43 lines
1.3 KiB
Go
43 lines
1.3 KiB
Go
|
// Code copied from go-ethereum
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"math/big"
|
||
|
|
||
|
"github.com/ethereum/go-ethereum/core/state"
|
||
|
"github.com/ethereum/go-ethereum/core/types"
|
||
|
"github.com/ethereum/go-ethereum/consensus/ethash"
|
||
|
"github.com/ethereum/go-ethereum/params"
|
||
|
)
|
||
|
|
||
|
// Some weird constants to avoid constant memory allocs for them.
|
||
|
var (
|
||
|
big8 = big.NewInt(8)
|
||
|
big32 = big.NewInt(32)
|
||
|
)
|
||
|
|
||
|
// AccumulateRewards credits the coinbase of the given block with the mining
|
||
|
// reward. The total reward consists of the static block reward and rewards for
|
||
|
// included uncles. The coinbase of each uncle block is also rewarded.
|
||
|
func accumulateRewards(config *params.ChainConfig, state *state.StateDB, header *types.Header, uncles []*types.Header) {
|
||
|
// Select the correct block reward based on chain progression
|
||
|
blockReward := ethash.FrontierBlockReward
|
||
|
if config.IsByzantium(header.Number) {
|
||
|
blockReward = ethash.ByzantiumBlockReward
|
||
|
}
|
||
|
// Accumulate the rewards for the miner and any included uncles
|
||
|
reward := new(big.Int).Set(blockReward)
|
||
|
r := new(big.Int)
|
||
|
for _, uncle := range uncles {
|
||
|
r.Add(uncle.Number, big8)
|
||
|
r.Sub(r, header.Number)
|
||
|
r.Mul(r, blockReward)
|
||
|
r.Div(r, big8)
|
||
|
state.AddBalance(uncle.Coinbase, r)
|
||
|
|
||
|
r.Div(blockReward, big32)
|
||
|
reward.Add(reward, r)
|
||
|
}
|
||
|
state.AddBalance(header.Coinbase, reward)
|
||
|
}
|