public static GetBlockHeadersData readFrom(final RLPInput input) {
      input.enterList();

      final Optional<Hash> blockHash;
      final OptionalLong blockNumber;
      if (input.nextSize() == Hash.SIZE) {
        blockHash = Optional.of(Hash.wrap(input.readBytes32()));
        blockNumber = OptionalLong.empty();
      } else {
        blockHash = Optional.empty();
        blockNumber = OptionalLong.of(input.readLongScalar());
      }

      final int maxHeaders = input.readIntScalar();
      final int skip = input.readIntScalar();
      final boolean reverse = input.readIntScalar() != 0;

      input.leaveList();

      return new GetBlockHeadersData(blockHash, blockNumber, maxHeaders, skip, reverse);
    }
Returns the block hash that the message requests or {@link Optional#empty()} if the request
specifies a block number.

@return Block Hash Requested or {@link Optional#empty()}
ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/messages/GetBlockHeadersMessage.java