diff --git a/cmd/geth/main.go b/cmd/geth/main.go index e276e86c6a..0bf1ad5333 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -129,6 +129,7 @@ var ( utils.MinerLegacyExtraDataFlag, utils.MinerRecommitIntervalFlag, utils.MinerNoVerfiyFlag, + utils.MinerNoEmptyPrecommitFlag, utils.NATFlag, utils.NoDiscoverFlag, utils.DiscoveryV5Flag, diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index 51e9f91848..eca52a3618 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -210,6 +210,7 @@ var AppHelpFlagGroups = []flagGroup{ utils.MinerExtraDataFlag, utils.MinerRecommitIntervalFlag, utils.MinerNoVerfiyFlag, + utils.MinerNoEmptyPrecommitFlag, }, }, { diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index dbefc9d935..d07063196f 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -483,6 +483,10 @@ var ( Name: "miner.noverify", Usage: "Disable remote sealing verification", } + MinerNoEmptyPrecommitFlag = cli.BoolFlag{ + Name: "miner.noempty-precommit", + Usage: "Disable empty mining solution precommit", + } // Account settings UnlockedAccountFlag = cli.StringFlag{ Name: "unlock", @@ -1359,6 +1363,9 @@ func setMiner(ctx *cli.Context, cfg *miner.Config) { if ctx.GlobalIsSet(MinerNoVerfiyFlag.Name) { cfg.Noverify = ctx.Bool(MinerNoVerfiyFlag.Name) } + if ctx.GlobalIsSet(MinerNoEmptyPrecommitFlag.Name) { + cfg.NoEmptyPrecommit = ctx.Bool(MinerNoEmptyPrecommitFlag.Name) + } } func setWhitelist(ctx *cli.Context, cfg *eth.Config) { diff --git a/miner/miner.go b/miner/miner.go index b968b3a92a..b365fd833e 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -43,14 +43,15 @@ type Backend interface { // Config is the configuration parameters of mining. type Config struct { - Etherbase common.Address `toml:",omitempty"` // Public address for block mining rewards (default = first account) - Notify []string `toml:",omitempty"` // HTTP URL list to be notified of new work packages(only useful in ethash). - ExtraData hexutil.Bytes `toml:",omitempty"` // Block extra data set by the miner - GasFloor uint64 // Target gas floor for mined blocks. - GasCeil uint64 // Target gas ceiling for mined blocks. - GasPrice *big.Int // Minimum gas price for mining a transaction - Recommit time.Duration // The time interval for miner to re-create mining work. - Noverify bool // Disable remote mining solution verification(only useful in ethash). + Etherbase common.Address `toml:",omitempty"` // Public address for block mining rewards (default = first account) + Notify []string `toml:",omitempty"` // HTTP URL list to be notified of new work packages(only useful in ethash). + ExtraData hexutil.Bytes `toml:",omitempty"` // Block extra data set by the miner + GasFloor uint64 // Target gas floor for mined blocks. + GasCeil uint64 // Target gas ceiling for mined blocks. + GasPrice *big.Int // Minimum gas price for mining a transaction + Recommit time.Duration // The time interval for miner to re-create mining work. + Noverify bool // Disable remote mining solution verification(only useful in ethash). + NoEmptyPrecommit bool // Disable pre-commit empty mining solution } // Miner creates blocks and searches for proof-of-work values. diff --git a/miner/worker.go b/miner/worker.go index 59a47a1220..16ec5b47e7 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -305,6 +305,10 @@ func (w *worker) newWorkLoop(recommit time.Duration) { if interrupt != nil { atomic.StoreInt32(interrupt, s) } + // Disable empty mining solution precommit if required. + if !noempty && w.config.NoEmptyPrecommit { + noempty = true + } interrupt = new(int32) w.newWorkCh <- &newWorkReq{interrupt: interrupt, noempty: noempty, timestamp: timestamp} timer.Reset(recommit) @@ -922,8 +926,10 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) log.Error("Failed to fetch pending transactions", "err", err) return } - // Short circuit if there is no available pending transactions - if len(pending) == 0 { + // Short circuit if there is no available pending transactions. + // But if we disable empty precommit already, ignore it. Since + // empty block is necessary to keep the liveness of the network. + if len(pending) == 0 && !w.config.NoEmptyPrecommit { w.updateSnapshot() return }