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  }