From 6a8c4ab4b757100e26b3027aca2be3a0f2dec134 Mon Sep 17 00:00:00 2001 From: cby3149 Date: Thu, 26 Oct 2023 12:34:40 -0700 Subject: [PATCH 1/9] Add DisableTxPoolGossip flag --- cmd/rpcdaemon/cli/httpcfg/http_cfg.go | 2 + cmd/txpool/main.go | 4 + cmd/utils/flags.go | 12 +- erigon-lib/txpool/pool.go | 27 +++++ erigon-lib/txpool/pool_test.go | 104 ++++++++++++++++++ erigon-lib/txpool/txpoolcfg/txpoolcfg.go | 4 + .../txpool/txpooluitl/all_components.go | 7 +- eth/backend.go | 1 + eth/ethconfig/config.go | 2 + turbo/cli/default_flags.go | 2 + 10 files changed, 163 insertions(+), 2 deletions(-) diff --git a/cmd/rpcdaemon/cli/httpcfg/http_cfg.go b/cmd/rpcdaemon/cli/httpcfg/http_cfg.go index 63d4cb6a0ff..57b14f3a607 100644 --- a/cmd/rpcdaemon/cli/httpcfg/http_cfg.go +++ b/cmd/rpcdaemon/cli/httpcfg/http_cfg.go @@ -67,4 +67,6 @@ type HttpCfg struct { // Ots API OtsMaxPageSize uint64 + + DisableTxPoolGossip bool } diff --git a/cmd/txpool/main.go b/cmd/txpool/main.go index 1dc3d7541fb..3c5d1a844b1 100644 --- a/cmd/txpool/main.go +++ b/cmd/txpool/main.go @@ -55,6 +55,8 @@ var ( priceBump uint64 blobPriceBump uint64 + noTxGossip bool + commitEvery time.Duration ) @@ -80,6 +82,7 @@ func init() { rootCmd.PersistentFlags().Uint64Var(&priceBump, "txpool.pricebump", txpoolcfg.DefaultConfig.PriceBump, "Price bump percentage to replace an already existing transaction") rootCmd.PersistentFlags().Uint64Var(&blobPriceBump, "txpool.blobpricebump", txpoolcfg.DefaultConfig.BlobPriceBump, "Price bump percentage to replace an existing blob (type-3) transaction") rootCmd.PersistentFlags().DurationVar(&commitEvery, utils.TxPoolCommitEveryFlag.Name, utils.TxPoolCommitEveryFlag.Value, utils.TxPoolCommitEveryFlag.Usage) + rootCmd.PersistentFlags().BoolVar(&noTxGossip, "txpool.disabletxpoolgossip", txpoolcfg.DefaultConfig.NoTxGossip, "Disable transaction pool gossip") rootCmd.Flags().StringSliceVar(&traceSenders, utils.TxPoolTraceSendersFlag.Name, []string{}, utils.TxPoolTraceSendersFlag.Usage) } @@ -146,6 +149,7 @@ func doTxpool(ctx context.Context, logger log.Logger) error { cfg.BlobSlots = blobSlots cfg.PriceBump = priceBump cfg.BlobPriceBump = blobPriceBump + cfg.NoTxGossip = noTxGossip cacheConfig := kvcache.DefaultCoherentConfig cacheConfig.MetricsLabel = "txpool" diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 578d796716f..29f2e7a69b7 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -20,13 +20,14 @@ package utils import ( "crypto/ecdsa" "fmt" - "github.com/ledgerwatch/erigon/cl/clparams" "math/big" "path/filepath" "runtime" "strconv" "strings" + "github.com/ledgerwatch/erigon/cl/clparams" + "github.com/c2h5oh/datasize" "github.com/ledgerwatch/erigon-lib/chain/networkname" "github.com/ledgerwatch/erigon-lib/chain/snapcfg" @@ -835,6 +836,11 @@ var ( Usage: "Path to the silkworm_api library (enables embedded Silkworm execution)", Value: "", } + + DisableTxPoolGossipFlag = cli.BoolFlag{ + Name: "disable.txpool.gossip", + Usage: "Disable transaction pool gossip.", + } ) var MetricFlags = []cli.Flag{&MetricsEnabledFlag, &MetricsHTTPFlag, &MetricsPortFlag} @@ -1649,6 +1655,10 @@ func SetEthConfig(ctx *cli.Context, nodeConfig *nodecfg.Config, cfg *ethconfig.C if ctx.IsSet(TrustedSetupFile.Name) { libkzg.SetTrustedSetupFilePath(ctx.String(TrustedSetupFile.Name)) } + + if ctx.IsSet(DisableTxPoolGossipFlag.Name) { + cfg.DisableTxPoolGossip = ctx.Bool(DisableTxPoolGossipFlag.Name) + } } // SetDNSDiscoveryDefaults configures DNS discovery with the given URL if diff --git a/erigon-lib/txpool/pool.go b/erigon-lib/txpool/pool.go index 9111b5f4ba0..f1e33def67b 100644 --- a/erigon-lib/txpool/pool.go +++ b/erigon-lib/txpool/pool.go @@ -1696,6 +1696,14 @@ func MainLoop(ctx context.Context, db kv.RwDB, coreDB kv.RoDB, p *TxPool, newTxs notifyMiningAboutNewSlots() + if p.cfg.NoTxGossip { + // drain newTxs for emptying newTx channel + // newTx channel will be filled only with local transactions + // early return to avoid outbound transaction propagation + log.Debug("[txpool] tx gossip disabled", "state", "drain new transactions") + return + } + var localTxTypes []byte var localTxSizes []uint32 var localTxHashes types.Hashes @@ -1766,6 +1774,11 @@ func MainLoop(ctx context.Context, db kv.RwDB, coreDB kv.RoDB, p *TxPool, newTxs if len(newPeers) == 0 { continue } + if p.cfg.NoTxGossip { + // avoid transaction gossiping for new peers + log.Debug("[txpool] tx gossip disabled", "state", "sync new peers") + continue + } t := time.Now() var hashes types.Hashes var types []byte @@ -2114,6 +2127,20 @@ func (p *TxPool) deprecatedForEach(_ context.Context, f func(rlp []byte, sender }) } +// disables adding remote transactions +type TxPoolDropRemote struct { + *TxPool +} + +func NewTxPoolDropRemote(txPool *TxPool) *TxPoolDropRemote { + return &TxPoolDropRemote{TxPool: txPool} +} + +func (p *TxPoolDropRemote) AddRemoteTxs(ctx context.Context, newTxs types.TxSlots) { + // disable adding remote transactions + // consume remote tx from fetch +} + var PoolChainConfigKey = []byte("chain_config") var PoolLastSeenBlockKey = []byte("last_seen_block") var PoolPendingBaseFeeKey = []byte("pending_base_fee") diff --git a/erigon-lib/txpool/pool_test.go b/erigon-lib/txpool/pool_test.go index 64aa1903da7..9d6210e78f9 100644 --- a/erigon-lib/txpool/pool_test.go +++ b/erigon-lib/txpool/pool_test.go @@ -941,3 +941,107 @@ func makeBlobTx() types.TxSlot { blobTx.BlobFeeCap = *blobFeeCap return blobTx } + +func TestDropRemote(t *testing.T) { + assert, require := assert.New(t), require.New(t) + ch := make(chan types.Announcements, 100) + db, coreDB := memdb.NewTestPoolDB(t), memdb.NewTestDB(t) + + cfg := txpoolcfg.DefaultConfig + cfg.NoTxGossip = true + + logger := log.New() + sendersCache := kvcache.New(kvcache.DefaultCoherentConfig) + + txPool, err := New(ch, coreDB, cfg, sendersCache, *u256.N1, big.NewInt(0), big.NewInt(0), nil, fixedgas.DefaultMaxBlobsPerBlock, logger) + assert.NoError(err) + require.True(txPool != nil) + txPoolDropRemote := NewTxPoolDropRemote(txPool) + + ctx := context.Background() + var stateVersionID uint64 = 0 + pendingBaseFee := uint64(1_000_000) + // start blocks from 0, set empty hash - then kvcache will also work on this + h1 := gointerfaces.ConvertHashToH256([32]byte{}) + change := &remote.StateChangeBatch{ + StateVersionId: stateVersionID, + PendingBlockBaseFee: pendingBaseFee, + BlockGasLimit: 1000000, + ChangeBatch: []*remote.StateChange{ + {BlockHeight: 0, BlockHash: h1}, + }, + } + var addr [20]byte + addr[0] = 1 + v := make([]byte, types.EncodeSenderLengthForStorage(2, *uint256.NewInt(1 * common.Ether))) + types.EncodeSender(2, *uint256.NewInt(1 * common.Ether), v) + change.ChangeBatch[0].Changes = append(change.ChangeBatch[0].Changes, &remote.AccountChange{ + Action: remote.Action_UPSERT, + Address: gointerfaces.ConvertAddressToH160(addr), + Data: v, + }) + tx, err := db.BeginRw(ctx) + require.NoError(err) + defer tx.Rollback() + err = txPoolDropRemote.OnNewBlock(ctx, change, types.TxSlots{}, types.TxSlots{}, tx) + assert.NoError(err) + // 1. Try Local Tx + { + var txSlots types.TxSlots + txSlot := &types.TxSlot{ + Tip: *uint256.NewInt(500_000), + FeeCap: *uint256.NewInt(3_000_000), + Gas: 100000, + Nonce: 3, + } + txSlot.IDHash[0] = 1 + txSlots.Append(txSlot, addr[:], true) + + reasons, err := txPoolDropRemote.AddLocalTxs(ctx, txSlots, tx) + assert.NoError(err) + for _, reason := range reasons { + assert.Equal(txpoolcfg.Success, reason, reason.String()) + } + } + select { + case annoucements := <-ch: + for i := 0; i < annoucements.Len(); i++ { + _, _, hash := annoucements.At(i) + fmt.Printf("propagated hash %x\n", hash) + } + default: + + } + + // 2. Try same Tx, but as remote; tx must be dropped + { + var txSlots types.TxSlots + txSlot := &types.TxSlot{ + Tip: *uint256.NewInt(500_000), + FeeCap: *uint256.NewInt(3_000_000), + Gas: 100000, + Nonce: 3, + } + txSlot.IDHash[0] = 1 + txSlots.Append(txSlot, addr[:], true) + + txPoolDropRemote.AddRemoteTxs(ctx, txSlots) + } + + // empty because AddRemoteTxs logic is intentionally empty + assert.Equal(0, len(txPoolDropRemote.unprocessedRemoteByHash)) + assert.Equal(0, len(txPoolDropRemote.unprocessedRemoteTxs.Txs)) + + assert.NoError(txPoolDropRemote.processRemoteTxs(ctx)) + + checkAnnouncementEmpty := func() bool { + select { + case <-ch: + return false + default: + return true + } + } + // no announcement because unprocessedRemoteTxs is already empty + assert.True(checkAnnouncementEmpty()) +} diff --git a/erigon-lib/txpool/txpoolcfg/txpoolcfg.go b/erigon-lib/txpool/txpoolcfg/txpoolcfg.go index 31616c0807a..a320d2a8385 100644 --- a/erigon-lib/txpool/txpoolcfg/txpoolcfg.go +++ b/erigon-lib/txpool/txpoolcfg/txpoolcfg.go @@ -51,6 +51,8 @@ type Config struct { MdbxPageSize datasize.ByteSize MdbxDBSizeLimit datasize.ByteSize MdbxGrowthStep datasize.ByteSize + + NoTxGossip bool } var DefaultConfig = Config{ @@ -68,6 +70,8 @@ var DefaultConfig = Config{ BlobSlots: 48, // Default for a total of 8 txs for 6 blobs each - for hive tests PriceBump: 10, // Price bump percentage to replace an already existing transaction BlobPriceBump: 100, + + NoTxGossip: false, } type DiscardReason uint8 diff --git a/erigon-lib/txpool/txpooluitl/all_components.go b/erigon-lib/txpool/txpooluitl/all_components.go index b67381f1c58..b8f6a9276aa 100644 --- a/erigon-lib/txpool/txpooluitl/all_components.go +++ b/erigon-lib/txpool/txpooluitl/all_components.go @@ -143,16 +143,21 @@ func AllComponents(ctx context.Context, cfg txpoolcfg.Config, cache kvcache.Cach cancunTime = cfg.OverrideCancunTime } + var pool txpool.Pool txPool, err := txpool.New(newTxs, chainDB, cfg, cache, *chainID, shanghaiTime, agraBlock, cancunTime, maxBlobsPerBlock, logger) if err != nil { return nil, nil, nil, nil, nil, err } + pool = txpool.Pool(txPool) + if cfg.NoTxGossip { + pool = txpool.Pool(txpool.NewTxPoolDropRemote(txPool)) + } fetch := txpool.NewFetch(ctx, sentryClients, txPool, stateChangesClient, chainDB, txPoolDB, *chainID, logger) //fetch.ConnectCore() //fetch.ConnectSentries() - send := txpool.NewSend(ctx, sentryClients, txPool, logger) + send := txpool.NewSend(ctx, sentryClients, pool, logger) txpoolGrpcServer := txpool.NewGrpcServer(ctx, txPool, txPoolDB, *chainID, logger) return txPoolDB, txPool, fetch, send, txpoolGrpcServer, nil } diff --git a/eth/backend.go b/eth/backend.go index eb6deac2c3f..ecd7f87614d 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -550,6 +550,7 @@ func New(ctx context.Context, stack *node.Node, config *ethconfig.Config, logger return nil, err } + config.TxPool.NoTxGossip = config.DisableTxPoolGossip var miningRPC txpool_proto.MiningServer stateDiffClient := direct.NewStateDiffClientDirect(kvRPC) if config.DeprecatedTxPool.Disable { diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 83ea6a406ca..ffd826ca6b9 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -255,6 +255,8 @@ type Config struct { // Embedded Silkworm support SilkwormEnabled bool SilkwormPath string + + DisableTxPoolGossip bool } type Sync struct { diff --git a/turbo/cli/default_flags.go b/turbo/cli/default_flags.go index 40fad68e151..828e5736887 100644 --- a/turbo/cli/default_flags.go +++ b/turbo/cli/default_flags.go @@ -166,4 +166,6 @@ var DefaultFlags = []cli.Flag{ &utils.SilkwormPathFlag, &utils.TrustedSetupFile, + + &utils.DisableTxPoolGossipFlag, } From fdff16ec35dc58abf02be491958ef024a00e8e9a Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Tue, 21 Nov 2023 10:05:12 +0700 Subject: [PATCH 2/9] use same flag name use --txpool.* namespace --- cmd/txpool/main.go | 2 +- cmd/utils/flags.go | 11 ++++++----- turbo/cli/default_flags.go | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/cmd/txpool/main.go b/cmd/txpool/main.go index 3c5d1a844b1..4d895f5565c 100644 --- a/cmd/txpool/main.go +++ b/cmd/txpool/main.go @@ -82,7 +82,7 @@ func init() { rootCmd.PersistentFlags().Uint64Var(&priceBump, "txpool.pricebump", txpoolcfg.DefaultConfig.PriceBump, "Price bump percentage to replace an already existing transaction") rootCmd.PersistentFlags().Uint64Var(&blobPriceBump, "txpool.blobpricebump", txpoolcfg.DefaultConfig.BlobPriceBump, "Price bump percentage to replace an existing blob (type-3) transaction") rootCmd.PersistentFlags().DurationVar(&commitEvery, utils.TxPoolCommitEveryFlag.Name, utils.TxPoolCommitEveryFlag.Value, utils.TxPoolCommitEveryFlag.Usage) - rootCmd.PersistentFlags().BoolVar(&noTxGossip, "txpool.disabletxpoolgossip", txpoolcfg.DefaultConfig.NoTxGossip, "Disable transaction pool gossip") + rootCmd.PersistentFlags().BoolVar(&noTxGossip, utils.TxPoolGossipDisableFlag.Name, utils.TxPoolGossipDisableFlag.Value, utils.TxPoolGossipDisableFlag.Usage) rootCmd.Flags().StringSliceVar(&traceSenders, utils.TxPoolTraceSendersFlag.Name, []string{}, utils.TxPoolTraceSendersFlag.Usage) } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 29f2e7a69b7..62a791a1caa 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -837,9 +837,10 @@ var ( Value: "", } - DisableTxPoolGossipFlag = cli.BoolFlag{ - Name: "disable.txpool.gossip", - Usage: "Disable transaction pool gossip.", + TxPoolGossipDisableFlag = cli.BoolFlag{ + Name: "txpool.gossip.disable", + Usage: "Disable transaction pool gossip (p2p)", + Value: txpoolcfg.DefaultConfig.NoTxGossip, } ) @@ -1656,8 +1657,8 @@ func SetEthConfig(ctx *cli.Context, nodeConfig *nodecfg.Config, cfg *ethconfig.C libkzg.SetTrustedSetupFilePath(ctx.String(TrustedSetupFile.Name)) } - if ctx.IsSet(DisableTxPoolGossipFlag.Name) { - cfg.DisableTxPoolGossip = ctx.Bool(DisableTxPoolGossipFlag.Name) + if ctx.IsSet(TxPoolGossipDisableFlag.Name) { + cfg.DisableTxPoolGossip = ctx.Bool(TxPoolGossipDisableFlag.Name) } } diff --git a/turbo/cli/default_flags.go b/turbo/cli/default_flags.go index 828e5736887..a10ad20d8eb 100644 --- a/turbo/cli/default_flags.go +++ b/turbo/cli/default_flags.go @@ -167,5 +167,5 @@ var DefaultFlags = []cli.Flag{ &utils.TrustedSetupFile, - &utils.DisableTxPoolGossipFlag, + &utils.TxPoolGossipDisableFlag, } From a76e29de3f6e94c87aba5800f467971a2b62970a Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Tue, 21 Nov 2023 10:11:36 +0700 Subject: [PATCH 3/9] use same flag name use --txpool.* namespace --- cmd/utils/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 62a791a1caa..8f33660bda3 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -839,7 +839,7 @@ var ( TxPoolGossipDisableFlag = cli.BoolFlag{ Name: "txpool.gossip.disable", - Usage: "Disable transaction pool gossip (p2p)", + Usage: "Disable transaction pool gossip (p2p). Some networks like 'Optimism execution engine'/'Optimistic Rollup' - using it to protect against MEV attacks", Value: txpoolcfg.DefaultConfig.NoTxGossip, } ) From d7e2f51706244a03e7f4601114cef7b87992e1c7 Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Tue, 21 Nov 2023 10:15:16 +0700 Subject: [PATCH 4/9] save --- cmd/utils/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 8f33660bda3..225f0a58fb7 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -839,7 +839,7 @@ var ( TxPoolGossipDisableFlag = cli.BoolFlag{ Name: "txpool.gossip.disable", - Usage: "Disable transaction pool gossip (p2p). Some networks like 'Optimism execution engine'/'Optimistic Rollup' - using it to protect against MEV attacks", + Usage: "Disabling p2p gossip of txs. Any txs received by p2p - will be dropped.K Some networks like 'Optimism execution engine'/'Optimistic Rollup' - using it to protect against MEV attacks", Value: txpoolcfg.DefaultConfig.NoTxGossip, } ) From 46a6b40f82fbf2d4f416f168a07a61431a6237c8 Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Tue, 21 Nov 2023 15:49:35 +0700 Subject: [PATCH 5/9] save --- cmd/rpcdaemon/cli/httpcfg/http_cfg.go | 2 -- cmd/txpool/main.go | 2 +- cmd/utils/flags.go | 2 +- erigon-lib/txpool/pool.go | 25 +++++++------------ erigon-lib/txpool/pool_test.go | 15 ++++++----- erigon-lib/txpool/txpoolcfg/txpoolcfg.go | 4 +-- .../txpool/txpooluitl/all_components.go | 2 +- eth/backend.go | 2 +- 8 files changed, 22 insertions(+), 32 deletions(-) diff --git a/cmd/rpcdaemon/cli/httpcfg/http_cfg.go b/cmd/rpcdaemon/cli/httpcfg/http_cfg.go index 0ef9adecdfa..1cf9d588334 100644 --- a/cmd/rpcdaemon/cli/httpcfg/http_cfg.go +++ b/cmd/rpcdaemon/cli/httpcfg/http_cfg.go @@ -79,6 +79,4 @@ type HttpCfg struct { MaxGetProofRewindBlockCount int //Max GetProof rewind block count // Ots API OtsMaxPageSize uint64 - - DisableTxPoolGossip bool } diff --git a/cmd/txpool/main.go b/cmd/txpool/main.go index 4d895f5565c..d915a18b32b 100644 --- a/cmd/txpool/main.go +++ b/cmd/txpool/main.go @@ -149,7 +149,7 @@ func doTxpool(ctx context.Context, logger log.Logger) error { cfg.BlobSlots = blobSlots cfg.PriceBump = priceBump cfg.BlobPriceBump = blobPriceBump - cfg.NoTxGossip = noTxGossip + cfg.NoGossip = noTxGossip cacheConfig := kvcache.DefaultCoherentConfig cacheConfig.MetricsLabel = "txpool" diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index fe48418dd60..4f403ece86b 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -902,7 +902,7 @@ var ( TxPoolGossipDisableFlag = cli.BoolFlag{ Name: "txpool.gossip.disable", Usage: "Disabling p2p gossip of txs. Any txs received by p2p - will be dropped.K Some networks like 'Optimism execution engine'/'Optimistic Rollup' - using it to protect against MEV attacks", - Value: txpoolcfg.DefaultConfig.NoTxGossip, + Value: txpoolcfg.DefaultConfig.NoGossip, } ) diff --git a/erigon-lib/txpool/pool.go b/erigon-lib/txpool/pool.go index e19c8c61d88..7e86ca30889 100644 --- a/erigon-lib/txpool/pool.go +++ b/erigon-lib/txpool/pool.go @@ -711,6 +711,13 @@ func (p *TxPool) CountContent() (int, int, int) { return p.pending.Len(), p.baseFee.Len(), p.queued.Len() } func (p *TxPool) AddRemoteTxs(_ context.Context, newTxs types.TxSlots) { + if p.cfg.NoGossip { + // if no gossip, then + // disable adding remote transactions + // consume remote tx from fetch + return + } + defer addRemoteTxsTimer.UpdateDuration(time.Now()) p.lock.Lock() defer p.lock.Unlock() @@ -1701,7 +1708,7 @@ func MainLoop(ctx context.Context, db kv.RwDB, coreDB kv.RoDB, p *TxPool, newTxs notifyMiningAboutNewSlots() - if p.cfg.NoTxGossip { + if p.cfg.NoGossip { // drain newTxs for emptying newTx channel // newTx channel will be filled only with local transactions // early return to avoid outbound transaction propagation @@ -1786,7 +1793,7 @@ func MainLoop(ctx context.Context, db kv.RwDB, coreDB kv.RoDB, p *TxPool, newTxs if len(newPeers) == 0 { continue } - if p.cfg.NoTxGossip { + if p.cfg.NoGossip { // avoid transaction gossiping for new peers log.Debug("[txpool] tx gossip disabled", "state", "sync new peers") continue @@ -2139,20 +2146,6 @@ func (p *TxPool) deprecatedForEach(_ context.Context, f func(rlp []byte, sender }) } -// disables adding remote transactions -type TxPoolDropRemote struct { - *TxPool -} - -func NewTxPoolDropRemote(txPool *TxPool) *TxPoolDropRemote { - return &TxPoolDropRemote{TxPool: txPool} -} - -func (p *TxPoolDropRemote) AddRemoteTxs(ctx context.Context, newTxs types.TxSlots) { - // disable adding remote transactions - // consume remote tx from fetch -} - var PoolChainConfigKey = []byte("chain_config") var PoolLastSeenBlockKey = []byte("last_seen_block") var PoolPendingBaseFeeKey = []byte("pending_base_fee") diff --git a/erigon-lib/txpool/pool_test.go b/erigon-lib/txpool/pool_test.go index f1c66143c72..5c3ffba8074 100644 --- a/erigon-lib/txpool/pool_test.go +++ b/erigon-lib/txpool/pool_test.go @@ -947,7 +947,7 @@ func TestDropRemote(t *testing.T) { db, coreDB := memdb.NewTestPoolDB(t), memdb.NewTestDB(t) cfg := txpoolcfg.DefaultConfig - cfg.NoTxGossip = true + cfg.NoGossip = true logger := log.New() sendersCache := kvcache.New(kvcache.DefaultCoherentConfig) @@ -955,7 +955,6 @@ func TestDropRemote(t *testing.T) { txPool, err := New(ch, coreDB, cfg, sendersCache, *u256.N1, big.NewInt(0), big.NewInt(0), nil, fixedgas.DefaultMaxBlobsPerBlock, logger) assert.NoError(err) require.True(txPool != nil) - txPoolDropRemote := NewTxPoolDropRemote(txPool) ctx := context.Background() var stateVersionID uint64 = 0 @@ -982,7 +981,7 @@ func TestDropRemote(t *testing.T) { tx, err := db.BeginRw(ctx) require.NoError(err) defer tx.Rollback() - err = txPoolDropRemote.OnNewBlock(ctx, change, types.TxSlots{}, types.TxSlots{}, tx) + err = txPool.OnNewBlock(ctx, change, types.TxSlots{}, types.TxSlots{}, tx) assert.NoError(err) // 1. Try Local Tx { @@ -996,7 +995,7 @@ func TestDropRemote(t *testing.T) { txSlot.IDHash[0] = 1 txSlots.Append(txSlot, addr[:], true) - reasons, err := txPoolDropRemote.AddLocalTxs(ctx, txSlots, tx) + reasons, err := txPool.AddLocalTxs(ctx, txSlots, tx) assert.NoError(err) for _, reason := range reasons { assert.Equal(txpoolcfg.Success, reason, reason.String()) @@ -1024,14 +1023,14 @@ func TestDropRemote(t *testing.T) { txSlot.IDHash[0] = 1 txSlots.Append(txSlot, addr[:], true) - txPoolDropRemote.AddRemoteTxs(ctx, txSlots) + txPool.AddRemoteTxs(ctx, txSlots) } // empty because AddRemoteTxs logic is intentionally empty - assert.Equal(0, len(txPoolDropRemote.unprocessedRemoteByHash)) - assert.Equal(0, len(txPoolDropRemote.unprocessedRemoteTxs.Txs)) + assert.Equal(0, len(txPool.unprocessedRemoteByHash)) + assert.Equal(0, len(txPool.unprocessedRemoteTxs.Txs)) - assert.NoError(txPoolDropRemote.processRemoteTxs(ctx)) + assert.NoError(txPool.processRemoteTxs(ctx)) checkAnnouncementEmpty := func() bool { select { diff --git a/erigon-lib/txpool/txpoolcfg/txpoolcfg.go b/erigon-lib/txpool/txpoolcfg/txpoolcfg.go index a320d2a8385..4dc6169c948 100644 --- a/erigon-lib/txpool/txpoolcfg/txpoolcfg.go +++ b/erigon-lib/txpool/txpoolcfg/txpoolcfg.go @@ -52,7 +52,7 @@ type Config struct { MdbxDBSizeLimit datasize.ByteSize MdbxGrowthStep datasize.ByteSize - NoTxGossip bool + NoGossip bool // this mode doesn't broadcast any txs, and if receive remote-txn - skip it } var DefaultConfig = Config{ @@ -71,7 +71,7 @@ var DefaultConfig = Config{ PriceBump: 10, // Price bump percentage to replace an already existing transaction BlobPriceBump: 100, - NoTxGossip: false, + NoGossip: false, } type DiscardReason uint8 diff --git a/erigon-lib/txpool/txpooluitl/all_components.go b/erigon-lib/txpool/txpooluitl/all_components.go index b8f6a9276aa..0df4af07048 100644 --- a/erigon-lib/txpool/txpooluitl/all_components.go +++ b/erigon-lib/txpool/txpooluitl/all_components.go @@ -149,7 +149,7 @@ func AllComponents(ctx context.Context, cfg txpoolcfg.Config, cache kvcache.Cach return nil, nil, nil, nil, nil, err } pool = txpool.Pool(txPool) - if cfg.NoTxGossip { + if cfg.NoGossip { pool = txpool.Pool(txpool.NewTxPoolDropRemote(txPool)) } diff --git a/eth/backend.go b/eth/backend.go index 62d5bc0476f..8de334c4b72 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -589,7 +589,7 @@ func New(ctx context.Context, stack *node.Node, config *ethconfig.Config, logger return nil, err } - config.TxPool.NoTxGossip = config.DisableTxPoolGossip + config.TxPool.NoGossip = config.DisableTxPoolGossip var miningRPC txpool_proto.MiningServer stateDiffClient := direct.NewStateDiffClientDirect(kvRPC) if config.DeprecatedTxPool.Disable { From 975b9f2144f56947c4df6ff2647df6d0012f4877 Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Tue, 21 Nov 2023 15:50:10 +0700 Subject: [PATCH 6/9] save --- erigon-lib/txpool/pool_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erigon-lib/txpool/pool_test.go b/erigon-lib/txpool/pool_test.go index 5c3ffba8074..a438be399e6 100644 --- a/erigon-lib/txpool/pool_test.go +++ b/erigon-lib/txpool/pool_test.go @@ -941,7 +941,7 @@ func makeBlobTx() types.TxSlot { return blobTx } -func TestDropRemote(t *testing.T) { +func TestDropRemoteAtNoGossip(t *testing.T) { assert, require := assert.New(t), require.New(t) ch := make(chan types.Announcements, 100) db, coreDB := memdb.NewTestPoolDB(t), memdb.NewTestDB(t) From 31ec86f18f2ebadd937113b8c171d0dd399809d6 Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Tue, 21 Nov 2023 15:51:18 +0700 Subject: [PATCH 7/9] save --- erigon-lib/txpool/txpooluitl/all_components.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/erigon-lib/txpool/txpooluitl/all_components.go b/erigon-lib/txpool/txpooluitl/all_components.go index 0df4af07048..8078fb5232b 100644 --- a/erigon-lib/txpool/txpooluitl/all_components.go +++ b/erigon-lib/txpool/txpooluitl/all_components.go @@ -143,21 +143,16 @@ func AllComponents(ctx context.Context, cfg txpoolcfg.Config, cache kvcache.Cach cancunTime = cfg.OverrideCancunTime } - var pool txpool.Pool - txPool, err := txpool.New(newTxs, chainDB, cfg, cache, *chainID, shanghaiTime, agraBlock, cancunTime, maxBlobsPerBlock, logger) + pool, err := txpool.New(newTxs, chainDB, cfg, cache, *chainID, shanghaiTime, agraBlock, cancunTime, maxBlobsPerBlock, logger) if err != nil { return nil, nil, nil, nil, nil, err } - pool = txpool.Pool(txPool) - if cfg.NoGossip { - pool = txpool.Pool(txpool.NewTxPoolDropRemote(txPool)) - } - fetch := txpool.NewFetch(ctx, sentryClients, txPool, stateChangesClient, chainDB, txPoolDB, *chainID, logger) + fetch := txpool.NewFetch(ctx, sentryClients, pool, stateChangesClient, chainDB, txPoolDB, *chainID, logger) //fetch.ConnectCore() //fetch.ConnectSentries() send := txpool.NewSend(ctx, sentryClients, pool, logger) - txpoolGrpcServer := txpool.NewGrpcServer(ctx, txPool, txPoolDB, *chainID, logger) - return txPoolDB, txPool, fetch, send, txpoolGrpcServer, nil + txpoolGrpcServer := txpool.NewGrpcServer(ctx, pool, txPoolDB, *chainID, logger) + return txPoolDB, pool, fetch, send, txpoolGrpcServer, nil } From 64bcc0b6af0c48a3c199f1223604f0fe60b31c81 Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Wed, 22 Nov 2023 09:32:03 +0700 Subject: [PATCH 8/9] save --- erigon-lib/txpool/txpooluitl/all_components.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/erigon-lib/txpool/txpooluitl/all_components.go b/erigon-lib/txpool/txpooluitl/all_components.go index 8078fb5232b..b67381f1c58 100644 --- a/erigon-lib/txpool/txpooluitl/all_components.go +++ b/erigon-lib/txpool/txpooluitl/all_components.go @@ -143,16 +143,16 @@ func AllComponents(ctx context.Context, cfg txpoolcfg.Config, cache kvcache.Cach cancunTime = cfg.OverrideCancunTime } - pool, err := txpool.New(newTxs, chainDB, cfg, cache, *chainID, shanghaiTime, agraBlock, cancunTime, maxBlobsPerBlock, logger) + txPool, err := txpool.New(newTxs, chainDB, cfg, cache, *chainID, shanghaiTime, agraBlock, cancunTime, maxBlobsPerBlock, logger) if err != nil { return nil, nil, nil, nil, nil, err } - fetch := txpool.NewFetch(ctx, sentryClients, pool, stateChangesClient, chainDB, txPoolDB, *chainID, logger) + fetch := txpool.NewFetch(ctx, sentryClients, txPool, stateChangesClient, chainDB, txPoolDB, *chainID, logger) //fetch.ConnectCore() //fetch.ConnectSentries() - send := txpool.NewSend(ctx, sentryClients, pool, logger) - txpoolGrpcServer := txpool.NewGrpcServer(ctx, pool, txPoolDB, *chainID, logger) - return txPoolDB, pool, fetch, send, txpoolGrpcServer, nil + send := txpool.NewSend(ctx, sentryClients, txPool, logger) + txpoolGrpcServer := txpool.NewGrpcServer(ctx, txPool, txPoolDB, *chainID, logger) + return txPoolDB, txPool, fetch, send, txpoolGrpcServer, nil } From a113ce96097041eff55245700221bd7cc93bd53d Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Thu, 23 Nov 2023 10:24:08 +0700 Subject: [PATCH 9/9] save --- cmd/utils/flags.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 73d5aca2efd..41ca31a8b69 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -148,6 +148,11 @@ var ( Name: "txpool.disable", Usage: "Experimental external pool and block producer, see ./cmd/txpool/readme.md for more info. Disabling internal txpool and block producer.", } + TxPoolGossipDisableFlag = cli.BoolFlag{ + Name: "txpool.gossip.disable", + Usage: "Disabling p2p gossip of txs. Any txs received by p2p - will be dropped.K Some networks like 'Optimism execution engine'/'Optimistic Rollup' - using it to protect against MEV attacks", + Value: txpoolcfg.DefaultConfig.NoGossip, + } TxPoolLocalsFlag = cli.StringFlag{ Name: "txpool.locals", Usage: "Comma separated accounts to treat as locals (no flush, priority inclusion)", @@ -898,10 +903,6 @@ var ( Usage: "sets the port to listen for beacon api requests", Value: 5555, } - TxPoolGossipDisableFlag = cli.BoolFlag{ - Name: "txpool.gossip.disable", - Usage: "Disabling p2p gossip of txs. Any txs received by p2p - will be dropped.K Some networks like 'Optimism execution engine'/'Optimistic Rollup' - using it to protect against MEV attacks", - Value: txpoolcfg.DefaultConfig.NoGossip, CaplinBackfillingFlag = cli.BoolFlag{ Name: "caplin.backfilling", Usage: "sets whether backfilling is enabled for caplin",