From 871c22d11eda6ed45bcf3d4beae5ca16e1feec93 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 4 Feb 2025 09:14:51 +1100 Subject: [PATCH 1/9] Implement EIP2935 as system call Signed-off-by: Gabriel-Trintinalia --- .../blockcreation/AbstractBlockCreator.java | 26 ++-- .../AbstractBlockCreatorTest.java | 5 +- .../mainnet/AbstractBlockProcessor.java | 19 +-- .../mainnet/blockhash/BlockHashProcessor.java | 7 +- .../blockhash/CancunBlockHashProcessor.java | 9 +- .../blockhash/Eip7709BlockHashProcessor.java | 2 +- .../blockhash/FrontierBlockHashProcessor.java | 6 +- .../blockhash/PragueBlockHashProcessor.java | 70 ++------- .../requests/ProcessRequestContext.java | 31 ++-- .../requests/SystemCallRequestProcessor.java | 18 +-- .../systemcall/BlockContextProcessor.java | 19 +++ .../systemcall/BlockProcessingContext.java | 63 ++++++++ .../{ => systemcall}/SystemCallProcessor.java | 43 +++--- .../ethereum/vm/Eip7709BlockHashLookup.java | 6 +- ... => MainnetBlockContextProcessorTest.java} | 22 ++- .../blockhash/BlockHashProcessorTest.java | 141 ------------------ .../hyperledger/besu/evmtool/T8nExecutor.java | 24 +-- 17 files changed, 210 insertions(+), 301 deletions(-) create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockContextProcessor.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockProcessingContext.java rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/{ => systemcall}/SystemCallProcessor.java (79%) rename ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/{SystemCallProcessorTest.java => MainnetBlockContextProcessorTest.java} (87%) delete mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessorTest.java 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 5a37d079c4d..f1395ead14d 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 @@ -50,6 +50,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator; import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.worldstate.WorldUpdater; import org.hyperledger.besu.plugin.services.exception.StorageException; @@ -210,9 +211,17 @@ protected BlockCreationResult createBlock( final List ommers = maybeOmmers.orElse(selectOmmers()); - newProtocolSpec - .getBlockHashProcessor() - .processBlockHashes(disposableWorldState, processableBlockHeader); + BlockProcessingContext blockProcessingContext = + new BlockProcessingContext( + disposableWorldState, + processableBlockHeader, + BlockAwareOperationTracer.NO_TRACING, + newProtocolSpec + .getBlockHashProcessor() + .createBlockHashLookup(protocolContext.getBlockchain(), processableBlockHeader), + newProtocolSpec); + + newProtocolSpec.getBlockHashProcessor().process(blockProcessingContext); throwIfStopped(); @@ -252,17 +261,8 @@ protected BlockCreationResult createBlock( // EIP-7685: process EL requests final Optional requestProcessor = newProtocolSpec.getRequestProcessorCoordinator(); - ProcessRequestContext context = - new ProcessRequestContext( - processableBlockHeader, - disposableWorldState, - newProtocolSpec, - transactionResults.getReceipts(), - newProtocolSpec - .getBlockHashProcessor() - .createBlockHashLookup(protocolContext.getBlockchain(), processableBlockHeader), - operationTracer); + new ProcessRequestContext(blockProcessingContext, transactionResults.getReceipts()); Optional> maybeRequests = requestProcessor.map(processor -> processor.process(context)); diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java index 4c4bf134855..4f9c2753e2b 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java @@ -78,6 +78,7 @@ import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor; import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor; import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason; import org.hyperledger.besu.evm.account.Account; import org.hyperledger.besu.evm.internal.EvmConfiguration; @@ -142,7 +143,9 @@ void findDepositRequestsFromReceipts() { var depositRequestsFromReceipts = new DepositRequestProcessor(DEFAULT_DEPOSIT_CONTRACT_ADDRESS) - .process(new ProcessRequestContext(null, null, null, receipts, null, null)); + .process( + new ProcessRequestContext( + new BlockProcessingContext(null, null, null, null, null), receipts)); assertThat(depositRequestsFromReceipts).isEqualTo(expectedDepositRequest); } 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 42efc85e5c9..c49d11b5cd4 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 @@ -32,6 +32,7 @@ import org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor.PreprocessingFunction.NoPreprocessing; import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.MerkleTrieException; @@ -126,10 +127,12 @@ protected BlockProcessingResult processBlock( long currentBlobGasUsed = 0; final ProtocolSpec protocolSpec = protocolSchedule.getByBlockHeader(blockHeader); - - protocolSpec.getBlockHashProcessor().processBlockHashes(worldState, blockHeader); final BlockHashLookup blockHashLookup = protocolSpec.getBlockHashProcessor().createBlockHashLookup(blockchain, blockHeader); + final BlockProcessingContext context = + new BlockProcessingContext( + worldState, blockHeader, OperationTracer.NO_TRACING, blockHashLookup, protocolSpec); + protocolSpec.getBlockHashProcessor().process(context); final Address miningBeneficiary = miningBeneficiaryCalculator.calculateBeneficiary(blockHeader); @@ -240,16 +243,8 @@ protected BlockProcessingResult processBlock( protocolSpec.getRequestProcessorCoordinator(); Optional> maybeRequests = Optional.empty(); if (requestProcessor.isPresent()) { - ProcessRequestContext context = - new ProcessRequestContext( - blockHeader, - worldState, - protocolSpec, - receipts, - blockHashLookup, - OperationTracer.NO_TRACING); - - maybeRequests = Optional.of(requestProcessor.get().process(context)); + ProcessRequestContext requestContext = new ProcessRequestContext(context, receipts); + maybeRequests = Optional.of(requestProcessor.get().process(requestContext)); } if (maybeRequests.isPresent() && blockHeader.getRequestsHash().isPresent()) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessor.java index ae4bf5b6f34..d0bf57021d0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessor.java @@ -15,13 +15,12 @@ package org.hyperledger.besu.ethereum.mainnet.blockhash; import org.hyperledger.besu.ethereum.chain.Blockchain; -import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockContextProcessor; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.evm.blockhash.BlockHashLookup; -public interface BlockHashProcessor { - - void processBlockHashes(MutableWorldState worldState, ProcessableBlockHeader currentBlockHeader); +public interface BlockHashProcessor extends BlockContextProcessor { BlockHashLookup createBlockHashLookup(Blockchain blockchain, ProcessableBlockHeader blockHeader); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/CancunBlockHashProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/CancunBlockHashProcessor.java index 3be30719e18..0a348d4fccd 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/CancunBlockHashProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/CancunBlockHashProcessor.java @@ -14,27 +14,28 @@ */ package org.hyperledger.besu.ethereum.mainnet.blockhash; -import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; import org.hyperledger.besu.ethereum.mainnet.ParentBeaconBlockRootHelper; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.evm.worldstate.WorldUpdater; /** Processes the beacon block storage if it is present in the block header. */ public class CancunBlockHashProcessor extends FrontierBlockHashProcessor { @Override - public void processBlockHashes( - final MutableWorldState mutableWorldState, final ProcessableBlockHeader currentBlockHeader) { + public Void process(final BlockProcessingContext context) { + ProcessableBlockHeader currentBlockHeader = context.getBlockHeader(); currentBlockHeader .getParentBeaconBlockRoot() .ifPresent( beaconBlockRoot -> { if (!beaconBlockRoot.isEmpty()) { - WorldUpdater worldUpdater = mutableWorldState.updater(); + WorldUpdater worldUpdater = context.getWorldState().updater(); ParentBeaconBlockRootHelper.storeParentBeaconBlockRoot( worldUpdater, currentBlockHeader.getTimestamp(), beaconBlockRoot); worldUpdater.commit(); } }); + return null; } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/Eip7709BlockHashProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/Eip7709BlockHashProcessor.java index 2688d400ce9..12e3fa1ff1e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/Eip7709BlockHashProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/Eip7709BlockHashProcessor.java @@ -29,6 +29,6 @@ public class Eip7709BlockHashProcessor extends PragueBlockHashProcessor { @Override public BlockHashLookup createBlockHashLookup( final Blockchain blockchain, final ProcessableBlockHeader blockHeader) { - return new Eip7709BlockHashLookup(historyStorageAddress, historyServeWindow); + return new Eip7709BlockHashLookup(historyStorageAddress); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/FrontierBlockHashProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/FrontierBlockHashProcessor.java index eba80a0eb82..dd68ff467f2 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/FrontierBlockHashProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/FrontierBlockHashProcessor.java @@ -15,8 +15,8 @@ package org.hyperledger.besu.ethereum.mainnet.blockhash; import org.hyperledger.besu.ethereum.chain.Blockchain; -import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.ethereum.vm.BlockchainBasedBlockHashLookup; import org.hyperledger.besu.evm.blockhash.BlockHashLookup; import org.hyperledger.besu.evm.operation.BlockHashOperation; @@ -24,9 +24,9 @@ public class FrontierBlockHashProcessor implements BlockHashProcessor { @Override - public void processBlockHashes( - final MutableWorldState mutableWorldState, final ProcessableBlockHeader currentBlockHeader) { + public Void process(final BlockProcessingContext context) { // do nothing + return null; } /** diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java index 1f67e5dc26f..415b2043303 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java @@ -15,16 +15,11 @@ package org.hyperledger.besu.ethereum.mainnet.blockhash; import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.datatypes.Hash; -import org.hyperledger.besu.ethereum.core.MutableWorldState; -import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; -import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.worldstate.WorldUpdater; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; +import org.hyperledger.besu.ethereum.mainnet.systemcall.SystemCallProcessor; import com.google.common.annotations.VisibleForTesting; -import org.apache.tuweni.units.bigints.UInt256; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.tuweni.bytes.Bytes; /** * Processes and stores historical block hashes in accordance with EIP-2935. This class is @@ -32,20 +27,14 @@ * historical block hash access in smart contracts. */ public class PragueBlockHashProcessor extends CancunBlockHashProcessor { - private static final Logger LOG = LoggerFactory.getLogger(PragueBlockHashProcessor.class); - public static final Address HISTORY_STORAGE_ADDRESS = Address.fromHexString("0x0000f90827f1c53a10cb7a02335b175320002935"); - /** The HISTORY_SERVE_WINDOW */ - private static final long HISTORY_SERVE_WINDOW = 8191; - - protected final long historyServeWindow; protected final Address historyStorageAddress; /** Constructs a BlockHashProcessor. */ public PragueBlockHashProcessor() { - this(HISTORY_STORAGE_ADDRESS, HISTORY_SERVE_WINDOW); + this(HISTORY_STORAGE_ADDRESS); } /** @@ -53,53 +42,20 @@ public PragueBlockHashProcessor() { * primarily used for testing. * * @param historyStorageAddress the address of the contract storing the history - * @param historyServeWindow The number of blocks for which history should be saved. */ @VisibleForTesting - public PragueBlockHashProcessor( - final Address historyStorageAddress, final long historyServeWindow) { + public PragueBlockHashProcessor(final Address historyStorageAddress) { this.historyStorageAddress = historyStorageAddress; - this.historyServeWindow = historyServeWindow; } @Override - public void processBlockHashes( - final MutableWorldState mutableWorldState, final ProcessableBlockHeader currentBlockHeader) { - super.processBlockHashes(mutableWorldState, currentBlockHeader); - - WorldUpdater worldUpdater = mutableWorldState.updater(); - final MutableAccount historyStorageAccount = worldUpdater.getAccount(historyStorageAddress); - - if (historyStorageAccount != null - && historyStorageAccount.getNonce() > 0 - && currentBlockHeader.getNumber() > 0) { - storeParentHash(historyStorageAccount, currentBlockHeader); - } - worldUpdater.commit(); - } - - /** - * Stores the hash of the parent block in the world state. - * - * @param account The account associated with the historical block hash storage. - * @param header The current block header being processed. - */ - private void storeParentHash(final MutableAccount account, final ProcessableBlockHeader header) { - storeHash(account, header.getNumber() - 1, header.getParentHash()); - } - - /** - * Stores the hash in the world state. - * - * @param account The account associated with the historical block hash storage. - * @param number The slot to store. - * @param hash The hash to be stored. - */ - private void storeHash(final MutableAccount account, final long number, final Hash hash) { - UInt256 slot = UInt256.valueOf(number % historyServeWindow); - UInt256 value = UInt256.fromBytes(hash); - LOG.trace( - "Writing to {} {}=%{}", account.getAddress(), slot.toDecimalString(), value.toHexString()); - account.setStorageValue(slot, value); + public Void process(final BlockProcessingContext context) { + super.process(context); + SystemCallProcessor processor = + new SystemCallProcessor(context.getProtocolSpec().getTransactionProcessor()); + + Bytes inputData = context.getBlockHeader().getParentHash(); + processor.process(historyStorageAddress, context, inputData); + return null; } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java index 5615d41d716..4b94841a94c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java @@ -14,19 +14,26 @@ */ package org.hyperledger.besu.ethereum.mainnet.requests; -import org.hyperledger.besu.ethereum.core.MutableWorldState; -import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; import org.hyperledger.besu.ethereum.core.TransactionReceipt; -import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; -import org.hyperledger.besu.evm.blockhash.BlockHashLookup; -import org.hyperledger.besu.evm.tracing.OperationTracer; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import java.util.List; -public record ProcessRequestContext( - ProcessableBlockHeader blockHeader, - MutableWorldState mutableWorldState, - ProtocolSpec protocolSpec, - List transactionReceipts, - BlockHashLookup blockHashLookup, - OperationTracer operationTracer) {} +public final class ProcessRequestContext extends BlockProcessingContext { + private final List transactionReceipts; + + public ProcessRequestContext( + final BlockProcessingContext context, final List transactionReceipts) { + super( + context.getWorldState(), + context.getBlockHeader(), + context.getOperationTracer(), + context.getBlockHashLookup(), + context.getProtocolSpec()); + this.transactionReceipts = transactionReceipts; + } + + public List transactionReceipts() { + return transactionReceipts; + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/SystemCallRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/SystemCallRequestProcessor.java index 3bcfe02c2a4..a8b7d3186e8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/SystemCallRequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/SystemCallRequestProcessor.java @@ -17,12 +17,14 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.RequestType; import org.hyperledger.besu.ethereum.core.Request; -import org.hyperledger.besu.ethereum.mainnet.SystemCallProcessor; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockContextProcessor; +import org.hyperledger.besu.ethereum.mainnet.systemcall.SystemCallProcessor; import org.apache.tuweni.bytes.Bytes; /** Processes system call requests. */ -public class SystemCallRequestProcessor implements RequestProcessor { +public class SystemCallRequestProcessor + implements RequestProcessor, BlockContextProcessor { private final Address callAddress; private final RequestType requestType; @@ -41,16 +43,10 @@ public SystemCallRequestProcessor(final Address callAddress, final RequestType r @Override public Request process(final ProcessRequestContext context) { - SystemCallProcessor systemCallProcessor = - new SystemCallProcessor(context.protocolSpec().getTransactionProcessor()); + final SystemCallProcessor systemCallProcessor = + new SystemCallProcessor(context.getProtocolSpec().getTransactionProcessor()); - Bytes systemCallOutput = - systemCallProcessor.process( - callAddress, - context.mutableWorldState().updater(), - context.blockHeader(), - context.operationTracer(), - context.blockHashLookup()); + Bytes systemCallOutput = systemCallProcessor.process(callAddress, context, Bytes.EMPTY); return new Request(requestType, systemCallOutput); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockContextProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockContextProcessor.java new file mode 100644 index 00000000000..fb50dade404 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockContextProcessor.java @@ -0,0 +1,19 @@ +/* + * Copyright contributors to 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.systemcall; + +public interface BlockContextProcessor { + T process(final C context); +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockProcessingContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockProcessingContext.java new file mode 100644 index 00000000000..0ba6f434e48 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockProcessingContext.java @@ -0,0 +1,63 @@ +/* + * Copyright contributors to 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.systemcall; + +import org.hyperledger.besu.ethereum.core.MutableWorldState; +import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; +import org.hyperledger.besu.evm.blockhash.BlockHashLookup; +import org.hyperledger.besu.evm.tracing.OperationTracer; + +public class BlockProcessingContext { + + private final MutableWorldState worldState; + private final ProcessableBlockHeader blockHeader; + private final OperationTracer operationTracer; + private final BlockHashLookup blockHashLookup; + private final ProtocolSpec protocolSpec; + + public BlockProcessingContext( + final MutableWorldState worldState, + final ProcessableBlockHeader blockHeader, + final OperationTracer operationTracer, + final BlockHashLookup blockHashLookup, + final ProtocolSpec protocolSpec) { + this.worldState = worldState; + this.blockHeader = blockHeader; + this.operationTracer = operationTracer; + this.blockHashLookup = blockHashLookup; + this.protocolSpec = protocolSpec; + } + + public MutableWorldState getWorldState() { + return worldState; + } + + public ProcessableBlockHeader getBlockHeader() { + return blockHeader; + } + + public OperationTracer getOperationTracer() { + return operationTracer; + } + + public BlockHashLookup getBlockHashLookup() { + return blockHashLookup; + } + + public ProtocolSpec getProtocolSpec() { + return protocolSpec; + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java similarity index 79% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessor.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java index ccf6703bef6..9d42fd60841 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java @@ -12,13 +12,14 @@ * * SPDX-License-Identifier: Apache-2.0 */ -package org.hyperledger.besu.ethereum.mainnet; +package org.hyperledger.besu.ethereum.mainnet.systemcall; import static org.hyperledger.besu.evm.frame.MessageFrame.DEFAULT_MAX_STACK_SIZE; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor; import org.hyperledger.besu.evm.account.Account; import org.hyperledger.besu.evm.blockhash.BlockHashLookup; import org.hyperledger.besu.evm.code.CodeV0; @@ -48,37 +49,34 @@ public SystemCallProcessor(final MainnetTransactionProcessor mainnetTransactionP } /** - * Processes a system call to a specified address, using the provided world state, block header, - * operation tracer, and block hash lookup. + * Processes a system call. * - * @param callAddress the address to call. - * @param worldState the current world state. - * @param blockHeader the current block header. - * @param operationTracer the operation tracer for tracing EVM operations. - * @param blockHashLookup the block hash lookup function. - * @return the output data from the call. If no code exists at the callAddress then an empty Bytes - * is returned. + * @param callAddress The address to call. + * @param context The system call context. The input data to the system call. + * @return The output of the system call. */ public Bytes process( - final Address callAddress, - final WorldUpdater worldState, - final ProcessableBlockHeader blockHeader, - final OperationTracer operationTracer, - final BlockHashLookup blockHashLookup) { - + final Address callAddress, final BlockProcessingContext context, final Bytes inputData) { // if no code exists at CALL_ADDRESS, the call must fail silently - final Account maybeContract = worldState.get(callAddress); + final Account maybeContract = context.getWorldState().get(callAddress); if (maybeContract == null) { LOG.trace("System call address not found {}", callAddress); return Bytes.EMPTY; } + WorldUpdater worldUpdater = context.getWorldState().updater(); final AbstractMessageProcessor messageProcessor = mainnetTransactionProcessor.getMessageProcessor(MessageFrame.Type.MESSAGE_CALL); final MessageFrame initialFrame = - createCallFrame(callAddress, worldState, blockHeader, blockHashLookup); - - return processFrame(initialFrame, messageProcessor, operationTracer, worldState); + createCallFrame( + callAddress, + worldUpdater, + context.getBlockHeader(), + context.getBlockHashLookup(), + inputData); + + worldUpdater.commit(); + return processFrame(initialFrame, messageProcessor, context.getOperationTracer(), worldUpdater); } private Bytes processFrame( @@ -109,7 +107,8 @@ private MessageFrame createCallFrame( final Address callAddress, final WorldUpdater worldUpdater, final ProcessableBlockHeader blockHeader, - final BlockHashLookup blockHashLookup) { + final BlockHashLookup blockHashLookup, + final Bytes inputData) { final Optional maybeContract = Optional.ofNullable(worldUpdater.get(callAddress)); final AbstractMessageProcessor processor = @@ -130,7 +129,7 @@ private MessageFrame createCallFrame( .type(MessageFrame.Type.MESSAGE_CALL) .address(callAddress) .contract(callAddress) - .inputData(Bytes.EMPTY) + .inputData(inputData) .sender(SYSTEM_ADDRESS) .blockHashLookup(blockHashLookup) .code( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/vm/Eip7709BlockHashLookup.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/vm/Eip7709BlockHashLookup.java index 1b9fca3bf76..73bf5ef459e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/vm/Eip7709BlockHashLookup.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/vm/Eip7709BlockHashLookup.java @@ -37,6 +37,7 @@ public class Eip7709BlockHashLookup implements BlockHashLookup { private static final Logger LOG = LoggerFactory.getLogger(Eip7709BlockHashLookup.class); private static final long BLOCKHASH_SERVE_WINDOW = 256L; + private static final long HISTORY_SERVE_WINDOW = 8191; private final Address contractAddress; private final long historyServeWindow; @@ -47,10 +48,9 @@ public class Eip7709BlockHashLookup implements BlockHashLookup { * Constructs a Eip7709BlockHashLookup. * * @param contractAddress the address of the contract storing the history. - * @param historyServeWindow the number of blocks for which history should be saved. */ - public Eip7709BlockHashLookup(final Address contractAddress, final long historyServeWindow) { - this(contractAddress, historyServeWindow, BLOCKHASH_SERVE_WINDOW); + public Eip7709BlockHashLookup(final Address contractAddress) { + this(contractAddress, HISTORY_SERVE_WINDOW, BLOCKHASH_SERVE_WINDOW); } /** diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockContextProcessorTest.java similarity index 87% rename from ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessorTest.java rename to ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockContextProcessorTest.java index fe44c3ce4c6..bed1cb963b5 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockContextProcessorTest.java @@ -22,9 +22,12 @@ import static org.mockito.Mockito.when; import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider; import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; +import org.hyperledger.besu.ethereum.mainnet.systemcall.SystemCallProcessor; import org.hyperledger.besu.evm.blockhash.BlockHashLookup; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.processor.AbstractMessageProcessor; @@ -36,7 +39,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class SystemCallProcessorTest { +public class MainnetBlockContextProcessorTest { private static final Address CALL_ADDRESS = Address.fromHexString("0x1"); private static final Bytes EXPECTED_OUTPUT = Bytes.fromHexString("0x01"); private ProcessableBlockHeader mockBlockHeader; @@ -95,12 +98,17 @@ void shouldReturnEmptyWhenContractDoesNotExist() { Bytes processSystemCall(final MutableWorldState worldState) { SystemCallProcessor systemCallProcessor = new SystemCallProcessor(mockTransactionProcessor); - return systemCallProcessor.process( - CALL_ADDRESS, - worldState.updater(), - mockBlockHeader, - OperationTracer.NO_TRACING, - mockBlockHashLookup); + + BlockProcessingContext blockProcessingContext = + new BlockProcessingContext( + worldState, + mockBlockHeader, + OperationTracer.NO_TRACING, + mockBlockHashLookup, + mock(ProtocolSpec.class)); + + when(mockBlockHashLookup.apply(any(), any())).thenReturn(Hash.EMPTY); + return systemCallProcessor.process(CALL_ADDRESS, blockProcessingContext, Bytes.EMPTY); } private MutableWorldState createWorldState(final Address address) { diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessorTest.java deleted file mode 100644 index 98f3788b909..00000000000 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessorTest.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * 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.blockhash; - -import static org.hyperledger.besu.datatypes.Hash.fromHexStringLenient; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.when; - -import org.hyperledger.besu.datatypes.Hash; -import org.hyperledger.besu.ethereum.core.BlockHeader; -import org.hyperledger.besu.ethereum.core.MutableWorldState; -import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.worldstate.WorldUpdater; - -import org.apache.tuweni.units.bigints.UInt256; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class BlockHashProcessorTest { - private WorldUpdater worldUpdater; - private MutableWorldState mutableWorldState; - private MutableAccount account; - private BlockHashProcessor processor; - - private final long historicalWindow = 255; - - @BeforeEach - void setUp() { - mutableWorldState = mock(MutableWorldState.class); - worldUpdater = mock(WorldUpdater.class); - account = mock(MutableAccount.class); - when(account.getNonce()).thenReturn(1L); - when(mutableWorldState.updater()).thenReturn(worldUpdater); - when(worldUpdater.getAccount(PragueBlockHashProcessor.HISTORY_STORAGE_ADDRESS)) - .thenReturn(account); - } - - @Test - void shouldStoreParentBlockHash() { - long currentBlock = 3; - processor = new PragueBlockHashProcessor(); - BlockHeader currentBlockHeader = mockBlockHeader(currentBlock); - mockAncestorHeaders(currentBlockHeader, 3); - processor.processBlockHashes(mutableWorldState, currentBlockHeader); - // only parent slot number must be set - verify(account, times(1)).setStorageValue(any(), any()); - verifyAccount(currentBlock - 1, historicalWindow); - } - - @Test - void shouldNotStoreBlockHashForGenesisBlock() { - // For the fork to be activated at genesis, no history is written to the genesis state, and at - // the start of block 1, genesis hash will be written as a normal operation to slot 0. - long currentBlock = 0; - processor = new PragueBlockHashProcessor(); - BlockHeader currentBlockHeader = mockBlockHeader(currentBlock); - mockAncestorHeaders(currentBlockHeader, 0); - - processor.processBlockHashes(mutableWorldState, currentBlockHeader); - verify(account, times(0)).setStorageValue(any(), any()); - } - - @Test - void shouldStoreAncestorBlockHashesAtForkCorrectlyParentIsGenesis() { - // for activation at block 1, only genesis hash will be written at slot 0 as there is no - // additional history that needs to be persisted. - long currentBlock = 1; - processor = new PragueBlockHashProcessor(); - BlockHeader currentBlockHeader = mockBlockHeader(currentBlock); - mockAncestorHeaders(currentBlockHeader, 10); - - processor.processBlockHashes(mutableWorldState, currentBlockHeader); - verify(account, times(1)).setStorageValue(any(), any()); - verifyAccount(0, historicalWindow); - } - - @Test - void shouldNotStoreBlockHashIfContractIsNotDeployed() { - when(worldUpdater.getAccount(PragueBlockHashProcessor.HISTORY_STORAGE_ADDRESS)) - .thenReturn(null); - - long currentBlock = 1; - processor = new PragueBlockHashProcessor(); - BlockHeader currentBlockHeader = mockBlockHeader(currentBlock); - mockAncestorHeaders(currentBlockHeader, 0); - - processor.processBlockHashes(mutableWorldState, currentBlockHeader); - verifyNoInteractions(account); - } - - @Test - void shouldWriteGenesisHashAtSlot0() { - processor = new PragueBlockHashProcessor(); - BlockHeader header = mockBlockHeader(1); - mockAncestorHeaders(header, 1); - processor.processBlockHashes(mutableWorldState, header); - verify(account) - .setStorageValue(UInt256.valueOf(0), UInt256.fromHexString(Hash.ZERO.toHexString())); - } - - private void verifyAccount(final long number, final long historicalWindow) { - verify(account) - .setStorageValue(UInt256.valueOf(number % historicalWindow), UInt256.valueOf(number)); - } - - private void mockAncestorHeaders(final BlockHeader blockHeader, final int count) { - long firstAncestor = Math.max(blockHeader.getNumber() - count, 0); - var block = blockHeader; - for (long i = blockHeader.getNumber(); i > firstAncestor; i--) { - long parentNumber = block.getNumber() - 1; - block = mockBlockHeader(parentNumber); - } - } - - private BlockHeader mockBlockHeader(final long currentNumber) { - BlockHeader blockHeader = mock(BlockHeader.class); - when(blockHeader.getNumber()).thenReturn(currentNumber); - Hash hash = fromHexStringLenient("0x" + Long.toHexString(currentNumber)); - Hash parentHash = fromHexStringLenient("0x" + Long.toHexString(currentNumber - 1)); - when(blockHeader.getHash()).thenReturn(hash); - when(blockHeader.getTimestamp()).thenReturn(currentNumber); - when(blockHeader.getParentHash()).thenReturn(parentHash); - return blockHeader; - } -} diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index b454302faae..1d1a2a0f240 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -44,6 +44,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; +import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.referencetests.BonsaiReferenceTestWorldState; import org.hyperledger.besu.ethereum.referencetests.ReferenceTestEnv; @@ -356,9 +357,18 @@ static T8nResult runTest( .orElse(blockHeader.getExcessBlobGas().orElse(BlobGas.ZERO)); // state-test final Wei blobGasPrice = protocolSpec.getFeeMarket().blobGasPricePerGas(excessBlobGas); long blobGasLimit = protocolSpec.getGasLimitCalculator().currentBlobGasLimit(); + BlockProcessingContext context = + new BlockProcessingContext( + worldState, + referenceTestEnv, + OperationTracer.NO_TRACING, + protocolSpec + .getBlockHashProcessor() + .createBlockHashLookup(blockchain, referenceTestEnv), + protocolSpec); if (!referenceTestEnv.isStateTest()) { - protocolSpec.getBlockHashProcessor().processBlockHashes(worldState, referenceTestEnv); + protocolSpec.getBlockHashProcessor().process(context); } final WorldUpdater rootWorldStateUpdater = worldState.updater(); @@ -535,15 +545,9 @@ static T8nResult runTest( var requestProcessorCoordinator = protocolSpec.getRequestProcessorCoordinator(); if (requestProcessorCoordinator.isPresent()) { var rpc = requestProcessorCoordinator.get(); - ProcessRequestContext context = - new ProcessRequestContext( - blockHeader, - worldState, - protocolSpec, - receipts, - protocolSpec.getBlockHashProcessor().createBlockHashLookup(blockchain, blockHeader), - OperationTracer.NO_TRACING); - Optional> maybeRequests = Optional.of(rpc.process(context)); + + ProcessRequestContext requestContext = new ProcessRequestContext(context, receipts); + Optional> maybeRequests = Optional.of(rpc.process(requestContext)); Hash requestsHash = BodyValidation.requestsHash(maybeRequests.orElse(List.of())); resultObject.put("requestsHash", requestsHash.toHexString()); From ef918bdcd4e5b38d151b9e67a2867bfefaa8e9ef Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 4 Feb 2025 15:23:53 +1100 Subject: [PATCH 2/9] Implement EIP2935 as system call Signed-off-by: Gabriel-Trintinalia --- .../mainnet/systemcall/SystemCallProcessor.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java index 9d42fd60841..f578af1e870 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java @@ -57,26 +57,25 @@ public SystemCallProcessor(final MainnetTransactionProcessor mainnetTransactionP */ public Bytes process( final Address callAddress, final BlockProcessingContext context, final Bytes inputData) { + WorldUpdater updater = context.getWorldState().updater(); + // if no code exists at CALL_ADDRESS, the call must fail silently - final Account maybeContract = context.getWorldState().get(callAddress); + final Account maybeContract = updater.get(callAddress); if (maybeContract == null) { LOG.trace("System call address not found {}", callAddress); return Bytes.EMPTY; } - WorldUpdater worldUpdater = context.getWorldState().updater(); - final AbstractMessageProcessor messageProcessor = + final AbstractMessageProcessor processor = mainnetTransactionProcessor.getMessageProcessor(MessageFrame.Type.MESSAGE_CALL); final MessageFrame initialFrame = createCallFrame( callAddress, - worldUpdater, + updater, context.getBlockHeader(), context.getBlockHashLookup(), inputData); - - worldUpdater.commit(); - return processFrame(initialFrame, messageProcessor, context.getOperationTracer(), worldUpdater); + return processFrame(initialFrame, processor, context.getOperationTracer(), updater); } private Bytes processFrame( From 45721bd520e382a8d17533bad5ab032f90fbdb42 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 4 Feb 2025 15:33:10 +1100 Subject: [PATCH 3/9] Rename class Signed-off-by: Gabriel-Trintinalia --- .../besu/ethereum/blockcreation/AbstractBlockCreator.java | 6 +++--- .../ethereum/blockcreation/AbstractBlockCreatorTest.java | 4 ++-- .../besu/ethereum/mainnet/AbstractBlockProcessor.java | 4 ++-- .../ethereum/mainnet/requests/DepositRequestProcessor.java | 2 +- ...essRequestContext.java => RequestProcessingContext.java} | 4 ++-- .../besu/ethereum/mainnet/requests/RequestProcessor.java | 2 +- .../mainnet/requests/RequestProcessorCoordinator.java | 2 +- .../mainnet/requests/SystemCallRequestProcessor.java | 4 ++-- .../main/java/org/hyperledger/besu/evmtool/T8nExecutor.java | 4 ++-- 9 files changed, 16 insertions(+), 16 deletions(-) rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/{ProcessRequestContext.java => RequestProcessingContext.java} (92%) 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 f1395ead14d..f293ca32109 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 @@ -48,7 +48,7 @@ import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions; import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor; import org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator; -import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; +import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessingContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.evm.account.MutableAccount; @@ -261,8 +261,8 @@ protected BlockCreationResult createBlock( // EIP-7685: process EL requests final Optional requestProcessor = newProtocolSpec.getRequestProcessorCoordinator(); - ProcessRequestContext context = - new ProcessRequestContext(blockProcessingContext, transactionResults.getReceipts()); + RequestProcessingContext context = + new RequestProcessingContext(blockProcessingContext, transactionResults.getReceipts()); Optional> maybeRequests = requestProcessor.map(processor -> processor.process(context)); diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java index 4f9c2753e2b..3e9a9a6e81c 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java @@ -77,7 +77,7 @@ import org.hyperledger.besu.ethereum.mainnet.ValidationResult; import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor; import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor; -import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; +import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessingContext; import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason; import org.hyperledger.besu.evm.account.Account; @@ -144,7 +144,7 @@ void findDepositRequestsFromReceipts() { var depositRequestsFromReceipts = new DepositRequestProcessor(DEFAULT_DEPOSIT_CONTRACT_ADDRESS) .process( - new ProcessRequestContext( + new RequestProcessingContext( new BlockProcessingContext(null, null, null, null, null), receipts)); assertThat(depositRequestsFromReceipts).isEqualTo(expectedDepositRequest); } 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 c49d11b5cd4..0dc708bcd56 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 @@ -30,7 +30,7 @@ import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.Withdrawal; import org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor.PreprocessingFunction.NoPreprocessing; -import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; +import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessingContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; @@ -243,7 +243,7 @@ protected BlockProcessingResult processBlock( protocolSpec.getRequestProcessorCoordinator(); Optional> maybeRequests = Optional.empty(); if (requestProcessor.isPresent()) { - ProcessRequestContext requestContext = new ProcessRequestContext(context, receipts); + RequestProcessingContext requestContext = new RequestProcessingContext(context, receipts); maybeRequests = Optional.of(requestProcessor.get().process(requestContext)); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java index 37e266f015b..816fb4bcabb 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java @@ -35,7 +35,7 @@ public DepositRequestProcessor(final Address depositContractAddress) { } @Override - public Request process(final ProcessRequestContext context) { + public Request process(final RequestProcessingContext context) { if (depositContractAddress.isEmpty()) { return new Request(RequestType.DEPOSIT, Bytes.EMPTY); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessingContext.java similarity index 92% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessingContext.java index 4b94841a94c..b45c341e6d8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessingContext.java @@ -19,10 +19,10 @@ import java.util.List; -public final class ProcessRequestContext extends BlockProcessingContext { +public final class RequestProcessingContext extends BlockProcessingContext { private final List transactionReceipts; - public ProcessRequestContext( + public RequestProcessingContext( final BlockProcessingContext context, final List transactionReceipts) { super( context.getWorldState(), diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java index dd471aec1e8..fef28e52a40 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java @@ -17,5 +17,5 @@ import org.hyperledger.besu.ethereum.core.Request; public interface RequestProcessor { - Request process(final ProcessRequestContext context); + Request process(final RequestProcessingContext context); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessorCoordinator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessorCoordinator.java index 7dd3b5c6dd8..c46eafa4da9 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessorCoordinator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessorCoordinator.java @@ -35,7 +35,7 @@ private RequestProcessorCoordinator( this.processors = processors; } - public List process(final ProcessRequestContext context) { + public List process(final RequestProcessingContext context) { return processors.values().stream() .map(requestProcessor -> requestProcessor.process(context)) .toList(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/SystemCallRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/SystemCallRequestProcessor.java index a8b7d3186e8..78f71da7229 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/SystemCallRequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/SystemCallRequestProcessor.java @@ -24,7 +24,7 @@ /** Processes system call requests. */ public class SystemCallRequestProcessor - implements RequestProcessor, BlockContextProcessor { + implements RequestProcessor, BlockContextProcessor { private final Address callAddress; private final RequestType requestType; @@ -41,7 +41,7 @@ public SystemCallRequestProcessor(final Address callAddress, final RequestType r * @return A {@link Request} request */ @Override - public Request process(final ProcessRequestContext context) { + public Request process(final RequestProcessingContext context) { final SystemCallProcessor systemCallProcessor = new SystemCallProcessor(context.getProtocolSpec().getTransactionProcessor()); diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index 1d1a2a0f240..d1906aefc88 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -43,7 +43,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; -import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; +import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessingContext; import org.hyperledger.besu.ethereum.mainnet.systemcall.BlockProcessingContext; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.referencetests.BonsaiReferenceTestWorldState; @@ -546,7 +546,7 @@ static T8nResult runTest( if (requestProcessorCoordinator.isPresent()) { var rpc = requestProcessorCoordinator.get(); - ProcessRequestContext requestContext = new ProcessRequestContext(context, receipts); + RequestProcessingContext requestContext = new RequestProcessingContext(context, receipts); Optional> maybeRequests = Optional.of(rpc.process(requestContext)); Hash requestsHash = BodyValidation.requestsHash(maybeRequests.orElse(List.of())); From 0a4be70e0d4fac989c77cd0044602559585de8ab Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 4 Feb 2025 15:37:30 +1100 Subject: [PATCH 4/9] Rename class Signed-off-by: Gabriel-Trintinalia --- .../ethereum/blockcreation/AbstractBlockCreator.java | 4 ++-- .../besu/ethereum/mainnet/AbstractBlockProcessor.java | 9 +++++---- .../java/org/hyperledger/besu/evmtool/T8nExecutor.java | 7 ++++--- 3 files changed, 11 insertions(+), 9 deletions(-) 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 f293ca32109..feda679b58c 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 @@ -261,11 +261,11 @@ protected BlockCreationResult createBlock( // EIP-7685: process EL requests final Optional requestProcessor = newProtocolSpec.getRequestProcessorCoordinator(); - RequestProcessingContext context = + RequestProcessingContext requestProcessingContext = new RequestProcessingContext(blockProcessingContext, transactionResults.getReceipts()); Optional> maybeRequests = - requestProcessor.map(processor -> processor.process(context)); + requestProcessor.map(processor -> processor.process(requestProcessingContext)); throwIfStopped(); 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 0dc708bcd56..160d5149df4 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 @@ -129,10 +129,10 @@ protected BlockProcessingResult processBlock( final ProtocolSpec protocolSpec = protocolSchedule.getByBlockHeader(blockHeader); final BlockHashLookup blockHashLookup = protocolSpec.getBlockHashProcessor().createBlockHashLookup(blockchain, blockHeader); - final BlockProcessingContext context = + final BlockProcessingContext blockProcessingContext = new BlockProcessingContext( worldState, blockHeader, OperationTracer.NO_TRACING, blockHashLookup, protocolSpec); - protocolSpec.getBlockHashProcessor().process(context); + protocolSpec.getBlockHashProcessor().process(blockProcessingContext); final Address miningBeneficiary = miningBeneficiaryCalculator.calculateBeneficiary(blockHeader); @@ -243,8 +243,9 @@ protected BlockProcessingResult processBlock( protocolSpec.getRequestProcessorCoordinator(); Optional> maybeRequests = Optional.empty(); if (requestProcessor.isPresent()) { - RequestProcessingContext requestContext = new RequestProcessingContext(context, receipts); - maybeRequests = Optional.of(requestProcessor.get().process(requestContext)); + RequestProcessingContext requestProcessingContext = + new RequestProcessingContext(blockProcessingContext, receipts); + maybeRequests = Optional.of(requestProcessor.get().process(requestProcessingContext)); } if (maybeRequests.isPresent() && blockHeader.getRequestsHash().isPresent()) { diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index d1906aefc88..a8d463f6a9c 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -357,7 +357,7 @@ static T8nResult runTest( .orElse(blockHeader.getExcessBlobGas().orElse(BlobGas.ZERO)); // state-test final Wei blobGasPrice = protocolSpec.getFeeMarket().blobGasPricePerGas(excessBlobGas); long blobGasLimit = protocolSpec.getGasLimitCalculator().currentBlobGasLimit(); - BlockProcessingContext context = + BlockProcessingContext blockProcessingContext = new BlockProcessingContext( worldState, referenceTestEnv, @@ -368,7 +368,7 @@ static T8nResult runTest( protocolSpec); if (!referenceTestEnv.isStateTest()) { - protocolSpec.getBlockHashProcessor().process(context); + protocolSpec.getBlockHashProcessor().process(blockProcessingContext); } final WorldUpdater rootWorldStateUpdater = worldState.updater(); @@ -546,7 +546,8 @@ static T8nResult runTest( if (requestProcessorCoordinator.isPresent()) { var rpc = requestProcessorCoordinator.get(); - RequestProcessingContext requestContext = new RequestProcessingContext(context, receipts); + RequestProcessingContext requestContext = + new RequestProcessingContext(blockProcessingContext, receipts); Optional> maybeRequests = Optional.of(rpc.process(requestContext)); Hash requestsHash = BodyValidation.requestsHash(maybeRequests.orElse(List.of())); From 2647f03f30fd5de756b8713137596e559157b825 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 4 Feb 2025 15:53:36 +1100 Subject: [PATCH 5/9] Fix order and trace Signed-off-by: Gabriel-Trintinalia --- .../blockcreation/AbstractBlockCreator.java | 23 +++++++++---------- .../mainnet/AbstractBlockProcessor.java | 2 +- .../systemcall/BlockProcessingContext.java | 12 +++++----- .../MainnetBlockContextProcessorTest.java | 6 ++--- .../hyperledger/besu/evmtool/T8nExecutor.java | 6 ++--- 5 files changed, 24 insertions(+), 25 deletions(-) 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 feda679b58c..30a81f28ac3 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 @@ -211,18 +211,6 @@ protected BlockCreationResult createBlock( final List ommers = maybeOmmers.orElse(selectOmmers()); - BlockProcessingContext blockProcessingContext = - new BlockProcessingContext( - disposableWorldState, - processableBlockHeader, - BlockAwareOperationTracer.NO_TRACING, - newProtocolSpec - .getBlockHashProcessor() - .createBlockHashLookup(protocolContext.getBlockchain(), processableBlockHeader), - newProtocolSpec); - - newProtocolSpec.getBlockHashProcessor().process(blockProcessingContext); - throwIfStopped(); final PluginTransactionSelector pluginTransactionSelector = @@ -232,6 +220,17 @@ protected BlockCreationResult createBlock( pluginTransactionSelector.getOperationTracer(); operationTracer.traceStartBlock(processableBlockHeader, miningBeneficiary); + BlockProcessingContext blockProcessingContext = + new BlockProcessingContext( + processableBlockHeader, + disposableWorldState, + newProtocolSpec, + newProtocolSpec + .getBlockHashProcessor() + .createBlockHashLookup(protocolContext.getBlockchain(), processableBlockHeader), + operationTracer); + newProtocolSpec.getBlockHashProcessor().process(blockProcessingContext); + timings.register("preTxsSelection"); final TransactionSelectionResults transactionResults = selectTransactions( 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 160d5149df4..d4e3f1e2ec6 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 @@ -131,7 +131,7 @@ protected BlockProcessingResult processBlock( protocolSpec.getBlockHashProcessor().createBlockHashLookup(blockchain, blockHeader); final BlockProcessingContext blockProcessingContext = new BlockProcessingContext( - worldState, blockHeader, OperationTracer.NO_TRACING, blockHashLookup, protocolSpec); + blockHeader, worldState, protocolSpec, blockHashLookup, OperationTracer.NO_TRACING); protocolSpec.getBlockHashProcessor().process(blockProcessingContext); final Address miningBeneficiary = miningBeneficiaryCalculator.calculateBeneficiary(blockHeader); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockProcessingContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockProcessingContext.java index 0ba6f434e48..7a95778b349 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockProcessingContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/BlockProcessingContext.java @@ -29,16 +29,16 @@ public class BlockProcessingContext { private final ProtocolSpec protocolSpec; public BlockProcessingContext( - final MutableWorldState worldState, final ProcessableBlockHeader blockHeader, - final OperationTracer operationTracer, + final MutableWorldState worldState, + final ProtocolSpec protocolSpec, final BlockHashLookup blockHashLookup, - final ProtocolSpec protocolSpec) { - this.worldState = worldState; + final OperationTracer operationTracer) { this.blockHeader = blockHeader; - this.operationTracer = operationTracer; - this.blockHashLookup = blockHashLookup; + this.worldState = worldState; this.protocolSpec = protocolSpec; + this.blockHashLookup = blockHashLookup; + this.operationTracer = operationTracer; } public MutableWorldState getWorldState() { diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockContextProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockContextProcessorTest.java index bed1cb963b5..ba9febc7efc 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockContextProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockContextProcessorTest.java @@ -101,11 +101,11 @@ Bytes processSystemCall(final MutableWorldState worldState) { BlockProcessingContext blockProcessingContext = new BlockProcessingContext( - worldState, mockBlockHeader, - OperationTracer.NO_TRACING, + worldState, + mock(ProtocolSpec.class), mockBlockHashLookup, - mock(ProtocolSpec.class)); + OperationTracer.NO_TRACING); when(mockBlockHashLookup.apply(any(), any())).thenReturn(Hash.EMPTY); return systemCallProcessor.process(CALL_ADDRESS, blockProcessingContext, Bytes.EMPTY); diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index a8d463f6a9c..905a0d9ac6d 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -359,13 +359,13 @@ static T8nResult runTest( long blobGasLimit = protocolSpec.getGasLimitCalculator().currentBlobGasLimit(); BlockProcessingContext blockProcessingContext = new BlockProcessingContext( - worldState, referenceTestEnv, - OperationTracer.NO_TRACING, + worldState, + protocolSpec, protocolSpec .getBlockHashProcessor() .createBlockHashLookup(blockchain, referenceTestEnv), - protocolSpec); + OperationTracer.NO_TRACING); if (!referenceTestEnv.isStateTest()) { protocolSpec.getBlockHashProcessor().process(blockProcessingContext); From 9f27fb0b206080e5940d9edaa41c8dbb61701b59 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 4 Feb 2025 17:30:21 +1100 Subject: [PATCH 6/9] Fix constructor order Signed-off-by: Gabriel-Trintinalia --- .../ethereum/mainnet/requests/RequestProcessingContext.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessingContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessingContext.java index b45c341e6d8..8d632dfa219 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessingContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessingContext.java @@ -25,11 +25,11 @@ public final class RequestProcessingContext extends BlockProcessingContext { public RequestProcessingContext( final BlockProcessingContext context, final List transactionReceipts) { super( - context.getWorldState(), context.getBlockHeader(), - context.getOperationTracer(), + context.getWorldState(), + context.getProtocolSpec(), context.getBlockHashLookup(), - context.getProtocolSpec()); + context.getOperationTracer()); this.transactionReceipts = transactionReceipts; } From 0e9ade32e6c18928b5e07cb3d23cd34894503508 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 4 Feb 2025 21:51:08 +1100 Subject: [PATCH 7/9] Remove redundant method and move commit to same level Signed-off-by: Gabriel-Trintinalia --- .../systemcall/SystemCallProcessor.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java index f578af1e870..c413a7eaf96 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java @@ -25,7 +25,6 @@ import org.hyperledger.besu.evm.code.CodeV0; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.processor.AbstractMessageProcessor; -import org.hyperledger.besu.evm.tracing.OperationTracer; import org.hyperledger.besu.evm.worldstate.WorldUpdater; import java.util.Deque; @@ -69,40 +68,32 @@ public Bytes process( final AbstractMessageProcessor processor = mainnetTransactionProcessor.getMessageProcessor(MessageFrame.Type.MESSAGE_CALL); final MessageFrame initialFrame = - createCallFrame( + createMessageFrame( callAddress, updater, context.getBlockHeader(), context.getBlockHashLookup(), inputData); - return processFrame(initialFrame, processor, context.getOperationTracer(), updater); - } - - private Bytes processFrame( - final MessageFrame frame, - final AbstractMessageProcessor processor, - final OperationTracer tracer, - final WorldUpdater updater) { - if (!frame.getCode().isValid()) { + if (!initialFrame.getCode().isValid()) { throw new RuntimeException("System call did not execute to completion - opcode invalid"); } - Deque stack = frame.getMessageFrameStack(); + Deque stack = initialFrame.getMessageFrameStack(); while (!stack.isEmpty()) { - processor.process(stack.peekFirst(), tracer); + processor.process(stack.peekFirst(), context.getOperationTracer()); } - if (frame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { + if (initialFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { updater.commit(); - return frame.getOutputData(); + return initialFrame.getOutputData(); } // the call must execute to completion throw new RuntimeException("System call did not execute to completion"); } - private MessageFrame createCallFrame( + private MessageFrame createMessageFrame( final Address callAddress, final WorldUpdater worldUpdater, final ProcessableBlockHeader blockHeader, From f3b72f332883a2129ed3da44cfd498479caf7631 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 4 Feb 2025 21:57:02 +1100 Subject: [PATCH 8/9] Rename variable Signed-off-by: Gabriel-Trintinalia --- .../mainnet/systemcall/SystemCallProcessor.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java index c413a7eaf96..99738bda380 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java @@ -67,7 +67,7 @@ public Bytes process( final AbstractMessageProcessor processor = mainnetTransactionProcessor.getMessageProcessor(MessageFrame.Type.MESSAGE_CALL); - final MessageFrame initialFrame = + final MessageFrame frame = createMessageFrame( callAddress, updater, @@ -75,18 +75,18 @@ public Bytes process( context.getBlockHashLookup(), inputData); - if (!initialFrame.getCode().isValid()) { + if (!frame.getCode().isValid()) { throw new RuntimeException("System call did not execute to completion - opcode invalid"); } - Deque stack = initialFrame.getMessageFrameStack(); + Deque stack = frame.getMessageFrameStack(); while (!stack.isEmpty()) { processor.process(stack.peekFirst(), context.getOperationTracer()); } - if (initialFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { + if (frame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { updater.commit(); - return initialFrame.getOutputData(); + return frame.getOutputData(); } // the call must execute to completion From 33cd5793ff01c6759288f6bacd1c9f2f8213ba25 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Wed, 5 Feb 2025 17:04:48 +1100 Subject: [PATCH 9/9] minor changes Signed-off-by: Gabriel-Trintinalia --- .../ethereum/mainnet/blockhash/PragueBlockHashProcessor.java | 2 +- .../besu/ethereum/mainnet/systemcall/SystemCallProcessor.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java index 415b2043303..b5952a2df8a 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java @@ -27,7 +27,7 @@ * historical block hash access in smart contracts. */ public class PragueBlockHashProcessor extends CancunBlockHashProcessor { - public static final Address HISTORY_STORAGE_ADDRESS = + private static final Address HISTORY_STORAGE_ADDRESS = Address.fromHexString("0x0000f90827f1c53a10cb7a02335b175320002935"); protected final Address historyStorageAddress; diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java index 99738bda380..4d310b7d2fa 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/systemcall/SystemCallProcessor.java @@ -52,6 +52,7 @@ public SystemCallProcessor(final MainnetTransactionProcessor mainnetTransactionP * * @param callAddress The address to call. * @param context The system call context. The input data to the system call. + * @param inputData The input data to the system call. * @return The output of the system call. */ public Bytes process(