Browse Source

Fixed uncle rewards in miner

The uncle rewards were changed in the block processor. This change will
reflect those changes in the miner as well.
obscuren 10 năm trước cách đây
mục cha
commit
344b3556eb
3 tập tin đã thay đổi với 25 bổ sung22 xóa
  1. 23 17
      core/block_processor.go
  2. 1 1
      miner/agent.go
  3. 1 4
      miner/worker.go

+ 23 - 17
core/block_processor.go

@@ -210,10 +210,12 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (td *big
 		return
 	}
 
-	// Accumulate static rewards; block reward, uncle's and uncle inclusion.
-	if err = sm.AccumulateRewards(state, block, parent); err != nil {
+	// Verify uncles
+	if err = sm.VerifyUncles(state, block, parent); err != nil {
 		return
 	}
+	// Accumulate static rewards; block reward, uncle's and uncle inclusion.
+	AccumulateRewards(state, block)
 
 	// Commit state objects/accounts to a temporary trie (does not save)
 	// used to calculate the state root.
@@ -291,9 +293,27 @@ func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header) error {
 	return nil
 }
 
-func (sm *BlockProcessor) AccumulateRewards(statedb *state.StateDB, block, parent *types.Block) error {
+func AccumulateRewards(statedb *state.StateDB, block *types.Block) {
 	reward := new(big.Int).Set(BlockReward)
 
+	for _, uncle := range block.Uncles() {
+		num := new(big.Int).Add(big.NewInt(8), uncle.Number)
+		num.Sub(num, block.Number())
+
+		r := new(big.Int)
+		r.Mul(BlockReward, num)
+		r.Div(r, big.NewInt(8))
+
+		statedb.AddBalance(uncle.Coinbase, r)
+
+		reward.Add(reward, new(big.Int).Div(BlockReward, big.NewInt(32)))
+	}
+
+	// Get the account associated with the coinbase
+	statedb.AddBalance(block.Header().Coinbase, reward)
+}
+
+func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *types.Block) error {
 	ancestors := set.New()
 	uncles := set.New()
 	ancestorHeaders := make(map[common.Hash]*types.Header)
@@ -327,21 +347,8 @@ func (sm *BlockProcessor) AccumulateRewards(statedb *state.StateDB, block, paren
 			return ValidationError(fmt.Sprintf("%v", err))
 		}
 
-		num := new(big.Int).Add(big.NewInt(8), uncle.Number)
-		num.Sub(num, block.Number())
-
-		r := new(big.Int)
-		r.Mul(BlockReward, num)
-		r.Div(r, big.NewInt(8))
-
-		statedb.AddBalance(uncle.Coinbase, r)
-
-		reward.Add(reward, new(big.Int).Div(BlockReward, big.NewInt(32)))
 	}
 
-	// Get the account associated with the coinbase
-	statedb.AddBalance(block.Header().Coinbase, reward)
-
 	return nil
 }
 
@@ -358,7 +365,6 @@ func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err erro
 	)
 
 	sm.TransitionState(state, parent, block, true)
-	sm.AccumulateRewards(state, block, parent)
 
 	return state.Logs(), nil
 }

+ 1 - 1
miner/agent.go

@@ -60,7 +60,7 @@ out:
 		}
 	}
 
-	close(self.quitCurrentOp)
+	//close(self.quitCurrentOp)
 done:
 	// Empty channel
 	for {

+ 1 - 4
miner/worker.go

@@ -270,7 +270,7 @@ gasLimit:
 
 	self.current.block.SetUncles(uncles)
 
-	self.current.state.AddBalance(self.coinbase, core.BlockReward)
+	core.AccumulateRewards(self.current.state, self.current.block)
 
 	self.current.state.Update(common.Big0)
 	self.push()
@@ -297,9 +297,6 @@ func (self *worker) commitUncle(uncle *types.Header) error {
 		return core.UncleError(fmt.Sprintf("Uncle already in family (%x)", uncle.Hash()))
 	}
 
-	self.current.state.AddBalance(uncle.Coinbase, uncleReward)
-	self.current.state.AddBalance(self.coinbase, inclusionReward)
-
 	return nil
 }