diff --git a/consensus/XDPoS/engines/engine_v1/engine.go b/consensus/XDPoS/engines/engine_v1/engine.go index b70b9c7c23..2b0f77cef5 100644 --- a/consensus/XDPoS/engines/engine_v1/engine.go +++ b/consensus/XDPoS/engines/engine_v1/engine.go @@ -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 { diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index 5725beb9b6..a39a5e469b 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -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 { diff --git a/consensus/tests/engine_v2_tests/api_test.go b/consensus/tests/engine_v2_tests/api_test.go index 82e2b1eeab..01d69ef97d 100644 --- a/consensus/tests/engine_v2_tests/api_test.go +++ b/consensus/tests/engine_v2_tests/api_test.go @@ -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) } diff --git a/consensus/tests/engine_v2_tests/helper.go b/consensus/tests/engine_v2_tests/helper.go index f327d67500..439de41f2a 100644 --- a/consensus/tests/engine_v2_tests/helper.go +++ b/consensus/tests/engine_v2_tests/helper.go @@ -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