@Override
  public boolean validate(
      final BlockHeader header, final BlockHeader parent, final ProtocolContext protocolContext) {
    try {
      final Collection<Address> storedValidators =
          protocolContext
              .getConsensusContext(CliqueContext.class)
              .getValidatorProvider()
              .getValidatorsAfterBlock(parent);

      return extraDataIsValid(storedValidators, header);

    } catch (final RLPException ex) {
      LOG.info(
          "Invalid block header: ExtraData field was unable to be deserialised into an Clique Struct.",
          ex);
      return false;
    } catch (final IllegalArgumentException ex) {
      LOG.info("Invalid block header: Failed to verify extra data", ex);
      return false;
    }
  }
Responsible for determining the validity of the extra data field. Ensures:

<ul>
  <li>Bytes in the extra data field can be decoded as per Clique specification
  <li>Proposer (derived from the proposerSeal) is a member of the validators
  <li>Validators are only validated on epoch blocks.
</ul>

@param header the block header containing the extraData to be validated.
@return True if the extraData successfully produces an CliqueExtraData object, false otherwise
consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/headervalidationrules/CliqueExtraDataValidationRule.java