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. // 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 { 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 var maxMasternodes int
// check if block number is increase ms checkpoint // 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) { 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 { if len(ms) > maxMasternodes {
ms = ms[:maxMasternodes] ms = ms[:maxMasternodes]
} }
number := header.Number.Uint64()
log.Trace("take snapshot", "number", number, "hash", header.Hash())
// get snapshot // get snapshot
snap, err := x.snapshot(chain, number, header.Hash(), nil, header) snap, err := x.snapshot(chain, number, header.Hash(), nil, header)
if err != nil { 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 { func (x *XDPoS_v2) UpdateMasternodes(chain consensus.ChainReader, header *types.Header, ms []utils.Masternode) error {
number := header.Number.Uint64() 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{} masterNodes := []common.Address{}
for _, m := range ms { for _, m := range ms {

View file

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

View file

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