Skip to content
This repository was archived by the owner on Jun 6, 2025. It is now read-only.

Commit 57f25f0

Browse files
authored
consortium/v2: distribute finality reward for the voters in parent block (#337)
* consortium/v2: distribute finality reward for the voters in parent block Because the finality votes are assembled after we FinalizeAndAssemble the block and the finality reward distribution transaction is in FinalizeAndAssemble, we cannot reward the finality voters in the current block right away. Instead, the reward distribution is delayed until next block. So in the FinalizeAndAssemble, we look at the finality voters in the parent header and distribute reward to them. * consortium/v2: integrate with the finality tracking contract This commit integrates with the finality tracking contract (axieinfinity/ronin-dpos-contracts#279) to record the finality reward for voters.
1 parent 4a794d8 commit 57f25f0

File tree

4 files changed

+230
-6
lines changed

4 files changed

+230
-6
lines changed

consensus/consortium/common/contract.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/ethereum/go-ethereum/common/hexutil"
1616
"github.com/ethereum/go-ethereum/common/math"
1717
"github.com/ethereum/go-ethereum/consensus"
18+
finalityTracking "github.com/ethereum/go-ethereum/consensus/consortium/generated_contracts/finality_tracking"
1819
"github.com/ethereum/go-ethereum/consensus/consortium/generated_contracts/profile"
1920
roninValidatorSet "github.com/ethereum/go-ethereum/consensus/consortium/generated_contracts/ronin_validator_set"
2021
slashIndicator "github.com/ethereum/go-ethereum/consensus/consortium/generated_contracts/slash_indicator"
@@ -69,6 +70,7 @@ type ContractIntegrator struct {
6970
roninValidatorSetSC *roninValidatorSet.RoninValidatorSet
7071
slashIndicatorSC *slashIndicator.SlashIndicator
7172
profileSC *profile.Profile
73+
finalityTrackingSC *finalityTracking.FinalityTracking
7274
signTxFn SignerTxFn
7375
coinbase common.Address
7476
}
@@ -93,11 +95,18 @@ func NewContractIntegrator(config *chainParams.ChainConfig, backend bind.Contrac
9395
return nil, err
9496
}
9597

98+
// Create Finality Tracking contract instance
99+
finalityTrackingSC, err := finalityTracking.NewFinalityTracking(config.ConsortiumV2Contracts.FinalityTracking, backend)
100+
if err != nil {
101+
return nil, err
102+
}
103+
96104
return &ContractIntegrator{
97105
chainId: config.ChainID,
98106
roninValidatorSetSC: roninValidatorSetSC,
99107
slashIndicatorSC: slashIndicatorSC,
100108
profileSC: profileSC,
109+
finalityTrackingSC: finalityTrackingSC,
101110
signTxFn: signTxFn,
102111
signer: types.LatestSignerForChainID(config.ChainID),
103112
coinbase: coinbase,
@@ -214,8 +223,7 @@ func (c *ContractIntegrator) Slash(opts *ApplyTransactOpts, spoiledValidator com
214223

215224
func (c *ContractIntegrator) FinalityReward(opts *ApplyTransactOpts, votedValidators []common.Address) error {
216225
nonce := opts.State.GetNonce(c.coinbase)
217-
// FIXME: Change this
218-
tx, err := c.slashIndicatorSC.SlashUnavailability(getTransactionOpts(c.coinbase, nonce, c.chainId, c.signTxFn), common.Address{})
226+
tx, err := c.finalityTrackingSC.RecordFinality(getTransactionOpts(c.coinbase, nonce, c.chainId, c.signTxFn), votedValidators)
219227
if err != nil {
220228
return err
221229
}

consensus/consortium/generated_contracts/finality_tracking/finality_tracking.go

Lines changed: 202 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

consensus/consortium/v2/consortium.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -729,17 +729,24 @@ func (c *Consortium) processSystemTransactions(chain consensus.ChainHeaderReader
729729

730730
_, _, _, contract := c.readSignerAndContract()
731731

732-
if c.chainConfig.IsShillin(header.Number) {
733-
extraData, err := finality.DecodeExtra(header.Extra, c.chainConfig.IsShillin(header.Number))
732+
// If the parent's block includes the finality votes, distribute reward for the voters
733+
if c.chainConfig.IsShillin(new(big.Int).Sub(header.Number, common.Big1)) {
734+
parentHeader := chain.GetHeaderByHash(header.ParentHash)
735+
extraData, err := finality.DecodeExtra(parentHeader.Extra, true)
734736
if err != nil {
735737
return err
736738
}
737739
if extraData.HasFinalityVote == 1 {
740+
parentSnap, err := c.snapshot(chain, parentHeader.Number.Uint64()-1, parentHeader.ParentHash, nil)
741+
if err != nil {
742+
return err
743+
}
744+
738745
votedValidatorPositions := extraData.FinalityVotedValidators.Indices()
739746
var votedValidators []common.Address
740747
for _, position := range votedValidatorPositions {
741748
// The header has been verified so there must be no out of bound here
742-
votedValidators = append(votedValidators, snap.ValidatorsWithBlsPub[position].Address)
749+
votedValidators = append(votedValidators, parentSnap.ValidatorsWithBlsPub[position].Address)
743750
}
744751

745752
if err := contract.FinalityReward(transactOpts, votedValidators); err != nil {

params/config.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,7 @@ type ConsortiumV2Contracts struct {
573573
RoninValidatorSet common.Address `json:"roninValidatorSet"`
574574
SlashIndicator common.Address `json:"slashIndicator"`
575575
ProfileContract common.Address `json:"profileContract"`
576+
FinalityTracking common.Address `json:"finalityTracking"`
576577
}
577578

578579
func (c *ConsortiumV2Contracts) IsSystemContract(address common.Address) bool {
@@ -619,11 +620,16 @@ func (c *ChainConfig) String() string {
619620
profileContract = c.ConsortiumV2Contracts.ProfileContract
620621
}
621622

623+
finalityTrackingContract := common.HexToAddress("")
624+
if c.ConsortiumV2Contracts != nil {
625+
finalityTrackingContract = c.ConsortiumV2Contracts.FinalityTracking
626+
}
627+
622628
chainConfigFmt := "{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v "
623629
chainConfigFmt += "Petersburg: %v Istanbul: %v, Odysseus: %v, Fenix: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, "
624630
chainConfigFmt += "Engine: %v, Blacklist Contract: %v, Fenix Validator Contract: %v, ConsortiumV2: %v, ConsortiumV2.RoninValidatorSet: %v, "
625631
chainConfigFmt += "ConsortiumV2.SlashIndicator: %v, ConsortiumV2.StakingContract: %v, Puffy: %v, Buba: %v, Olek: %v, Shillin: %v, "
626-
chainConfigFmt += "ConsortiumV2.ProfileContract: %v}"
632+
chainConfigFmt += "ConsortiumV2.ProfileContract: %v, ConsortiumV2.FinalityTracking: %v}"
627633

628634
return fmt.Sprintf(chainConfigFmt,
629635
c.ChainID,
@@ -655,6 +661,7 @@ func (c *ChainConfig) String() string {
655661
c.OlekBlock,
656662
c.ShillinBlock,
657663
profileContract.Hex(),
664+
finalityTrackingContract.Hex(),
658665
)
659666
}
660667

0 commit comments

Comments
 (0)