diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index a87650c022..a1c30fe6db 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -612,7 +612,8 @@ func (x *XDPoS_v2) verifyHeader(chain consensus.ChainReader, header *types.Heade return utils.ErrInvalidCheckpointSigners } } else { - if header.Validators != nil { + if len(header.Validators) != 0 { + log.Warn("[verifyHeader] Validators shall not have values in non-epochSwitch block", "Hash", header.Hash(), "Number", header.Number, "Validators", header.Validators) return utils.ErrInvalidFieldInNonEpochSwitch } } diff --git a/consensus/tests/verify_block_test.go b/consensus/tests/verify_block_test.go index d7ab27220d..1f5f4f7915 100644 --- a/consensus/tests/verify_block_test.go +++ b/consensus/tests/verify_block_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/XinFinOrg/XDPoSChain/consensus/XDPoS" + "github.com/XinFinOrg/XDPoSChain/consensus/XDPoS/utils" "github.com/XinFinOrg/XDPoSChain/params" "github.com/stretchr/testify/assert" ) @@ -22,12 +23,19 @@ func TestShouldVerifyBlock(t *testing.T) { // Skip the mining time validation by set mine time to 0 config.XDPoS.V2.MinePeriod = 0 // Block 901 is the first v2 block with round of 1 - blockchain, _, currentBlock, _, _, _ := PrepareXDCTestBlockChainForV2Engine(t, 901, &config, 0) + blockchain, _, _, _, _, _ := PrepareXDCTestBlockChainForV2Engine(t, 910, &config, 0) adaptor := blockchain.Engine().(*XDPoS.XDPoS) // Happy path - err = adaptor.VerifyHeader(blockchain, currentBlock.Header(), true) + err = adaptor.VerifyHeader(blockchain, blockchain.GetBlockByNumber(901).Header(), true) assert.Nil(t, err) - // TODO: unhappy path XIN-135: https://hashlabs.atlassian.net/wiki/spaces/HASHLABS/pages/95944705/Verify+header + // Verify non-epoch switch block + err = adaptor.VerifyHeader(blockchain, blockchain.GetBlockByNumber(902).Header(), true) + assert.Nil(t, err) + + nonEpochSwitchWithValidators := blockchain.GetBlockByNumber(902).Header() + nonEpochSwitchWithValidators.Validators = acc1Addr.Bytes() + err = adaptor.VerifyHeader(blockchain, nonEpochSwitchWithValidators, true) + assert.Equal(t, utils.ErrInvalidFieldInNonEpochSwitch, err) }