diff --git a/cmd/geth/main.go b/cmd/geth/main.go index b1b1e92642d2..dcb7d12fc177 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -133,6 +133,7 @@ var ( utils.MinerNoVerifyFlag, utils.MinerStoreSkippedTxTracesFlag, utils.MinerMaxAccountsNumFlag, + utils.MinerAllowEmptyFlag, utils.NATFlag, utils.NoDiscoverFlag, utils.DiscoveryV5Flag, diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 0e1fce891ab8..8686dbc3df7e 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -197,6 +197,7 @@ var AppHelpFlagGroups = []flags.FlagGroup{ utils.MinerNoVerifyFlag, utils.MinerStoreSkippedTxTracesFlag, utils.MinerMaxAccountsNumFlag, + utils.MinerAllowEmptyFlag, }, }, { diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 8d8bdf6773fc..7371a3770074 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -515,6 +515,10 @@ var ( Usage: "Maximum number of accounts that miner will fetch the pending transactions of when building a new block", Value: math.MaxInt, } + MinerAllowEmptyFlag = cli.BoolFlag{ + Name: "miner.allowempty", + Usage: "Allow sealing empty blocks", + } // Account settings UnlockedAccountFlag = cli.StringFlag{ Name: "unlock", @@ -1620,6 +1624,9 @@ func setMiner(ctx *cli.Context, cfg *miner.Config) { if ctx.GlobalIsSet(MinerMaxAccountsNumFlag.Name) { cfg.MaxAccountsNum = ctx.GlobalInt(MinerMaxAccountsNumFlag.Name) } + if ctx.GlobalIsSet(MinerAllowEmptyFlag.Name) { + cfg.AllowEmpty = ctx.GlobalBool(MinerAllowEmptyFlag.Name) + } if ctx.GlobalIsSet(LegacyMinerGasTargetFlag.Name) { log.Warn("The generic --miner.gastarget flag is deprecated and will be removed in the future!") } diff --git a/miner/miner.go b/miner/miner.go index 0d483643df9e..a7b5b0cc8112 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -60,6 +60,7 @@ type Config struct { StoreSkippedTxTraces bool // Whether store the wrapped traces when storing a skipped tx MaxAccountsNum int // Maximum number of accounts that miner will fetch the pending transactions of when building a new block CCCMaxWorkers int // Maximum number of workers to use for async CCC tasks + AllowEmpty bool // If true, then we allow sealing empty blocks SigningDisabled bool // Whether to disable signing blocks with consensus enginek } diff --git a/miner/scroll_worker.go b/miner/scroll_worker.go index c2b97b5fbf07..b95fb6027aee 100644 --- a/miner/scroll_worker.go +++ b/miner/scroll_worker.go @@ -400,6 +400,9 @@ func (w *worker) mainLoop() { w.current.deadlineReached = true if len(w.current.txs) > 0 { _, err = w.commit() + } else if w.config.AllowEmpty { + log.Warn("Committing empty block", "number", w.current.header.Number) + _, err = w.commit() } case ev := <-w.txsCh: idleTimer.UpdateSince(idleStart) diff --git a/params/version.go b/params/version.go index 99a9625f3fab..d3e1cbbc5057 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ import ( const ( VersionMajor = 5 // Major version component of the current release VersionMinor = 8 // Minor version component of the current release - VersionPatch = 28 // Patch version component of the current release + VersionPatch = 29 // Patch version component of the current release VersionMeta = "mainnet" // Version metadata to append to the version string )