|
|
|
@ -69,17 +69,30 @@ func CalcTD(block, parent *types.Block) *big.Int { |
|
|
|
|
|
|
|
|
|
// CalcGasLimit computes the gas limit of the next block after parent.
|
|
|
|
|
// The result may be modified by the caller.
|
|
|
|
|
// This is miner strategy, not consensus protocol.
|
|
|
|
|
func CalcGasLimit(parent *types.Block) *big.Int { |
|
|
|
|
decay := new(big.Int).Div(parent.GasLimit(), params.GasLimitBoundDivisor) |
|
|
|
|
// contrib = (parentGasUsed * 3 / 2) / 1024
|
|
|
|
|
contrib := new(big.Int).Mul(parent.GasUsed(), big.NewInt(3)) |
|
|
|
|
contrib = contrib.Div(contrib, big.NewInt(2)) |
|
|
|
|
contrib = contrib.Div(contrib, params.GasLimitBoundDivisor) |
|
|
|
|
|
|
|
|
|
// decay = parentGasLimit / 1024 -1
|
|
|
|
|
decay := new(big.Int).Div(parent.GasLimit(), params.GasLimitBoundDivisor) |
|
|
|
|
decay.Sub(decay, big.NewInt(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. |
|
|
|
|
*/ |
|
|
|
|
gl := new(big.Int).Sub(parent.GasLimit(), decay) |
|
|
|
|
gl = gl.Add(gl, contrib) |
|
|
|
|
gl = gl.Add(gl, big.NewInt(1)) |
|
|
|
|
gl.Set(common.BigMax(gl, params.MinGasLimit)) |
|
|
|
|
|
|
|
|
|
// however, if we're now below the target (GenesisGasLimit) we increase the
|
|
|
|
|
// limit as much as we can (parentGasLimit / 1024 -1)
|
|
|
|
|
if gl.Cmp(params.GenesisGasLimit) < 0 { |
|
|
|
|
gl.Add(parent.GasLimit(), decay) |
|
|
|
|
gl.Set(common.BigMin(gl, params.GenesisGasLimit)) |
|
|
|
|