github.com/MetalBlockchain/metalgo@v1.11.9/vms/avm/block/block_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package block 5 6 import ( 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/require" 11 12 "github.com/MetalBlockchain/metalgo/codec" 13 "github.com/MetalBlockchain/metalgo/ids" 14 "github.com/MetalBlockchain/metalgo/utils/constants" 15 "github.com/MetalBlockchain/metalgo/utils/crypto/secp256k1" 16 "github.com/MetalBlockchain/metalgo/vms/avm/fxs" 17 "github.com/MetalBlockchain/metalgo/vms/avm/txs" 18 "github.com/MetalBlockchain/metalgo/vms/components/avax" 19 "github.com/MetalBlockchain/metalgo/vms/secp256k1fx" 20 ) 21 22 var ( 23 chainID = ids.GenerateTestID() 24 keys = secp256k1.TestKeys() 25 assetID = ids.GenerateTestID() 26 ) 27 28 func TestInvalidBlock(t *testing.T) { 29 require := require.New(t) 30 31 parser, err := NewParser( 32 []fxs.Fx{ 33 &secp256k1fx.Fx{}, 34 }, 35 ) 36 require.NoError(err) 37 38 _, err = parser.ParseBlock(nil) 39 require.ErrorIs(err, codec.ErrCantUnpackVersion) 40 } 41 42 func TestStandardBlocks(t *testing.T) { 43 // check standard block can be built and parsed 44 require := require.New(t) 45 46 parser, err := NewParser( 47 []fxs.Fx{ 48 &secp256k1fx.Fx{}, 49 }, 50 ) 51 require.NoError(err) 52 53 blkTimestamp := time.Now() 54 parentID := ids.GenerateTestID() 55 height := uint64(2022) 56 cm := parser.Codec() 57 txs, err := createTestTxs(cm) 58 require.NoError(err) 59 60 standardBlk, err := NewStandardBlock(parentID, height, blkTimestamp, txs, cm) 61 require.NoError(err) 62 63 // parse block 64 parsed, err := parser.ParseBlock(standardBlk.Bytes()) 65 require.NoError(err) 66 67 // compare content 68 require.Equal(standardBlk.ID(), parsed.ID()) 69 require.Equal(standardBlk.Parent(), parsed.Parent()) 70 require.Equal(standardBlk.Height(), parsed.Height()) 71 require.Equal(standardBlk.Bytes(), parsed.Bytes()) 72 require.Equal(standardBlk.Timestamp(), parsed.Timestamp()) 73 74 require.IsType(&StandardBlock{}, parsed) 75 parsedStandardBlk := parsed.(*StandardBlock) 76 77 require.Equal(txs, parsedStandardBlk.Txs()) 78 require.Equal(parsed.Txs(), parsedStandardBlk.Txs()) 79 } 80 81 func createTestTxs(cm codec.Manager) ([]*txs.Tx, error) { 82 countTxs := 1 83 testTxs := make([]*txs.Tx, 0, countTxs) 84 for i := 0; i < countTxs; i++ { 85 // Create the tx 86 tx := &txs.Tx{Unsigned: &txs.BaseTx{BaseTx: avax.BaseTx{ 87 NetworkID: constants.UnitTestID, 88 BlockchainID: chainID, 89 Outs: []*avax.TransferableOutput{{ 90 Asset: avax.Asset{ID: assetID}, 91 Out: &secp256k1fx.TransferOutput{ 92 Amt: uint64(12345), 93 OutputOwners: secp256k1fx.OutputOwners{ 94 Threshold: 1, 95 Addrs: []ids.ShortID{keys[0].PublicKey().Address()}, 96 }, 97 }, 98 }}, 99 Ins: []*avax.TransferableInput{{ 100 UTXOID: avax.UTXOID{ 101 TxID: ids.ID{'t', 'x', 'I', 'D'}, 102 OutputIndex: 1, 103 }, 104 Asset: avax.Asset{ID: assetID}, 105 In: &secp256k1fx.TransferInput{ 106 Amt: uint64(54321), 107 Input: secp256k1fx.Input{ 108 SigIndices: []uint32{2}, 109 }, 110 }, 111 }}, 112 Memo: []byte{1, 2, 3, 4, 5, 6, 7, 8}, 113 }}} 114 if err := tx.SignSECP256K1Fx(cm, [][]*secp256k1.PrivateKey{{keys[0]}}); err != nil { 115 return nil, err 116 } 117 testTxs = append(testTxs, tx) 118 } 119 return testTxs, nil 120 }