private GasUsage computeExcessBlobGas(
      final TransactionSelectionResults transactionResults,
      final ProtocolSpec newProtocolSpec,
      final BlockHeader parentHeader) {

    if (newProtocolSpec.getFeeMarket().implementsBlobFee()) {
      final var gasCalculator = newProtocolSpec.getGasCalculator();
      final int newBlobsCount =
          transactionResults.getTransactionsByType(TransactionType.BLOB).stream()
              .map(tx -> tx.getVersionedHashes().orElseThrow())
              .mapToInt(List::size)
              .sum();
      // casting parent excess blob gas to long since for the moment it should be well below that
      // limit
      BlobGas excessBlobGas =
          ExcessBlobGasCalculator.calculateExcessBlobGasForParent(newProtocolSpec, parentHeader);
      BlobGas used = BlobGas.of(gasCalculator.blobGasCost(newBlobsCount));
      return new GasUsage(excessBlobGas, used);
    }
    return null;
  }
Create block will create a new block at the head of the blockchain specified in the
protocolContext.

<p>It will select transactions from the PendingTransaction list for inclusion in the Block
body, and will supply an empty Ommers list.

<p>Once transactions have been selected and applied to a disposable/temporary world state, the
block reward is paid to the relevant coinbase, and a sealable header is constructed.

<p>The sealableHeader is then provided to child instances for sealing (i.e. proof of work or
otherwise).

<p>The constructed block is then returned.

@return a block with appropriately selected transactions, seals and ommers.
ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java