|
|
@@ -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))
|