Skip to content
This repository was archived by the owner on Jul 1, 2025. It is now read-only.

Commit c9dea04

Browse files
lu-pintogaryschulte
authored andcommitted
eip-7709 implement BLOCKHASH opcode from system contract state (#7971)
* eip-7709 implement BLOCKHASH opcode from system contract state Signed-off-by: Luis Pinto <[email protected]> * fixup! eip-7709 implement BLOCKHASH opcode from system contract state reimplement blockhashlookup with MessageFrame instead of WorldUpdater Signed-off-by: Luis Pinto <[email protected]> * fixup! eip-7709 implement BLOCKHASH opcode from system contract state address review comments Signed-off-by: Luis Pinto <[email protected]> * fixup! eip-7709 implement BLOCKHASH opcode from system contract state add comment about unused BlockHashProcessor Signed-off-by: Luis Pinto <[email protected]> --------- Signed-off-by: Luis Pinto <[email protected]>
1 parent ef0baef commit c9dea04

File tree

67 files changed

+699
-256
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+699
-256
lines changed

besu/src/main/java/org/hyperledger/besu/services/TraceServiceImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
3232
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
3333
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
34-
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
3534
import org.hyperledger.besu.evm.worldstate.WorldUpdater;
3635
import org.hyperledger.besu.plugin.Unstable;
3736
import org.hyperledger.besu.plugin.data.BlockTraceResult;
@@ -217,7 +216,9 @@ private List<TransactionProcessingResult> trace(
217216
transaction,
218217
protocolSpec.getMiningBeneficiaryCalculator().calculateBeneficiary(header),
219218
tracer,
220-
new CachingBlockHashLookup(header, blockchain),
219+
protocolSpec
220+
.getBlockHashProcessor()
221+
.createBlockHashLookup(blockchain, header),
221222
false,
222223
blobGasPrice);
223224

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecuteTransactionStep.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@
2626
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor;
2727
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
2828
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
29-
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
3029
import org.hyperledger.besu.ethereum.vm.DebugOperationTracer;
31-
import org.hyperledger.besu.evm.operation.BlockHashOperation.BlockHashLookup;
30+
import org.hyperledger.besu.evm.blockhash.BlockHashLookup;
3231

3332
import java.util.List;
3433
import java.util.Optional;
@@ -95,7 +94,8 @@ public TransactionTrace apply(final TransactionTrace transactionTrace) {
9594
maybeParentHeader
9695
.map(parent -> calculateExcessBlobGasForParent(protocolSpec, parent))
9796
.orElse(BlobGas.ZERO));
98-
final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(header, blockchain);
97+
final BlockHashLookup blockHashLookup =
98+
protocolSpec.getBlockHashProcessor().createBlockHashLookup(blockchain, header);
9999
result =
100100
transactionProcessor.processTransaction(
101101
chainUpdater.getNextUpdater(),

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/BlockReplay.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
3131
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
3232
import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams;
33-
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
34-
import org.hyperledger.besu.evm.operation.BlockHashOperation.BlockHashLookup;
33+
import org.hyperledger.besu.evm.blockhash.BlockHashLookup;
3534

3635
import java.util.List;
3736
import java.util.Optional;
@@ -90,7 +89,8 @@ public <T> Optional<T> beforeTransactionInBlock(
9089
return performActionWithBlock(
9190
blockHash,
9291
(body, header, blockchain, transactionProcessor, protocolSpec) -> {
93-
final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(header, blockchain);
92+
final BlockHashLookup blockHashLookup =
93+
protocolSpec.getBlockHashProcessor().createBlockHashLookup(blockchain, header);
9494
final Wei blobGasPrice =
9595
protocolSpec
9696
.getFeeMarket()
@@ -137,7 +137,7 @@ public <T> Optional<T> afterTransactionInBlock(
137137
blockHeader,
138138
transaction,
139139
spec.getMiningBeneficiaryCalculator().calculateBeneficiary(blockHeader),
140-
new CachingBlockHashLookup(blockHeader, blockchain),
140+
spec.getBlockHashProcessor().createBlockHashLookup(blockchain, blockHeader),
141141
false,
142142
TransactionValidationParams.blockReplay(),
143143
blobGasPrice);
@@ -180,6 +180,10 @@ private Optional<Block> getBlock(final Hash blockHash) {
180180
return Optional.empty();
181181
}
182182

183+
public ProtocolSpec getProtocolSpec(final BlockHeader header) {
184+
return protocolSchedule.getByBlockHeader(header);
185+
}
186+
183187
@FunctionalInterface
184188
public interface BlockAction<T> {
185189
Optional<T> perform(

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/BlockTracer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.hyperledger.besu.ethereum.core.MutableWorldState;
2020
import org.hyperledger.besu.ethereum.debug.TraceFrame;
2121
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
22-
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
2322
import org.hyperledger.besu.ethereum.vm.DebugOperationTracer;
2423
import org.hyperledger.besu.evm.worldstate.WorldUpdater;
2524

@@ -69,7 +68,10 @@ private BlockReplay.TransactionAction<TransactionTrace> prepareReplayAction(
6968
transaction,
7069
header.getCoinbase(),
7170
tracer,
72-
new CachingBlockHashLookup(header, blockchain),
71+
blockReplay
72+
.getProtocolSpec(header)
73+
.getBlockHashProcessor()
74+
.createBlockHashLookup(blockchain, header),
7375
false,
7476
blobGasPrice);
7577
final List<TraceFrame> traceFrames = tracer.copyTraceFrames();

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.hyperledger.besu.ethereum.mainnet.ImmutableTransactionValidationParams;
3030
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor;
3131
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
32-
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
3332
import org.hyperledger.besu.ethereum.vm.DebugOperationTracer;
3433
import org.hyperledger.besu.evm.tracing.OperationTracer;
3534
import org.hyperledger.besu.evm.tracing.StandardJsonTracer;
@@ -192,7 +191,10 @@ private TransactionProcessingResult processTransaction(
192191
transaction,
193192
header.getCoinbase(),
194193
tracer,
195-
new CachingBlockHashLookup(header, blockchain),
194+
blockReplay
195+
.getProtocolSpec(header)
196+
.getBlockHashProcessor()
197+
.createBlockHashLookup(blockchain, header),
196198
false,
197199
ImmutableTransactionValidationParams.builder().isAllowFutureNonce(true).build(),
198200
blobGasPrice);

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/privateProcessor/PrivateBlockReplay.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ private <T> Optional<T> performActionWithBlock(
8989
return action.perform(body, header, blockchain, transactionProcessor, protocolSpec);
9090
}
9191

92+
public ProtocolSpec getProtocolSpec(final BlockHeader header) {
93+
return protocolSchedule.getByBlockHeader(header);
94+
}
95+
9296
@FunctionalInterface
9397
public interface BlockAction<T> {
9498
Optional<T> perform(

ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/privateProcessor/PrivateBlockTracer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.hyperledger.besu.ethereum.debug.TraceFrame;
1919
import org.hyperledger.besu.ethereum.privacy.storage.PrivateBlockMetadata;
2020
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
21-
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
2221
import org.hyperledger.besu.ethereum.vm.DebugOperationTracer;
2322
import org.hyperledger.besu.evm.worldstate.StackedUpdater;
2423
import org.hyperledger.besu.evm.worldstate.WorldUpdater;
@@ -76,7 +75,10 @@ private PrivateBlockReplay.TransactionAction<PrivateTransactionTrace> prepareRep
7675
transaction,
7776
header.getCoinbase(),
7877
tracer,
79-
new CachingBlockHashLookup(header, blockchain),
78+
blockReplay
79+
.getProtocolSpec(header)
80+
.getBlockHashProcessor()
81+
.createBlockHashLookup(blockchain, header),
8082
Bytes32.wrap(Bytes.fromBase64String(privacyGroupId)));
8183

8284
final List<TraceFrame> traceFrames = tracer.copyTraceFrames();

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/processor/TransactionTracerTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor;
3434
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
3535
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
36+
import org.hyperledger.besu.ethereum.mainnet.blockhash.BlockHashProcessor;
3637
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
3738
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
3839
import org.hyperledger.besu.ethereum.vm.DebugOperationTracer;
@@ -84,6 +85,7 @@ public class TransactionTracerTest {
8485

8586
@Mock private ProtocolSpec protocolSpec;
8687
@Mock private GasCalculator gasCalculator;
88+
@Mock private BlockHashProcessor blockHashProcessor;
8789

8890
@Mock private Tracer.TraceableState mutableWorldState;
8991

@@ -120,6 +122,7 @@ public void setUp() throws Exception {
120122
when(protocolSpec.getFeeMarket()).thenReturn(FeeMarket.london(0L));
121123
when(blockchain.getChainHeadHeader()).thenReturn(blockHeader);
122124
when(protocolSpec.getGasCalculator()).thenReturn(gasCalculator);
125+
when(protocolSpec.getBlockHashProcessor()).thenReturn(blockHashProcessor);
123126
when(protocolContext.getBadBlockManager()).thenReturn(badBlockManager);
124127
}
125128

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator;
5050
import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext;
5151
import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator;
52-
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
5352
import org.hyperledger.besu.evm.account.MutableAccount;
5453
import org.hyperledger.besu.evm.worldstate.WorldUpdater;
5554
import org.hyperledger.besu.plugin.services.exception.StorageException;
@@ -212,8 +211,7 @@ protected BlockCreationResult createBlock(
212211

213212
newProtocolSpec
214213
.getBlockHashProcessor()
215-
.processBlockHashes(
216-
protocolContext.getBlockchain(), disposableWorldState, processableBlockHeader);
214+
.processBlockHashes(disposableWorldState, processableBlockHeader);
217215

218216
throwIfStopped();
219217

@@ -260,7 +258,9 @@ protected BlockCreationResult createBlock(
260258
disposableWorldState,
261259
newProtocolSpec,
262260
transactionResults.getReceipts(),
263-
new CachingBlockHashLookup(processableBlockHeader, protocolContext.getBlockchain()),
261+
newProtocolSpec
262+
.getBlockHashProcessor()
263+
.createBlockHashLookup(protocolContext.getBlockchain(), processableBlockHeader),
264264
operationTracer);
265265

266266
Optional<List<Request>> maybeRequests =

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockTransactionSelector.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,8 @@
4545
import org.hyperledger.besu.ethereum.mainnet.blockhash.BlockHashProcessor;
4646
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
4747
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
48-
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
48+
import org.hyperledger.besu.evm.blockhash.BlockHashLookup;
4949
import org.hyperledger.besu.evm.gascalculator.GasCalculator;
50-
import org.hyperledger.besu.evm.operation.BlockHashOperation.BlockHashLookup;
5150
import org.hyperledger.besu.evm.worldstate.WorldUpdater;
5251
import org.hyperledger.besu.plugin.data.TransactionSelectionResult;
5352
import org.hyperledger.besu.plugin.services.tracer.BlockAwareOperationTracer;
@@ -376,7 +375,9 @@ private TransactionSelectionResult evaluatePostProcessing(
376375
private TransactionProcessingResult processTransaction(
377376
final PendingTransaction pendingTransaction, final WorldUpdater worldStateUpdater) {
378377
final BlockHashLookup blockHashLookup =
379-
new CachingBlockHashLookup(blockSelectionContext.pendingBlockHeader(), blockchain);
378+
blockSelectionContext
379+
.blockHashProcessor()
380+
.createBlockHashLookup(blockchain, blockSelectionContext.pendingBlockHeader());
380381
return transactionProcessor.processTransaction(
381382
worldStateUpdater,
382383
blockSelectionContext.pendingBlockHeader(),

0 commit comments

Comments
 (0)