diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index eaa4c8b704f1..0906da00e34e 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -582,6 +582,7 @@ func (x *XDPoS_v2) VerifyVoteMessage(chain consensus.ChainReader, vote *types.Vo snapshot, err := x.getSnapshot(chain, vote.GapNumber, true) if err != nil { log.Error("[VerifyVoteMessage] fail to get snapshot for a vote message", "BlockNum", vote.ProposedBlockInfo.Number, "Hash", vote.ProposedBlockInfo.Hash, "Error", err.Error()) + return false, err } verified, _, err := x.verifyMsgSignature(types.VoteSigHash(&types.VoteForSign{ ProposedBlockInfo: vote.ProposedBlockInfo, diff --git a/consensus/tests/engine_v2_tests/vote_test.go b/consensus/tests/engine_v2_tests/vote_test.go index 71d92c405cc7..d135b5d20c4a 100644 --- a/consensus/tests/engine_v2_tests/vote_test.go +++ b/consensus/tests/engine_v2_tests/vote_test.go @@ -510,6 +510,32 @@ func TestVerifyVoteMsg(t *testing.T) { assert.Nil(t, err) } +func TestVoteMsgMissingSnapshot(t *testing.T) { + blockchain, _, currentBlock, signer, signFn, _ := PrepareXDCTestBlockChainForV2Engine(t, 915, params.TestXDPoSMockChainConfig, nil) + engineV2 := blockchain.Engine().(*XDPoS.XDPoS).EngineV2 + + blockInfo := &utils.BlockInfo{ + Hash: currentBlock.Hash(), + Round: utils.Round(14), + Number: big.NewInt(915), + } + voteForSign := &utils.VoteForSign{ + ProposedBlockInfo: blockInfo, + GapNumber: 450, + } + + signHash, _ := signFn(accounts.Account{Address: signer}, utils.VoteSigHash(voteForSign).Bytes()) + voteMsg := &utils.Vote{ + ProposedBlockInfo: blockInfo, + Signature: signHash, + GapNumber: 1350, // missing 1350 snapshot + } + engineV2.SetNewRoundFaker(blockchain, utils.Round(14), false) + verified, err := engineV2.VerifyVoteMessage(blockchain, voteMsg) + assert.False(t, verified) + assert.NotNil(t, err) +} + func TestVoteMessageHandlerWrongGapNumber(t *testing.T) { blockchain, _, currentBlock, signer, signFn, _ := PrepareXDCTestBlockChainForV2Engine(t, 905, params.TestXDPoSMockChainConfig, nil) engineV2 := blockchain.Engine().(*XDPoS.XDPoS).EngineV2