diff options
author | Wei-Ning Huang <w@dexon.org> | 2019-03-26 11:16:22 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 21:32:58 +0800 |
commit | 78b707cebf4b3bc101e0793f14f9cac7323bff04 (patch) | |
tree | d1c2c050b35b967c808a3cb51603a5850152acb9 /consensus | |
parent | 29f658cd915af6e489abce7f897d7f1a0768ca64 (diff) | |
download | dexon-78b707cebf4b3bc101e0793f14f9cac7323bff04.tar.gz dexon-78b707cebf4b3bc101e0793f14f9cac7323bff04.tar.zst dexon-78b707cebf4b3bc101e0793f14f9cac7323bff04.zip |
core: set extended round block reward to zero (#298)
To discourage DKG set from prolonging the round indefinitely, we set the
block reward of the extended round to 0. The gas fee is send to the
DEXON governance owner for safe keeping and later used by the foundation.
Diffstat (limited to 'consensus')
-rw-r--r-- | consensus/dexcon/dexcon.go | 52 | ||||
-rw-r--r-- | consensus/dexcon/dexcon_test.go | 2 |
2 files changed, 35 insertions, 19 deletions
diff --git a/consensus/dexcon/dexcon.go b/consensus/dexcon/dexcon.go index 3e520438b..0b6fa192f 100644 --- a/consensus/dexcon/dexcon.go +++ b/consensus/dexcon/dexcon.go @@ -111,8 +111,21 @@ func (d *Dexcon) Prepare(chain consensus.ChainReader, header *types.Header) erro return nil } -func (d *Dexcon) calculateBlockReward(round int64, state *state.StateDB) *big.Int { - gs := d.govStateFetcer.GetStateForConfigAtRound(uint64(round)) +func (d *Dexcon) inExtendedRound(header *types.Header, state *state.StateDB) bool { + gs := vm.GovernanceState{state} + rgs := d.govStateFetcer.GetStateForConfigAtRound(header.Round) + + roundEnd := gs.RoundHeight(new(big.Int).SetUint64(header.Round)).Uint64() + rgs.RoundLength().Uint64() + + // Round 0 starts and height 0 instead of height 1. + if header.Round == 0 { + roundEnd += 1 + } + return header.Number.Uint64() >= roundEnd +} + +func (d *Dexcon) calculateBlockReward(round uint64) *big.Int { + gs := d.govStateFetcer.GetStateForConfigAtRound(round) config := gs.Configuration() blocksPerRound := config.RoundLength @@ -177,24 +190,27 @@ func (d *Dexcon) Finalize(chain consensus.ChainReader, header *types.Header, sta } // Distribute block reward and halving condition. - if header.Coinbase == (common.Address{}) { - header.Reward = new(big.Int) - } else { - reward := d.calculateBlockReward(int64(header.Round), state) - state.AddBalance(header.Coinbase, reward) - header.Reward = reward - gs.IncTotalSupply(reward) - - // Record last proposed height. - gs.PutLastProposedHeight(header.Coinbase, header.Number) - - // Check if halving checkpoint reached. - config := gs.Configuration() - if gs.TotalSupply().Cmp(config.NextHalvingSupply) >= 0 { - gs.MiningHalved() - } + reward := new(big.Int) + + // If this is not an empty block and we are not in extended round, calculate + // the block reward. + if header.Coinbase != (common.Address{}) && !d.inExtendedRound(header, state) { + reward = d.calculateBlockReward(header.Round) + } + + header.Reward = reward + state.AddBalance(header.Coinbase, reward) + gs.IncTotalSupply(reward) + + // Check if halving checkpoint reached. + config := gs.Configuration() + if gs.TotalSupply().Cmp(config.NextHalvingSupply) >= 0 { + gs.MiningHalved() } + // Record last proposed height. + gs.PutLastProposedHeight(header.Coinbase, header.Number) + header.Root = state.IntermediateRoot(true) return types.NewBlock(header, txs, uncles, receipts), nil } diff --git a/consensus/dexcon/dexcon_test.go b/consensus/dexcon/dexcon_test.go index 0181a80f3..bfded8db8 100644 --- a/consensus/dexcon/dexcon_test.go +++ b/consensus/dexcon/dexcon_test.go @@ -96,7 +96,7 @@ func (d *DexconTestSuite) TestBlockRewardCalculation() { // blockReard = miningVelocity * totalStaked * roundInterval / aYear / numBlocksInCurRound // 0.1875 * 1e18 * 3600 * 1000 / (86400 * 1000 * 365 * 3600) = 5945585996.96 - d.Require().Equal(big.NewInt(5945585996), consensus.calculateBlockReward(0, d.stateDB)) + d.Require().Equal(big.NewInt(5945585996), consensus.calculateBlockReward(0)) } func TestDexcon(t *testing.T) { |