engine_v2: verify gap number in UpdateMasternodes, close XFN-11 (#1622)

This commit is contained in:
Daniel Liu 2025-11-03 18:45:48 +08:00 committed by GitHub
parent 3cab0036ed
commit 45f7597c97
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 38 additions and 34 deletions

View file

@ -784,6 +784,9 @@ func (x *XDPoS_v1) Prepare(chain consensus.ChainReader, header *types.Header) er
// Update masternodes into snapshot. In V1, truncating ms[:MaxMasternodes] is done in this function.
func (x *XDPoS_v1) UpdateMasternodes(chain consensus.ChainReader, header *types.Header, ms []utils.Masternode) error {
number := header.Number.Uint64()
log.Trace("take snapshot", "number", number, "hash", header.Hash())
var maxMasternodes int
// check if block number is increase ms checkpoint
if x.chainConfig.IsTIPIncreaseMasternodes(header.Number) || (x.config.V2.SwitchBlock != nil && header.Number.Cmp(x.config.V2.SwitchBlock) == 1) {
@ -796,8 +799,6 @@ func (x *XDPoS_v1) UpdateMasternodes(chain consensus.ChainReader, header *types.
if len(ms) > maxMasternodes {
ms = ms[:maxMasternodes]
}
number := header.Number.Uint64()
log.Trace("take snapshot", "number", number, "hash", header.Hash())
// get snapshot
snap, err := x.snapshot(chain, number, header.Hash(), nil, header)
if err != nil {

View file

@ -571,7 +571,10 @@ func (x *XDPoS_v2) GetSnapshot(chain consensus.ChainReader, header *types.Header
func (x *XDPoS_v2) UpdateMasternodes(chain consensus.ChainReader, header *types.Header, ms []utils.Masternode) error {
number := header.Number.Uint64()
log.Trace("[UpdateMasternodes]")
log.Trace("[UpdateMasternodes]", "number", number, "hash", header.Hash())
if number%x.config.Epoch != x.config.Epoch-x.config.Gap {
return fmt.Errorf("[UpdateMasternodes] not gap block, number: %d, epoch: %d,gap: %d", number, x.config.Epoch, x.config.Gap)
}
masterNodes := []common.Address{}
for _, m := range ms {

View file

@ -86,7 +86,7 @@ func TestGetMissedRoundsInEpochByBlockNum(t *testing.T) {
}
// Update Signer as there is no previous signer assigned
err = UpdateSigner(blockchain)
blockchain.UpdateM1()
if err != nil {
t.Fatal(err)
}

View file

@ -381,11 +381,6 @@ func signingTxWithSignerFn(header *types.Header, nonce uint64, signer common.Add
return signedTx, nil
}
func UpdateSigner(bc *core.BlockChain) error {
err := bc.UpdateM1()
return err
}
func GetSnapshotSigner(bc *core.BlockChain, header *types.Header) (signersList, error) {
engine := bc.Engine().(*XDPoS.XDPoS)
snap, err := engine.GetSnapshot(bc, header)
@ -511,12 +506,13 @@ func PrepareXDCTestBlockChainForV2Engine(t *testing.T, numOfBlocks int, chainCon
}
currentBlock = block
}
// Update Signer as there is no previous signer assigned
err = UpdateSigner(blockchain)
if err != nil {
t.Fatal(err)
if uint64(i)%chainConfig.XDPoS.Epoch == chainConfig.XDPoS.Epoch-chainConfig.XDPoS.Gap {
err := blockchain.UpdateM1()
if err != nil {
t.Fatal(err)
}
}
}
return blockchain, backend, currentBlock, signer, signFn, currentForkBlock
@ -566,12 +562,13 @@ func PrepareXDCTestBlockChainWithPenaltyForV2Engine(t *testing.T, numOfBlocks in
t.Fatal(err)
}
currentBlock = block
}
// Update Signer as there is no previous signer assigned
err = UpdateSigner(blockchain)
if err != nil {
t.Fatal(err)
if uint64(i)%chainConfig.XDPoS.Epoch == chainConfig.XDPoS.Epoch-chainConfig.XDPoS.Gap {
err := blockchain.UpdateM1()
if err != nil {
t.Fatal(err)
}
}
}
return blockchain, backend, currentBlock, signer, signFn
@ -628,12 +625,13 @@ func PrepareXDCTestBlockChainWithPenaltyCustomized(t *testing.T, numOfBlocks int
t.Fatal(err)
}
currentBlock = block
}
// Update Signer as there is no previous signer assigned
err = UpdateSigner(blockchain)
if err != nil {
t.Fatal(err)
if uint64(i)%chainConfig.XDPoS.Epoch == chainConfig.XDPoS.Epoch-chainConfig.XDPoS.Gap {
err := blockchain.UpdateM1()
if err != nil {
t.Fatal(err)
}
}
}
return blockchain, backend, currentBlock, signer, signFn
@ -691,12 +689,13 @@ func PrepareXDCTestBlockChainWith128Candidates(t *testing.T, numOfBlocks int, ch
}
currentBlock = block
}
// Update Signer as there is no previous signer assigned
err = UpdateSigner(blockchain)
if err != nil {
t.Fatal(err)
if uint64(i)%chainConfig.XDPoS.Epoch == chainConfig.XDPoS.Epoch-chainConfig.XDPoS.Gap {
err := blockchain.UpdateM1()
if err != nil {
t.Fatal(err)
}
}
}
return blockchain, backend, currentBlock, signer, signFn
@ -760,12 +759,13 @@ func PrepareXDCTestBlockChainWithProtectorObserver(t *testing.T, numOfBlocks int
}
currentBlock = block
}
// Update Signer as there is no previous signer assigned
err = UpdateSigner(blockchain)
if err != nil {
t.Fatal(err)
if uint64(i)%chainConfig.XDPoS.Epoch == chainConfig.XDPoS.Epoch-chainConfig.XDPoS.Gap {
err := blockchain.UpdateM1()
if err != nil {
t.Fatal(err)
}
}
}
return blockchain, backend, currentBlock, signer, signFn