Skip to content

Commit

Permalink
Simplify miner gas limit post EIP-1559. Default to 30M (#3205) (#3274)
Browse files Browse the repository at this point in the history
Co-authored-by: Andrew Ashikhmin <34320705+yperbasis@users.noreply.github.com>
  • Loading branch information
AlexeyAkhunov and yperbasis committed Jan 17, 2022
1 parent 3630c26 commit d61fce8
Show file tree
Hide file tree
Showing 8 changed files with 31 additions and 54 deletions.
3 changes: 1 addition & 2 deletions cmd/integration/commands/flags.go
Expand Up @@ -39,8 +39,7 @@ func must(err error) {
func withMining(cmd *cobra.Command) {
cmd.Flags().Bool("mine", false, "Enable mining")
cmd.Flags().StringArray("miner.notify", nil, "Comma separated HTTP URL list to notify of new work packages")
cmd.Flags().Uint64("miner.gastarget", ethconfig.Defaults.Miner.GasFloor, "Target gas floor for mined blocks")
cmd.Flags().Uint64("miner.gaslimit", ethconfig.Defaults.Miner.GasCeil, "Target gas ceiling for mined blocks")
cmd.Flags().Uint64("miner.gaslimit", ethconfig.Defaults.Miner.GasLimit, "Target gas limit for mined blocks")
cmd.Flags().Int64("miner.gasprice", ethconfig.Defaults.Miner.GasPrice.Int64(), "Target gas price for mined blocks")
cmd.Flags().String("miner.etherbase", "0", "Public address for block mining rewards (default = first account")
cmd.Flags().String("miner.extradata", "", "Block extra data set by the miner (default = client version)")
Expand Down
20 changes: 4 additions & 16 deletions cmd/utils/flags.go
Expand Up @@ -228,15 +228,10 @@ var (
Name: "miner.notify",
Usage: "Comma separated HTTP URL list to notify of new work packages",
}
MinerGasTargetFlag = cli.Uint64Flag{
Name: "miner.gastarget",
Usage: "Target gas floor for mined blocks",
Value: ethconfig.Defaults.Miner.GasFloor,
}
MinerGasLimitFlag = cli.Uint64Flag{
Name: "miner.gaslimit",
Usage: "Target gas ceiling for mined blocks",
Value: ethconfig.Defaults.Miner.GasCeil,
Usage: "Target gas limit for mined blocks",
Value: ethconfig.Defaults.Miner.GasLimit,
}
MinerGasPriceFlag = BigFlag{
Name: "miner.gasprice",
Expand Down Expand Up @@ -1075,11 +1070,7 @@ func SetupMinerCobra(cmd *cobra.Command, cfg *params.MiningConfig) {
panic(err)
}
cfg.ExtraData = []byte(extraDataStr)
cfg.GasFloor, err = flags.GetUint64(MinerGasTargetFlag.Name)
if err != nil {
panic(err)
}
cfg.GasCeil, err = flags.GetUint64(MinerGasLimitFlag.Name)
cfg.GasLimit, err = flags.GetUint64(MinerGasLimitFlag.Name)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -1139,11 +1130,8 @@ func setMiner(ctx *cli.Context, cfg *params.MiningConfig) {
if ctx.GlobalIsSet(MinerExtraDataFlag.Name) {
cfg.ExtraData = []byte(ctx.GlobalString(MinerExtraDataFlag.Name))
}
if ctx.GlobalIsSet(MinerGasTargetFlag.Name) {
cfg.GasFloor = ctx.GlobalUint64(MinerGasTargetFlag.Name)
}
if ctx.GlobalIsSet(MinerGasLimitFlag.Name) {
cfg.GasCeil = ctx.GlobalUint64(MinerGasLimitFlag.Name)
cfg.GasLimit = ctx.GlobalUint64(MinerGasLimitFlag.Name)
}
if ctx.GlobalIsSet(MinerGasPriceFlag.Name) {
cfg.GasPrice = GlobalBig(ctx, MinerGasPriceFlag.Name)
Expand Down
45 changes: 17 additions & 28 deletions core/block_validator.go
Expand Up @@ -21,37 +21,26 @@ import (
)

// CalcGasLimit computes the gas limit of the next block after parent. It aims
// to keep the baseline gas above the provided floor, and increase it towards the
// ceil if the blocks are full. If the ceil is exceeded, it will always decrease
// the gas allowance.
func CalcGasLimit(parentGasUsed, parentGasLimit, gasFloor, gasCeil uint64) uint64 {
// contrib = (parentGasUsed * 3 / 2) / 1024
contrib := (parentGasUsed + parentGasUsed/2) / params.GasLimitBoundDivisor

// decay = parentGasLimit / 1024 -1
decay := parentGasLimit/params.GasLimitBoundDivisor - 1

/*
strategy: gasLimit of block-to-mine is set based on parent's
gasUsed value. if parentGasUsed > parentGasLimit * (2/3) then we
increase it, otherwise lower it (or leave it unchanged if it's right
at that usage) the amount increased/decreased depends on how far away
from parentGasLimit * (2/3) parentGasUsed is.
*/
limit := parentGasLimit - decay + contrib
if limit < params.MinGasLimit {
limit = params.MinGasLimit
// to keep the baseline gas close to the provided target, and increase it towards
// the target if the baseline gas is lower.
func CalcGasLimit(parentGasLimit, desiredLimit uint64) uint64 {
delta := parentGasLimit/params.GasLimitBoundDivisor - 1
limit := parentGasLimit
if desiredLimit < params.MinGasLimit {
desiredLimit = params.MinGasLimit
}
// If we're outside our allowed gas range, we try to hone towards them
if limit < gasFloor {
limit = parentGasLimit + decay
if limit > gasFloor {
limit = gasFloor
if limit < desiredLimit {
limit = parentGasLimit + delta
if limit > desiredLimit {
limit = desiredLimit
}
} else if limit > gasCeil {
limit = parentGasLimit - decay
if limit < gasCeil {
limit = gasCeil
return limit
}
if limit > desiredLimit {
limit = parentGasLimit - delta
if limit < desiredLimit {
limit = desiredLimit
}
}
return limit
Expand Down
6 changes: 5 additions & 1 deletion core/chain_makers.go
Expand Up @@ -404,7 +404,7 @@ func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.I
parent.UncleHash(),
parent.Header().Seal,
),
GasLimit: CalcGasLimit(parent.GasUsed(), parent.GasLimit(), parent.GasLimit(), parent.GasLimit()),
GasLimit: CalcGasLimit(parent.GasLimit(), parent.GasLimit()),
Number: new(big.Int).Add(parent.Number(), common.Big1),
Time: time,
}
Expand All @@ -413,6 +413,10 @@ func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.I
if chain.Config().IsLondon(header.Number.Uint64()) {
header.BaseFee = misc.CalcBaseFee(chain.Config(), parent.Header())
header.Eip1559 = true
if !chain.Config().IsLondon(parent.NumberU64()) {
parentGasLimit := parent.GasLimit() * params.ElasticityMultiplier
header.GasLimit = CalcGasLimit(parentGasLimit, parentGasLimit)
}
}
header.WithSeal = chain.Config().IsHeaderWithSeal()

Expand Down
3 changes: 1 addition & 2 deletions eth/ethconfig/config.go
Expand Up @@ -76,8 +76,7 @@ var Defaults = Config{
NetworkID: 1,
Prune: prune.DefaultMode,
Miner: params.MiningConfig{
GasFloor: 8000000,
GasCeil: 8000000,
GasLimit: 30_000_000,
GasPrice: big.NewInt(params.GWei),
Recommit: 3 * time.Second,
},
Expand Down
4 changes: 2 additions & 2 deletions eth/stagedsync/stage_mining_create_block.go
Expand Up @@ -213,7 +213,7 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc
header := &types.Header{
ParentHash: parent.Hash(),
Number: num.Add(num, common.Big1),
GasLimit: core.CalcGasLimit(parent.GasUsed, parent.GasLimit, cfg.miner.MiningConfig.GasFloor, cfg.miner.MiningConfig.GasCeil),
GasLimit: core.CalcGasLimit(parent.GasLimit, cfg.miner.MiningConfig.GasLimit),
Extra: cfg.miner.MiningConfig.ExtraData,
Time: uint64(timestamp),
}
Expand All @@ -224,7 +224,7 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc
header.BaseFee = misc.CalcBaseFee(&cfg.chainConfig, parent)
if !cfg.chainConfig.IsLondon(parent.Number.Uint64()) {
parentGasLimit := parent.GasLimit * params.ElasticityMultiplier
header.GasLimit = core.CalcGasLimit(parent.GasUsed, parentGasLimit, cfg.miner.MiningConfig.GasFloor, cfg.miner.MiningConfig.GasCeil)
header.GasLimit = core.CalcGasLimit(parentGasLimit, cfg.miner.MiningConfig.GasLimit)
}
}
log.Info(fmt.Sprintf("[%s] Start mine", logPrefix), "block", executionAt+1, "baseFee", header.BaseFee, "gasLimit", header.GasLimit)
Expand Down
3 changes: 1 addition & 2 deletions params/mining.go
Expand Up @@ -17,8 +17,7 @@ type MiningConfig struct {
SigKey *ecdsa.PrivateKey // ECDSA private key for signing blocks
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.
GasLimit uint64 // Target gas limit 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.
}
1 change: 0 additions & 1 deletion turbo/cli/default_flags.go
Expand Up @@ -77,7 +77,6 @@ var DefaultFlags = []cli.Flag{
utils.CliqueDataDirFlag,
utils.MiningEnabledFlag,
utils.MinerNotifyFlag,
utils.MinerGasTargetFlag,
utils.MinerGasLimitFlag,
utils.MinerEtherbaseFlag,
utils.MinerExtraDataFlag,
Expand Down

0 comments on commit d61fce8

Please sign in to comment.