Work around for the issue "return wrong list signers from snapshot"

Update signers in snapshot
Ignore signerCheck at checkpoint block 27307800
due to wrong snapshot at gap 27307799
This commit is contained in:
olumuyiwadad 2021-09-17 18:45:46 +05:30
parent a41658640f
commit 92ffe69ab4
4 changed files with 21 additions and 12 deletions

View file

@ -23,6 +23,7 @@ const (
MergeSignRange = 15 MergeSignRange = 15
RangeReturnSigner = 150 RangeReturnSigner = 150
MinimunMinerBlockPerEpoch = 1 MinimunMinerBlockPerEpoch = 1
IgnoreSignerCheckBlock = uint64(27307800)
) )
var TIP2019Block = big.NewInt(1) var TIP2019Block = big.NewInt(1)

View file

@ -417,20 +417,11 @@ func (c *XDPoS) verifyCascadingFields(chain consensus.ChainReader, header *types
if err == nil { if err == nil {
return c.verifySeal(chain, header, parents, fullVerify) return c.verifySeal(chain, header, parents, fullVerify)
} }
signers, err = c.GetSignersFromContract(chain, header)
// try again the progress with signers querying from smart contract
// for example the checkpoint is 886500 -> the start gap block is 886495
startGapBlockHeader := header
for step := uint64(1); step <= chain.Config().XDPoS.Gap; step++ {
startGapBlockHeader = chain.GetHeader(startGapBlockHeader.ParentHash, number-step)
}
signers, err = c.HookGetSignersFromContract(startGapBlockHeader.Hash())
if err != nil { if err != nil {
log.Debug("Can't get signers from Smart Contract ", err)
return err return err
} }
err = c.checkSignersOnCheckpoint(chain, header, signers)
if err == nil { if err == nil {
return c.verifySeal(chain, header, parents, fullVerify) return c.verifySeal(chain, header, parents, fullVerify)
} }
@ -440,6 +431,10 @@ func (c *XDPoS) verifyCascadingFields(chain consensus.ChainReader, header *types
func (c *XDPoS) checkSignersOnCheckpoint(chain consensus.ChainReader, header *types.Header, signers []common.Address) error { func (c *XDPoS) checkSignersOnCheckpoint(chain consensus.ChainReader, header *types.Header, signers []common.Address) error {
number := header.Number.Uint64() number := header.Number.Uint64()
// ignore signerCheck at checkpoint block 27307800 due to wrong snapshot at gap 27307799
if number == common.IgnoreSignerCheckBlock {
return nil
}
penPenalties := []common.Address{} penPenalties := []common.Address{}
if c.HookPenalty != nil || c.HookPenaltyTIPSigning != nil { if c.HookPenalty != nil || c.HookPenaltyTIPSigning != nil {
var err error var err error
@ -1281,3 +1276,16 @@ func (c *XDPoS) CheckMNTurn(chain consensus.ChainReader, parent *types.Header, s
} }
return false return false
} }
func (c *XDPoS) GetSignersFromContract(chain consensus.ChainReader, checkpointHeader *types.Header) ([]common.Address, error) {
startGapBlockHeader := checkpointHeader
number := checkpointHeader.Number.Uint64()
for step := uint64(1); step <= chain.Config().XDPoS.Gap; step++ {
startGapBlockHeader = chain.GetHeader(startGapBlockHeader.ParentHash, number-step)
}
signers, err := c.HookGetSignersFromContract(startGapBlockHeader.Hash())
if err != nil {
return []common.Address{}, fmt.Errorf("Can't get signers from Smart Contract . Err: %v", err)
}
return signers, nil
}

View file

@ -1271,7 +1271,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty
stats.processed++ stats.processed++
stats.usedGas += usedGas stats.usedGas += usedGas
stats.report(chain, i, bc.stateCache.TrieDB().Size()) stats.report(chain, i, bc.stateCache.TrieDB().Size())
if status == CanonStatTy && bc.chainConfig.XDPoS != nil { if bc.chainConfig.XDPoS != nil {
// epoch block // epoch block
if (chain[i].NumberU64() % bc.chainConfig.XDPoS.Epoch) == 0 { if (chain[i].NumberU64() % bc.chainConfig.XDPoS.Epoch) == 0 {
CheckpointCh <- 1 CheckpointCh <- 1

View file

@ -22,7 +22,7 @@ import (
const ( const (
VersionMajor = 1 // Major version component of the current release VersionMajor = 1 // Major version component of the current release
VersionMinor = 0 // Minor version component of the current release VersionMinor = 1 // Minor version component of the current release
VersionPatch = 1 // Patch version component of the current release VersionPatch = 1 // Patch version component of the current release
VersionMeta = "stable" // Version metadata to append to the version string VersionMeta = "stable" // Version metadata to append to the version string
) )