diff --git a/consensus/aura/aura.go b/consensus/aura/aura.go index 080fa8aac7..cbd03abb56 100644 --- a/consensus/aura/aura.go +++ b/consensus/aura/aura.go @@ -92,6 +92,10 @@ var ( // their extra-data fields. errExtraSigners = errors.New("non-checkpoint block contains extra signer list") + // errInvalidValidatorSeal is returned if the extra data field length is not + // equal to the length of a seal + errInvalidExtraData = errors.New("extra data field in block header is invalid") + // errInvalidCheckpointSigners is returned if a checkpoint block contains an // invalid list of signers (i.e. non divisible by 20 bytes, or not the correct // ones). @@ -267,32 +271,21 @@ func (a *Aura) verifyHeader(chain consensus.ChainReader, header *types.Header, p if header.Time.Cmp(big.NewInt(time.Now().Unix())) > 0 { return consensus.ErrFutureBlock } + // TODO: Are any of these necessary checks? // Checkpoint blocks need to enforce zero beneficiary - checkpoint := (number % a.config.Epoch) == 0 - if checkpoint && header.Coinbase != (common.Address{}) { - return errInvalidCheckpointBeneficiary - } + //checkpoint := (number % a.config.Epoch) == 0 + //if checkpoint && header.Coinbase != (common.Address{}) { + // return errInvalidCheckpointBeneficiary + //} // Nonces must be 0x00..0 or 0xff..f, zeroes enforced on checkpoints - if !bytes.Equal(header.Nonce[:], nonceAuthVote) && !bytes.Equal(header.Nonce[:], nonceDropVote) { - return errInvalidVote - } - if checkpoint && !bytes.Equal(header.Nonce[:], nonceDropVote) { - return errInvalidCheckpointVote - } - // Check that the extra-data contains both the vanity and signature - if len(header.Extra) < extraVanity { - return errMissingVanity - } - if len(header.Extra) < extraVanity+extraSeal { - return errMissingSignature - } - // Ensure that the extra-data contains a signer list on checkpoint, but none otherwise - signersBytes := len(header.Extra) - extraVanity - extraSeal - if !checkpoint && signersBytes != 0 { - return errExtraSigners - } - if checkpoint && signersBytes%common.AddressLength != 0 { - return errInvalidCheckpointSigners + //if !bytes.Equal(header.Nonce[:], nonceAuthVote) && !bytes.Equal(header.Nonce[:], nonceDropVote) { + // return errInvalidVote + //} + + // Ensure that the extra-data contains a single signature + signersBytes := len(header.Extra) - extraSeal + if signersBytes != 0 { + return errInvalidExtraData } // Ensure that the mix digest is zero as we don't have fork protection currently if header.MixDigest != (common.Hash{}) { @@ -302,9 +295,9 @@ func (a *Aura) verifyHeader(chain consensus.ChainReader, header *types.Header, p if header.UncleHash != uncleHash { return errInvalidUncleHash } - // Ensure that the block's difficulty is meaningful (may not be correct at this point) + // Ensure that the block's difficulty is correct (it should be constant) if number > 0 { - if header.Difficulty == nil || (header.Difficulty.Cmp(diffInTurn) != 0 && header.Difficulty.Cmp(diffNoTurn) != 0) { + if header.Difficulty != chain.Config().Difficulty { return errInvalidDifficulty } }