diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 027dac7bd6..587121693a 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -164,6 +164,10 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { } applyMetricConfig(ctx, &cfg) + if cfg.Eth.TxPoolDisabled && cfg.Node.P2P.NetRestrict == nil { + utils.Fatalf("Transaction pool can only be disabled when network is restricted") + } + return stack, cfg } diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 4b26de05a9..f8ca4bd686 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -68,6 +68,7 @@ var ( utils.OverrideCancun, utils.OverrideVerkle, utils.EnablePersonal, + utils.TxPoolDisabledFlag, utils.TxPoolLocalsFlag, utils.TxPoolNoLocalsFlag, utils.TxPoolJournalFlag, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index db226c73d8..8f0ff686b8 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -318,6 +318,11 @@ var ( Category: flags.LightCategory, } // Transaction pool settings + TxPoolDisabledFlag = &cli.BoolFlag{ + Name: "txpool.disabled", + Usage: "Run node without a transaction pool", + Category: flags.TxPoolCategory, + } TxPoolLocalsFlag = &cli.StringFlag{ Name: "txpool.locals", Usage: "Comma separated accounts to treat as locals (no flush, priority inclusion)", @@ -1656,11 +1661,16 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) { // Set configurations from CLI flags setEtherbase(ctx, cfg) setGPO(ctx, &cfg.GPO, ctx.String(SyncModeFlag.Name) == "light") - setTxPool(ctx, &cfg.TxPool) setMiner(ctx, &cfg.Miner) setRequiredBlocks(ctx, cfg) setLes(ctx, cfg) + if ctx.IsSet(TxPoolDisabledFlag.Name) { + cfg.TxPoolDisabled = ctx.Bool(TxPoolDisabledFlag.Name) + } else { + setTxPool(ctx, &cfg.TxPool) + } + // Cap the cache allowance and tune the garbage collector mem, err := gopsutil.VirtualMemory() if err == nil { diff --git a/eth/backend.go b/eth/backend.go index c6787870ca..529c5d3e3a 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -215,17 +215,21 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { } eth.bloomIndexer.Start(eth.blockchain) - if config.BlobPool.Datadir != "" { - config.BlobPool.Datadir = stack.ResolvePath(config.BlobPool.Datadir) - } - blobPool := blobpool.New(config.BlobPool, eth.blockchain) + var subpools []txpool.SubPool + if !config.TxPoolDisabled { + if config.BlobPool.Datadir != "" { + config.BlobPool.Datadir = stack.ResolvePath(config.BlobPool.Datadir) + } + blobPool := blobpool.New(config.BlobPool, eth.blockchain) - if config.TxPool.Journal != "" { - config.TxPool.Journal = stack.ResolvePath(config.TxPool.Journal) - } - legacyPool := legacypool.New(config.TxPool, eth.blockchain) + if config.TxPool.Journal != "" { + config.TxPool.Journal = stack.ResolvePath(config.TxPool.Journal) + } + legacyPool := legacypool.New(config.TxPool, eth.blockchain) - eth.txPool, err = txpool.New(new(big.Int).SetUint64(config.TxPool.PriceLimit), eth.blockchain, []txpool.SubPool{legacyPool, blobPool}) + subpools = []txpool.SubPool{legacyPool, blobPool} + } + eth.txPool, err = txpool.New(new(big.Int).SetUint64(config.TxPool.PriceLimit), eth.blockchain, subpools) if err != nil { return nil, err } diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index bfb1df3fb1..d00ab3e155 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -71,6 +71,7 @@ var Defaults = Config{ SnapshotCache: 102, FilterLogCacheSize: 32, Miner: miner.DefaultConfig, + TxPoolDisabled: false, TxPool: legacypool.DefaultConfig, BlobPool: blobpool.DefaultConfig, RPCGasCap: 50000000, @@ -141,8 +142,9 @@ type Config struct { Miner miner.Config // Transaction pool options - TxPool legacypool.Config - BlobPool blobpool.Config + TxPoolDisabled bool + TxPool legacypool.Config + BlobPool blobpool.Config // Gas Price Oracle options GPO gasprice.Config diff --git a/eth/ethconfig/gen_config.go b/eth/ethconfig/gen_config.go index 2abddc9e0d..8666c02976 100644 --- a/eth/ethconfig/gen_config.go +++ b/eth/ethconfig/gen_config.go @@ -46,6 +46,7 @@ func (c Config) MarshalTOML() (interface{}, error) { Preimages bool FilterLogCacheSize int Miner miner.Config + TxPoolDisabled bool TxPool legacypool.Config BlobPool blobpool.Config GPO gasprice.Config @@ -87,6 +88,7 @@ func (c Config) MarshalTOML() (interface{}, error) { enc.Preimages = c.Preimages enc.FilterLogCacheSize = c.FilterLogCacheSize enc.Miner = c.Miner + enc.TxPoolDisabled = c.TxPoolDisabled enc.TxPool = c.TxPool enc.BlobPool = c.BlobPool enc.GPO = c.GPO @@ -132,6 +134,7 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { Preimages *bool FilterLogCacheSize *int Miner *miner.Config + TxPoolDisabled *bool TxPool *legacypool.Config BlobPool *blobpool.Config GPO *gasprice.Config @@ -234,6 +237,9 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.Miner != nil { c.Miner = *dec.Miner } + if dec.TxPoolDisabled != nil { + c.TxPoolDisabled = *dec.TxPoolDisabled + } if dec.TxPool != nil { c.TxPool = *dec.TxPool }