From d4a1cfa1b61c2d8ffa566d2ecf42d12fc1225f10 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Thu, 6 Jul 2023 22:54:07 +1000 Subject: [PATCH 1/3] [4844] Fix Data Gas Price Calculation (#1) Signed-off-by: Gabriel-Trintinalia --- .../besu/services/TraceServiceImpl.java | 5 ++- .../methods/ExecuteTransactionStep.java | 6 ++- .../internal/processor/BlockReplay.java | 6 ++- .../internal/processor/TransactionTracer.java | 3 +- .../ethereum/api/query/BlockchainQueries.java | 5 ++- .../blockcreation/AbstractBlockCreator.java | 6 ++- .../besu/ethereum/chain/GenesisState.java | 6 +-- .../besu/ethereum/core/BlockHeader.java | 3 ++ .../ethereum/core/BlockHeaderBuilder.java | 3 +- .../mainnet/AbstractBlockProcessor.java | 24 ++++++---- .../feemarket/ExcessDataGasCalculator.java | 45 +++++++++++++++++++ .../transaction/TransactionSimulator.java | 6 ++- 12 files changed, 94 insertions(+), 24 deletions(-) create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ExcessDataGasCalculator.java diff --git a/besu/src/main/java/org/hyperledger/besu/services/TraceServiceImpl.java b/besu/src/main/java/org/hyperledger/besu/services/TraceServiceImpl.java index 3af78e2ada4..4a43f6f771f 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/TraceServiceImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/TraceServiceImpl.java @@ -15,6 +15,7 @@ package org.hyperledger.besu.services; import static com.google.common.base.Preconditions.checkArgument; +import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessDataGasCalculator.calculateExcessDataGasForParent; import org.hyperledger.besu.datatypes.DataGas; import org.hyperledger.besu.datatypes.Hash; @@ -112,7 +113,9 @@ private void trace(final Block block, final OperationTracer tracer) { .getFeeMarket() .dataPricePerGas( maybeParentHeader - .flatMap(BlockHeader::getExcessDataGas) + .map( + parent -> + calculateExcessDataGasForParent(protocolSpec, parent)) .orElse(DataGas.ZERO)); final TransactionProcessingResult result = transactionProcessor.processTransaction( diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecuteTransactionStep.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecuteTransactionStep.java index 12e422a6d3f..99b157c2205 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecuteTransactionStep.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecuteTransactionStep.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods; +import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessDataGasCalculator.calculateExcessDataGasForParent; + import org.hyperledger.besu.datatypes.DataGas; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.processor.TransactionTrace; @@ -90,7 +92,9 @@ public TransactionTrace apply(final TransactionTrace transactionTrace) { protocolSpec .getFeeMarket() .dataPricePerGas( - maybeParentHeader.flatMap(BlockHeader::getExcessDataGas).orElse(DataGas.ZERO)); + maybeParentHeader + .map(parent -> calculateExcessDataGasForParent(protocolSpec, parent)) + .orElse(DataGas.ZERO)); final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(header, blockchain); result = transactionProcessor.processTransaction( diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/BlockReplay.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/BlockReplay.java index 959f12c1640..49fe92cf604 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/BlockReplay.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/BlockReplay.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.processor; +import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessDataGasCalculator.calculateExcessDataGasForParent; + import org.hyperledger.besu.datatypes.DataGas; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; @@ -55,7 +57,7 @@ public Optional block( .dataPricePerGas( blockchain .getBlockHeader(header.getParentHash()) - .flatMap(BlockHeader::getExcessDataGas) + .map(parent -> calculateExcessDataGasForParent(protocolSpec, parent)) .orElse(DataGas.ZERO)); final List transactionTraces = @@ -89,7 +91,7 @@ public Optional beforeTransactionInBlock( .dataPricePerGas( blockchain .getBlockHeader(header.getParentHash()) - .flatMap(BlockHeader::getExcessDataGas) + .map(parent -> calculateExcessDataGasForParent(protocolSpec, parent)) .orElse(DataGas.ZERO)); for (final Transaction transaction : body.getTransactions()) { diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracer.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracer.java index 83213cdc165..141321a9b18 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracer.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracer.java @@ -15,6 +15,7 @@ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.processor; import static java.util.function.Predicate.isEqual; +import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessDataGasCalculator.calculateExcessDataGasForParent; import org.hyperledger.besu.datatypes.DataGas; import org.hyperledger.besu.datatypes.Hash; @@ -121,7 +122,7 @@ public List traceTransactionToFile( .dataPricePerGas( blockchain .getBlockHeader(header.getParentHash()) - .flatMap(BlockHeader::getExcessDataGas) + .map(parent -> calculateExcessDataGasForParent(protocolSpec, parent)) .orElse(DataGas.ZERO)); for (int i = 0; i < body.getTransactions().size(); i++) { ((StackedUpdater) stackedUpdater).markTransactionBoundary(); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueries.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueries.java index 69d515fe2c6..86cf13e789d 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueries.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueries.java @@ -16,9 +16,9 @@ import static com.google.common.base.Preconditions.checkArgument; import static org.hyperledger.besu.ethereum.api.query.cache.TransactionLogBloomCacher.BLOCKS_PER_BLOOM_CACHE; +import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessDataGasCalculator.calculateExcessDataGasForParent; import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.datatypes.DataGas; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.api.ApiConfiguration; @@ -695,7 +695,8 @@ private Optional getDataGasPrice( parentHeader -> protocolSpec .getFeeMarket() - .dataPricePerGas(parentHeader.getExcessDataGas().orElse(DataGas.ZERO))); + .dataPricePerGas( + calculateExcessDataGasForParent(protocolSpec, parentHeader))); } return Optional.empty(); } 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 b8c65bbd1d8..21e99b57421 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 @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.blockcreation; +import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessDataGasCalculator.calculateExcessDataGasForParent; + import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.DataGas; import org.hyperledger.besu.datatypes.Hash; @@ -169,10 +171,10 @@ protected BlockCreationResult createBlock( createPendingBlockHeader(timestamp, maybePrevRandao, newProtocolSpec); final Address miningBeneficiary = miningBeneficiaryCalculator.getMiningBeneficiary(processableBlockHeader.getNumber()); - final Wei dataGasPrice = + Wei dataGasPrice = newProtocolSpec .getFeeMarket() - .dataPricePerGas(parentHeader.getExcessDataGas().orElse(DataGas.ZERO)); + .dataPricePerGas(calculateExcessDataGasForParent(newProtocolSpec, parentHeader)); throwIfStopped(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java index 09012c98159..0f5e003267d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java @@ -243,7 +243,7 @@ private static long parseUnsignedLong(final String value) { private static boolean isShanghaiAtGenesis(final GenesisConfigFile genesis) { final OptionalLong shanghaiTimestamp = genesis.getConfigOptions().getShanghaiTime(); if (shanghaiTimestamp.isPresent()) { - return shanghaiTimestamp.getAsLong() == genesis.getTimestamp(); + return genesis.getTimestamp() >= shanghaiTimestamp.getAsLong(); } return false; } @@ -251,7 +251,7 @@ private static boolean isShanghaiAtGenesis(final GenesisConfigFile genesis) { private static boolean isCancunAtGenesis(final GenesisConfigFile genesis) { final OptionalLong cancunTimestamp = genesis.getConfigOptions().getCancunTime(); if (cancunTimestamp.isPresent()) { - return cancunTimestamp.getAsLong() == genesis.getTimestamp(); + return genesis.getTimestamp() >= cancunTimestamp.getAsLong(); } return false; } @@ -259,7 +259,7 @@ private static boolean isCancunAtGenesis(final GenesisConfigFile genesis) { private static boolean isExperimentalEipsTimeAtGenesis(final GenesisConfigFile genesis) { final OptionalLong experimentalEipsTime = genesis.getConfigOptions().getExperimentalEipsTime(); if (experimentalEipsTime.isPresent()) { - return experimentalEipsTime.getAsLong() == genesis.getTimestamp(); + return genesis.getTimestamp() >= experimentalEipsTime.getAsLong(); } return false; } 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 6aee80d10ce..eb2e906af70 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 @@ -320,6 +320,9 @@ public String toString() { if (withdrawalsRoot != null) { sb.append("withdrawalsRoot=").append(withdrawalsRoot).append(", "); } + if (dataGasUsed != null) { + sb.append("dataGasUsed=").append(dataGasUsed).append(", "); + } if (excessDataGas != null) { sb.append("excessDataGas=").append(excessDataGas).append(", "); } 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 a910f30a52c..41536ca964e 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,8 +73,7 @@ public class BlockHeaderBuilder { // instead of an invalid identifier such as -1. private OptionalLong nonce = OptionalLong.empty(); - private Long dataGasUsed; - + private Long dataGasUsed = null; private DataGas excessDataGas = null; public static BlockHeaderBuilder create() { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java index 08f77a91b88..cb9fb23b2a8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java @@ -14,8 +14,9 @@ */ package org.hyperledger.besu.ethereum.mainnet; +import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessDataGasCalculator.calculateExcessDataGasForParent; + import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.datatypes.DataGas; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.BlockProcessingOutputs; import org.hyperledger.besu.ethereum.BlockProcessingResult; @@ -112,14 +113,19 @@ public BlockProcessingResult processBlock( final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(blockHeader, blockchain); final Address miningBeneficiary = miningBeneficiaryCalculator.calculateBeneficiary(blockHeader); - final Wei dataGasPrice = - protocolSpec - .getFeeMarket() - .dataPricePerGas( - blockchain - .getBlockHeader(blockHeader.getParentHash()) - .flatMap(BlockHeader::getExcessDataGas) - .orElse(DataGas.ZERO)); + + Optional maybeParentHeader = + blockchain.getBlockHeader(blockHeader.getParentHash()); + + Wei dataGasPrice = + maybeParentHeader + .map( + (parentHeader) -> + protocolSpec + .getFeeMarket() + .dataPricePerGas( + calculateExcessDataGasForParent(protocolSpec, parentHeader))) + .orElse(Wei.ZERO); final TransactionProcessingResult result = transactionProcessor.processTransaction( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ExcessDataGasCalculator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ExcessDataGasCalculator.java new file mode 100644 index 00000000000..3787dafc45e --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ExcessDataGasCalculator.java @@ -0,0 +1,45 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet.feemarket; + +import org.hyperledger.besu.datatypes.DataGas; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; + +/** + + Calculates the excess data gas for a parent block header. + */ +public class ExcessDataGasCalculator { + /** +public class ExcessDataGasCalculator { + /** + Calculates the excess data gas for a parent block header. + @param protocolSpec The protocol specification. + @param parentHeader The parent block header. + @return The excess data gas. + */ + public static DataGas calculateExcessDataGasForParent( + final ProtocolSpec protocolSpec, final BlockHeader parentHeader) { +// Blob Data Excess + long headerExcess = + protocolSpec + .getGasCalculator() + .computeExcessDataGas( + parentHeader.getExcessDataGas().map(DataGas::toLong).orElse(0L), + parentHeader.getDataGasUsed().orElse(0L)); + return DataGas.of(headerExcess); + } +} \ No newline at end of file diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionSimulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionSimulator.java index 7508f8f7501..9a76eafee7b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionSimulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionSimulator.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.transaction; +import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessDataGasCalculator.calculateExcessDataGasForParent; + import org.hyperledger.besu.crypto.SECPSignature; import org.hyperledger.besu.crypto.SignatureAlgorithm; import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; @@ -231,7 +233,9 @@ public Optional processWithWorldUpdater( protocolSpec .getFeeMarket() .dataPricePerGas( - maybeParentHeader.flatMap(BlockHeader::getExcessDataGas).orElse(DataGas.ZERO)); + maybeParentHeader + .map(parent -> calculateExcessDataGasForParent(protocolSpec, parent)) + .orElse(DataGas.ZERO)); final Transaction transaction = maybeTransaction.get(); final TransactionProcessingResult result = From 5c18ccc4d39a6d145b9b408e29cbee5f990d13de Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Thu, 6 Jul 2023 23:15:03 +1000 Subject: [PATCH 2/3] Fix spotless Signed-off-by: Gabriel-Trintinalia --- .../besu/ethereum/chain/GenesisState.java | 2 +- .../feemarket/ExcessDataGasCalculator.java | 21 ++++++++----------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java index 0f5e003267d..959559a9af5 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java @@ -259,7 +259,7 @@ private static boolean isCancunAtGenesis(final GenesisConfigFile genesis) { private static boolean isExperimentalEipsTimeAtGenesis(final GenesisConfigFile genesis) { final OptionalLong experimentalEipsTime = genesis.getConfigOptions().getExperimentalEipsTime(); if (experimentalEipsTime.isPresent()) { - return genesis.getTimestamp() >= experimentalEipsTime.getAsLong(); + return genesis.getTimestamp() >= experimentalEipsTime.getAsLong(); } return false; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ExcessDataGasCalculator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ExcessDataGasCalculator.java index 3787dafc45e..75e179595a5 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ExcessDataGasCalculator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ExcessDataGasCalculator.java @@ -18,22 +18,19 @@ import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; -/** - - Calculates the excess data gas for a parent block header. - */ -public class ExcessDataGasCalculator { - /** +/** Calculates the excess data gas for a parent block header. */ public class ExcessDataGasCalculator { /** - Calculates the excess data gas for a parent block header. - @param protocolSpec The protocol specification. - @param parentHeader The parent block header. - @return The excess data gas. + * public class ExcessDataGasCalculator { /** Calculates the excess data gas for a parent block + * header. + * + * @param protocolSpec The protocol specification. + * @param parentHeader The parent block header. + * @return The excess data gas. */ public static DataGas calculateExcessDataGasForParent( final ProtocolSpec protocolSpec, final BlockHeader parentHeader) { -// Blob Data Excess + // Blob Data Excess long headerExcess = protocolSpec .getGasCalculator() @@ -42,4 +39,4 @@ public static DataGas calculateExcessDataGasForParent( parentHeader.getDataGasUsed().orElse(0L)); return DataGas.of(headerExcess); } -} \ No newline at end of file +} From 9ff54b6968602bec96f7f0f8c02014cf2760c368 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Thu, 6 Jul 2023 23:51:02 +1000 Subject: [PATCH 3/3] Fix mock unit tests Signed-off-by: Gabriel-Trintinalia --- .../jsonrpc/internal/processor/TransactionTracerTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracerTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracerTest.java index e2124a67c3f..7e139636638 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracerTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracerTest.java @@ -16,6 +16,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -35,6 +36,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.vm.DebugOperationTracer; +import org.hyperledger.besu.evm.gascalculator.GasCalculator; import org.hyperledger.besu.evm.tracing.StandardJsonTracer; import org.hyperledger.besu.evm.worldstate.StackedUpdater; import org.hyperledger.besu.evm.worldstate.WorldUpdater; @@ -78,6 +80,7 @@ public class TransactionTracerTest { @Mock private DebugOperationTracer tracer; @Mock private ProtocolSpec protocolSpec; + @Mock private GasCalculator gasCalculator; @Mock private Tracer.TraceableState mutableWorldState; @@ -112,6 +115,8 @@ public void setUp() throws Exception { when(protocolSpec.getFeeMarket()).thenReturn(FeeMarket.london(0L)); when(blockchain.getChainHeadHeader()).thenReturn(blockHeader); when(protocolSpec.getBadBlocksManager()).thenReturn(new BadBlockManager()); + when(protocolSpec.getGasCalculator()).thenReturn(gasCalculator); + when(gasCalculator.computeExcessDataGas(anyLong(), anyLong())).thenReturn(0L); } @Test