mirror of https://github.com/poanetwork/gecko.git
Merge pull request #87 from ava-labs/remove-tx-dependencies
use transitive dependencies when possible with transaction dependencies
This commit is contained in:
commit
f2126cba19
|
@ -18,9 +18,10 @@ import (
|
|||
// database, writing changes to the underlying database only when commit is
|
||||
// called.
|
||||
type Database struct {
|
||||
lock sync.RWMutex
|
||||
mem map[string]valueDelete
|
||||
db database.Database
|
||||
lock sync.RWMutex
|
||||
mem map[string]valueDelete
|
||||
db database.Database
|
||||
batch database.Batch
|
||||
}
|
||||
|
||||
type valueDelete struct {
|
||||
|
@ -31,8 +32,9 @@ type valueDelete struct {
|
|||
// New returns a new prefixed database
|
||||
func New(db database.Database) *Database {
|
||||
return &Database{
|
||||
mem: make(map[string]valueDelete, memdb.DefaultSize),
|
||||
db: db,
|
||||
mem: make(map[string]valueDelete, memdb.DefaultSize),
|
||||
db: db,
|
||||
batch: db.NewBatch(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -169,6 +171,7 @@ func (db *Database) SetDatabase(newDB database.Database) error {
|
|||
}
|
||||
|
||||
db.db = newDB
|
||||
db.batch = newDB.NewBatch()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -206,7 +209,9 @@ func (db *Database) Abort() {
|
|||
|
||||
func (db *Database) abort() { db.mem = make(map[string]valueDelete, memdb.DefaultSize) }
|
||||
|
||||
// CommitBatch returns a batch that will commit all pending writes to the underlying database
|
||||
// CommitBatch returns a batch that will commit all pending writes to the
|
||||
// underlying database. The returned batch should be written before future calls
|
||||
// to this DB unless the batch will never be written.
|
||||
func (db *Database) CommitBatch() (database.Batch, error) {
|
||||
db.lock.Lock()
|
||||
defer db.lock.Unlock()
|
||||
|
@ -219,21 +224,21 @@ func (db *Database) commitBatch() (database.Batch, error) {
|
|||
return nil, database.ErrClosed
|
||||
}
|
||||
|
||||
batch := db.db.NewBatch()
|
||||
db.batch.Reset()
|
||||
for key, value := range db.mem {
|
||||
if value.delete {
|
||||
if err := batch.Delete([]byte(key)); err != nil {
|
||||
if err := db.batch.Delete([]byte(key)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else if err := batch.Put([]byte(key), value.value); err != nil {
|
||||
} else if err := db.batch.Put([]byte(key), value.value); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if err := batch.Write(); err != nil {
|
||||
if err := db.batch.Write(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return batch, nil
|
||||
return db.batch, nil
|
||||
}
|
||||
|
||||
// Close implements the database.Database interface
|
||||
|
|
|
@ -54,6 +54,8 @@ func (vtx *uniqueVertex) refresh() {
|
|||
func (vtx *uniqueVertex) Evict() {
|
||||
if vtx.v != nil {
|
||||
vtx.v.unique = false
|
||||
// make sure the parents are able to be garbage collected
|
||||
vtx.v.parents = nil
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,8 +9,8 @@ import (
|
|||
"github.com/ava-labs/gecko/database"
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/snow"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/vms/components/verify"
|
||||
)
|
||||
|
||||
|
@ -46,8 +46,8 @@ func (t *BaseTx) InputUTXOs() []*ava.UTXOID {
|
|||
return utxos
|
||||
}
|
||||
|
||||
// AssetIDs returns the IDs of the assets this transaction depends on
|
||||
func (t *BaseTx) AssetIDs() ids.Set {
|
||||
// ConsumedAssetIDs returns the IDs of the assets this transaction consumes
|
||||
func (t *BaseTx) ConsumedAssetIDs() ids.Set {
|
||||
assets := ids.Set{}
|
||||
for _, in := range t.Ins {
|
||||
assets.Add(in.AssetID())
|
||||
|
@ -55,6 +55,11 @@ func (t *BaseTx) AssetIDs() ids.Set {
|
|||
return assets
|
||||
}
|
||||
|
||||
// AssetIDs returns the IDs of the assets this transaction depends on
|
||||
func (t *BaseTx) AssetIDs() ids.Set {
|
||||
return t.ConsumedAssetIDs()
|
||||
}
|
||||
|
||||
// NumCredentials returns the number of expected credentials
|
||||
func (t *BaseTx) NumCredentials() int { return len(t.Ins) }
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ func TestBaseTxSerialization(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 12345,
|
||||
|
@ -87,7 +87,7 @@ func TestBaseTxSerialization(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -125,7 +125,7 @@ func TestBaseTxGetters(t *testing.T) {
|
|||
tx := &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 12345,
|
||||
|
@ -135,7 +135,7 @@ func TestBaseTxGetters(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -162,6 +162,10 @@ func TestBaseTxGetters(t *testing.T) {
|
|||
t.Fatalf("Wrong number of assets returned")
|
||||
} else if !assets.Contains(asset) {
|
||||
t.Fatalf("Wrong asset returned")
|
||||
} else if assets := tx.ConsumedAssetIDs(); assets.Len() != 1 {
|
||||
t.Fatalf("Wrong number of consumed assets returned")
|
||||
} else if !assets.Contains(asset) {
|
||||
t.Fatalf("Wrong consumed asset returned")
|
||||
} else if utxos := tx.UTXOs(); len(utxos) != 1 {
|
||||
t.Fatalf("Wrong number of utxos returned")
|
||||
} else if utxo := utxos[0]; !utxo.TxID.Equals(txID) {
|
||||
|
@ -179,7 +183,7 @@ func TestBaseTxSyntacticVerify(t *testing.T) {
|
|||
tx := &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 12345,
|
||||
|
@ -189,7 +193,7 @@ func TestBaseTxSyntacticVerify(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -230,7 +234,7 @@ func TestBaseTxSyntacticVerifyWrongNetworkID(t *testing.T) {
|
|||
tx := &BaseTx{
|
||||
NetID: 0,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 12345,
|
||||
|
@ -240,7 +244,7 @@ func TestBaseTxSyntacticVerifyWrongNetworkID(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -272,7 +276,7 @@ func TestBaseTxSyntacticVerifyWrongChainID(t *testing.T) {
|
|||
tx := &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: ids.Empty,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 12345,
|
||||
|
@ -282,7 +286,7 @@ func TestBaseTxSyntacticVerifyWrongChainID(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -315,7 +319,7 @@ func TestBaseTxSyntacticVerifyInvalidOutput(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{nil},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -348,7 +352,7 @@ func TestBaseTxSyntacticVerifyUnsortedOutputs(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{
|
||||
&ava.TransferableOutput{
|
||||
{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 2,
|
||||
|
@ -358,7 +362,7 @@ func TestBaseTxSyntacticVerifyUnsortedOutputs(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
&ava.TransferableOutput{
|
||||
{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 1,
|
||||
|
@ -370,7 +374,7 @@ func TestBaseTxSyntacticVerifyUnsortedOutputs(t *testing.T) {
|
|||
},
|
||||
},
|
||||
Ins: []*ava.TransferableInput{
|
||||
&ava.TransferableInput{
|
||||
{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -403,7 +407,7 @@ func TestBaseTxSyntacticVerifyInvalidInput(t *testing.T) {
|
|||
tx := &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 12345,
|
||||
|
@ -428,7 +432,7 @@ func TestBaseTxSyntacticVerifyInputOverflow(t *testing.T) {
|
|||
tx := &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 12345,
|
||||
|
@ -439,7 +443,7 @@ func TestBaseTxSyntacticVerifyInputOverflow(t *testing.T) {
|
|||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{
|
||||
&ava.TransferableInput{
|
||||
{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -457,7 +461,7 @@ func TestBaseTxSyntacticVerifyInputOverflow(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
&ava.TransferableInput{
|
||||
{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -491,7 +495,7 @@ func TestBaseTxSyntacticVerifyOutputOverflow(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{
|
||||
&ava.TransferableOutput{
|
||||
{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 2,
|
||||
|
@ -501,7 +505,7 @@ func TestBaseTxSyntacticVerifyOutputOverflow(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
&ava.TransferableOutput{
|
||||
{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: math.MaxUint64,
|
||||
|
@ -512,7 +516,7 @@ func TestBaseTxSyntacticVerifyOutputOverflow(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -544,7 +548,7 @@ func TestBaseTxSyntacticVerifyInsufficientFunds(t *testing.T) {
|
|||
tx := &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: math.MaxUint64,
|
||||
|
@ -554,7 +558,7 @@ func TestBaseTxSyntacticVerifyInsufficientFunds(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -586,7 +590,7 @@ func TestBaseTxSyntacticVerifyUninitialized(t *testing.T) {
|
|||
tx := &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: asset},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 12345,
|
||||
|
@ -596,7 +600,7 @@ func TestBaseTxSyntacticVerifyUninitialized(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||
|
@ -633,7 +637,7 @@ func TestBaseTxSemanticVerify(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -702,7 +706,7 @@ func TestBaseTxSemanticVerifyUnknownFx(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -754,7 +758,7 @@ func TestBaseTxSemanticVerifyWrongAssetID(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -825,11 +829,11 @@ func TestBaseTxSemanticVerifyUnauthorizedFx(t *testing.T) {
|
|||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.Empty,
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
},
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.NewID([32]byte{1}),
|
||||
Fx: &testFx{},
|
||||
},
|
||||
|
@ -863,7 +867,7 @@ func TestBaseTxSemanticVerifyUnauthorizedFx(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -923,7 +927,7 @@ func TestBaseTxSemanticVerifyInvalidSignature(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -941,9 +945,7 @@ func TestBaseTxSemanticVerifyInvalidSignature(t *testing.T) {
|
|||
}}
|
||||
|
||||
tx.Creds = append(tx.Creds, &secp256k1fx.Credential{
|
||||
Sigs: [][crypto.SECP256K1RSigLen]byte{
|
||||
[crypto.SECP256K1RSigLen]byte{},
|
||||
},
|
||||
Sigs: [][crypto.SECP256K1RSigLen]byte{{}},
|
||||
})
|
||||
|
||||
b, err := vm.codec.Marshal(tx)
|
||||
|
@ -977,7 +979,7 @@ func TestBaseTxSemanticVerifyMissingUTXO(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 1,
|
||||
|
@ -1044,7 +1046,7 @@ func TestBaseTxSemanticVerifyInvalidUTXO(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: math.MaxUint32,
|
||||
|
@ -1107,7 +1109,7 @@ func TestBaseTxSemanticVerifyPendingInvalidUTXO(t *testing.T) {
|
|||
pendingTx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -1122,7 +1124,7 @@ func TestBaseTxSemanticVerifyPendingInvalidUTXO(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: genesisTx.ID()},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 50000,
|
||||
|
@ -1179,7 +1181,7 @@ func TestBaseTxSemanticVerifyPendingInvalidUTXO(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: txID,
|
||||
OutputIndex: 2,
|
||||
|
@ -1241,7 +1243,7 @@ func TestBaseTxSemanticVerifyPendingWrongAssetID(t *testing.T) {
|
|||
pendingTx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -1256,7 +1258,7 @@ func TestBaseTxSemanticVerifyPendingWrongAssetID(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: genesisTx.ID()},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 50000,
|
||||
|
@ -1313,7 +1315,7 @@ func TestBaseTxSemanticVerifyPendingWrongAssetID(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: txID,
|
||||
OutputIndex: 0,
|
||||
|
@ -1381,11 +1383,11 @@ func TestBaseTxSemanticVerifyPendingUnauthorizedFx(t *testing.T) {
|
|||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.NewID([32]byte{1}),
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
},
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.Empty,
|
||||
Fx: &testFx{},
|
||||
},
|
||||
|
@ -1419,7 +1421,7 @@ func TestBaseTxSemanticVerifyPendingUnauthorizedFx(t *testing.T) {
|
|||
pendingTx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -1434,7 +1436,7 @@ func TestBaseTxSemanticVerifyPendingUnauthorizedFx(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: genesisTx.ID()},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 50000,
|
||||
|
@ -1491,7 +1493,7 @@ func TestBaseTxSemanticVerifyPendingUnauthorizedFx(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: txID,
|
||||
OutputIndex: 0,
|
||||
|
@ -1543,11 +1545,11 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) {
|
|||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.NewID([32]byte{1}),
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
},
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.Empty,
|
||||
Fx: &testFx{},
|
||||
},
|
||||
|
@ -1581,7 +1583,7 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) {
|
|||
pendingTx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -1596,7 +1598,7 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: genesisTx.ID()},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 50000,
|
||||
|
@ -1653,7 +1655,7 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: txID,
|
||||
OutputIndex: 0,
|
||||
|
@ -1671,9 +1673,7 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) {
|
|||
}}
|
||||
|
||||
tx.Creds = append(tx.Creds, &secp256k1fx.Credential{
|
||||
Sigs: [][crypto.SECP256K1RSigLen]byte{
|
||||
[crypto.SECP256K1RSigLen]byte{},
|
||||
},
|
||||
Sigs: [][crypto.SECP256K1RSigLen]byte{{}},
|
||||
})
|
||||
|
||||
b, err = vm.codec.Marshal(tx)
|
||||
|
|
|
@ -8,8 +8,8 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/vms/components/verify"
|
||||
"github.com/ava-labs/gecko/vms/secp256k1fx"
|
||||
)
|
||||
|
@ -93,7 +93,7 @@ func TestCreateAssetTxSerialization(t *testing.T) {
|
|||
0xbb, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xaa,
|
||||
0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88,
|
||||
}),
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{
|
||||
ID: ids.NewID([32]byte{
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
|
@ -122,7 +122,7 @@ func TestCreateAssetTxSerialization(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.NewID([32]byte{
|
||||
0xf1, 0xe1, 0xd1, 0xc1, 0xb1, 0xa1, 0x91, 0x81,
|
||||
|
@ -152,7 +152,7 @@ func TestCreateAssetTxSerialization(t *testing.T) {
|
|||
Symbol: "VIX",
|
||||
Denomination: 2,
|
||||
States: []*InitialState{
|
||||
&InitialState{
|
||||
{
|
||||
FxID: 0,
|
||||
Outs: []verify.Verifiable{
|
||||
&secp256k1fx.TransferOutput{
|
||||
|
|
|
@ -12,11 +12,11 @@ import (
|
|||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/snow"
|
||||
"github.com/ava-labs/gecko/snow/engine/common"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/utils/crypto"
|
||||
"github.com/ava-labs/gecko/utils/hashing"
|
||||
"github.com/ava-labs/gecko/utils/logging"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/vms/secp256k1fx"
|
||||
)
|
||||
|
||||
|
@ -68,7 +68,7 @@ func TestExportTxSerialization(t *testing.T) {
|
|||
0xbb, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xaa,
|
||||
0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88,
|
||||
}),
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{TxID: ids.NewID([32]byte{
|
||||
0x0f, 0x2f, 0x4f, 0x6f, 0x8e, 0xae, 0xce, 0xee,
|
||||
0x0d, 0x2d, 0x4d, 0x6d, 0x8c, 0xac, 0xcc, 0xec,
|
||||
|
@ -141,7 +141,7 @@ func TestIssueExportTx(t *testing.T) {
|
|||
memdb.New(),
|
||||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{&common.Fx{
|
||||
[]*common.Fx{{
|
||||
ID: ids.Empty,
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
}},
|
||||
|
@ -167,7 +167,7 @@ func TestIssueExportTx(t *testing.T) {
|
|||
BaseTx: BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: avaID,
|
||||
OutputIndex: 1,
|
||||
|
@ -179,7 +179,7 @@ func TestIssueExportTx(t *testing.T) {
|
|||
},
|
||||
}},
|
||||
},
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: avaID},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 50000,
|
||||
|
@ -297,7 +297,7 @@ func TestClearForceAcceptedExportTx(t *testing.T) {
|
|||
memdb.New(),
|
||||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{&common.Fx{
|
||||
[]*common.Fx{{
|
||||
ID: ids.Empty,
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
}},
|
||||
|
@ -323,7 +323,7 @@ func TestClearForceAcceptedExportTx(t *testing.T) {
|
|||
BaseTx: BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: avaID,
|
||||
OutputIndex: 1,
|
||||
|
@ -335,7 +335,7 @@ func TestClearForceAcceptedExportTx(t *testing.T) {
|
|||
},
|
||||
}},
|
||||
},
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: avaID},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 50000,
|
||||
|
|
|
@ -11,8 +11,8 @@ import (
|
|||
"github.com/ava-labs/gecko/database/versiondb"
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/snow"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/vms/components/verify"
|
||||
)
|
||||
|
||||
|
@ -33,6 +33,15 @@ func (t *ImportTx) InputUTXOs() []*ava.UTXOID {
|
|||
return utxos
|
||||
}
|
||||
|
||||
// ConsumedAssetIDs returns the IDs of the assets this transaction consumes
|
||||
func (t *ImportTx) ConsumedAssetIDs() ids.Set {
|
||||
assets := t.BaseTx.AssetIDs()
|
||||
for _, in := range t.Ins {
|
||||
assets.Add(in.AssetID())
|
||||
}
|
||||
return assets
|
||||
}
|
||||
|
||||
// AssetIDs returns the IDs of the assets this transaction depends on
|
||||
func (t *ImportTx) AssetIDs() ids.Set {
|
||||
assets := t.BaseTx.AssetIDs()
|
||||
|
|
|
@ -68,7 +68,7 @@ func TestImportTxSerialization(t *testing.T) {
|
|||
0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88,
|
||||
}),
|
||||
},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{TxID: ids.NewID([32]byte{
|
||||
0x0f, 0x2f, 0x4f, 0x6f, 0x8e, 0xae, 0xce, 0xee,
|
||||
0x0d, 0x2d, 0x4d, 0x6d, 0x8c, 0xac, 0xcc, 0xec,
|
||||
|
@ -130,7 +130,7 @@ func TestIssueImportTx(t *testing.T) {
|
|||
memdb.New(),
|
||||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{&common.Fx{
|
||||
[]*common.Fx{{
|
||||
ID: ids.Empty,
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
}},
|
||||
|
@ -166,7 +166,7 @@ func TestIssueImportTx(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: utxoID,
|
||||
Asset: ava.Asset{ID: avaID},
|
||||
In: &secp256k1fx.TransferInput{
|
||||
|
@ -288,7 +288,7 @@ func TestForceAcceptImportTx(t *testing.T) {
|
|||
memdb.New(),
|
||||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{&common.Fx{
|
||||
[]*common.Fx{{
|
||||
ID: ids.Empty,
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
}},
|
||||
|
@ -326,7 +326,7 @@ func TestForceAcceptImportTx(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
},
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: utxoID,
|
||||
Asset: ava.Asset{ID: genesisTx.ID()},
|
||||
In: &secp256k1fx.TransferInput{
|
||||
|
|
|
@ -7,8 +7,8 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/vms/components/verify"
|
||||
)
|
||||
|
||||
|
@ -43,11 +43,11 @@ func TestOperationVerifyUTXOIDsNotSorted(t *testing.T) {
|
|||
op := &Operation{
|
||||
Asset: ava.Asset{ID: ids.Empty},
|
||||
UTXOIDs: []*ava.UTXOID{
|
||||
&ava.UTXOID{
|
||||
{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 1,
|
||||
},
|
||||
&ava.UTXOID{
|
||||
{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 0,
|
||||
},
|
||||
|
@ -64,7 +64,7 @@ func TestOperationVerify(t *testing.T) {
|
|||
op := &Operation{
|
||||
Asset: ava.Asset{ID: ids.Empty},
|
||||
UTXOIDs: []*ava.UTXOID{
|
||||
&ava.UTXOID{
|
||||
{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 1,
|
||||
},
|
||||
|
@ -81,20 +81,20 @@ func TestOperationSorting(t *testing.T) {
|
|||
c.RegisterType(&testOperable{})
|
||||
|
||||
ops := []*Operation{
|
||||
&Operation{
|
||||
{
|
||||
Asset: ava.Asset{ID: ids.Empty},
|
||||
UTXOIDs: []*ava.UTXOID{
|
||||
&ava.UTXOID{
|
||||
{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 1,
|
||||
},
|
||||
},
|
||||
Op: &testOperable{},
|
||||
},
|
||||
&Operation{
|
||||
{
|
||||
Asset: ava.Asset{ID: ids.Empty},
|
||||
UTXOIDs: []*ava.UTXOID{
|
||||
&ava.UTXOID{
|
||||
{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 0,
|
||||
},
|
||||
|
@ -112,7 +112,7 @@ func TestOperationSorting(t *testing.T) {
|
|||
ops = append(ops, &Operation{
|
||||
Asset: ava.Asset{ID: ids.Empty},
|
||||
UTXOIDs: []*ava.UTXOID{
|
||||
&ava.UTXOID{
|
||||
{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 1,
|
||||
},
|
||||
|
|
|
@ -8,8 +8,8 @@ import (
|
|||
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/snow"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/vms/components/verify"
|
||||
)
|
||||
|
||||
|
@ -39,6 +39,17 @@ func (t *OperationTx) InputUTXOs() []*ava.UTXOID {
|
|||
return utxos
|
||||
}
|
||||
|
||||
// ConsumedAssetIDs returns the IDs of the assets this transaction consumes
|
||||
func (t *OperationTx) ConsumedAssetIDs() ids.Set {
|
||||
assets := t.BaseTx.AssetIDs()
|
||||
for _, op := range t.Ops {
|
||||
if len(op.UTXOIDs) > 0 {
|
||||
assets.Add(op.AssetID())
|
||||
}
|
||||
}
|
||||
return assets
|
||||
}
|
||||
|
||||
// AssetIDs returns the IDs of the assets this transaction depends on
|
||||
func (t *OperationTx) AssetIDs() ids.Set {
|
||||
assets := t.BaseTx.AssetIDs()
|
||||
|
|
|
@ -38,7 +38,7 @@ func TestPrefixedSetsAndGets(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 0,
|
||||
|
@ -160,9 +160,7 @@ func TestPrefixedFundingAddresses(t *testing.T) {
|
|||
},
|
||||
Asset: ava.Asset{ID: ids.Empty},
|
||||
Out: &ava.TestAddressable{
|
||||
Addrs: [][]byte{
|
||||
[]byte{0},
|
||||
},
|
||||
Addrs: [][]byte{{0}},
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -792,7 +792,7 @@ func (service *Service) Send(r *http.Request, args *SendArgs, reply *SendReply)
|
|||
|
||||
ava.SortTransferableInputsWithSigners(ins, keys)
|
||||
|
||||
outs := []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
outs := []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: assetID},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: uint64(args.Amount),
|
||||
|
@ -946,7 +946,7 @@ func (service *Service) CreateMintTx(r *http.Request, args *CreateMintTxArgs, re
|
|||
BCID: service.vm.ctx.ChainID,
|
||||
},
|
||||
Ops: []*Operation{
|
||||
&Operation{
|
||||
{
|
||||
Asset: ava.Asset{ID: assetID},
|
||||
UTXOIDs: []*ava.UTXOID{
|
||||
&utxo.UTXOID,
|
||||
|
@ -1197,7 +1197,7 @@ func (service *Service) ImportAVA(_ *http.Request, args *ImportAVAArgs, reply *I
|
|||
|
||||
ava.SortTransferableInputsWithSigners(ins, keys)
|
||||
|
||||
outs := []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
outs := []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: service.vm.ava},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: amount,
|
||||
|
@ -1352,7 +1352,7 @@ func (service *Service) ExportAVA(_ *http.Request, args *ExportAVAArgs, reply *E
|
|||
|
||||
ava.SortTransferableInputsWithSigners(ins, keys)
|
||||
|
||||
exportOuts := []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
exportOuts := []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: service.vm.ava},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: uint64(args.Amount),
|
||||
|
|
|
@ -300,7 +300,7 @@ func TestCreateFixedCapAsset(t *testing.T) {
|
|||
Name: "test asset",
|
||||
Symbol: "test",
|
||||
Denomination: 1,
|
||||
InitialHolders: []*Holder{&Holder{
|
||||
InitialHolders: []*Holder{{
|
||||
Amount: 123456789,
|
||||
Address: vm.Format(keys[0].PublicKey().Address().Bytes()),
|
||||
}},
|
||||
|
@ -326,7 +326,7 @@ func TestCreateVariableCapAsset(t *testing.T) {
|
|||
Name: "test asset",
|
||||
Symbol: "test",
|
||||
MinterSets: []Owners{
|
||||
Owners{
|
||||
{
|
||||
Threshold: 1,
|
||||
Minters: []string{
|
||||
vm.Format(keys[0].PublicKey().Address().Bytes()),
|
||||
|
@ -367,7 +367,7 @@ func TestImportAvmKey(t *testing.T) {
|
|||
factory := crypto.FactorySECP256K1R{}
|
||||
skIntf, err := factory.NewPrivateKey()
|
||||
if err != nil {
|
||||
t.Fatalf("problem generating private key: %w", err)
|
||||
t.Fatalf("problem generating private key: %s", err)
|
||||
}
|
||||
sk := skIntf.(*crypto.PrivateKeySECP256K1R)
|
||||
|
||||
|
@ -406,7 +406,7 @@ func TestImportAvmKeyNoDuplicates(t *testing.T) {
|
|||
factory := crypto.FactorySECP256K1R{}
|
||||
skIntf, err := factory.NewPrivateKey()
|
||||
if err != nil {
|
||||
t.Fatalf("problem generating private key: %w", err)
|
||||
t.Fatalf("problem generating private key: %s", err)
|
||||
}
|
||||
sk := skIntf.(*crypto.PrivateKeySECP256K1R)
|
||||
|
||||
|
|
|
@ -288,7 +288,7 @@ func TestStateTXs(t *testing.T) {
|
|||
tx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 0,
|
||||
|
|
|
@ -11,12 +11,12 @@ func TestBuildGenesis(t *testing.T) {
|
|||
ss := StaticService{}
|
||||
|
||||
args := BuildGenesisArgs{GenesisData: map[string]AssetDefinition{
|
||||
"asset1": AssetDefinition{
|
||||
"asset1": {
|
||||
Name: "myFixedCapAsset",
|
||||
Symbol: "MFCA",
|
||||
Denomination: 8,
|
||||
InitialState: map[string][]interface{}{
|
||||
"fixedCap": []interface{}{
|
||||
"fixedCap": {
|
||||
Holder{
|
||||
Amount: 100000,
|
||||
Address: "A9bTQjfYGBFK3JPRJqF2eh3JYL7cHocvy",
|
||||
|
@ -36,11 +36,11 @@ func TestBuildGenesis(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
"asset2": AssetDefinition{
|
||||
"asset2": {
|
||||
Name: "myVarCapAsset",
|
||||
Symbol: "MVCA",
|
||||
InitialState: map[string][]interface{}{
|
||||
"variableCap": []interface{}{
|
||||
"variableCap": {
|
||||
Owners{
|
||||
Threshold: 1,
|
||||
Minters: []string{
|
||||
|
@ -58,10 +58,10 @@ func TestBuildGenesis(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
"asset3": AssetDefinition{
|
||||
"asset3": {
|
||||
Name: "myOtherVarCapAsset",
|
||||
InitialState: map[string][]interface{}{
|
||||
"variableCap": []interface{}{
|
||||
"variableCap": {
|
||||
Owners{
|
||||
Threshold: 1,
|
||||
Minters: []string{
|
||||
|
|
|
@ -9,8 +9,8 @@ import (
|
|||
"github.com/ava-labs/gecko/database"
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/snow"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/vms/components/verify"
|
||||
)
|
||||
|
||||
|
@ -24,7 +24,9 @@ type UnsignedTx interface {
|
|||
ID() ids.ID
|
||||
Bytes() []byte
|
||||
|
||||
ConsumedAssetIDs() ids.Set
|
||||
AssetIDs() ids.Set
|
||||
|
||||
NumCredentials() int
|
||||
InputUTXOs() []*ava.UTXOID
|
||||
UTXOs() []*ava.UTXO
|
||||
|
|
|
@ -7,9 +7,9 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/utils/units"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/vms/components/verify"
|
||||
"github.com/ava-labs/gecko/vms/secp256k1fx"
|
||||
)
|
||||
|
@ -56,7 +56,7 @@ func TestTxInvalidCredential(t *testing.T) {
|
|||
UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 0,
|
||||
|
@ -95,7 +95,7 @@ func TestTxInvalidUnsignedTx(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{
|
||||
&ava.TransferableInput{
|
||||
{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 0,
|
||||
|
@ -110,7 +110,7 @@ func TestTxInvalidUnsignedTx(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
&ava.TransferableInput{
|
||||
{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: ids.Empty,
|
||||
OutputIndex: 0,
|
||||
|
@ -153,7 +153,7 @@ func TestTxInvalidNumberOfCredentials(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{
|
||||
&ava.TransferableInput{
|
||||
{
|
||||
UTXOID: ava.UTXOID{TxID: ids.Empty, OutputIndex: 0},
|
||||
Asset: ava.Asset{ID: asset},
|
||||
In: &secp256k1fx.TransferInput{
|
||||
|
@ -165,7 +165,7 @@ func TestTxInvalidNumberOfCredentials(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
&ava.TransferableInput{
|
||||
{
|
||||
UTXOID: ava.UTXOID{TxID: ids.Empty, OutputIndex: 1},
|
||||
Asset: ava.Asset{ID: asset},
|
||||
In: &secp256k1fx.TransferInput{
|
||||
|
|
|
@ -85,7 +85,11 @@ func (tx *UniqueTx) refresh() {
|
|||
|
||||
// Evict is called when this UniqueTx will no longer be returned from a cache
|
||||
// lookup
|
||||
func (tx *UniqueTx) Evict() { tx.unique = false } // Lock is already held here
|
||||
func (tx *UniqueTx) Evict() {
|
||||
// Lock is already held here
|
||||
tx.unique = false
|
||||
tx.deps = nil
|
||||
}
|
||||
|
||||
func (tx *UniqueTx) setStatus(status choices.Status) error {
|
||||
tx.refresh()
|
||||
|
@ -206,22 +210,25 @@ func (tx *UniqueTx) Dependencies() []snowstorm.Tx {
|
|||
continue
|
||||
}
|
||||
txID, _ := in.InputSource()
|
||||
if !txIDs.Contains(txID) {
|
||||
txIDs.Add(txID)
|
||||
tx.deps = append(tx.deps, &UniqueTx{
|
||||
vm: tx.vm,
|
||||
txID: txID,
|
||||
})
|
||||
if txIDs.Contains(txID) {
|
||||
continue
|
||||
}
|
||||
txIDs.Add(txID)
|
||||
tx.deps = append(tx.deps, &UniqueTx{
|
||||
vm: tx.vm,
|
||||
txID: txID,
|
||||
})
|
||||
}
|
||||
consumedIDs := tx.Tx.ConsumedAssetIDs()
|
||||
for _, assetID := range tx.Tx.AssetIDs().List() {
|
||||
if !txIDs.Contains(assetID) {
|
||||
txIDs.Add(assetID)
|
||||
tx.deps = append(tx.deps, &UniqueTx{
|
||||
vm: tx.vm,
|
||||
txID: assetID,
|
||||
})
|
||||
if consumedIDs.Contains(assetID) || txIDs.Contains(assetID) {
|
||||
continue
|
||||
}
|
||||
txIDs.Add(assetID)
|
||||
tx.deps = append(tx.deps, &UniqueTx{
|
||||
vm: tx.vm,
|
||||
txID: assetID,
|
||||
})
|
||||
}
|
||||
return tx.deps
|
||||
}
|
||||
|
|
|
@ -20,12 +20,12 @@ import (
|
|||
"github.com/ava-labs/gecko/snow/choices"
|
||||
"github.com/ava-labs/gecko/snow/consensus/snowstorm"
|
||||
"github.com/ava-labs/gecko/snow/engine/common"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
"github.com/ava-labs/gecko/utils/formatting"
|
||||
"github.com/ava-labs/gecko/utils/logging"
|
||||
"github.com/ava-labs/gecko/utils/timer"
|
||||
"github.com/ava-labs/gecko/utils/wrappers"
|
||||
"github.com/ava-labs/gecko/vms/components/ava"
|
||||
"github.com/ava-labs/gecko/utils/codec"
|
||||
|
||||
cjson "github.com/ava-labs/gecko/utils/json"
|
||||
)
|
||||
|
@ -35,7 +35,7 @@ const (
|
|||
batchSize = 30
|
||||
stateCacheSize = 10000
|
||||
idCacheSize = 10000
|
||||
txCacheSize = 100000
|
||||
txCacheSize = 10000
|
||||
addressSep = "-"
|
||||
)
|
||||
|
||||
|
@ -248,8 +248,8 @@ func (vm *VM) CreateHandlers() map[string]*common.HTTPHandler {
|
|||
rpcServer.RegisterService(&Service{vm: vm}, "avm") // name this service "avm"
|
||||
|
||||
return map[string]*common.HTTPHandler{
|
||||
"": &common.HTTPHandler{Handler: rpcServer},
|
||||
"/pubsub": &common.HTTPHandler{LockOptions: common.NoLock, Handler: vm.pubsub},
|
||||
"": {Handler: rpcServer},
|
||||
"/pubsub": {LockOptions: common.NoLock, Handler: vm.pubsub},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -261,7 +261,7 @@ func (vm *VM) CreateStaticHandlers() map[string]*common.HTTPHandler {
|
|||
newServer.RegisterCodec(codec, "application/json;charset=UTF-8")
|
||||
newServer.RegisterService(&StaticService{}, "avm") // name this service "avm"
|
||||
return map[string]*common.HTTPHandler{
|
||||
"": &common.HTTPHandler{LockOptions: common.WriteLock, Handler: newServer},
|
||||
"": {LockOptions: common.WriteLock, Handler: newServer},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -84,11 +84,11 @@ func BuildGenesisTest(t *testing.T) []byte {
|
|||
addr2 := keys[2].PublicKey().Address()
|
||||
|
||||
args := BuildGenesisArgs{GenesisData: map[string]AssetDefinition{
|
||||
"asset1": AssetDefinition{
|
||||
"asset1": {
|
||||
Name: "myFixedCapAsset",
|
||||
Symbol: "MFCA",
|
||||
InitialState: map[string][]interface{}{
|
||||
"fixedCap": []interface{}{
|
||||
"fixedCap": {
|
||||
Holder{
|
||||
Amount: 100000,
|
||||
Address: addr0.String(),
|
||||
|
@ -108,11 +108,11 @@ func BuildGenesisTest(t *testing.T) []byte {
|
|||
},
|
||||
},
|
||||
},
|
||||
"asset2": AssetDefinition{
|
||||
"asset2": {
|
||||
Name: "myVarCapAsset",
|
||||
Symbol: "MVCA",
|
||||
InitialState: map[string][]interface{}{
|
||||
"variableCap": []interface{}{
|
||||
"variableCap": {
|
||||
Owners{
|
||||
Threshold: 1,
|
||||
Minters: []string{
|
||||
|
@ -131,10 +131,10 @@ func BuildGenesisTest(t *testing.T) []byte {
|
|||
},
|
||||
},
|
||||
},
|
||||
"asset3": AssetDefinition{
|
||||
"asset3": {
|
||||
Name: "myOtherVarCapAsset",
|
||||
InitialState: map[string][]interface{}{
|
||||
"variableCap": []interface{}{
|
||||
"variableCap": {
|
||||
Owners{
|
||||
Threshold: 1,
|
||||
Minters: []string{
|
||||
|
@ -168,7 +168,7 @@ func GenesisVM(t *testing.T) ([]byte, chan common.Message, *VM) {
|
|||
memdb.New(),
|
||||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{&common.Fx{
|
||||
[]*common.Fx{{
|
||||
ID: ids.Empty,
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
}},
|
||||
|
@ -195,7 +195,7 @@ func NewTx(t *testing.T, genesisBytes []byte, vm *VM) *Tx {
|
|||
newTx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -357,7 +357,7 @@ func TestTxSerialization(t *testing.T) {
|
|||
Symbol: "symb",
|
||||
Denomination: 0,
|
||||
States: []*InitialState{
|
||||
&InitialState{
|
||||
{
|
||||
FxID: 0,
|
||||
Outs: []verify.Verifiable{
|
||||
&secp256k1fx.MintOutput{
|
||||
|
@ -456,7 +456,7 @@ func TestFxInitializationFailure(t *testing.T) {
|
|||
/*db=*/ memdb.New(),
|
||||
/*genesisState=*/ genesisBytes,
|
||||
/*engineMessenger=*/ make(chan common.Message, 1),
|
||||
/*fxs=*/ []*common.Fx{&common.Fx{
|
||||
/*fxs=*/ []*common.Fx{{
|
||||
ID: ids.Empty,
|
||||
Fx: &testFx{initialize: errUnknownFx},
|
||||
}},
|
||||
|
@ -537,7 +537,7 @@ func TestIssueDependentTx(t *testing.T) {
|
|||
firstTx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: genesisTx.ID(),
|
||||
OutputIndex: 1,
|
||||
|
@ -552,7 +552,7 @@ func TestIssueDependentTx(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
|
||||
Outs: []*ava.TransferableOutput{{
|
||||
Asset: ava.Asset{ID: genesisTx.ID()},
|
||||
Out: &secp256k1fx.TransferOutput{
|
||||
Amt: 50000,
|
||||
|
@ -596,7 +596,7 @@ func TestIssueDependentTx(t *testing.T) {
|
|||
secondTx := &Tx{UnsignedTx: &BaseTx{
|
||||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
Ins: []*ava.TransferableInput{&ava.TransferableInput{
|
||||
Ins: []*ava.TransferableInput{{
|
||||
UTXOID: ava.UTXOID{
|
||||
TxID: firstTx.ID(),
|
||||
OutputIndex: 0,
|
||||
|
@ -671,11 +671,11 @@ func TestIssueNFT(t *testing.T) {
|
|||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.Empty.Prefix(0),
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
},
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.Empty.Prefix(1),
|
||||
Fx: &nftfx.Fx{},
|
||||
},
|
||||
|
@ -704,7 +704,7 @@ func TestIssueNFT(t *testing.T) {
|
|||
Name: "Team Rocket",
|
||||
Symbol: "TR",
|
||||
Denomination: 0,
|
||||
States: []*InitialState{&InitialState{
|
||||
States: []*InitialState{{
|
||||
FxID: 1,
|
||||
Outs: []verify.Verifiable{
|
||||
&nftfx.MintOutput{
|
||||
|
@ -740,9 +740,9 @@ func TestIssueNFT(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
},
|
||||
Ops: []*Operation{&Operation{
|
||||
Ops: []*Operation{{
|
||||
Asset: ava.Asset{ID: createAssetTx.ID()},
|
||||
UTXOIDs: []*ava.UTXOID{&ava.UTXOID{
|
||||
UTXOIDs: []*ava.UTXOID{{
|
||||
TxID: createAssetTx.ID(),
|
||||
OutputIndex: 0,
|
||||
}},
|
||||
|
@ -752,9 +752,7 @@ func TestIssueNFT(t *testing.T) {
|
|||
},
|
||||
GroupID: 1,
|
||||
Payload: []byte{'h', 'e', 'l', 'l', 'o'},
|
||||
Outputs: []*secp256k1fx.OutputOwners{
|
||||
&secp256k1fx.OutputOwners{},
|
||||
},
|
||||
Outputs: []*secp256k1fx.OutputOwners{{}},
|
||||
},
|
||||
}},
|
||||
}}
|
||||
|
@ -793,9 +791,9 @@ func TestIssueNFT(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
},
|
||||
Ops: []*Operation{&Operation{
|
||||
Ops: []*Operation{{
|
||||
Asset: ava.Asset{ID: createAssetTx.ID()},
|
||||
UTXOIDs: []*ava.UTXOID{&ava.UTXOID{
|
||||
UTXOIDs: []*ava.UTXOID{{
|
||||
TxID: mintNFTTx.ID(),
|
||||
OutputIndex: 0,
|
||||
}},
|
||||
|
@ -840,15 +838,15 @@ func TestIssueProperty(t *testing.T) {
|
|||
genesisBytes,
|
||||
issuer,
|
||||
[]*common.Fx{
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.Empty.Prefix(0),
|
||||
Fx: &secp256k1fx.Fx{},
|
||||
},
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.Empty.Prefix(1),
|
||||
Fx: &nftfx.Fx{},
|
||||
},
|
||||
&common.Fx{
|
||||
{
|
||||
ID: ids.Empty.Prefix(2),
|
||||
Fx: &propertyfx.Fx{},
|
||||
},
|
||||
|
@ -877,7 +875,7 @@ func TestIssueProperty(t *testing.T) {
|
|||
Name: "Team Rocket",
|
||||
Symbol: "TR",
|
||||
Denomination: 0,
|
||||
States: []*InitialState{&InitialState{
|
||||
States: []*InitialState{{
|
||||
FxID: 2,
|
||||
Outs: []verify.Verifiable{
|
||||
&propertyfx.MintOutput{
|
||||
|
@ -905,9 +903,9 @@ func TestIssueProperty(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
},
|
||||
Ops: []*Operation{&Operation{
|
||||
Ops: []*Operation{{
|
||||
Asset: ava.Asset{ID: createAssetTx.ID()},
|
||||
UTXOIDs: []*ava.UTXOID{&ava.UTXOID{
|
||||
UTXOIDs: []*ava.UTXOID{{
|
||||
TxID: createAssetTx.ID(),
|
||||
OutputIndex: 0,
|
||||
}},
|
||||
|
@ -960,9 +958,9 @@ func TestIssueProperty(t *testing.T) {
|
|||
NetID: networkID,
|
||||
BCID: chainID,
|
||||
},
|
||||
Ops: []*Operation{&Operation{
|
||||
Ops: []*Operation{{
|
||||
Asset: ava.Asset{ID: createAssetTx.ID()},
|
||||
UTXOIDs: []*ava.UTXOID{&ava.UTXOID{
|
||||
UTXOIDs: []*ava.UTXOID{{
|
||||
TxID: mintPropertyTx.ID(),
|
||||
OutputIndex: 1,
|
||||
}},
|
||||
|
|
Loading…
Reference in New Issue