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  }