From be4d4dd21e05b2bbd6b4eb4c3d5ac607574f354b Mon Sep 17 00:00:00 2001 From: Stefan Date: Thu, 8 Jun 2023 16:16:10 +1000 Subject: [PATCH] add dataGasUsed Signed-off-by: Stefan --- .../besu/tests/acceptance/dsl/BlockUtils.java | 1 + .../besu/services/BesuEventsImplTest.java | 2 +- .../api/jsonrpc/JsonRpcResponseUtils.java | 1 + .../engine/AbstractEngineNewPayload.java | 1 + .../parameters/EnginePayloadParameter.java | 8 ++++++- .../internal/methods/EthGasPriceTest.java | 2 ++ .../engine/AbstractEngineNewPayloadTest.java | 1 + ...neExchangeTransitionConfigurationTest.java | 1 + .../query/BlockchainQueriesLogCacheTest.java | 1 + .../cache/TransactionLogBloomCacherTest.java | 2 ++ .../blockcreation/AbstractBlockCreator.java | 22 ++++++++++++++++++- .../besu/ethereum/core/BlockHeader.java | 8 +++++++ .../ethereum/core/BlockHeaderBuilder.java | 10 +++++++++ .../ethereum/core/SealableBlockHeader.java | 12 ++++++++++ .../ethereum/core/NonBesuBlockHeader.java | 5 +++++ .../besu/ethereum/bonsai/LogRollingTests.java | 2 ++ .../eth/messages/MessageWrapperTest.java | 1 + .../backwardsync/ChainForTestCreator.java | 3 +++ .../BlockchainReferenceTestCaseSpec.java | 2 ++ .../referencetests/ReferenceTestEnv.java | 1 + .../gascalculator/CancunGasCalculator.java | 9 +++----- .../besu/evm/gascalculator/GasCalculator.java | 4 ++-- plugin-api/build.gradle | 2 +- .../besu/plugin/data/BlockHeader.java | 8 +++++++ 24 files changed, 97 insertions(+), 12 deletions(-) diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/BlockUtils.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/BlockUtils.java index 6f88c3a6ead..6b061467f68 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/BlockUtils.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/BlockUtils.java @@ -54,6 +54,7 @@ public static BlockHeader createBlockHeader( mixHash, new BigInteger(block.getNonceRaw().substring(2), 16).longValue(), null, + 0, null, null, blockHeaderFunctions); diff --git a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index 4ce430e787d..b2a05914714 100644 --- a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -195,7 +195,7 @@ private void setSyncTarget() { mock(EthPeer.class), new org.hyperledger.besu.ethereum.core.BlockHeader( null, null, null, null, null, null, null, null, 1, 1, 1, 1, null, null, null, 1, null, - null, null, null)); + 0, null, null, null)); } private void clearSyncTarget() { diff --git a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcResponseUtils.java b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcResponseUtils.java index c54c0d83905..b9455824c94 100644 --- a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcResponseUtils.java +++ b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcResponseUtils.java @@ -127,6 +127,7 @@ public JsonRpcResponse response( mixHash, nonce, withdrawalsRoot, + 0, // ToDo 4844: set with the value of data_gas_used field null, // ToDo 4844: set with the value of excess_data_gas field depositsRoot, blockHeaderFunctions); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index c482722fa69..2a4d97ee349 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -173,6 +173,7 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) blockParam.getPrevRandao(), 0, maybeWithdrawals.map(BodyValidation::withdrawalsRoot).orElse(null), + blockParam.getDataGasUsed(), blockParam.getExcessDataGas() == null ? null : DataGas.fromHexString(blockParam.getExcessDataGas()), diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java index c79363e93e3..d3294fa9219 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java @@ -48,7 +48,7 @@ public class EnginePayloadParameter { private final List transactions; private final List withdrawals; private final List deposits; - + private final long dataGasUsed; private final String excessDataGas; @JsonCreator @@ -68,6 +68,7 @@ public EnginePayloadParameter( @JsonProperty("prevRandao") final String prevRandao, @JsonProperty("transactions") final List transactions, @JsonProperty("withdrawals") final List withdrawals, + @JsonProperty("dataGasUsed") final UnsignedLongParameter dataGasUsed, @JsonProperty("deposits") final List deposits, @JsonProperty("excessDataGas") final String excessDataGas) { this.blockHash = blockHash; @@ -86,6 +87,7 @@ public EnginePayloadParameter( this.transactions = transactions; this.withdrawals = withdrawals; this.deposits = deposits; + this.dataGasUsed = dataGasUsed.getValue(); this.excessDataGas = excessDataGas; } @@ -149,6 +151,10 @@ public List getWithdrawals() { return withdrawals; } + public long getDataGasUsed() { + return dataGasUsed; + } + public String getExcessDataGas() { return excessDataGas; } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGasPriceTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGasPriceTest.java index 043a87d92ce..96e33aab056 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGasPriceTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGasPriceTest.java @@ -162,6 +162,7 @@ private Object createFakeBlock(final Long height) { Hash.EMPTY, 0, null, + 0, null, null, null), @@ -202,6 +203,7 @@ private Object createEmptyBlock(final Long height) { Hash.EMPTY, 0, null, + 0, null, null, null), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java index 0cce298eaa5..7955762835c 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java @@ -617,6 +617,7 @@ private EnginePayloadParameter mockPayload( header.getPrevRandao().map(Bytes32::toHexString).orElse("0x0"), txs, withdrawals, + new UnsignedLongParameter(header.getDataGasUsed()), deposits, header.getExcessDataGas().map(DataGas::toHexString).orElse(null)); } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java index 0180d0269c7..cad287534f0 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineExchangeTransitionConfigurationTest.java @@ -250,6 +250,7 @@ private BlockHeader createBlockHeader(final Hash blockHash, final long blockNumb Bytes32.ZERO, 0, null, + 0, null, null, new BlockHeaderFunctions() { diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueriesLogCacheTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueriesLogCacheTest.java index 801c1d7bd8a..5fbb042f8e9 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueriesLogCacheTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueriesLogCacheTest.java @@ -111,6 +111,7 @@ public void setup() { Hash.EMPTY, 0, null, + 0, null, null, new MainnetBlockHeaderFunctions()); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/cache/TransactionLogBloomCacherTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/cache/TransactionLogBloomCacherTest.java index d7664520291..045ae1d2eeb 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/cache/TransactionLogBloomCacherTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/cache/TransactionLogBloomCacherTest.java @@ -102,6 +102,7 @@ public void setup() throws IOException { Hash.EMPTY, 0, null, + 0, null, null, new MainnetBlockHeaderFunctions()); @@ -275,6 +276,7 @@ private BlockHeader createBlock(final long number, final Optional messag Hash.EMPTY, 0, null, + 0, null, null, new MainnetBlockHeaderFunctions()); diff --git a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java index 5f4af0bf49d..51f24092f36 100644 --- a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java +++ b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java @@ -228,7 +228,26 @@ protected BlockCreationResult createBlock( throwIfStopped(); - final DataGas newExcessDataGas = computeExcessDataGas(transactionResults, newProtocolSpec); + DataGas newExcessDataGas = null; + long newDataGasUsed = 0; + if (newProtocolSpec.getFeeMarket().implementsDataFee()) { + final var gasCalculator = newProtocolSpec.getGasCalculator(); + newExcessDataGas = + DataGas.of( + gasCalculator.computeExcessDataGas( + // casting parent excess data gas to long since for the moment it should be well + // below that limit + parentHeader.getExcessDataGas().map(DataGas::toLong).orElse(0L), + parentHeader.getDataGasUsed())); + + final int newBlobsCount = + transactionResults.getTransactionsByType(TransactionType.BLOB).stream() + .map(tx -> tx.getVersionedHashes().orElseThrow()) + .mapToInt(List::size) + .sum(); + + newDataGasUsed = gasCalculator.dataGasCost(newBlobsCount); + } throwIfStopped(); @@ -248,6 +267,7 @@ protected BlockCreationResult createBlock( ? BodyValidation.withdrawalsRoot(maybeWithdrawals.get()) : null) .depositsRoot(maybeDeposits.map(BodyValidation::depositsRoot).orElse(null)) + .dataGasUsed(newDataGasUsed) .excessDataGas(newExcessDataGas) .buildSealableBlockHeader(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeader.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeader.java index 1fa63d295f8..88ab81b9bf0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeader.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeader.java @@ -62,6 +62,7 @@ public BlockHeader( final Bytes32 mixHashOrPrevRandao, final long nonce, final Hash withdrawalsRoot, + final long dataGasUsed, final DataGas excessDataGas, final Hash depositsRoot, final BlockHeaderFunctions blockHeaderFunctions, @@ -83,6 +84,7 @@ public BlockHeader( baseFee, mixHashOrPrevRandao, withdrawalsRoot, + dataGasUsed, excessDataGas, depositsRoot); this.nonce = nonce; @@ -108,6 +110,7 @@ public BlockHeader( final Bytes32 mixHashOrPrevRandao, final long nonce, final Hash withdrawalsRoot, + final long dataGasUsed, final DataGas excessDataGas, final Hash depositsRoot, final BlockHeaderFunctions blockHeaderFunctions) { @@ -128,6 +131,7 @@ public BlockHeader( baseFee, mixHashOrPrevRandao, withdrawalsRoot, + dataGasUsed, excessDataGas, depositsRoot); this.nonce = nonce; @@ -213,6 +217,7 @@ public void writeTo(final RLPOutput out) { out.writeBytes(withdrawalsRoot); } if (excessDataGas != null) { + out.writeLongScalar(dataGasUsed); out.writeUInt256Scalar(excessDataGas); } if (depositsRoot != null) { @@ -244,6 +249,7 @@ public static BlockHeader readFrom( !(input.isEndOfCurrentList() || input.isZeroLengthString()) ? Hash.wrap(input.readBytes32()) : null; + final long dataGasUsed = !input.isEndOfCurrentList() ? input.readUInt256Scalar().toLong() : 0; final DataGas excessDataGas = !input.isEndOfCurrentList() ? DataGas.of(input.readUInt256Scalar()) : null; final Hash depositHashRoot = @@ -267,6 +273,7 @@ public static BlockHeader readFrom( mixHashOrPrevRandao, nonce, withdrawalHashRoot, + dataGasUsed, excessDataGas, depositHashRoot, blockHeaderFunctions); @@ -346,6 +353,7 @@ public static org.hyperledger.besu.ethereum.core.BlockHeader convertPluginBlockH .getWithdrawalsRoot() .map(h -> Hash.fromHexString(h.toHexString())) .orElse(null), + pluginBlockHeader.getDataGasUsed(), pluginBlockHeader.getExcessDataGas().map(DataGas::fromQuantity).orElse(null), pluginBlockHeader .getDepositsRoot() diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeaderBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeaderBuilder.java index e670c37221d..057be86c971 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeaderBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeaderBuilder.java @@ -73,6 +73,8 @@ public class BlockHeaderBuilder { // instead of an invalid identifier such as -1. private OptionalLong nonce = OptionalLong.empty(); + private long dataGasUsed; + private DataGas excessDataGas = null; public static BlockHeaderBuilder create() { @@ -119,6 +121,7 @@ public static BlockHeaderBuilder fromHeader(final BlockHeader header) { .nonce(header.getNonce()) .prevRandao(header.getPrevRandao().orElse(null)) .withdrawalsRoot(header.getWithdrawalsRoot().orElse(null)) + .dataGasUsed(header.getDataGasUsed()) .excessDataGas(header.getExcessDataGas().orElse(null)) .depositsRoot(header.getDepositsRoot().orElse(null)); } @@ -170,6 +173,7 @@ public BlockHeader buildBlockHeader() { mixHashOrPrevRandao, nonce.getAsLong(), withdrawalsRoot, + dataGasUsed, excessDataGas, depositsRoot, blockHeaderFunctions); @@ -210,6 +214,7 @@ public SealableBlockHeader buildSealableBlockHeader() { baseFee, mixHashOrPrevRandao, withdrawalsRoot, + dataGasUsed, excessDataGas, depositsRoot); } @@ -399,4 +404,9 @@ public BlockHeaderBuilder excessDataGas(final DataGas excessDataGas) { this.excessDataGas = excessDataGas; return this; } + + public BlockHeaderBuilder dataGasUsed(final long dataGasUsed) { + this.dataGasUsed = dataGasUsed; + return this; + } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/SealableBlockHeader.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/SealableBlockHeader.java index c742b6ab746..17fd4422bd0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/SealableBlockHeader.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/SealableBlockHeader.java @@ -44,6 +44,7 @@ public class SealableBlockHeader extends ProcessableBlockHeader { protected final Hash withdrawalsRoot; protected final Hash depositsRoot; + protected final long dataGasUsed; protected SealableBlockHeader( final Hash parentHash, @@ -62,6 +63,7 @@ protected SealableBlockHeader( final Wei baseFee, final Bytes32 mixHashOrPrevRandao, final Hash withdrawalsRoot, + final long dataGasUsed, final DataGas excessDataGas, final Hash depositsRoot) { super( @@ -83,6 +85,7 @@ protected SealableBlockHeader( this.logsBloom = logsBloom; this.gasUsed = gasUsed; this.extraData = extraData; + this.dataGasUsed = dataGasUsed; } /** @@ -165,4 +168,13 @@ public Optional getWithdrawalsRoot() { public Optional getDepositsRoot() { return Optional.ofNullable(depositsRoot); } + + /** + * Returns the data gas used + * + * @return the data gas used + */ + public long getDataGasUsed() { + return dataGasUsed; + } } diff --git a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/NonBesuBlockHeader.java b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/NonBesuBlockHeader.java index e8c1b58c66b..9e9f8cd5b6f 100644 --- a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/NonBesuBlockHeader.java +++ b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/NonBesuBlockHeader.java @@ -127,4 +127,9 @@ public Hash getBlockHash() { public Optional getExcessDataGas() { return Optional.empty(); } + + @Override + public long getDataGasUsed() { + return 0; + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/bonsai/LogRollingTests.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/bonsai/LogRollingTests.java index c6cc9b58c8f..b2a96ec71a3 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/bonsai/LogRollingTests.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/bonsai/LogRollingTests.java @@ -96,6 +96,7 @@ public class LogRollingTests { Hash.ZERO, 0, null, + 0, null, null, new MainnetBlockHeaderFunctions()); @@ -118,6 +119,7 @@ public class LogRollingTests { Hash.ZERO, 0, null, + 0, null, null, new MainnetBlockHeaderFunctions()); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/MessageWrapperTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/MessageWrapperTest.java index fa6d86dd9df..847415e31c5 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/MessageWrapperTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/MessageWrapperTest.java @@ -389,6 +389,7 @@ public TestBlockHeader( Hash.fromHexString(mixHash), Bytes.fromHexStringLenient(nonce).toLong(), null, + 0, null, null, new MainnetBlockHeaderFunctions()); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ChainForTestCreator.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ChainForTestCreator.java index 0d0b50858be..63dfe255770 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ChainForTestCreator.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ChainForTestCreator.java @@ -57,6 +57,7 @@ public static BlockHeader prepareHeader(final long number, final Optional getPrevRandao() { */ @Unstable Optional getExcessDataGas(); + + /** + * The data_gas_used of this header. + * + * @return The data_gas_used of this header. + */ + @Unstable + long getDataGasUsed(); }