@Override
  public Optional<SECPPublicKey> recoverPublicKeyFromSignature(
      final Bytes32 dataHash, final SECPSignature signature) {
    final BigInteger publicKeyBI =
        recoverFromSignature(signature.getRecId(), signature.getR(), signature.getS(), dataHash);
    return publicKeyBI == null
        ? Optional.empty()
        : Optional.of(SECPPublicKey.create(publicKeyBI, ALGORITHM));
  }
Verifies the given ECDSA signature using the public key bytes against the message bytes,
previously passed through a preprocessor function, which is normally a hashing function.

@param data The data to verify.
@param signature ASN.1 encoded signature.
@param pub The public key bytes to use.
@param preprocessor The function to apply to the data before verifying the signature, normally
    a hashing function.
@return True if the verification is successful.
crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/AbstractSECP256.java