github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/test/e2e/state_test.go (about) 1 package e2e 2 3 import ( 4 "context" 5 "fmt" 6 "math/big" 7 "strconv" 8 "testing" 9 10 "github.com/0xPolygon/supernets2-node/encoding" 11 "github.com/0xPolygon/supernets2-node/state" 12 "github.com/0xPolygon/supernets2-node/test/operations" 13 "github.com/0xPolygon/supernets2-node/test/vectors" 14 "github.com/ethereum/go-ethereum/common" 15 "github.com/ethereum/go-ethereum/core/types" 16 "github.com/ethereum/go-ethereum/rlp" 17 "github.com/stretchr/testify/require" 18 ) 19 20 // TestStateTransition tests state transitions using the vector 21 func TestStateTransition(t *testing.T) { 22 if testing.Short() { 23 t.Skip() 24 } 25 26 defer func() { 27 require.NoError(t, operations.Teardown()) 28 }() 29 30 // Load test vectors 31 testCases, err := vectors.LoadStateTransitionTestCases("./../vectors/src/state-transition/no-data/general.json") 32 require.NoError(t, err) 33 34 for _, testCase := range testCases { 35 t.Run(testCase.Description, func(t *testing.T) { 36 ctx := context.Background() 37 38 opsCfg := &operations.Config{ 39 State: &state.Config{ 40 MaxCumulativeGasUsed: 800000, 41 }, 42 SequenceSender: &operations.SequenceSenderConfig{ 43 SenderAddress: testCase.SequencerAddress, 44 LastBatchVirtualizationTimeMaxWaitPeriod: "5s", 45 WaitPeriodSendSequence: "5s", 46 MaxBatchesForL1: 1, 47 PrivateKey: testCase.SequencerPrivateKey, 48 }, 49 } 50 opsman, err := operations.NewManager(ctx, opsCfg) 51 require.NoError(t, err) 52 53 genesisAccounts := make(map[string]big.Int) 54 for _, gacc := range testCase.GenesisAccounts { 55 genesisAccounts[gacc.Address] = gacc.Balance.Int 56 } 57 require.NoError(t, opsman.SetGenesisAccountsBalance(genesisAccounts)) 58 59 // Check initial root 60 require.NoError(t, opsman.CheckVirtualRoot(testCase.ExpectedOldRoot)) 61 62 require.NoError(t, opsman.Setup()) 63 64 // convert vector txs 65 txs := make([]*types.Transaction, 0, len(testCase.Txs)) 66 for i := 0; i < len(testCase.Txs); i++ { 67 vecTx := testCase.Txs[i] 68 var tx types.Transaction 69 err := rlp.DecodeBytes([]byte(vecTx.RawTx), &tx) 70 require.NoError(t, err) 71 txs = append(txs, &tx) 72 } 73 74 // send transactions 75 _, err = operations.ApplyL2Txs(ctx, txs, nil, nil, operations.VerifiedConfirmationLevel) 76 require.NoError(t, err) 77 78 st := opsman.State() 79 80 // Check leafs 81 l2Block, err := st.GetLastL2Block(ctx, nil) 82 require.NoError(t, err) 83 for addrStr, leaf := range testCase.ExpectedNewLeafs { 84 addr := common.HexToAddress(addrStr) 85 86 actualBalance, err := st.GetBalance(ctx, addr, l2Block.Root()) 87 require.NoError(t, err) 88 require.Equal(t, 0, leaf.Balance.Cmp(actualBalance), fmt.Sprintf("addr: %s expected: %s found: %s", addr.Hex(), leaf.Balance.Text(encoding.Base10), actualBalance.Text(encoding.Base10))) 89 90 actualNonce, err := st.GetNonce(ctx, addr, l2Block.Root()) 91 require.NoError(t, err) 92 require.Equal(t, leaf.Nonce, strconv.FormatUint(actualNonce, encoding.Base10), fmt.Sprintf("addr: %s expected: %s found: %d", addr.Hex(), leaf.Nonce, actualNonce)) 93 } 94 95 // Check virtual root against the expected state 96 require.NoError(t, opsman.CheckVirtualRoot(testCase.ExpectedNewRoot)) 97 98 // Check that last virtual and consolidated l2 block are the same 99 lastConsolidatedL2BlockNumber, err := st.GetLastConsolidatedL2BlockNumber(ctx, nil) 100 require.NoError(t, err) 101 lastVirtualL2BlockNumber, err := st.GetLastL2BlockNumber(ctx, nil) 102 require.NoError(t, err) 103 t.Logf("lastConsolidatedL2BlockNumber: %d lastVirtualL2BlockNumber: %d", lastConsolidatedL2BlockNumber, lastVirtualL2BlockNumber) 104 require.Equal(t, lastConsolidatedL2BlockNumber, lastVirtualL2BlockNumber) 105 106 require.NoError(t, operations.Teardown()) 107 }) 108 } 109 }