From 29b38a5a01b7723fe33ae95cf278f5f6e584475f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Wed, 18 Oct 2023 08:55:58 +0200 Subject: [PATCH 01/12] prover v3.0.0-RC3-fork.6 --- docker-compose.yml | 2 +- test/docker-compose.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7b1e0592e6..f34b1972d3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -107,7 +107,7 @@ services: zkevm-prover: container_name: zkevm-prover restart: unless-stopped - image: hermeznetwork/zkevm-prover:v2.2.3 + image: hermeznetwork/zkevm-prover:v3.0.0-RC3-fork.6 depends_on: zkevm-state-db: condition: service_healthy diff --git a/test/docker-compose.yml b/test/docker-compose.yml index a00598dd0e..7930bef2b1 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -348,7 +348,7 @@ services: zkevm-prover: container_name: zkevm-prover - image: hermeznetwork/zkevm-prover:v2.2.3 + image: hermeznetwork/zkevm-prover:v3.0.0-RC3-fork.6 ports: - 50061:50061 # MT - 50071:50071 # Executor @@ -422,7 +422,7 @@ services: zkevm-permissionless-prover: container_name: zkevm-permissionless-prover - image: hermeznetwork/zkevm-prover:v2.2.3 + image: hermeznetwork/zkevm-prover:v3.0.0-RC3-fork.6 ports: # - 50058:50058 # Prover - 50059:50052 # Mock prover From 6a2d93005c594449a1ae5b7abf25758e6e4ce164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Wed, 18 Oct 2023 08:59:46 +0200 Subject: [PATCH 02/12] prover v3.0.0 --- docker-compose.yml | 2 +- test/docker-compose.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index f34b1972d3..b539dc4689 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -107,7 +107,7 @@ services: zkevm-prover: container_name: zkevm-prover restart: unless-stopped - image: hermeznetwork/zkevm-prover:v3.0.0-RC3-fork.6 + image: hermeznetwork/zkevm-prover:v3.0.0 depends_on: zkevm-state-db: condition: service_healthy diff --git a/test/docker-compose.yml b/test/docker-compose.yml index 7930bef2b1..377924d793 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -348,7 +348,7 @@ services: zkevm-prover: container_name: zkevm-prover - image: hermeznetwork/zkevm-prover:v3.0.0-RC3-fork.6 + image: hermeznetwork/zkevm-prover:v3.0.0 ports: - 50061:50061 # MT - 50071:50071 # Executor @@ -422,7 +422,7 @@ services: zkevm-permissionless-prover: container_name: zkevm-permissionless-prover - image: hermeznetwork/zkevm-prover:v3.0.0-RC3-fork.6 + image: hermeznetwork/zkevm-prover:v3.0.0 ports: # - 50058:50058 # Prover - 50059:50052 # Mock prover From 520645eb64efda57ddeab3634b2114ee33c80b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Wed, 18 Oct 2023 10:46:19 +0200 Subject: [PATCH 03/12] update prover to v3.0.0-RC1 --- test/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/docker-compose.yml b/test/docker-compose.yml index 377924d793..3b31942791 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -348,7 +348,7 @@ services: zkevm-prover: container_name: zkevm-prover - image: hermeznetwork/zkevm-prover:v3.0.0 + image: hermeznetwork/zkevm-prover:v3.0.0-RC1 ports: - 50061:50061 # MT - 50071:50071 # Executor @@ -422,7 +422,7 @@ services: zkevm-permissionless-prover: container_name: zkevm-permissionless-prover - image: hermeznetwork/zkevm-prover:v3.0.0 + image: hermeznetwork/zkevm-prover:v3.0.0-RC1 ports: # - 50058:50058 # Prover - 50059:50052 # Mock prover From 6f9c8e7ad7ad3e5622ecd87bb099a3732bb5fe0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Wed, 18 Oct 2023 11:14:30 +0200 Subject: [PATCH 04/12] update prover to v0.3.1-RC1 --- docker-compose.yml | 2 +- go.mod | 2 +- go.sum | 4 ++-- sequencer/sequencer.go | 2 +- tools/datastreamer/main.go | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b539dc4689..10999534d8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -107,7 +107,7 @@ services: zkevm-prover: container_name: zkevm-prover restart: unless-stopped - image: hermeznetwork/zkevm-prover:v3.0.0 + image: hermeznetwork/zkevm-prover:v3.0.0-RC1 depends_on: zkevm-state-db: condition: service_healthy diff --git a/go.mod b/go.mod index 0046a35436..483135fa2a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/0xPolygonHermez/zkevm-node go 1.21 require ( - github.com/0xPolygonHermez/zkevm-data-streamer v0.0.12 + github.com/0xPolygonHermez/zkevm-data-streamer v0.1.0 github.com/didip/tollbooth/v6 v6.1.2 github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 github.com/ethereum/go-ethereum v1.13.2 diff --git a/go.sum b/go.sum index 6ed752bc47..64cc86b257 100644 --- a/go.sum +++ b/go.sum @@ -42,8 +42,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/0xPolygonHermez/zkevm-data-streamer v0.0.12 h1:Sk8jD/f/SrkbQ+OXajGqenYi1sTqPN0JMG311DoL0GI= -github.com/0xPolygonHermez/zkevm-data-streamer v0.0.12/go.mod h1:853hkExOKPpMqbyEGqF8cuobSlbVd2OLVEZoRFTGRzo= +github.com/0xPolygonHermez/zkevm-data-streamer v0.1.0 h1:fYsPST5nwgE+IAQMa53kk1jgGJcKwUAmtOd4gABm92I= +github.com/0xPolygonHermez/zkevm-data-streamer v0.1.0/go.mod h1:853hkExOKPpMqbyEGqF8cuobSlbVd2OLVEZoRFTGRzo= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= diff --git a/sequencer/sequencer.go b/sequencer/sequencer.go index 65405e64e6..70f69f5a3d 100644 --- a/sequencer/sequencer.go +++ b/sequencer/sequencer.go @@ -89,7 +89,7 @@ func (s *Sequencer) Start(ctx context.Context) { // Start stream server if enabled if s.cfg.StreamServer.Enabled { - streamServer, err := datastreamer.New(s.cfg.StreamServer.Port, state.StreamTypeSequencer, s.cfg.StreamServer.Filename, &s.cfg.StreamServer.Log) + streamServer, err := datastreamer.NewServer(s.cfg.StreamServer.Port, state.StreamTypeSequencer, s.cfg.StreamServer.Filename, &s.cfg.StreamServer.Log) if err != nil { log.Fatalf("failed to create stream server, err: %v", err) } diff --git a/tools/datastreamer/main.go b/tools/datastreamer/main.go index 0bde965988..d034373a03 100644 --- a/tools/datastreamer/main.go +++ b/tools/datastreamer/main.go @@ -100,7 +100,7 @@ func main() { func initializeStreamServer(c *config.Config) (*datastreamer.StreamServer, error) { // Create a stream server - streamServer, err := datastreamer.New(c.StreamServer.Port, state.StreamTypeSequencer, c.StreamServer.Filename, &c.StreamServer.Log) + streamServer, err := datastreamer.NewServer(c.StreamServer.Port, state.StreamTypeSequencer, c.StreamServer.Filename, &c.StreamServer.Log) if err != nil { return nil, err } From 0b3833058e0cf7d104b5fd76b0d9a82bc43ff3ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Wed, 18 Oct 2023 12:39:54 +0200 Subject: [PATCH 05/12] update tests to forkID6 --- ci/e2e-group10/forced_batches_test.go | 2 +- ci/e2e-group10/forced_batches_vector_group2_test.go | 2 +- ci/e2e-group11/forced_batches_vector_group3_test.go | 2 +- ci/e2e-group9/forced_batches_vector_group1_test.go | 4 ++-- etherman/etherman_test.go | 4 ++-- jsonrpc/endpoints_zkevm_test.go | 8 ++++---- pool/pool_test.go | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ci/e2e-group10/forced_batches_test.go b/ci/e2e-group10/forced_batches_test.go index d2e2efb080..dc0ed445cf 100644 --- a/ci/e2e-group10/forced_batches_test.go +++ b/ci/e2e-group10/forced_batches_test.go @@ -24,7 +24,7 @@ import ( const ( toAddressHex = "0x4d5Cf5032B2a844602278b01199ED191A86c93ff" gerFinalityBlocks = uint64(250) - forkID5 = 5 + forkID6 = 6 ) var ( diff --git a/ci/e2e-group10/forced_batches_vector_group2_test.go b/ci/e2e-group10/forced_batches_vector_group2_test.go index 0faf78a046..a0e1655646 100644 --- a/ci/e2e-group10/forced_batches_vector_group2_test.go +++ b/ci/e2e-group10/forced_batches_vector_group2_test.go @@ -71,7 +71,7 @@ func TestForcedBatchesVectorFiles(t *testing.T) { require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) decodedData, err := hex.DecodeHex(testCase.BatchL2Data) require.NoError(t, err) - _, txBytes, _, err := state.DecodeTxs(decodedData, forkID5) + _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) require.NoError(t, err) actualNewStateRoot := forcedBatch.StateRoot diff --git a/ci/e2e-group11/forced_batches_vector_group3_test.go b/ci/e2e-group11/forced_batches_vector_group3_test.go index 4bbf4b508b..a1d9172697 100644 --- a/ci/e2e-group11/forced_batches_vector_group3_test.go +++ b/ci/e2e-group11/forced_batches_vector_group3_test.go @@ -24,7 +24,7 @@ import ( ) const ( - forkID5 = 5 + forkID6 = 6 ) func TestForcedBatchesVectorFiles(t *testing.T) { diff --git a/ci/e2e-group9/forced_batches_vector_group1_test.go b/ci/e2e-group9/forced_batches_vector_group1_test.go index 81fd0db8ac..bad4555e35 100644 --- a/ci/e2e-group9/forced_batches_vector_group1_test.go +++ b/ci/e2e-group9/forced_batches_vector_group1_test.go @@ -24,7 +24,7 @@ import ( ) const ( - forkID5 uint64 = 5 + forkID6 uint64 = 6 ) func TestForcedBatchesVectorFiles(t *testing.T) { @@ -64,7 +64,7 @@ func TestForcedBatchesVectorFiles(t *testing.T) { log.Info("###################") genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) require.NoError(t, opsman.SetGenesis(genesisActions)) - require.NoError(t, opsman.SetForkID(forkID5)) + require.NoError(t, opsman.SetForkID(forkID6)) require.NoError(t, opsman.Setup()) // Check initial root diff --git a/etherman/etherman_test.go b/etherman/etherman_test.go index 62896ff26c..61359ab3f3 100644 --- a/etherman/etherman_test.go +++ b/etherman/etherman_test.go @@ -27,7 +27,7 @@ import ( ) const ( - forkID5 = 5 + forkID6 = 6 ) func init() { @@ -319,7 +319,7 @@ func TestSendSequences(t *testing.T) { require.NoError(t, err) tx1 := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - batchL2Data, err := state.EncodeTransactions([]types.Transaction{*tx1}, constants.EffectivePercentage, forkID5) + batchL2Data, err := state.EncodeTransactions([]types.Transaction{*tx1}, constants.EffectivePercentage, forkID6) require.NoError(t, err) sequence := ethmanTypes.Sequence{ GlobalExitRoot: ger, diff --git a/jsonrpc/endpoints_zkevm_test.go b/jsonrpc/endpoints_zkevm_test.go index bac0229302..4c1b428fac 100644 --- a/jsonrpc/endpoints_zkevm_test.go +++ b/jsonrpc/endpoints_zkevm_test.go @@ -22,7 +22,7 @@ import ( ) const ( - forkID5 = 5 + forkID6 = 6 ) func TestConsolidatedBlockNumber(t *testing.T) { @@ -714,7 +714,7 @@ func TestGetBatchByNumber(t *testing.T) { batchTxs = append(batchTxs, *tx) effectivePercentages = append(effectivePercentages, state.MaxEffectivePercentage) } - batchL2Data, err := state.EncodeTransactions(batchTxs, effectivePercentages, forkID5) + batchL2Data, err := state.EncodeTransactions(batchTxs, effectivePercentages, forkID6) require.NoError(t, err) tc.ExpectedResult.BatchL2Data = batchL2Data batch := &state.Batch{ @@ -833,7 +833,7 @@ func TestGetBatchByNumber(t *testing.T) { batchTxs = append(batchTxs, *tx) effectivePercentages = append(effectivePercentages, state.MaxEffectivePercentage) } - batchL2Data, err := state.EncodeTransactions(batchTxs, effectivePercentages, forkID5) + batchL2Data, err := state.EncodeTransactions(batchTxs, effectivePercentages, forkID6) require.NoError(t, err) batch := &state.Batch{ @@ -982,7 +982,7 @@ func TestGetBatchByNumber(t *testing.T) { batchTxs = append(batchTxs, *tx) effectivePercentages = append(effectivePercentages, state.MaxEffectivePercentage) } - batchL2Data, err := state.EncodeTransactions(batchTxs, effectivePercentages, forkID5) + batchL2Data, err := state.EncodeTransactions(batchTxs, effectivePercentages, forkID6) require.NoError(t, err) var fb uint64 = 1 batch := &state.Batch{ diff --git a/pool/pool_test.go b/pool/pool_test.go index 10a354eed9..85ae23bb8d 100644 --- a/pool/pool_test.go +++ b/pool/pool_test.go @@ -38,7 +38,7 @@ import ( ) const ( - forkID5 = 5 + forkID6 = 6 senderPrivateKey = "0x28b2b0318721be8c8339199172cd7cc8f5e273800a35616ec893083a4b32c02e" senderAddress = "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D" ) @@ -284,7 +284,7 @@ func Test_AddPreEIP155Tx(t *testing.T) { batchL2Data := "0xe580843b9aca00830186a0941275fbb540c8efc58b812ba83b0d0b8b9917ae98808464fbb77c6b39bdc5f8e458aba689f2a1ff8c543a94e4817bda40f3fe34080c4ab26c1e3c2fc2cda93bc32f0a79940501fd505dcf48d94abfde932ebf1417f502cb0d9de81bff" b, err := hex.DecodeHex(batchL2Data) require.NoError(t, err) - txs, _, _, err := state.DecodeTxs(b, forkID5) + txs, _, _, err := state.DecodeTxs(b, forkID6) require.NoError(t, err) tx := txs[0] From cbdd1158727dd070813da379f77bd054ddd196f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Wed, 18 Oct 2023 12:42:58 +0200 Subject: [PATCH 06/12] update tests to forkID6 --- ci/e2e-group11/forced_batches_vector_group3_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/e2e-group11/forced_batches_vector_group3_test.go b/ci/e2e-group11/forced_batches_vector_group3_test.go index a1d9172697..9f9b748bff 100644 --- a/ci/e2e-group11/forced_batches_vector_group3_test.go +++ b/ci/e2e-group11/forced_batches_vector_group3_test.go @@ -75,7 +75,7 @@ func TestForcedBatchesVectorFiles(t *testing.T) { require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) decodedData, err := hex.DecodeHex(testCase.BatchL2Data) require.NoError(t, err) - _, txBytes, _, err := state.DecodeTxs(decodedData, forkID5) + _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) require.NoError(t, err) actualNewStateRoot := forcedBatch.StateRoot From 5c027a8b546f341be316fb8c5095f1487a62ee99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Wed, 18 Oct 2023 13:14:28 +0200 Subject: [PATCH 07/12] update prover image --- ci/e2e-group10/forced_batches_test.go | 2 +- ci/e2e-group9/forced_batches_vector_group1_test.go | 2 +- config/environments/local/local.genesis.config.json | 2 +- test/config/test.genesis.config.json | 2 +- test/docker-compose.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ci/e2e-group10/forced_batches_test.go b/ci/e2e-group10/forced_batches_test.go index dc0ed445cf..1b572d068b 100644 --- a/ci/e2e-group10/forced_batches_test.go +++ b/ci/e2e-group10/forced_batches_test.go @@ -61,7 +61,7 @@ func TestForcedBatches(t *testing.T) { unsignedTx := types.NewTransaction(nonce, toAddress, amount, gasLimit, gasPrice, nil) signedTx, err := auth.Signer(auth.From, unsignedTx) require.NoError(t, err) - encodedTxs, err := state.EncodeTransactions([]types.Transaction{*signedTx}, constants.EffectivePercentage, forkID5) + encodedTxs, err := state.EncodeTransactions([]types.Transaction{*signedTx}, constants.EffectivePercentage, forkID6) require.NoError(t, err) forcedBatch, err := sendForcedBatch(t, encodedTxs, opsman) require.NoError(t, err) diff --git a/ci/e2e-group9/forced_batches_vector_group1_test.go b/ci/e2e-group9/forced_batches_vector_group1_test.go index bad4555e35..1286211f88 100644 --- a/ci/e2e-group9/forced_batches_vector_group1_test.go +++ b/ci/e2e-group9/forced_batches_vector_group1_test.go @@ -76,7 +76,7 @@ func TestForcedBatchesVectorFiles(t *testing.T) { require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) decodedData, err := hex.DecodeHex(testCase.BatchL2Data) require.NoError(t, err) - _, txBytes, _, err := state.DecodeTxs(decodedData, forkID5) + _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) require.NoError(t, err) forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) require.NoError(t, err) diff --git a/config/environments/local/local.genesis.config.json b/config/environments/local/local.genesis.config.json index e78f355783..44f698467e 100644 --- a/config/environments/local/local.genesis.config.json +++ b/config/environments/local/local.genesis.config.json @@ -6,7 +6,7 @@ "polygonZkEVMGlobalExitRootAddress": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" }, "root": "0xd88680f1b151dd67518f9aca85161424c0cac61df2f5424a3ddc04ea25adecc7", - "genesisBlockNumber": 102, + "genesisBlockNumber": 134, "genesis": [ { "contractName": "PolygonZkEVMDeployer", diff --git a/test/config/test.genesis.config.json b/test/config/test.genesis.config.json index e78f355783..44f698467e 100644 --- a/test/config/test.genesis.config.json +++ b/test/config/test.genesis.config.json @@ -6,7 +6,7 @@ "polygonZkEVMGlobalExitRootAddress": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" }, "root": "0xd88680f1b151dd67518f9aca85161424c0cac61df2f5424a3ddc04ea25adecc7", - "genesisBlockNumber": 102, + "genesisBlockNumber": 134, "genesis": [ { "contractName": "PolygonZkEVMDeployer", diff --git a/test/docker-compose.yml b/test/docker-compose.yml index 3b31942791..160fc82801 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -320,7 +320,7 @@ services: zkevm-mock-l1-network: container_name: zkevm-mock-l1-network - image: hermeznetwork/geth-zkevm-contracts:v2.0.0-RC1-fork.5-geth1.12.0 + image: hermeznetwork/geth-zkevm-contracts:v2.0.0-fork.6-geth1.12.0 ports: - 8545:8545 - 8546:8546 From 6e80de90c35e5077c1a7c8569973fb73387aee70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Wed, 18 Oct 2023 14:12:39 +0200 Subject: [PATCH 08/12] udpate test --- test/e2e/forced_batches_vector_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/forced_batches_vector_test.go b/test/e2e/forced_batches_vector_test.go index 05b0eab7f3..cab9987c7c 100644 --- a/test/e2e/forced_batches_vector_test.go +++ b/test/e2e/forced_batches_vector_test.go @@ -24,7 +24,7 @@ import ( ) const ( - forkID = 5 + forkID = 6 ) func TestForcedBatchesVectorFiles(t *testing.T) { From cce731044bc6b63ddb60c67ffa8b78e5ac1451a8 Mon Sep 17 00:00:00 2001 From: Nikolay Nedkov Date: Wed, 18 Oct 2023 17:01:14 +0300 Subject: [PATCH 09/12] Changing the forced batch tests to use genesisBlockNumber from the test.genesis.config.json. Signed-off-by: Nikolay Nedkov --- ci/e2e-group10/forced_batches_vector_group2_test.go | 10 ++++++++-- ci/e2e-group11/forced_batches_vector_group3_test.go | 9 +++++++-- ci/e2e-group9/forced_batches_vector_group1_test.go | 9 +++++++-- config/network.go | 12 +++++++----- test/e2e/forced_batches_vector_test.go | 9 +++++++-- test/e2e/state_test.go | 7 ++++++- test/operations/manager.go | 8 ++++---- 7 files changed, 46 insertions(+), 18 deletions(-) diff --git a/ci/e2e-group10/forced_batches_vector_group2_test.go b/ci/e2e-group10/forced_batches_vector_group2_test.go index a0e1655646..c1434c0e08 100644 --- a/ci/e2e-group10/forced_batches_vector_group2_test.go +++ b/ci/e2e-group10/forced_batches_vector_group2_test.go @@ -9,6 +9,7 @@ import ( "testing" "time" + "github.com/0xPolygonHermez/zkevm-node/config" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" "github.com/0xPolygonHermez/zkevm-node/hex" "github.com/0xPolygonHermez/zkevm-node/log" @@ -30,7 +31,11 @@ func TestForcedBatchesVectorFiles(t *testing.T) { } vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group2" ctx := context.Background() - err := filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { + genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") + require.NoError(t, err) + genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) + require.NoError(t, err) + err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } @@ -59,7 +64,8 @@ func TestForcedBatchesVectorFiles(t *testing.T) { log.Info("# Setting Genesis #") log.Info("###################") genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) - require.NoError(t, opsman.SetGenesis(genesisActions)) + + require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) require.NoError(t, opsman.Setup()) // Check initial root diff --git a/ci/e2e-group11/forced_batches_vector_group3_test.go b/ci/e2e-group11/forced_batches_vector_group3_test.go index 9f9b748bff..44e479852d 100644 --- a/ci/e2e-group11/forced_batches_vector_group3_test.go +++ b/ci/e2e-group11/forced_batches_vector_group3_test.go @@ -9,6 +9,7 @@ import ( "testing" "time" + "github.com/0xPolygonHermez/zkevm-node/config" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" "github.com/0xPolygonHermez/zkevm-node/hex" "github.com/0xPolygonHermez/zkevm-node/log" @@ -34,7 +35,11 @@ func TestForcedBatchesVectorFiles(t *testing.T) { } vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group3" ctx := context.Background() - err := filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { + genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") + require.NoError(t, err) + genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) + require.NoError(t, err) + err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } @@ -63,7 +68,7 @@ func TestForcedBatchesVectorFiles(t *testing.T) { log.Info("# Setting Genesis #") log.Info("###################") genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) - require.NoError(t, opsman.SetGenesis(genesisActions)) + require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) require.NoError(t, opsman.Setup()) // Check initial root diff --git a/ci/e2e-group9/forced_batches_vector_group1_test.go b/ci/e2e-group9/forced_batches_vector_group1_test.go index 1286211f88..b6abd1ee9b 100644 --- a/ci/e2e-group9/forced_batches_vector_group1_test.go +++ b/ci/e2e-group9/forced_batches_vector_group1_test.go @@ -9,6 +9,7 @@ import ( "testing" "time" + "github.com/0xPolygonHermez/zkevm-node/config" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" "github.com/0xPolygonHermez/zkevm-node/hex" "github.com/0xPolygonHermez/zkevm-node/log" @@ -34,7 +35,11 @@ func TestForcedBatchesVectorFiles(t *testing.T) { } vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group1" ctx := context.Background() - err := filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { + genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") + require.NoError(t, err) + genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) + require.NoError(t, err) + err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } @@ -63,7 +68,7 @@ func TestForcedBatchesVectorFiles(t *testing.T) { log.Info("# Setting Genesis #") log.Info("###################") genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) - require.NoError(t, opsman.SetGenesis(genesisActions)) + require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) require.NoError(t, opsman.SetForkID(forkID6)) require.NoError(t, opsman.Setup()) diff --git a/config/network.go b/config/network.go index 57f1ac8488..a0076a4a18 100644 --- a/config/network.go +++ b/config/network.go @@ -71,22 +71,23 @@ func (cfg *Config) loadNetworkConfig(ctx *cli.Context) { networkJSON = TestnetNetworkConfigJSON case string(custom): var err error - networkJSON, err = loadGenesisFileAsString(ctx) + cfgPath := ctx.String(FlagCustomNetwork) + networkJSON, err = LoadGenesisFileAsString(cfgPath) if err != nil { panic(err.Error()) } default: log.Fatalf("unsupported --network value. Must be one of: [%s, %s, %s]", mainnet, testnet, custom) } - config, err := loadGenesisFromJSONString(networkJSON) + config, err := LoadGenesisFromJSONString(networkJSON) if err != nil { panic(fmt.Errorf("failed to load genesis configuration from file. Error: %v", err)) } cfg.NetworkConfig = config } -func loadGenesisFileAsString(ctx *cli.Context) (string, error) { - cfgPath := ctx.String(FlagCustomNetwork) +// LoadGenesisFileAsString loads the genesis file as a string +func LoadGenesisFileAsString(cfgPath string) (string, error) { if cfgPath != "" { f, err := os.Open(cfgPath) //nolint:gosec if err != nil { @@ -109,7 +110,8 @@ func loadGenesisFileAsString(ctx *cli.Context) (string, error) { } } -func loadGenesisFromJSONString(jsonStr string) (NetworkConfig, error) { +// LoadGenesisFromJSONString loads the genesis file from JSON string +func LoadGenesisFromJSONString(jsonStr string) (NetworkConfig, error) { var cfg NetworkConfig var cfgJSON GenesisFromJSON diff --git a/test/e2e/forced_batches_vector_test.go b/test/e2e/forced_batches_vector_test.go index cab9987c7c..a9207773ee 100644 --- a/test/e2e/forced_batches_vector_test.go +++ b/test/e2e/forced_batches_vector_test.go @@ -9,6 +9,7 @@ import ( "testing" "time" + "github.com/0xPolygonHermez/zkevm-node/config" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" "github.com/0xPolygonHermez/zkevm-node/hex" "github.com/0xPolygonHermez/zkevm-node/log" @@ -34,7 +35,11 @@ func TestForcedBatchesVectorFiles(t *testing.T) { } vectorFilesDir := "./../vectors/src/state-transition/forced-tx" ctx := context.Background() - err := filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { + genesisFileAsStr, err := config.LoadGenesisFileAsString("../config/test.genesis.config.json") + require.NoError(t, err) + genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) + require.NoError(t, err) + err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } @@ -63,7 +68,7 @@ func TestForcedBatchesVectorFiles(t *testing.T) { log.Info("# Setting Genesis #") log.Info("###################") genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) - require.NoError(t, opsman.SetGenesis(genesisActions)) + require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) require.NoError(t, opsman.Setup()) // Check initial root diff --git a/test/e2e/state_test.go b/test/e2e/state_test.go index 38dabedb34..2960afd197 100644 --- a/test/e2e/state_test.go +++ b/test/e2e/state_test.go @@ -7,6 +7,7 @@ import ( "strconv" "testing" + "github.com/0xPolygonHermez/zkevm-node/config" "github.com/0xPolygonHermez/zkevm-node/encoding" "github.com/0xPolygonHermez/zkevm-node/state" "github.com/0xPolygonHermez/zkevm-node/test/operations" @@ -30,6 +31,10 @@ func TestStateTransition(t *testing.T) { // Load test vectors testCases, err := vectors.LoadStateTransitionTestCases("./../vectors/src/state-transition/no-data/general.json") require.NoError(t, err) + genesisFileAsStr, err := config.LoadGenesisFileAsString("../config/test.genesis.config.json") + require.NoError(t, err) + genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) + require.NoError(t, err) for _, testCase := range testCases { t.Run(testCase.Description, func(t *testing.T) { @@ -54,7 +59,7 @@ func TestStateTransition(t *testing.T) { for _, gacc := range testCase.GenesisAccounts { genesisAccounts[gacc.Address] = gacc.Balance.Int } - require.NoError(t, opsman.SetGenesisAccountsBalance(genesisAccounts)) + require.NoError(t, opsman.SetGenesisAccountsBalance(genesisConfig.Genesis.GenesisBlockNum, genesisAccounts)) // Check initial root require.NoError(t, opsman.CheckVirtualRoot(testCase.ExpectedOldRoot)) diff --git a/test/operations/manager.go b/test/operations/manager.go index 6a35485be6..82a3f809f9 100644 --- a/test/operations/manager.go +++ b/test/operations/manager.go @@ -137,7 +137,7 @@ func (m *Manager) CheckConsolidatedRoot(expectedRoot string) error { } // SetGenesisAccountsBalance creates the genesis block in the state. -func (m *Manager) SetGenesisAccountsBalance(genesisAccounts map[string]big.Int) error { +func (m *Manager) SetGenesisAccountsBalance(genesisBlockNumber uint64, genesisAccounts map[string]big.Int) error { var genesisActions []*state.GenesisAction for address, balanceValue := range genesisAccounts { action := &state.GenesisAction{ @@ -148,12 +148,12 @@ func (m *Manager) SetGenesisAccountsBalance(genesisAccounts map[string]big.Int) genesisActions = append(genesisActions, action) } - return m.SetGenesis(genesisActions) + return m.SetGenesis(genesisBlockNumber, genesisActions) } -func (m *Manager) SetGenesis(genesisActions []*state.GenesisAction) error { +func (m *Manager) SetGenesis(genesisBlockNumber uint64, genesisActions []*state.GenesisAction) error { genesisBlock := state.Block{ - BlockNumber: 102, + BlockNumber: genesisBlockNumber, BlockHash: state.ZeroHash, ParentHash: state.ZeroHash, ReceivedAt: time.Now(), From 0ef39c0a5c49e39b5e3a298874ab5576f6b441d4 Mon Sep 17 00:00:00 2001 From: Nikolay Nedkov Date: Wed, 18 Oct 2023 19:05:47 +0300 Subject: [PATCH 10/12] Fixing forced batch tests to be symlinks and fixing usage of SetForkID. Signed-off-by: Nikolay Nedkov --- ci/e2e-group10/forced_batches_test.go | 236 +---------------- .../forced_batches_vector_group2_test.go | 235 +---------------- ci/e2e-group10/shared.go | 1 + .../forced_batches_vector_group3_test.go | 238 +---------------- ci/e2e-group11/shared.go | 1 + .../forced_batches_vector_group1_test.go | 240 +----------------- ci/e2e-group9/shared.go | 1 + test/e2e/forced_batches_test.go | 23 +- ...o => forced_batches_vector_group1_test.go} | 114 +-------- test/e2e/forced_batches_vector_group2_test.go | 134 ++++++++++ test/e2e/forced_batches_vector_group3_test.go | 134 ++++++++++ test/e2e/shared.go | 102 ++++++++ test/operations/manager.go | 4 +- 13 files changed, 397 insertions(+), 1066 deletions(-) mode change 100644 => 120000 ci/e2e-group10/forced_batches_test.go mode change 100644 => 120000 ci/e2e-group10/forced_batches_vector_group2_test.go create mode 120000 ci/e2e-group10/shared.go mode change 100644 => 120000 ci/e2e-group11/forced_batches_vector_group3_test.go create mode 120000 ci/e2e-group11/shared.go mode change 100644 => 120000 ci/e2e-group9/forced_batches_vector_group1_test.go create mode 120000 ci/e2e-group9/shared.go rename test/e2e/{forced_batches_vector_test.go => forced_batches_vector_group1_test.go} (55%) create mode 100644 test/e2e/forced_batches_vector_group2_test.go create mode 100644 test/e2e/forced_batches_vector_group3_test.go diff --git a/ci/e2e-group10/forced_batches_test.go b/ci/e2e-group10/forced_batches_test.go deleted file mode 100644 index 1b572d068b..0000000000 --- a/ci/e2e-group10/forced_batches_test.go +++ /dev/null @@ -1,235 +0,0 @@ -package e2e - -import ( - "context" - "math/big" - "testing" - "time" - - "github.com/ethereum/go-ethereum/core/types" - - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmglobalexitroot" - "github.com/0xPolygonHermez/zkevm-node/log" - "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/0xPolygonHermez/zkevm-node/test/constants" - "github.com/0xPolygonHermez/zkevm-node/test/operations" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/require" -) - -const ( - toAddressHex = "0x4d5Cf5032B2a844602278b01199ED191A86c93ff" - gerFinalityBlocks = uint64(250) - forkID6 = 6 -) - -var ( - toAddress = common.HexToAddress(toAddressHex) -) - -func TestForcedBatches(t *testing.T) { - if testing.Short() { - t.Skip() - } - - defer func() { - require.NoError(t, operations.Teardown()) - }() - - var err error - nTxs := 10 - ctx := context.Background() - opsman, auth, client, amount, gasLimit, gasPrice, nonce := setupEnvironment(ctx, t) - - txs := make([]*types.Transaction, 0, nTxs) - for i := 0; i < nTxs; i++ { - tx := types.NewTransaction(nonce, toAddress, amount, gasLimit, gasPrice, nil) - nonce = nonce + 1 - txs = append(txs, tx) - } - - var l2BlockNumbers []*big.Int - l2BlockNumbers, err = operations.ApplyL2Txs(ctx, txs, auth, client, operations.VerifiedConfirmationLevel) - require.NoError(t, err) - - time.Sleep(2 * time.Second) - amount = big.NewInt(0).Add(amount, big.NewInt(10)) - unsignedTx := types.NewTransaction(nonce, toAddress, amount, gasLimit, gasPrice, nil) - signedTx, err := auth.Signer(auth.From, unsignedTx) - require.NoError(t, err) - encodedTxs, err := state.EncodeTransactions([]types.Transaction{*signedTx}, constants.EffectivePercentage, forkID6) - require.NoError(t, err) - forcedBatch, err := sendForcedBatch(t, encodedTxs, opsman) - require.NoError(t, err) - - // Checking if all txs sent before the forced batch were processed within previous closed batch - for _, l2blockNum := range l2BlockNumbers { - batch, err := opsman.State().GetBatchByL2BlockNumber(ctx, l2blockNum.Uint64(), nil) - require.NoError(t, err) - require.Less(t, batch.BatchNumber, forcedBatch.BatchNumber) - } -} - -func setupEnvironment(ctx context.Context, t *testing.T) (*operations.Manager, *bind.TransactOpts, *ethclient.Client, *big.Int, uint64, *big.Int, uint64) { - - err := operations.Teardown() - require.NoError(t, err) - opsCfg := operations.GetDefaultOperationsConfig() - opsCfg.State.MaxCumulativeGasUsed = 80000000000 - opsman, err := operations.NewManager(ctx, opsCfg) - require.NoError(t, err) - err = opsman.Setup() - require.NoError(t, err) - time.Sleep(5 * time.Second) - // Load account with balance on local genesis - auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL2ChainID) - require.NoError(t, err) - // Load eth client - client, err := ethclient.Dial(operations.DefaultL2NetworkURL) - require.NoError(t, err) - // Send txs - amount := big.NewInt(10000) - senderBalance, err := client.BalanceAt(ctx, auth.From, nil) - require.NoError(t, err) - senderNonce, err := client.PendingNonceAt(ctx, auth.From) - require.NoError(t, err) - - log.Infof("Receiver Addr: %v", toAddress.String()) - log.Infof("Sender Addr: %v", auth.From.String()) - log.Infof("Sender Balance: %v", senderBalance.String()) - log.Infof("Sender Nonce: %v", senderNonce) - - gasLimit, err := client.EstimateGas(ctx, ethereum.CallMsg{From: auth.From, To: &toAddress, Value: amount}) - require.NoError(t, err) - - gasPrice, err := client.SuggestGasPrice(ctx) - require.NoError(t, err) - - nonce, err := client.PendingNonceAt(ctx, auth.From) - require.NoError(t, err) - return opsman, auth, client, amount, gasLimit, gasPrice, nonce -} - -func sendForcedBatch(t *testing.T, txs []byte, opsman *operations.Manager) (*state.Batch, error) { - ctx := context.Background() - st := opsman.State() - // Connect to ethereum node - ethClient, err := ethclient.Dial(operations.DefaultL1NetworkURL) - require.NoError(t, err) - - initialGer, _, err := st.GetLatestGer(ctx, gerFinalityBlocks) - require.NoError(t, err) - - // Create smc client - zkEvmAddr := common.HexToAddress(operations.DefaultL1ZkEVMSmartContract) - zkEvm, err := polygonzkevm.NewPolygonzkevm(zkEvmAddr, ethClient) - require.NoError(t, err) - - auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL1ChainID) - require.NoError(t, err) - - log.Info("Using address: ", auth.From) - - num, err := zkEvm.LastForceBatch(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - - log.Info("Number of forceBatches in the smc: ", num) - - // Get tip - tip, err := zkEvm.GetForcedBatchFee(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - - managerAddress, err := zkEvm.GlobalExitRootManager(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - - manager, err := polygonzkevmglobalexitroot.NewPolygonzkevmglobalexitroot(managerAddress, ethClient) - require.NoError(t, err) - - rootInContract, err := manager.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - rootInContractHash := common.BytesToHash(rootInContract[:]) - - disallowed, err := zkEvm.IsForcedBatchDisallowed(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - if disallowed { - tx, err := zkEvm.ActivateForceBatches(auth) - require.NoError(t, err) - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - } - - currentBlock, err := ethClient.BlockByNumber(ctx, nil) - require.NoError(t, err) - - log.Debug("currentBlock.Time(): ", currentBlock.Time()) - - // Send forceBatch - tx, err := zkEvm.ForceBatch(auth, txs, tip) - require.NoError(t, err) - - log.Info("TxHash: ", tx.Hash()) - time.Sleep(1 * time.Second) - - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - - query := ethereum.FilterQuery{ - FromBlock: currentBlock.Number(), - Addresses: []common.Address{zkEvmAddr}, - } - logs, err := ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - - var forcedBatch *state.Batch - for _, vLog := range logs { - if vLog.Topics[0] != constants.ForcedBatchSignatureHash { - logs, err = ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - continue - } - fb, err := zkEvm.ParseForceBatch(vLog) - if err != nil { - log.Errorf("failed to parse force batch log event, err: ", err) - } - log.Debugf("log decoded: %+v", fb) - ger := fb.LastGlobalExitRoot - log.Info("GlobalExitRoot: ", ger) - log.Info("Transactions: ", common.Bytes2Hex(fb.Transactions)) - fullBlock, err := ethClient.BlockByHash(ctx, vLog.BlockHash) - if err != nil { - log.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err) - return nil, err - } - log.Info("MinForcedTimestamp: ", fullBlock.Time()) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - for err == state.ErrStateNotSynchronized { - time.Sleep(1 * time.Second) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - } - log.Info("ForcedBatchNum: ", forcedBatch.BatchNumber) - require.NoError(t, err) - require.NotNil(t, forcedBatch) - - log.Info("Waiting for batch to be virtualized...") - err = operations.WaitBatchToBeVirtualized(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - - log.Info("Waiting for batch to be consolidated...") - err = operations.WaitBatchToBeConsolidated(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - - if rootInContractHash != initialGer.GlobalExitRoot { - finalGer, _, err := st.GetLatestGer(ctx, gerFinalityBlocks) - require.NoError(t, err) - if finalGer.GlobalExitRoot != rootInContractHash { - log.Fatal("global exit root is not updated") - } - } - } - - return forcedBatch, nil -} diff --git a/ci/e2e-group10/forced_batches_test.go b/ci/e2e-group10/forced_batches_test.go new file mode 120000 index 0000000000..8681813c2c --- /dev/null +++ b/ci/e2e-group10/forced_batches_test.go @@ -0,0 +1 @@ +../../test/e2e/forced_batches_test.go \ No newline at end of file diff --git a/ci/e2e-group10/forced_batches_vector_group2_test.go b/ci/e2e-group10/forced_batches_vector_group2_test.go deleted file mode 100644 index c1434c0e08..0000000000 --- a/ci/e2e-group10/forced_batches_vector_group2_test.go +++ /dev/null @@ -1,234 +0,0 @@ -package e2e - -import ( - "context" - "math/big" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/0xPolygonHermez/zkevm-node/config" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" - "github.com/0xPolygonHermez/zkevm-node/hex" - "github.com/0xPolygonHermez/zkevm-node/log" - "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/0xPolygonHermez/zkevm-node/test/constants" - "github.com/0xPolygonHermez/zkevm-node/test/operations" - "github.com/0xPolygonHermez/zkevm-node/test/vectors" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/require" -) - -func TestForcedBatchesVectorFiles(t *testing.T) { - - if testing.Short() { - t.Skip() - } - vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group2" - ctx := context.Background() - genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") - require.NoError(t, err) - genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) - require.NoError(t, err) - err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.IsDir() && !strings.HasSuffix(info.Name(), "list.json") { - - t.Run(info.Name(), func(t *testing.T) { - - defer func() { - require.NoError(t, operations.Teardown()) - }() - - // Load test vectors - log.Info("=====================================================================") - log.Info(path) - log.Info("=====================================================================") - testCase, err := vectors.LoadStateTransitionTestCaseV2(path) - require.NoError(t, err) - - opsCfg := operations.GetDefaultOperationsConfig() - opsCfg.State.MaxCumulativeGasUsed = 80000000000 - opsman, err := operations.NewManager(ctx, opsCfg) - require.NoError(t, err) - - // Setting Genesis - log.Info("###################") - log.Info("# Setting Genesis #") - log.Info("###################") - genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) - - require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) - require.NoError(t, opsman.Setup()) - - // Check initial root - log.Info("################################") - log.Info("# Verifying initial state root #") - log.Info("################################") - actualOldStateRoot, err := opsman.State().GetLastStateRoot(ctx, nil) - require.NoError(t, err) - require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) - decodedData, err := hex.DecodeHex(testCase.BatchL2Data) - require.NoError(t, err) - _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) - forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) - require.NoError(t, err) - actualNewStateRoot := forcedBatch.StateRoot - isClosed, err := opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) - require.NoError(t, err) - - // wait until is closed - for !isClosed { - time.Sleep(1 * time.Second) - isClosed, err = opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) - require.NoError(t, err) - } - - log.Info("#######################") - log.Info("# Verifying new leafs #") - log.Info("#######################") - merkleTree := opsman.State().GetTree() - for _, expectedNewLeaf := range testCase.ExpectedNewLeafs { - if expectedNewLeaf.IsSmartContract { - log.Info("Smart Contract Address: ", expectedNewLeaf.Address) - } else { - log.Info("Account Address: ", expectedNewLeaf.Address) - } - log.Info("Verifying Balance...") - actualBalance, err := merkleTree.GetBalance(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.Balance.String(), actualBalance.String()) - - log.Info("Verifying Nonce...") - actualNonce, err := merkleTree.GetNonce(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.Nonce, actualNonce.String()) - if expectedNewLeaf.IsSmartContract { - log.Info("Verifying Storage...") - for positionHex, expectedNewStorageHex := range expectedNewLeaf.Storage { - position, ok := big.NewInt(0).SetString(positionHex[2:], 16) - require.True(t, ok) - expectedNewStorage, ok := big.NewInt(0).SetString(expectedNewStorageHex[2:], 16) - require.True(t, ok) - actualStorage, err := merkleTree.GetStorageAt(ctx, common.HexToAddress(expectedNewLeaf.Address), position, actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewStorage, actualStorage) - } - - log.Info("Verifying HashBytecode...") - actualHashByteCode, err := merkleTree.GetCodeHash(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.HashBytecode, common.BytesToHash(actualHashByteCode).String()) - } - } - return - }) - - return nil - } - return nil - }) - require.NoError(t, err) -} - -func sendForcedBatchForVector(t *testing.T, txs []byte, opsman *operations.Manager) (*state.Batch, error) { - ctx := context.Background() - st := opsman.State() - // Connect to ethereum node - ethClient, err := ethclient.Dial(operations.DefaultL1NetworkURL) - require.NoError(t, err) - - // Create smc client - zkEvmAddr := common.HexToAddress(operations.DefaultL1ZkEVMSmartContract) - zkEvm, err := polygonzkevm.NewPolygonzkevm(zkEvmAddr, ethClient) - require.NoError(t, err) - - auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL1ChainID) - require.NoError(t, err) - - log.Info("Using address: ", auth.From) - num, err := zkEvm.LastForceBatch(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - log.Info("Number of forceBatches in the smc: ", num) - - // Get tip - tip, err := zkEvm.GetForcedBatchFee(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - - disallowed, err := zkEvm.IsForcedBatchDisallowed(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - if disallowed { - tx, err := zkEvm.ActivateForceBatches(auth) - require.NoError(t, err) - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - } - - // Send forceBatch - tx, err := zkEvm.ForceBatch(auth, txs, tip) - require.NoError(t, err) - - log.Info("Forced Batch Submit to L1 TxHash: ", tx.Hash()) - time.Sleep(1 * time.Second) - - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - - currentBlock, err := ethClient.BlockByNumber(ctx, nil) - require.NoError(t, err) - log.Debug("currentBlock.Time(): ", currentBlock.Time()) - - query := ethereum.FilterQuery{ - FromBlock: currentBlock.Number(), - Addresses: []common.Address{zkEvmAddr}, - } - logs, err := ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - - var forcedBatch *state.Batch - for _, vLog := range logs { - if vLog.Topics[0] != constants.ForcedBatchSignatureHash { - logs, err = ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - continue - } - fb, err := zkEvm.ParseForceBatch(vLog) - if err != nil { - log.Errorf("failed to parse force batch log event, err: ", err) - } - log.Debugf("log decoded: %+v", fb) - ger := fb.LastGlobalExitRoot - log.Info("GlobalExitRoot: ", ger) - log.Info("Transactions: ", common.Bytes2Hex(fb.Transactions)) - fullBlock, err := ethClient.BlockByHash(ctx, vLog.BlockHash) - if err != nil { - log.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err) - return nil, err - } - log.Info("MinForcedTimestamp: ", fullBlock.Time()) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - for err == state.ErrStateNotSynchronized { - time.Sleep(1 * time.Second) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - } - require.NoError(t, err) - require.NotNil(t, forcedBatch) - - log.Info("Waiting Forced Batch to be virtualized ...") - err = operations.WaitBatchToBeVirtualized(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - - log.Info("Waiting Forced Batch to be consolidated ...") - err = operations.WaitBatchToBeConsolidated(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - } - - return forcedBatch, nil -} diff --git a/ci/e2e-group10/forced_batches_vector_group2_test.go b/ci/e2e-group10/forced_batches_vector_group2_test.go new file mode 120000 index 0000000000..e52931aaa9 --- /dev/null +++ b/ci/e2e-group10/forced_batches_vector_group2_test.go @@ -0,0 +1 @@ +../../test/e2e/forced_batches_vector_group2_test.go \ No newline at end of file diff --git a/ci/e2e-group10/shared.go b/ci/e2e-group10/shared.go new file mode 120000 index 0000000000..2762ace935 --- /dev/null +++ b/ci/e2e-group10/shared.go @@ -0,0 +1 @@ +../../test/e2e/shared.go \ No newline at end of file diff --git a/ci/e2e-group11/forced_batches_vector_group3_test.go b/ci/e2e-group11/forced_batches_vector_group3_test.go deleted file mode 100644 index 44e479852d..0000000000 --- a/ci/e2e-group11/forced_batches_vector_group3_test.go +++ /dev/null @@ -1,237 +0,0 @@ -package e2e - -import ( - "context" - "math/big" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/0xPolygonHermez/zkevm-node/config" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" - "github.com/0xPolygonHermez/zkevm-node/hex" - "github.com/0xPolygonHermez/zkevm-node/log" - "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/0xPolygonHermez/zkevm-node/test/constants" - "github.com/0xPolygonHermez/zkevm-node/test/operations" - "github.com/0xPolygonHermez/zkevm-node/test/vectors" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/require" -) - -const ( - forkID6 = 6 -) - -func TestForcedBatchesVectorFiles(t *testing.T) { - - if testing.Short() { - t.Skip() - } - vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group3" - ctx := context.Background() - genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") - require.NoError(t, err) - genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) - require.NoError(t, err) - err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.IsDir() && !strings.HasSuffix(info.Name(), "list.json") { - - t.Run(info.Name(), func(t *testing.T) { - - defer func() { - require.NoError(t, operations.Teardown()) - }() - - // Load test vectors - log.Info("=====================================================================") - log.Info(path) - log.Info("=====================================================================") - testCase, err := vectors.LoadStateTransitionTestCaseV2(path) - require.NoError(t, err) - - opsCfg := operations.GetDefaultOperationsConfig() - opsCfg.State.MaxCumulativeGasUsed = 80000000000 - opsman, err := operations.NewManager(ctx, opsCfg) - require.NoError(t, err) - - // Setting Genesis - log.Info("###################") - log.Info("# Setting Genesis #") - log.Info("###################") - genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) - require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) - require.NoError(t, opsman.Setup()) - - // Check initial root - log.Info("################################") - log.Info("# Verifying initial state root #") - log.Info("################################") - actualOldStateRoot, err := opsman.State().GetLastStateRoot(ctx, nil) - require.NoError(t, err) - require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) - decodedData, err := hex.DecodeHex(testCase.BatchL2Data) - require.NoError(t, err) - _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) - forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) - require.NoError(t, err) - actualNewStateRoot := forcedBatch.StateRoot - isClosed, err := opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) - require.NoError(t, err) - - // wait until is closed - for !isClosed { - time.Sleep(1 * time.Second) - isClosed, err = opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) - require.NoError(t, err) - } - - log.Info("#######################") - log.Info("# Verifying new leafs #") - log.Info("#######################") - merkleTree := opsman.State().GetTree() - for _, expectedNewLeaf := range testCase.ExpectedNewLeafs { - if expectedNewLeaf.IsSmartContract { - log.Info("Smart Contract Address: ", expectedNewLeaf.Address) - } else { - log.Info("Account Address: ", expectedNewLeaf.Address) - } - log.Info("Verifying Balance...") - actualBalance, err := merkleTree.GetBalance(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.Balance.String(), actualBalance.String()) - - log.Info("Verifying Nonce...") - actualNonce, err := merkleTree.GetNonce(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.Nonce, actualNonce.String()) - if expectedNewLeaf.IsSmartContract { - log.Info("Verifying Storage...") - for positionHex, expectedNewStorageHex := range expectedNewLeaf.Storage { - position, ok := big.NewInt(0).SetString(positionHex[2:], 16) - require.True(t, ok) - expectedNewStorage, ok := big.NewInt(0).SetString(expectedNewStorageHex[2:], 16) - require.True(t, ok) - actualStorage, err := merkleTree.GetStorageAt(ctx, common.HexToAddress(expectedNewLeaf.Address), position, actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewStorage, actualStorage) - } - - log.Info("Verifying HashBytecode...") - actualHashByteCode, err := merkleTree.GetCodeHash(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.HashBytecode, common.BytesToHash(actualHashByteCode).String()) - } - } - return - }) - - return nil - } - return nil - }) - require.NoError(t, err) -} - -func sendForcedBatchForVector(t *testing.T, txs []byte, opsman *operations.Manager) (*state.Batch, error) { - ctx := context.Background() - st := opsman.State() - // Connect to ethereum node - ethClient, err := ethclient.Dial(operations.DefaultL1NetworkURL) - require.NoError(t, err) - - // Create smc client - zkEvmAddr := common.HexToAddress(operations.DefaultL1ZkEVMSmartContract) - zkEvm, err := polygonzkevm.NewPolygonzkevm(zkEvmAddr, ethClient) - require.NoError(t, err) - - auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL1ChainID) - require.NoError(t, err) - - log.Info("Using address: ", auth.From) - num, err := zkEvm.LastForceBatch(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - log.Info("Number of forceBatches in the smc: ", num) - - // Get tip - tip, err := zkEvm.GetForcedBatchFee(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - - disallowed, err := zkEvm.IsForcedBatchDisallowed(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - if disallowed { - tx, err := zkEvm.ActivateForceBatches(auth) - require.NoError(t, err) - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - } - - // Send forceBatch - tx, err := zkEvm.ForceBatch(auth, txs, tip) - require.NoError(t, err) - - log.Info("Forced Batch Submit to L1 TxHash: ", tx.Hash()) - time.Sleep(1 * time.Second) - - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - - currentBlock, err := ethClient.BlockByNumber(ctx, nil) - require.NoError(t, err) - log.Debug("currentBlock.Time(): ", currentBlock.Time()) - - query := ethereum.FilterQuery{ - FromBlock: currentBlock.Number(), - Addresses: []common.Address{zkEvmAddr}, - } - logs, err := ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - - var forcedBatch *state.Batch - for _, vLog := range logs { - if vLog.Topics[0] != constants.ForcedBatchSignatureHash { - logs, err = ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - continue - } - fb, err := zkEvm.ParseForceBatch(vLog) - if err != nil { - log.Errorf("failed to parse force batch log event, err: ", err) - } - log.Debugf("log decoded: %+v", fb) - ger := fb.LastGlobalExitRoot - log.Info("GlobalExitRoot: ", ger) - log.Info("Transactions: ", common.Bytes2Hex(fb.Transactions)) - fullBlock, err := ethClient.BlockByHash(ctx, vLog.BlockHash) - if err != nil { - log.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err) - return nil, err - } - log.Info("MinForcedTimestamp: ", fullBlock.Time()) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - for err == state.ErrStateNotSynchronized { - time.Sleep(1 * time.Second) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - } - require.NoError(t, err) - require.NotNil(t, forcedBatch) - - log.Info("Waiting Forced Batch to be virtualized ...") - err = operations.WaitBatchToBeVirtualized(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - - log.Info("Waiting Forced Batch to be consolidated ...") - err = operations.WaitBatchToBeConsolidated(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - } - - return forcedBatch, nil -} diff --git a/ci/e2e-group11/forced_batches_vector_group3_test.go b/ci/e2e-group11/forced_batches_vector_group3_test.go new file mode 120000 index 0000000000..2bcb4c322a --- /dev/null +++ b/ci/e2e-group11/forced_batches_vector_group3_test.go @@ -0,0 +1 @@ +../../test/e2e/forced_batches_vector_group3_test.go \ No newline at end of file diff --git a/ci/e2e-group11/shared.go b/ci/e2e-group11/shared.go new file mode 120000 index 0000000000..2762ace935 --- /dev/null +++ b/ci/e2e-group11/shared.go @@ -0,0 +1 @@ +../../test/e2e/shared.go \ No newline at end of file diff --git a/ci/e2e-group9/forced_batches_vector_group1_test.go b/ci/e2e-group9/forced_batches_vector_group1_test.go deleted file mode 100644 index b6abd1ee9b..0000000000 --- a/ci/e2e-group9/forced_batches_vector_group1_test.go +++ /dev/null @@ -1,239 +0,0 @@ -package e2e - -import ( - "context" - "math/big" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/0xPolygonHermez/zkevm-node/config" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" - "github.com/0xPolygonHermez/zkevm-node/hex" - "github.com/0xPolygonHermez/zkevm-node/log" - "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/0xPolygonHermez/zkevm-node/test/constants" - "github.com/0xPolygonHermez/zkevm-node/test/operations" - "github.com/0xPolygonHermez/zkevm-node/test/vectors" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/require" -) - -const ( - forkID6 uint64 = 6 -) - -func TestForcedBatchesVectorFiles(t *testing.T) { - - if testing.Short() { - t.Skip() - } - vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group1" - ctx := context.Background() - genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") - require.NoError(t, err) - genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) - require.NoError(t, err) - err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.IsDir() && !strings.HasSuffix(info.Name(), "list.json") { - - t.Run(info.Name(), func(t *testing.T) { - - defer func() { - require.NoError(t, operations.Teardown()) - }() - - // Load test vectors - log.Info("=====================================================================") - log.Info(path) - log.Info("=====================================================================") - testCase, err := vectors.LoadStateTransitionTestCaseV2(path) - require.NoError(t, err) - - opsCfg := operations.GetDefaultOperationsConfig() - opsCfg.State.MaxCumulativeGasUsed = 80000000000 - opsman, err := operations.NewManager(ctx, opsCfg) - require.NoError(t, err) - - // Setting Genesis - log.Info("###################") - log.Info("# Setting Genesis #") - log.Info("###################") - genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) - require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) - require.NoError(t, opsman.SetForkID(forkID6)) - require.NoError(t, opsman.Setup()) - - // Check initial root - log.Info("################################") - log.Info("# Verifying initial state root #") - log.Info("################################") - actualOldStateRoot, err := opsman.State().GetLastStateRoot(ctx, nil) - require.NoError(t, err) - require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) - decodedData, err := hex.DecodeHex(testCase.BatchL2Data) - require.NoError(t, err) - _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) - require.NoError(t, err) - forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) - require.NoError(t, err) - actualNewStateRoot := forcedBatch.StateRoot - isClosed, err := opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) - require.NoError(t, err) - - // wait until is closed - for !isClosed { - time.Sleep(1 * time.Second) - isClosed, err = opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) - require.NoError(t, err) - } - - log.Info("#######################") - log.Info("# Verifying new leafs #") - log.Info("#######################") - merkleTree := opsman.State().GetTree() - for _, expectedNewLeaf := range testCase.ExpectedNewLeafs { - if expectedNewLeaf.IsSmartContract { - log.Info("Smart Contract Address: ", expectedNewLeaf.Address) - } else { - log.Info("Account Address: ", expectedNewLeaf.Address) - } - log.Info("Verifying Balance...") - actualBalance, err := merkleTree.GetBalance(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.Balance.String(), actualBalance.String()) - - log.Info("Verifying Nonce...") - actualNonce, err := merkleTree.GetNonce(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.Nonce, actualNonce.String()) - if expectedNewLeaf.IsSmartContract { - log.Info("Verifying Storage...") - for positionHex, expectedNewStorageHex := range expectedNewLeaf.Storage { - position, ok := big.NewInt(0).SetString(positionHex[2:], 16) - require.True(t, ok) - expectedNewStorage, ok := big.NewInt(0).SetString(expectedNewStorageHex[2:], 16) - require.True(t, ok) - actualStorage, err := merkleTree.GetStorageAt(ctx, common.HexToAddress(expectedNewLeaf.Address), position, actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewStorage, actualStorage) - } - - log.Info("Verifying HashBytecode...") - actualHashByteCode, err := merkleTree.GetCodeHash(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) - require.NoError(t, err) - require.Equal(t, expectedNewLeaf.HashBytecode, common.BytesToHash(actualHashByteCode).String()) - } - } - return - }) - - return nil - } - return nil - }) - require.NoError(t, err) -} - -func sendForcedBatchForVector(t *testing.T, txs []byte, opsman *operations.Manager) (*state.Batch, error) { - ctx := context.Background() - st := opsman.State() - // Connect to ethereum node - ethClient, err := ethclient.Dial(operations.DefaultL1NetworkURL) - require.NoError(t, err) - - // Create smc client - zkEvmAddr := common.HexToAddress(operations.DefaultL1ZkEVMSmartContract) - zkEvm, err := polygonzkevm.NewPolygonzkevm(zkEvmAddr, ethClient) - require.NoError(t, err) - - auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL1ChainID) - require.NoError(t, err) - - log.Info("Using address: ", auth.From) - num, err := zkEvm.LastForceBatch(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - log.Info("Number of forceBatches in the smc: ", num) - - // Get tip - tip, err := zkEvm.GetForcedBatchFee(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - - disallowed, err := zkEvm.IsForcedBatchDisallowed(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - if disallowed { - tx, err := zkEvm.ActivateForceBatches(auth) - require.NoError(t, err) - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - } - - // Send forceBatch - tx, err := zkEvm.ForceBatch(auth, txs, tip) - require.NoError(t, err) - - log.Info("Forced Batch Submit to L1 TxHash: ", tx.Hash()) - time.Sleep(1 * time.Second) - - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - - currentBlock, err := ethClient.BlockByNumber(ctx, nil) - require.NoError(t, err) - log.Debug("currentBlock.Time(): ", currentBlock.Time()) - - query := ethereum.FilterQuery{ - FromBlock: currentBlock.Number(), - Addresses: []common.Address{zkEvmAddr}, - } - logs, err := ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - - var forcedBatch *state.Batch - for _, vLog := range logs { - if vLog.Topics[0] != constants.ForcedBatchSignatureHash { - logs, err = ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - continue - } - fb, err := zkEvm.ParseForceBatch(vLog) - if err != nil { - log.Errorf("failed to parse force batch log event, err: ", err) - } - log.Debugf("log decoded: %+v", fb) - ger := fb.LastGlobalExitRoot - log.Info("GlobalExitRoot: ", ger) - log.Info("Transactions: ", common.Bytes2Hex(fb.Transactions)) - fullBlock, err := ethClient.BlockByHash(ctx, vLog.BlockHash) - if err != nil { - log.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err) - return nil, err - } - log.Info("MinForcedTimestamp: ", fullBlock.Time()) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - for err == state.ErrStateNotSynchronized { - time.Sleep(1 * time.Second) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - } - require.NoError(t, err) - require.NotNil(t, forcedBatch) - - log.Info("Waiting Forced Batch to be virtualized ...") - err = operations.WaitBatchToBeVirtualized(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - - log.Info("Waiting Forced Batch to be consolidated ...") - err = operations.WaitBatchToBeConsolidated(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - } - - return forcedBatch, nil -} diff --git a/ci/e2e-group9/forced_batches_vector_group1_test.go b/ci/e2e-group9/forced_batches_vector_group1_test.go new file mode 120000 index 0000000000..dcba3a9097 --- /dev/null +++ b/ci/e2e-group9/forced_batches_vector_group1_test.go @@ -0,0 +1 @@ +../../test/e2e/forced_batches_vector_group1_test.go \ No newline at end of file diff --git a/ci/e2e-group9/shared.go b/ci/e2e-group9/shared.go new file mode 120000 index 0000000000..2762ace935 --- /dev/null +++ b/ci/e2e-group9/shared.go @@ -0,0 +1 @@ +../../test/e2e/shared.go \ No newline at end of file diff --git a/test/e2e/forced_batches_test.go b/test/e2e/forced_batches_test.go index 88808db20c..149114e28f 100644 --- a/test/e2e/forced_batches_test.go +++ b/test/e2e/forced_batches_test.go @@ -3,10 +3,13 @@ package e2e import ( "context" "math/big" - "sync" "testing" "time" + "github.com/0xPolygonHermez/zkevm-node/config" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmglobalexitroot" "github.com/0xPolygonHermez/zkevm-node/log" @@ -16,7 +19,6 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" ) @@ -42,27 +44,21 @@ func TestForcedBatches(t *testing.T) { txs = append(txs, tx) } - wgNormalL2Transfers := new(sync.WaitGroup) - wgNormalL2Transfers.Add(1) var l2BlockNumbers []*big.Int - go func() { - defer wgNormalL2Transfers.Done() - l2BlockNumbers, err = operations.ApplyL2Txs(ctx, txs, auth, client, operations.VerifiedConfirmationLevel) - require.NoError(t, err) - }() + l2BlockNumbers, err = operations.ApplyL2Txs(ctx, txs, auth, client, operations.VerifiedConfirmationLevel) + require.NoError(t, err) time.Sleep(2 * time.Second) amount = big.NewInt(0).Add(amount, big.NewInt(10)) unsignedTx := types.NewTransaction(nonce, toAddress, amount, gasLimit, gasPrice, nil) signedTx, err := auth.Signer(auth.From, unsignedTx) require.NoError(t, err) - encodedTxs, err := state.EncodeTransactions([]types.Transaction{*signedTx}, constants.EffectivePercentage, forkID) + encodedTxs, err := state.EncodeTransactions([]types.Transaction{*signedTx}, constants.EffectivePercentage, forkID6) require.NoError(t, err) forcedBatch, err := sendForcedBatch(t, encodedTxs, opsman) require.NoError(t, err) // Checking if all txs sent before the forced batch were processed within previous closed batch - wgNormalL2Transfers.Wait() for _, l2blockNum := range l2BlockNumbers { batch, err := opsman.State().GetBatchByL2BlockNumber(ctx, l2blockNum.Uint64(), nil) require.NoError(t, err) @@ -75,8 +71,13 @@ func setupEnvironment(ctx context.Context, t *testing.T) (*operations.Manager, * require.NoError(t, err) opsCfg := operations.GetDefaultOperationsConfig() opsCfg.State.MaxCumulativeGasUsed = 80000000000 + genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") + require.NoError(t, err) + genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) + require.NoError(t, err) opsman, err := operations.NewManager(ctx, opsCfg) require.NoError(t, err) + require.NoError(t, opsman.SetForkID(genesisConfig.Genesis.GenesisBlockNum, forkID6)) err = opsman.Setup() require.NoError(t, err) time.Sleep(5 * time.Second) diff --git a/test/e2e/forced_batches_vector_test.go b/test/e2e/forced_batches_vector_group1_test.go similarity index 55% rename from test/e2e/forced_batches_vector_test.go rename to test/e2e/forced_batches_vector_group1_test.go index a9207773ee..7bf6c70cf3 100644 --- a/test/e2e/forced_batches_vector_test.go +++ b/test/e2e/forced_batches_vector_group1_test.go @@ -10,32 +10,23 @@ import ( "time" "github.com/0xPolygonHermez/zkevm-node/config" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" "github.com/0xPolygonHermez/zkevm-node/hex" "github.com/0xPolygonHermez/zkevm-node/log" "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/0xPolygonHermez/zkevm-node/test/constants" "github.com/0xPolygonHermez/zkevm-node/test/operations" "github.com/0xPolygonHermez/zkevm-node/test/vectors" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" ) -const ( - forkID = 6 -) - -func TestForcedBatchesVectorFiles(t *testing.T) { +func TestForcedBatchesVectorFilesGroup1(t *testing.T) { if testing.Short() { t.Skip() } - vectorFilesDir := "./../vectors/src/state-transition/forced-tx" + vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group1" ctx := context.Background() - genesisFileAsStr, err := config.LoadGenesisFileAsString("../config/test.genesis.config.json") + genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") require.NoError(t, err) genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) require.NoError(t, err) @@ -69,6 +60,7 @@ func TestForcedBatchesVectorFiles(t *testing.T) { log.Info("###################") genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) + require.NoError(t, opsman.SetForkID(genesisConfig.Genesis.GenesisBlockNum, forkID6)) require.NoError(t, opsman.Setup()) // Check initial root @@ -80,7 +72,8 @@ func TestForcedBatchesVectorFiles(t *testing.T) { require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) decodedData, err := hex.DecodeHex(testCase.BatchL2Data) require.NoError(t, err) - _, txBytes, _, err := state.DecodeTxs(decodedData, forkID) + _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) + require.NoError(t, err) forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) require.NoError(t, err) actualNewStateRoot := forcedBatch.StateRoot @@ -140,98 +133,3 @@ func TestForcedBatchesVectorFiles(t *testing.T) { }) require.NoError(t, err) } - -func sendForcedBatchForVector(t *testing.T, txs []byte, opsman *operations.Manager) (*state.Batch, error) { - ctx := context.Background() - st := opsman.State() - // Connect to ethereum node - ethClient, err := ethclient.Dial(operations.DefaultL1NetworkURL) - require.NoError(t, err) - - // Create smc client - zkEvmAddr := common.HexToAddress(operations.DefaultL1ZkEVMSmartContract) - zkEvm, err := polygonzkevm.NewPolygonzkevm(zkEvmAddr, ethClient) - require.NoError(t, err) - - auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL1ChainID) - require.NoError(t, err) - - log.Info("Using address: ", auth.From) - num, err := zkEvm.LastForceBatch(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - log.Info("Number of forceBatches in the smc: ", num) - - // Get tip - tip, err := zkEvm.GetForcedBatchFee(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - - disallowed, err := zkEvm.IsForcedBatchDisallowed(&bind.CallOpts{Pending: false}) - require.NoError(t, err) - if disallowed { - tx, err := zkEvm.ActivateForceBatches(auth) - require.NoError(t, err) - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - } - - // Send forceBatch - tx, err := zkEvm.ForceBatch(auth, txs, tip) - require.NoError(t, err) - - log.Info("Forced Batch Submit to L1 TxHash: ", tx.Hash()) - time.Sleep(1 * time.Second) - - err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) - require.NoError(t, err) - - currentBlock, err := ethClient.BlockByNumber(ctx, nil) - require.NoError(t, err) - log.Debug("currentBlock.Time(): ", currentBlock.Time()) - - query := ethereum.FilterQuery{ - FromBlock: currentBlock.Number(), - Addresses: []common.Address{zkEvmAddr}, - } - logs, err := ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - - var forcedBatch *state.Batch - for _, vLog := range logs { - if vLog.Topics[0] != constants.ForcedBatchSignatureHash { - logs, err = ethClient.FilterLogs(ctx, query) - require.NoError(t, err) - continue - } - fb, err := zkEvm.ParseForceBatch(vLog) - if err != nil { - log.Errorf("failed to parse force batch log event, err: ", err) - } - log.Debugf("log decoded: %+v", fb) - ger := fb.LastGlobalExitRoot - log.Info("GlobalExitRoot: ", ger) - log.Info("Transactions: ", common.Bytes2Hex(fb.Transactions)) - fullBlock, err := ethClient.BlockByHash(ctx, vLog.BlockHash) - if err != nil { - log.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err) - return nil, err - } - log.Info("MinForcedTimestamp: ", fullBlock.Time()) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - for err == state.ErrStateNotSynchronized { - time.Sleep(1 * time.Second) - forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) - } - require.NoError(t, err) - require.NotNil(t, forcedBatch) - - log.Info("Waiting Forced Batch to be virtualized ...") - err = operations.WaitBatchToBeVirtualized(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - - log.Info("Waiting Forced Batch to be consolidated ...") - err = operations.WaitBatchToBeConsolidated(forcedBatch.BatchNumber, 4*time.Minute, st) - require.NoError(t, err) - } - - return forcedBatch, nil -} diff --git a/test/e2e/forced_batches_vector_group2_test.go b/test/e2e/forced_batches_vector_group2_test.go new file mode 100644 index 0000000000..21070db52f --- /dev/null +++ b/test/e2e/forced_batches_vector_group2_test.go @@ -0,0 +1,134 @@ +package e2e + +import ( + "context" + "math/big" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/config" + "github.com/0xPolygonHermez/zkevm-node/hex" + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/0xPolygonHermez/zkevm-node/test/operations" + "github.com/0xPolygonHermez/zkevm-node/test/vectors" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestForcedBatchesVectorFilesGroup2(t *testing.T) { + + if testing.Short() { + t.Skip() + } + vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group2" + ctx := context.Background() + genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") + require.NoError(t, err) + genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) + require.NoError(t, err) + err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() && !strings.HasSuffix(info.Name(), "list.json") { + + t.Run(info.Name(), func(t *testing.T) { + + defer func() { + require.NoError(t, operations.Teardown()) + }() + + // Load test vectors + log.Info("=====================================================================") + log.Info(path) + log.Info("=====================================================================") + testCase, err := vectors.LoadStateTransitionTestCaseV2(path) + require.NoError(t, err) + + opsCfg := operations.GetDefaultOperationsConfig() + opsCfg.State.MaxCumulativeGasUsed = 80000000000 + opsman, err := operations.NewManager(ctx, opsCfg) + require.NoError(t, err) + + // Setting Genesis + log.Info("###################") + log.Info("# Setting Genesis #") + log.Info("###################") + genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) + require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) + require.NoError(t, opsman.SetForkID(genesisConfig.Genesis.GenesisBlockNum, forkID6)) + require.NoError(t, opsman.Setup()) + + // Check initial root + log.Info("################################") + log.Info("# Verifying initial state root #") + log.Info("################################") + actualOldStateRoot, err := opsman.State().GetLastStateRoot(ctx, nil) + require.NoError(t, err) + require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) + decodedData, err := hex.DecodeHex(testCase.BatchL2Data) + require.NoError(t, err) + _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) + forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) + require.NoError(t, err) + actualNewStateRoot := forcedBatch.StateRoot + isClosed, err := opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) + require.NoError(t, err) + + // wait until is closed + for !isClosed { + time.Sleep(1 * time.Second) + isClosed, err = opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) + require.NoError(t, err) + } + + log.Info("#######################") + log.Info("# Verifying new leafs #") + log.Info("#######################") + merkleTree := opsman.State().GetTree() + for _, expectedNewLeaf := range testCase.ExpectedNewLeafs { + if expectedNewLeaf.IsSmartContract { + log.Info("Smart Contract Address: ", expectedNewLeaf.Address) + } else { + log.Info("Account Address: ", expectedNewLeaf.Address) + } + log.Info("Verifying Balance...") + actualBalance, err := merkleTree.GetBalance(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) + require.NoError(t, err) + require.Equal(t, expectedNewLeaf.Balance.String(), actualBalance.String()) + + log.Info("Verifying Nonce...") + actualNonce, err := merkleTree.GetNonce(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) + require.NoError(t, err) + require.Equal(t, expectedNewLeaf.Nonce, actualNonce.String()) + if expectedNewLeaf.IsSmartContract { + log.Info("Verifying Storage...") + for positionHex, expectedNewStorageHex := range expectedNewLeaf.Storage { + position, ok := big.NewInt(0).SetString(positionHex[2:], 16) + require.True(t, ok) + expectedNewStorage, ok := big.NewInt(0).SetString(expectedNewStorageHex[2:], 16) + require.True(t, ok) + actualStorage, err := merkleTree.GetStorageAt(ctx, common.HexToAddress(expectedNewLeaf.Address), position, actualNewStateRoot.Bytes()) + require.NoError(t, err) + require.Equal(t, expectedNewStorage, actualStorage) + } + + log.Info("Verifying HashBytecode...") + actualHashByteCode, err := merkleTree.GetCodeHash(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) + require.NoError(t, err) + require.Equal(t, expectedNewLeaf.HashBytecode, common.BytesToHash(actualHashByteCode).String()) + } + } + return + }) + + return nil + } + return nil + }) + require.NoError(t, err) +} diff --git a/test/e2e/forced_batches_vector_group3_test.go b/test/e2e/forced_batches_vector_group3_test.go new file mode 100644 index 0000000000..ec01446114 --- /dev/null +++ b/test/e2e/forced_batches_vector_group3_test.go @@ -0,0 +1,134 @@ +package e2e + +import ( + "context" + "math/big" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/config" + "github.com/0xPolygonHermez/zkevm-node/hex" + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/0xPolygonHermez/zkevm-node/test/operations" + "github.com/0xPolygonHermez/zkevm-node/test/vectors" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestForcedBatchesVectorFilesGroup3(t *testing.T) { + + if testing.Short() { + t.Skip() + } + vectorFilesDir := "./../vectors/src/state-transition/forced-tx/group3" + ctx := context.Background() + genesisFileAsStr, err := config.LoadGenesisFileAsString("../../test/config/test.genesis.config.json") + require.NoError(t, err) + genesisConfig, err := config.LoadGenesisFromJSONString(genesisFileAsStr) + require.NoError(t, err) + err = filepath.Walk(vectorFilesDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() && !strings.HasSuffix(info.Name(), "list.json") { + + t.Run(info.Name(), func(t *testing.T) { + + defer func() { + require.NoError(t, operations.Teardown()) + }() + + // Load test vectors + log.Info("=====================================================================") + log.Info(path) + log.Info("=====================================================================") + testCase, err := vectors.LoadStateTransitionTestCaseV2(path) + require.NoError(t, err) + + opsCfg := operations.GetDefaultOperationsConfig() + opsCfg.State.MaxCumulativeGasUsed = 80000000000 + opsman, err := operations.NewManager(ctx, opsCfg) + require.NoError(t, err) + + // Setting Genesis + log.Info("###################") + log.Info("# Setting Genesis #") + log.Info("###################") + genesisActions := vectors.GenerateGenesisActions(testCase.Genesis) + require.NoError(t, opsman.SetGenesis(genesisConfig.Genesis.GenesisBlockNum, genesisActions)) + require.NoError(t, opsman.SetForkID(genesisConfig.Genesis.GenesisBlockNum, forkID6)) + require.NoError(t, opsman.Setup()) + + // Check initial root + log.Info("################################") + log.Info("# Verifying initial state root #") + log.Info("################################") + actualOldStateRoot, err := opsman.State().GetLastStateRoot(ctx, nil) + require.NoError(t, err) + require.Equal(t, testCase.ExpectedOldStateRoot, actualOldStateRoot.Hex()) + decodedData, err := hex.DecodeHex(testCase.BatchL2Data) + require.NoError(t, err) + _, txBytes, _, err := state.DecodeTxs(decodedData, forkID6) + forcedBatch, err := sendForcedBatchForVector(t, txBytes, opsman) + require.NoError(t, err) + actualNewStateRoot := forcedBatch.StateRoot + isClosed, err := opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) + require.NoError(t, err) + + // wait until is closed + for !isClosed { + time.Sleep(1 * time.Second) + isClosed, err = opsman.State().IsBatchClosed(ctx, forcedBatch.BatchNumber, nil) + require.NoError(t, err) + } + + log.Info("#######################") + log.Info("# Verifying new leafs #") + log.Info("#######################") + merkleTree := opsman.State().GetTree() + for _, expectedNewLeaf := range testCase.ExpectedNewLeafs { + if expectedNewLeaf.IsSmartContract { + log.Info("Smart Contract Address: ", expectedNewLeaf.Address) + } else { + log.Info("Account Address: ", expectedNewLeaf.Address) + } + log.Info("Verifying Balance...") + actualBalance, err := merkleTree.GetBalance(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) + require.NoError(t, err) + require.Equal(t, expectedNewLeaf.Balance.String(), actualBalance.String()) + + log.Info("Verifying Nonce...") + actualNonce, err := merkleTree.GetNonce(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) + require.NoError(t, err) + require.Equal(t, expectedNewLeaf.Nonce, actualNonce.String()) + if expectedNewLeaf.IsSmartContract { + log.Info("Verifying Storage...") + for positionHex, expectedNewStorageHex := range expectedNewLeaf.Storage { + position, ok := big.NewInt(0).SetString(positionHex[2:], 16) + require.True(t, ok) + expectedNewStorage, ok := big.NewInt(0).SetString(expectedNewStorageHex[2:], 16) + require.True(t, ok) + actualStorage, err := merkleTree.GetStorageAt(ctx, common.HexToAddress(expectedNewLeaf.Address), position, actualNewStateRoot.Bytes()) + require.NoError(t, err) + require.Equal(t, expectedNewStorage, actualStorage) + } + + log.Info("Verifying HashBytecode...") + actualHashByteCode, err := merkleTree.GetCodeHash(ctx, common.HexToAddress(expectedNewLeaf.Address), actualNewStateRoot.Bytes()) + require.NoError(t, err) + require.Equal(t, expectedNewLeaf.HashBytecode, common.BytesToHash(actualHashByteCode).String()) + } + } + return + }) + + return nil + } + return nil + }) + require.NoError(t, err) +} diff --git a/test/e2e/shared.go b/test/e2e/shared.go index 9e464d7dd1..31c04cdcb3 100644 --- a/test/e2e/shared.go +++ b/test/e2e/shared.go @@ -5,6 +5,12 @@ import ( "context" "fmt" "math/big" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" + "github.com/0xPolygonHermez/zkevm-node/test/constants" + "github.com/stretchr/testify/require" "github.com/0xPolygonHermez/zkevm-node/log" "github.com/0xPolygonHermez/zkevm-node/state" @@ -20,6 +26,7 @@ const ( invalidParamsErrorCode = -32602 toAddressHex = "0x4d5Cf5032B2a844602278b01199ED191A86c93ff" gerFinalityBlocks = uint64(250) + forkID6 = 6 ) var ( @@ -123,3 +130,98 @@ func logTx(tx *ethTypes.Transaction) { //log.Debugf("RLP: ", hex.EncodeToHex(b)) log.Debugf("********************") } + +func sendForcedBatchForVector(t *testing.T, txs []byte, opsman *operations.Manager) (*state.Batch, error) { + ctx := context.Background() + st := opsman.State() + // Connect to ethereum node + ethClient, err := ethclient.Dial(operations.DefaultL1NetworkURL) + require.NoError(t, err) + + // Create smc client + zkEvmAddr := common.HexToAddress(operations.DefaultL1ZkEVMSmartContract) + zkEvm, err := polygonzkevm.NewPolygonzkevm(zkEvmAddr, ethClient) + require.NoError(t, err) + + auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL1ChainID) + require.NoError(t, err) + + log.Info("Using address: ", auth.From) + num, err := zkEvm.LastForceBatch(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + log.Info("Number of forceBatches in the smc: ", num) + + // Get tip + tip, err := zkEvm.GetForcedBatchFee(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + + disallowed, err := zkEvm.IsForcedBatchDisallowed(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + if disallowed { + tx, err := zkEvm.ActivateForceBatches(auth) + require.NoError(t, err) + err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) + require.NoError(t, err) + } + + // Send forceBatch + tx, err := zkEvm.ForceBatch(auth, txs, tip) + require.NoError(t, err) + + log.Info("Forced Batch Submit to L1 TxHash: ", tx.Hash()) + time.Sleep(1 * time.Second) + + err = operations.WaitTxToBeMined(ctx, ethClient, tx, operations.DefaultTimeoutTxToBeMined) + require.NoError(t, err) + + currentBlock, err := ethClient.BlockByNumber(ctx, nil) + require.NoError(t, err) + log.Debug("currentBlock.Time(): ", currentBlock.Time()) + + query := ethereum.FilterQuery{ + FromBlock: currentBlock.Number(), + Addresses: []common.Address{zkEvmAddr}, + } + logs, err := ethClient.FilterLogs(ctx, query) + require.NoError(t, err) + + var forcedBatch *state.Batch + for _, vLog := range logs { + if vLog.Topics[0] != constants.ForcedBatchSignatureHash { + logs, err = ethClient.FilterLogs(ctx, query) + require.NoError(t, err) + continue + } + fb, err := zkEvm.ParseForceBatch(vLog) + if err != nil { + log.Errorf("failed to parse force batch log event, err: ", err) + } + log.Debugf("log decoded: %+v", fb) + ger := fb.LastGlobalExitRoot + log.Info("GlobalExitRoot: ", ger) + log.Info("Transactions: ", common.Bytes2Hex(fb.Transactions)) + fullBlock, err := ethClient.BlockByHash(ctx, vLog.BlockHash) + if err != nil { + log.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err) + return nil, err + } + log.Info("MinForcedTimestamp: ", fullBlock.Time()) + forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) + for err == state.ErrStateNotSynchronized { + time.Sleep(1 * time.Second) + forcedBatch, err = st.GetBatchByForcedBatchNum(ctx, fb.ForceBatchNum, nil) + } + require.NoError(t, err) + require.NotNil(t, forcedBatch) + + log.Info("Waiting Forced Batch to be virtualized ...") + err = operations.WaitBatchToBeVirtualized(forcedBatch.BatchNumber, 4*time.Minute, st) + require.NoError(t, err) + + log.Info("Waiting Forced Batch to be consolidated ...") + err = operations.WaitBatchToBeConsolidated(forcedBatch.BatchNumber, 4*time.Minute, st) + require.NoError(t, err) + } + + return forcedBatch, nil +} diff --git a/test/operations/manager.go b/test/operations/manager.go index 82a3f809f9..6719eaa0ef 100644 --- a/test/operations/manager.go +++ b/test/operations/manager.go @@ -178,7 +178,7 @@ func (m *Manager) SetGenesis(genesisBlockNumber uint64, genesisActions []*state. } // SetForkID sets the initial forkID in db for testing purposes -func (m *Manager) SetForkID(forkID uint64) error { +func (m *Manager) SetForkID(blockNum uint64, forkID uint64) error { dbTx, err := m.st.BeginStateTransaction(m.ctx) if err != nil { return err @@ -190,7 +190,7 @@ func (m *Manager) SetForkID(forkID uint64) error { ToBatchNumber: math.MaxUint64, ForkId: forkID, Version: "forkID", - BlockNumber: 102, + BlockNumber: blockNum, } err = m.st.AddForkIDInterval(m.ctx, fID, dbTx) From aee9528743cb21ec0a5a6ae9e0dd4a583440a3fc Mon Sep 17 00:00:00 2001 From: Nikolay Nedkov Date: Wed, 18 Oct 2023 19:05:47 +0300 Subject: [PATCH 11/12] Fixing forced batch tests to be symlinks and fixing usage of SetForkID. Signed-off-by: Nikolay Nedkov From e6001bf1e07439aa581aa7b1ce1497e14fe65507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= Date: Thu, 19 Oct 2023 10:03:45 +0200 Subject: [PATCH 12/12] update prover image to v3.0.0-RC2 --- docker-compose.yml | 2 +- test/docker-compose.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 10999534d8..d52c048bb4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -107,7 +107,7 @@ services: zkevm-prover: container_name: zkevm-prover restart: unless-stopped - image: hermeznetwork/zkevm-prover:v3.0.0-RC1 + image: hermeznetwork/zkevm-prover:v3.0.0-RC2 depends_on: zkevm-state-db: condition: service_healthy diff --git a/test/docker-compose.yml b/test/docker-compose.yml index 160fc82801..d544f6889b 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -348,7 +348,7 @@ services: zkevm-prover: container_name: zkevm-prover - image: hermeznetwork/zkevm-prover:v3.0.0-RC1 + image: hermeznetwork/zkevm-prover:v3.0.0-RC2 ports: - 50061:50061 # MT - 50071:50071 # Executor @@ -422,7 +422,7 @@ services: zkevm-permissionless-prover: container_name: zkevm-permissionless-prover - image: hermeznetwork/zkevm-prover:v3.0.0-RC1 + image: hermeznetwork/zkevm-prover:v3.0.0-RC2 ports: # - 50058:50058 # Prover - 50059:50052 # Mock prover