public static BlockHeader readFrom(
      final RLPInput input, final BlockHeaderFunctions blockHeaderFunctions) {
    final RLPInput headerRlp = input.readAsRlp();
    if (headerRlp.enterList() == 0) {
      return null;
    }

    final Hash parentHash = Hash.wrap(headerRlp.readBytes32());
    final Hash ommersHash = Hash.wrap(headerRlp.readBytes32());
    final Address coinbase = Address.readFrom(headerRlp);
    final Hash stateRoot = Hash.wrap(headerRlp.readBytes32());
    final Hash transactionsRoot = Hash.wrap(headerRlp.readBytes32());
    final Hash receiptsRoot = Hash.wrap(headerRlp.readBytes32());
    final LogsBloomFilter logsBloom = LogsBloomFilter.readFrom(headerRlp);
    final Difficulty difficulty = Difficulty.of(headerRlp.readUInt256Scalar());
    final long number = headerRlp.readLongScalar();
    final long gasLimit = headerRlp.readLongScalar();
    final long gasUsed = headerRlp.readLongScalar();
    final long timestamp = headerRlp.readLongScalar();
    final Bytes extraData = headerRlp.readBytes();
    final Bytes32 mixHashOrPrevRandao = headerRlp.readBytes32();
    final long nonce = headerRlp.readLong();
    final Wei baseFee =
        !headerRlp.isEndOfCurrentList() ? Wei.of(headerRlp.readUInt256Scalar()) : null;
    final Hash withdrawalHashRoot =
        !(headerRlp.isEndOfCurrentList() || headerRlp.isZeroLengthString())
            ? Hash.wrap(headerRlp.readBytes32())
            : null;
    final Long blobGasUsed = !headerRlp.isEndOfCurrentList() ? headerRlp.readLongScalar() : null;
    final BlobGas excessBlobGas =
        !headerRlp.isEndOfCurrentList() ? BlobGas.of(headerRlp.readUInt64Scalar()) : null;
    final Bytes32 parentBeaconBlockRoot =
        !headerRlp.isEndOfCurrentList() ? headerRlp.readBytes32() : null;
    final Hash requestsHash =
        !headerRlp.isEndOfCurrentList() ? Hash.wrap(headerRlp.readBytes32()) : null;
    headerRlp.leaveList();
    return new BlockHeader(
        parentHash,
        ommersHash,
        coinbase,
        stateRoot,
        transactionsRoot,
        receiptsRoot,
        logsBloom,
        difficulty,
        number,
        gasLimit,
        gasUsed,
        timestamp,
        extraData,
        baseFee,
        mixHashOrPrevRandao,
        nonce,
        withdrawalHashRoot,
        blobGasUsed,
        excessBlobGas,
        parentBeaconBlockRoot,
        requestsHash,
        blockHeaderFunctions,
        Optional.of(headerRlp.raw()));
  }
Write an RLP representation.

@param out The RLP output to write to
ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeader.java