mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-16 18:00:46 +00:00
engine_v2: verify gap number in UpdateMasternodes, close XFN-11 (#1622)
This commit is contained in:
parent
3cab0036ed
commit
45f7597c97
4 changed files with 38 additions and 34 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue