From fbfbacd532bec083a22b81bb0a4709166f3ecf94 Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 24 Oct 2024 10:58:48 +0800 Subject: [PATCH 1/8] introduce TestTxPoolContentWithMinTip test case --- .../taiko-client/proposer/proposer_test.go | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/packages/taiko-client/proposer/proposer_test.go b/packages/taiko-client/proposer/proposer_test.go index f3a968a3759..ad836502104 100644 --- a/packages/taiko-client/proposer/proposer_test.go +++ b/packages/taiko-client/proposer/proposer_test.go @@ -2,6 +2,7 @@ package proposer import ( "context" + "crypto/ecdsa" "math/big" "os" "testing" @@ -119,6 +120,84 @@ func (s *ProposerTestSuite) SetupTest() { s.cancel = cancel } +func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } + skList := []string{ + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", // 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 + "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", // 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC + "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6", // 0x90F79bf6EB2c4f870365E785982E1f101E93b906 + "0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a", // 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 + "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba", // 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc + } + + var ( + p = s.p + privs []*ecdsa.PrivateKey + ) + + for _, sk := range skList { + priv, err := crypto.ToECDSA(common.FromHex(sk)) + s.Nil(err) + privs = append(privs, priv) + } + + for i := 0; i < 300; i++ { + for _, priv := range privs { + to := common.BigToAddress(big.NewInt(int64(i))) + _, err := testutils.SendDynamicFeeTx(s.RPCClient.L2, priv, &to, big.NewInt(1), nil) + s.Nil(err) + } + } + + for _, testCase := range []struct { + blockMaxGasLimit uint32 + blockMaxTxListBytes uint64 + maxTransactionsLists uint64 + + txLengthList []int + }{ + { + p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + p.MaxProposedTxListsPerEpoch, + []int{1500}, + }, + { + p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + p.MaxProposedTxListsPerEpoch * 5, + []int{1500}, + }, + { + p.protocolConfigs.BlockMaxGasLimit / 100, + rpc.BlockMaxTxListBytes, + 200, + []int{114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 18}, + }, + } { + res, err := s.RPCClient.GetPoolContent( + context.Background(), + p.proposerAddress, + testCase.blockMaxGasLimit, + testCase.blockMaxTxListBytes, + p.LocalAddresses, + testCase.maxTransactionsLists, + 0, + p.chainConfig, + ) + s.Nil(err) + + s.GreaterOrEqual(int(testCase.maxTransactionsLists), len(res)) + for i, txsLen := range testCase.txLengthList { + s.Equal(txsLen, res[i].TxList.Len()) + s.GreaterOrEqual(uint64(testCase.blockMaxGasLimit), res[i].EstimatedGasUsed) + s.GreaterOrEqual(testCase.blockMaxTxListBytes, res[i].BytesLength) + } + } +} + func (s *ProposerTestSuite) TestProposeTxLists() { p := s.p ctx := p.ctx From 339802673ffdbc61cf1469140c1664dd5be573dd Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 24 Oct 2024 14:07:54 +0800 Subject: [PATCH 2/8] introduce TestTxPoolContentWithMinTip test case --- .../taiko-client/proposer/proposer_test.go | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/taiko-client/proposer/proposer_test.go b/packages/taiko-client/proposer/proposer_test.go index ad836502104..f379e0f0291 100644 --- a/packages/taiko-client/proposer/proposer_test.go +++ b/packages/taiko-client/proposer/proposer_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" @@ -133,8 +134,10 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { } var ( - p = s.p - privs []*ecdsa.PrivateKey + p = s.p + privs []*ecdsa.PrivateKey + l2Cli = s.RPCClient.L2 + chainID = l2Cli.ChainID ) for _, sk := range skList { @@ -143,10 +146,13 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { privs = append(privs, priv) } - for i := 0; i < 300; i++ { - for _, priv := range privs { - to := common.BigToAddress(big.NewInt(int64(i))) - _, err := testutils.SendDynamicFeeTx(s.RPCClient.L2, priv, &to, big.NewInt(1), nil) + for _, priv := range privs { + auth, err := bind.NewKeyedTransactorWithChainID(priv, chainID) + s.Nil(err) + nonce, err := l2Cli.PendingNonceAt(context.Background(), auth.From) + s.Nil(err) + for i := 0; i < 300; i++ { + _, err = testutils.SendDynamicFeeTxWithNonce(s.RPCClient.L2, priv, nonce+uint64(i), &auth.From, big.NewInt(1), nil) s.Nil(err) } } @@ -171,10 +177,10 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { []int{1500}, }, { - p.protocolConfigs.BlockMaxGasLimit / 100, + p.protocolConfigs.BlockMaxGasLimit / 50, rpc.BlockMaxTxListBytes, 200, - []int{114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 18}, + []int{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 81}, }, } { res, err := s.RPCClient.GetPoolContent( From 82f12b1a005f606e1d12e96da1399546e070dc33 Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 24 Oct 2024 14:10:41 +0800 Subject: [PATCH 3/8] introduce TestTxPoolContentWithMinTip test case --- .../taiko-client/internal/testutils/helper.go | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/packages/taiko-client/internal/testutils/helper.go b/packages/taiko-client/internal/testutils/helper.go index d93e3499f15..4e6365bb76c 100644 --- a/packages/taiko-client/internal/testutils/helper.go +++ b/packages/taiko-client/internal/testutils/helper.go @@ -282,6 +282,50 @@ func SignatureFromRSV(r, s string, v byte) []byte { return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) } +func SendDynamicFeeTxWithNonce( + client *rpc.EthClient, + priv *ecdsa.PrivateKey, + nonce uint64, + to *common.Address, + value *big.Int, + data []byte, +) (*types.Transaction, error) { + head, err := client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + + auth, err := bind.NewKeyedTransactorWithChainID(priv, client.ChainID) + if err != nil { + return nil, err + } + + gasTipCap, err := client.SuggestGasTipCap(context.Background()) + if err != nil { + return nil, err + } + + tx, err := auth.Signer(auth.From, types.NewTx(&types.DynamicFeeTx{ + To: to, + Nonce: nonce, + Value: value, + GasTipCap: gasTipCap, + GasFeeCap: new(big.Int).Add( + gasTipCap, + new(big.Int).Mul(head.BaseFee, big.NewInt(2)), + ), + Gas: 2100_000, + Data: data, + })) + if err != nil { + return nil, err + } + if err = client.SendTransaction(context.Background(), tx); err != nil { + return nil, err + } + return tx, nil +} + // SendDynamicFeeTx sends a dynamic transaction, used for tests. func SendDynamicFeeTx( client *rpc.EthClient, From a33883fe2eb950423720e028ec6c7796650742c4 Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 24 Oct 2024 14:31:35 +0800 Subject: [PATCH 4/8] fix comments --- packages/taiko-client/internal/testutils/helper.go | 2 +- packages/taiko-client/proposer/proposer_test.go | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/taiko-client/internal/testutils/helper.go b/packages/taiko-client/internal/testutils/helper.go index 4e6365bb76c..36d7adc9331 100644 --- a/packages/taiko-client/internal/testutils/helper.go +++ b/packages/taiko-client/internal/testutils/helper.go @@ -282,7 +282,7 @@ func SignatureFromRSV(r, s string, v byte) []byte { return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) } -func SendDynamicFeeTxWithNonce( +func AssembleTestTx( client *rpc.EthClient, priv *ecdsa.PrivateKey, nonce uint64, diff --git a/packages/taiko-client/proposer/proposer_test.go b/packages/taiko-client/proposer/proposer_test.go index f379e0f0291..f377af3d301 100644 --- a/packages/taiko-client/proposer/proposer_test.go +++ b/packages/taiko-client/proposer/proposer_test.go @@ -134,25 +134,25 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { } var ( - p = s.p - privs []*ecdsa.PrivateKey - l2Cli = s.RPCClient.L2 - chainID = l2Cli.ChainID + p = s.p + privKeys []*ecdsa.PrivateKey + l2Cli = s.RPCClient.L2 + chainID = l2Cli.ChainID ) for _, sk := range skList { priv, err := crypto.ToECDSA(common.FromHex(sk)) s.Nil(err) - privs = append(privs, priv) + privKeys = append(privKeys, priv) } - for _, priv := range privs { + for _, priv := range privKeys { auth, err := bind.NewKeyedTransactorWithChainID(priv, chainID) s.Nil(err) nonce, err := l2Cli.PendingNonceAt(context.Background(), auth.From) s.Nil(err) for i := 0; i < 300; i++ { - _, err = testutils.SendDynamicFeeTxWithNonce(s.RPCClient.L2, priv, nonce+uint64(i), &auth.From, big.NewInt(1), nil) + _, err = testutils.AssembleTestTx(s.RPCClient.L2, priv, nonce+uint64(i), &auth.From, big.NewInt(1), nil) s.Nil(err) } } From a6b6d89ca4d38f16b0d4c643eb63b277e49d9562 Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 24 Oct 2024 14:32:57 +0800 Subject: [PATCH 5/8] fix comments --- packages/taiko-client/proposer/proposer_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/taiko-client/proposer/proposer_test.go b/packages/taiko-client/proposer/proposer_test.go index f377af3d301..e7d3fe3808d 100644 --- a/packages/taiko-client/proposer/proposer_test.go +++ b/packages/taiko-client/proposer/proposer_test.go @@ -125,7 +125,7 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { if os.Getenv("L2_NODE") == "l2_reth" { s.T().Skip() } - skList := []string{ + privetKeyHexList := []string{ "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", // 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", // 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6", // 0x90F79bf6EB2c4f870365E785982E1f101E93b906 @@ -140,7 +140,7 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { chainID = l2Cli.ChainID ) - for _, sk := range skList { + for _, sk := range privetKeyHexList { priv, err := crypto.ToECDSA(common.FromHex(sk)) s.Nil(err) privKeys = append(privKeys, priv) From 452ee7fdf0a1660ddb981b244a01ec11be71d230 Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 24 Oct 2024 15:12:38 +0800 Subject: [PATCH 6/8] check nonce --- .../taiko-client/proposer/proposer_test.go | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/taiko-client/proposer/proposer_test.go b/packages/taiko-client/proposer/proposer_test.go index e7d3fe3808d..3f3d4e6ed3b 100644 --- a/packages/taiko-client/proposer/proposer_test.go +++ b/packages/taiko-client/proposer/proposer_test.go @@ -3,6 +3,8 @@ package proposer import ( "context" "crypto/ecdsa" + "fmt" + "maps" "math/big" "os" "testing" @@ -125,6 +127,8 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { if os.Getenv("L2_NODE") == "l2_reth" { s.T().Skip() } + defer s.Nil(s.s.ProcessL1Blocks(context.Background())) + privetKeyHexList := []string{ "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", // 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", // 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC @@ -146,17 +150,20 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { privKeys = append(privKeys, priv) } + originNonces := make(map[common.Address]uint64) for _, priv := range privKeys { auth, err := bind.NewKeyedTransactorWithChainID(priv, chainID) s.Nil(err) nonce, err := l2Cli.PendingNonceAt(context.Background(), auth.From) s.Nil(err) + originNonces[auth.From] = nonce for i := 0; i < 300; i++ { _, err = testutils.AssembleTestTx(s.RPCClient.L2, priv, nonce+uint64(i), &auth.From, big.NewInt(1), nil) s.Nil(err) } } + signer := types.LatestSignerForChainID(chainID) for _, testCase := range []struct { blockMaxGasLimit uint32 blockMaxTxListBytes uint64 @@ -195,6 +202,22 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { ) s.Nil(err) + checkNonces := maps.Clone(originNonces) + // Make sure all the nonce are in order. + for _, txList := range res { + for _, tx := range txList.TxList { + sender, err := types.Sender(signer, tx) + s.Nil(err) + s.Equalf(checkNonces[sender], tx.Nonce(), + fmt.Sprintf("%s nonce check, expect: %d, actual: %d", + sender.String(), + checkNonces[sender], + tx.Nonce(), + )) + checkNonces[sender]++ + } + } + s.GreaterOrEqual(int(testCase.maxTransactionsLists), len(res)) for i, txsLen := range testCase.txLengthList { s.Equal(txsLen, res[i].TxList.Len()) @@ -202,6 +225,8 @@ func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { s.GreaterOrEqual(testCase.blockMaxTxListBytes, res[i].BytesLength) } } + + s.Nil(p.ProposeOp(context.Background())) } func (s *ProposerTestSuite) TestProposeTxLists() { From d4e41db12f2b9e29397be24939636294f8cb26f9 Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 24 Oct 2024 17:48:35 +0800 Subject: [PATCH 7/8] update taiko-geth dependency and choice to use stable foundry version --- go.mod | 8 +------- go.sum | 4 ++-- .../taiko-client/internal/docker/nodes/docker-compose.yml | 2 +- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 4c5ee52f395..31dcefa4c84 100644 --- a/go.mod +++ b/go.mod @@ -235,13 +235,7 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -exclude ( - github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/go-ethereum v1.14.6 - github.com/ethereum/go-ethereum v1.14.7 -) - -replace github.com/ethereum/go-ethereum v1.14.11 => github.com/taikoxyz/taiko-geth v1.8.1-0.20241003040603-5c84a2082747 +replace github.com/ethereum/go-ethereum v1.14.11 => github.com/taikoxyz/taiko-geth v1.11.1 replace github.com/ethereum-optimism/optimism v1.7.4 => github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39 diff --git a/go.sum b/go.sum index 9ddee77dab9..f7be24097ed 100644 --- a/go.sum +++ b/go.sum @@ -610,8 +610,8 @@ github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082 h1:ymZR+Y88LOnA8i3Ke github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082/go.mod h1:RHnIu3EFehrWX3JhFAMQSXD5uz7l0xaNroTzXrap7EQ= github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39 h1:JssMxaDmORjQ9RPZNulVJhAD8zSPd6LZFq5wsr6Nwz8= github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39/go.mod h1:ym7scR7ZHvEmwx1DLGVDzFlAdR+uhP1+Z4XCiFuSD5s= -github.com/taikoxyz/taiko-geth v1.8.1-0.20241003040603-5c84a2082747 h1:QRB8VHGmlRgm7ze/4Fzuce08Ypbq5Mr5q/piTfsck1A= -github.com/taikoxyz/taiko-geth v1.8.1-0.20241003040603-5c84a2082747/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E= +github.com/taikoxyz/taiko-geth v1.11.1 h1:pur1WP6YJkwKhLVeN3Zf7dOwbPq6tS88gYod6QKlJc4= +github.com/taikoxyz/taiko-geth v1.11.1/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E= github.com/testcontainers/testcontainers-go v0.30.0 h1:jmn/XS22q4YRrcMwWg0pAwlClzs/abopbsBzrepyc4E= github.com/testcontainers/testcontainers-go v0.30.0/go.mod h1:K+kHNGiM5zjklKjgTtcrEetF3uhWbMUyqAQoyoh8Pf0= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= diff --git a/packages/taiko-client/internal/docker/nodes/docker-compose.yml b/packages/taiko-client/internal/docker/nodes/docker-compose.yml index 1c81f01f92c..429595fbf26 100644 --- a/packages/taiko-client/internal/docker/nodes/docker-compose.yml +++ b/packages/taiko-client/internal/docker/nodes/docker-compose.yml @@ -1,7 +1,7 @@ services: l1_node: container_name: l1_node - image: ghcr.io/foundry-rs/foundry:nightly + image: ghcr.io/foundry-rs/foundry:nightly-2044faec64f99a21f0e5f0094458a973612d0712 restart: unless-stopped platform: linux/amd64 pull_policy: always From 2b71b0369a179ce537f7b8b5205d3a57db603224 Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 24 Oct 2024 20:05:33 +0800 Subject: [PATCH 8/8] fix lint errors --- packages/eventindexer/.golangci.yml | 2 +- packages/relayer/.golangci.yml | 8 +++----- packages/relayer/pkg/mock/mock_tx_sender.go | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/eventindexer/.golangci.yml b/packages/eventindexer/.golangci.yml index 2f3a3d4742f..f8f1767ce33 100644 --- a/packages/eventindexer/.golangci.yml +++ b/packages/eventindexer/.golangci.yml @@ -9,7 +9,7 @@ # ], output: - format: colored-line-number + formats: colored-line-number linters: enable: diff --git a/packages/relayer/.golangci.yml b/packages/relayer/.golangci.yml index 56dcebe883c..f47cd722a6f 100644 --- a/packages/relayer/.golangci.yml +++ b/packages/relayer/.golangci.yml @@ -9,7 +9,7 @@ # ], output: - format: colored-line-number + formats: colored-line-number linters: enable: @@ -34,6 +34,8 @@ linters-settings: min-complexity: 75 issues: + exclude-dirs: + - contracts/* exclude-rules: # Exclude some linters from running on tests files. - path: _test\.go @@ -42,7 +44,3 @@ issues: - path: / linters: - typecheck - -run: - skip-dirs: - - contracts/* diff --git a/packages/relayer/pkg/mock/mock_tx_sender.go b/packages/relayer/pkg/mock/mock_tx_sender.go index df88966b6ae..5dd941b5fd0 100644 --- a/packages/relayer/pkg/mock/mock_tx_sender.go +++ b/packages/relayer/pkg/mock/mock_tx_sender.go @@ -2,10 +2,12 @@ package mock import ( "context" + "math/big" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rpc" ) type TxManager struct { @@ -34,3 +36,20 @@ func (t *TxManager) Close() { func (t *TxManager) IsClosed() bool { return false } + +func (t *TxManager) SendAsync(ctx context.Context, candidate txmgr.TxCandidate, ch chan txmgr.SendResponse) { + panic("unimplemented") +} + +func (t *TxManager) SuggestGasPriceCaps(ctx context.Context) ( + tipCap *big.Int, + baseFee *big.Int, + blobBaseFee *big.Int, + err error, +) { + panic("unimplemented") +} + +func (t *TxManager) API() rpc.API { + panic("unimplemented") +}