فهرست منبع

core: fixed mining strategy

obscuren 10 سال پیش
والد
کامیت
f6669db001
2فایلهای تغییر یافته به همراه16 افزوده شده و 10 حذف شده
  1. 1 1
      core/chain_makers.go
  2. 15 9
      core/chain_manager.go

+ 1 - 1
core/chain_makers.go

@@ -98,7 +98,7 @@ func makeChain(bman *BlockProcessor, parent *types.Block, max int, db common.Dat
 			fmt.Println("process with parent failed", err)
 			panic(err)
 		}
-		block.Td = CalculateTD(block, parent)
+		block.Td = CalcTD(block, parent)
 		blocks[i] = block
 		parent = block
 	}

+ 15 - 9
core/chain_manager.go

@@ -48,7 +48,7 @@ func CalcDifficulty(block, parent *types.Header) *big.Int {
 	return diff
 }
 
-func CalculateTD(block, parent *types.Block) *big.Int {
+func CalcTD(block, parent *types.Block) *big.Int {
 	if parent == nil {
 		return block.Difficulty()
 	}
@@ -59,14 +59,20 @@ func CalculateTD(block, parent *types.Block) *big.Int {
 }
 
 func CalcGasLimit(parent *types.Block) *big.Int {
-	// ((1024-1) * parent.gasLimit + (gasUsed * 6 / 5)) / 1024
-	previous := new(big.Int).Mul(big.NewInt(1024-1), parent.GasLimit())
-	current := new(big.Rat).Mul(new(big.Rat).SetInt(parent.GasUsed()), big.NewRat(6, 5))
-	curInt := new(big.Int).Div(current.Num(), current.Denom())
+	decay := new(big.Int).Div(parent.GasLimit(), params.GasLimitBoundDivisor)
+	contrib := new(big.Int).Mul(parent.GasUsed(), big.NewInt(3))
+	contrib = contrib.Div(contrib, big.NewInt(2))
+	contrib = contrib.Div(contrib, params.GasLimitBoundDivisor)
 
-	result := new(big.Int).Add(previous, curInt)
-	result.Div(result, big.NewInt(1024))
-	return common.BigMax(params.GenesisGasLimit, result)
+	gl := new(big.Int).Sub(parent.GasLimit(), decay)
+	gl = gl.Add(gl, contrib)
+	gl = common.BigMax(gl, params.MinGasLimit)
+
+	if gl.Cmp(params.GenesisGasLimit) < 0 {
+		gl2 := new(big.Int).Add(parent.GasLimit(), decay)
+		return common.BigMin(params.GenesisGasLimit, gl2)
+	}
+	return gl
 }
 
 type ChainManager struct {
@@ -525,7 +531,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
 		}
 		// Setting block.Td regardless of error (known for example) prevents errors down the line
 		// in the protocol handler
-		block.Td = new(big.Int).Set(CalculateTD(block, self.GetBlock(block.ParentHash())))
+		block.Td = new(big.Int).Set(CalcTD(block, self.GetBlock(block.ParentHash())))
 
 		// Call in to the block processor and check for errors. It's likely that if one block fails
 		// all others will fail too (unless a known block is returned).