From a7684883882ac2d258c752e499d663a29bc1d63a Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Tue, 2 Jul 2024 17:00:52 +0200 Subject: [PATCH 01/35] add Parallel Transaction Processing System Signed-off-by: Karim Taam --- .../mainnet/AbstractBlockProcessor.java | 164 +++++++++++------- .../mainnet/MainnetTransactionProcessor.java | 28 +-- .../mainnet/TransactionConflictChecker.java | 144 +++++++++++++++ .../TransactionProcessingResult.java | 11 ++ .../LazyBonsaiCachedMerkleTrieLoader.java | 62 +++++++ .../bonsai/worldview/BonsaiWorldState.java | 9 + .../DiffBasedWorldStateUpdateAccumulator.java | 4 +- 7 files changed, 349 insertions(+), 73 deletions(-) create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionConflictChecker.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java 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 f600f07393a..7b2161edbd9 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 @@ -31,8 +31,10 @@ import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.MerkleTrieException; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.BonsaiAccount; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldStateUpdateAccumulator; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; import org.hyperledger.besu.ethereum.vm.BlockHashLookup; import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator; @@ -40,7 +42,6 @@ import org.hyperledger.besu.evm.worldstate.WorldState; import org.hyperledger.besu.evm.worldstate.WorldUpdater; -import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -48,6 +49,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@SuppressWarnings("SuspiciousMethodCalls") public abstract class AbstractBlockProcessor implements BlockProcessor { @FunctionalInterface @@ -90,6 +92,7 @@ protected AbstractBlockProcessor( this.protocolSchedule = protocolSchedule; } + @SuppressWarnings({"unchecked", "ReassignedVariable"}) @Override public BlockProcessingResult processBlock( final Blockchain blockchain, @@ -112,68 +115,109 @@ public BlockProcessingResult processBlock( updater, blockHeader.getTimestamp(), blockHeader.getParentBeaconBlockRoot().get()); } - for (final Transaction transaction : transactions) { - if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) { - return new BlockProcessingResult(Optional.empty(), "provided gas insufficient"); - } - - final WorldUpdater worldStateUpdater = worldState.updater(); - - final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(blockHeader, blockchain); - final Address miningBeneficiary = - miningBeneficiaryCalculator.calculateBeneficiary(blockHeader); - - Optional maybeParentHeader = - blockchain.getBlockHeader(blockHeader.getParentHash()); - - Wei blobGasPrice = - maybeParentHeader - .map( - parentHeader -> - protocolSpec - .getFeeMarket() - .blobGasPricePerGas( - calculateExcessBlobGasForParent(protocolSpec, parentHeader))) - .orElse(Wei.ZERO); - - final TransactionProcessingResult result = - transactionProcessor.processTransaction( - worldStateUpdater, - blockHeader, - transaction, - miningBeneficiary, - OperationTracer.NO_TRACING, - blockHashLookup, - true, - TransactionValidationParams.processingBlock(), - privateMetadataUpdater, - blobGasPrice); - if (result.isInvalid()) { - String errorMessage = - MessageFormat.format( - "Block processing error: transaction invalid {0}. Block {1} Transaction {2}", - result.getValidationResult().getErrorMessage(), - blockHeader.getHash().toHexString(), - transaction.getHash().toHexString()); - LOG.info(errorMessage); - if (worldState instanceof BonsaiWorldState) { - ((BonsaiWorldStateUpdateAccumulator) worldStateUpdater).reset(); + final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(blockHeader, blockchain); + final Address miningBeneficiary = miningBeneficiaryCalculator.calculateBeneficiary(blockHeader); + + TransactionConflictChecker transactionConflictChecker = new TransactionConflictChecker(); + transactionConflictChecker.findParallelTransactions(miningBeneficiary, transactions); + + Optional maybeParentHeader = + blockchain.getBlockHeader(blockHeader.getParentHash()); + + Wei blobGasPrice = + maybeParentHeader + .map( + parentHeader -> + protocolSpec + .getFeeMarket() + .blobGasPricePerGas( + calculateExcessBlobGasForParent(protocolSpec, parentHeader))) + .orElse(Wei.ZERO); + + transactionConflictChecker.getParallelizedTransactions().parallelStream() + .forEach( + transaction -> { + BonsaiWorldState roundWorldState = + new BonsaiWorldState((BonsaiWorldState) worldState); + WorldUpdater roundWorldStateUpdater = roundWorldState.updater(); + + final TransactionProcessingResult result = + transactionProcessor.processTransaction( + roundWorldStateUpdater, + blockHeader, + transaction.transaction(), + miningBeneficiary, + OperationTracer.NO_TRACING, + blockHashLookup, + true, + TransactionValidationParams.processingBlock(), + privateMetadataUpdater, + blobGasPrice); + roundWorldStateUpdater.commit(); + transactionConflictChecker.saveParallelizedTransactionProcessingResult( + transaction, roundWorldState.getAccumulator(), result); + }); + + int confirmedParallelizedTransaction = 0; + try { + final BonsaiWorldStateUpdateAccumulator blockUpdater = + (BonsaiWorldStateUpdateAccumulator) worldState.updater(); + for (int i = 0; i < transactions.size(); i++) { + Transaction transaction = transactions.get(i); + final TransactionProcessingResult transactionProcessingResult; + + final DiffBasedWorldStateUpdateAccumulator transactionAccumulator = + (DiffBasedWorldStateUpdateAccumulator) + transactionConflictChecker.getAccumulatorByTransaction().get((long) i); + if (transactionAccumulator != null + && !transactionConflictChecker.checkConflicts( + miningBeneficiary, + new TransactionConflictChecker.TransactionWithLocation(i, transaction), + transactionAccumulator, + blockUpdater)) { + blockUpdater.cloneFromUpdater( + (DiffBasedWorldStateUpdateAccumulator) + transactionConflictChecker.getAccumulatorByTransaction().get((long) i)); + transactionProcessingResult = + transactionConflictChecker.getResultByTransaction().get((long) i); + confirmedParallelizedTransaction++; + } else { + transactionProcessingResult = + transactionProcessor.processTransaction( + blockUpdater, + blockHeader, + transaction, + miningBeneficiary, + OperationTracer.NO_TRACING, + blockHashLookup, + true, + TransactionValidationParams.processingBlock(), + privateMetadataUpdater, + blobGasPrice); } - return new BlockProcessingResult(Optional.empty(), errorMessage); - } - worldStateUpdater.commit(); + final var coinbase = blockUpdater.getOrCreate(miningBeneficiary); + if (transactionProcessingResult.getMiningBenef() != null) { + coinbase.incrementBalance(transactionProcessingResult.getMiningBenef()); + } + blockUpdater.commit(); - currentGasUsed += transaction.getGasLimit() - result.getGasRemaining(); - if (transaction.getVersionedHashes().isPresent()) { - currentBlobGasUsed += - (transaction.getVersionedHashes().get().size() * CancunGasCalculator.BLOB_GAS_PER_BLOB); + currentGasUsed += transaction.getGasLimit() - transactionProcessingResult.getGasRemaining(); + if (transaction.getVersionedHashes().isPresent()) { + currentBlobGasUsed += + (transaction.getVersionedHashes().get().size() + * CancunGasCalculator.BLOB_GAS_PER_BLOB); + } + final TransactionReceipt transactionReceipt = + transactionReceiptFactory.create( + transaction.getType(), transactionProcessingResult, worldState, currentGasUsed); + receipts.add(transactionReceipt); } - - final TransactionReceipt transactionReceipt = - transactionReceiptFactory.create( - transaction.getType(), result, worldState, currentGasUsed); - receipts.add(transactionReceipt); + System.out.println("confirmedParallelizedTransaction " + confirmedParallelizedTransaction); + } catch (Throwable e) { + e.printStackTrace(); + System.out.println("error " + e); } + if (blockHeader.getBlobGasUsed().isPresent() && currentBlobGasUsed != blockHeader.getBlobGasUsed().get()) { String errorMessage = @@ -210,6 +254,7 @@ public BlockProcessingResult processBlock( return new BlockProcessingResult(Optional.empty(), "ommer too old"); } + System.out.println(worldState.updater().get(miningBeneficiary).getBalance()); try { worldState.persist(blockHeader); } catch (MerkleTrieException e) { @@ -222,7 +267,6 @@ public BlockProcessingResult processBlock( LOG.error("failed persisting block", e); return new BlockProcessingResult(Optional.empty(), e); } - return new BlockProcessingResult(Optional.of(new BlockProcessingOutputs(worldState, receipts))); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java index 209fc87c490..a13a70f8af8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java @@ -461,7 +461,6 @@ public TransactionProcessingResult processTransaction( 0L); // update the coinbase - final var coinbase = worldState.getOrCreate(miningBeneficiary); final long usedGas = transaction.getGasLimit() - refundedGas; final CoinbaseFeePriceCalculator coinbaseCalculator; if (blockHeader.getBaseFee().isPresent()) { @@ -483,8 +482,6 @@ public TransactionProcessingResult processTransaction( final Wei coinbaseWeiDelta = coinbaseCalculator.price(usedGas, transactionGasPrice, blockHeader.getBaseFee()); - coinbase.incrementBalance(coinbaseWeiDelta); - initialFrame.getSelfDestructs().forEach(worldState::deleteAccount); if (clearEmptyAccounts) { @@ -492,12 +489,15 @@ public TransactionProcessingResult processTransaction( } if (initialFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { - return TransactionProcessingResult.successful( - initialFrame.getLogs(), - gasUsedByTransaction, - refundedGas, - initialFrame.getOutputData(), - validationResult); + TransactionProcessingResult successful = + TransactionProcessingResult.successful( + initialFrame.getLogs(), + gasUsedByTransaction, + refundedGas, + initialFrame.getOutputData(), + validationResult); + successful.setMiningBenef(coinbaseWeiDelta); + return successful; } else { if (initialFrame.getExceptionalHaltReason().isPresent()) { LOG.debug( @@ -511,8 +511,14 @@ public TransactionProcessingResult processTransaction( transaction.getHash(), initialFrame.getRevertReason().get()); } - return TransactionProcessingResult.failed( - gasUsedByTransaction, refundedGas, validationResult, initialFrame.getRevertReason()); + TransactionProcessingResult failed = + TransactionProcessingResult.failed( + gasUsedByTransaction, + refundedGas, + validationResult, + initialFrame.getRevertReason()); + failed.setMiningBenef(coinbaseWeiDelta); + return failed; } } catch (final MerkleTrieException re) { operationTracer.traceEndTransaction( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionConflictChecker.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionConflictChecker.java new file mode 100644 index 00000000000..2b3fa4ec448 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionConflictChecker.java @@ -0,0 +1,144 @@ +package org.hyperledger.besu.ethereum.mainnet; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.ethereum.core.Transaction; +import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class TransactionConflictChecker { + + private final List parallelizedTransactions = + Collections.synchronizedList(new ArrayList<>()); + + private final Map> + accumulatorByParallelizedTransaction = new ConcurrentHashMap<>(); + + private final Map resultByParallelizedTransaction = + new ConcurrentHashMap<>(); + + public void findParallelTransactions( + final Address producer, final List transactions) { + for (int i = 0; i < transactions.size(); i++) { + Transaction tx1 = transactions.get(i); + boolean conflict = false; + if (!tx1.getSender().equals(producer) + && (tx1.getTo().isEmpty() || !tx1.getTo().get().equals(producer))) { + for (int j = 0; j < i; j++) { + Transaction tx2 = transactions.get(j); + conflict = + tx1.getSender().equals(tx2.getSender()) + || (tx2.getTo().isPresent() + && tx1.getTo().isPresent() + && tx1.getTo().get().equals(tx2.getTo().get())) + || (tx2.getTo().isPresent() && tx1.getSender().equals(tx2.getTo().get())) + || (tx1.getTo().isPresent() && tx1.getTo().get().equals(tx2.getSender())); + if (conflict) { + break; + } + } + if (!conflict) { + parallelizedTransactions.add(new TransactionWithLocation(i, tx1)); + } + } + } + System.out.println("findParallelTransactions end " + parallelizedTransactions.size()); + } + + public void saveParallelizedTransactionProcessingResult( + final TransactionWithLocation transaction, + final DiffBasedWorldStateUpdateAccumulator accumulator, + final TransactionProcessingResult result) { + accumulatorByParallelizedTransaction.put(transaction.getLocation(), accumulator); + resultByParallelizedTransaction.put(transaction.getLocation(), result); + } + + public boolean checkConflicts( + final Address producer, + final TransactionWithLocation transaction, + final DiffBasedWorldStateUpdateAccumulator trxAccumulator, + final DiffBasedWorldStateUpdateAccumulator blockAccumulator) { + final Set
addressesTouchedByTransaction = + getAddressesTouchedByTransaction(transaction, Optional.of(trxAccumulator)); + if (addressesTouchedByTransaction.contains(producer)) { + return true; + } + final Set
commonAddresses = new HashSet<>(addressesTouchedByTransaction); + commonAddresses.retainAll(blockAccumulator.getAccountsToUpdate().keySet()); + return !commonAddresses.isEmpty(); + } + + private Set
getAddressesTouchedByTransaction( + final TransactionWithLocation transaction, + final Optional> accumulator) { + HashSet
addresses = new HashSet<>(); + addresses.add(transaction.getSender()); + if (transaction.getTo().isPresent()) { + addresses.add(transaction.getTo().get()); + } + accumulator.ifPresent( + diffBasedWorldStateUpdateAccumulator -> + addresses.addAll(diffBasedWorldStateUpdateAccumulator.getAccountsToUpdate().keySet())); + return addresses; + } + + public List getParallelizedTransactions() { + return parallelizedTransactions; + } + + public Map> getAccumulatorByTransaction() { + return accumulatorByParallelizedTransaction; + } + + public Map getResultByTransaction() { + return resultByParallelizedTransaction; + } + + public static final class TransactionWithLocation { + private final long location; + private final Transaction transaction; + + public TransactionWithLocation(final long location, final Transaction transaction) { + this.location = location; + this.transaction = transaction; + } + + public long getLocation() { + return location; + } + + public Transaction transaction() { + return transaction; + } + + public Address getSender() { + return transaction.getSender(); + } + + public Optional
getTo() { + return transaction.getTo(); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TransactionWithLocation that = (TransactionWithLocation) o; + return location == that.location; + } + + @Override + public int hashCode() { + return Objects.hash(location); + } + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/processing/TransactionProcessingResult.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/processing/TransactionProcessingResult.java index eca28927bdd..06628315e87 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/processing/TransactionProcessingResult.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/processing/TransactionProcessingResult.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.ethereum.processing; +import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.mainnet.ValidationResult; import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason; import org.hyperledger.besu.evm.log.Log; @@ -49,6 +50,8 @@ public enum Status { private final Bytes output; + private Wei miningBenef; + private final ValidationResult validationResult; private final Optional revertReason; @@ -106,6 +109,14 @@ public TransactionProcessingResult( this.revertReason = revertReason; } + public void setMiningBenef(final Wei miningBenef) { + this.miningBenef = miningBenef; + } + + public Wei getMiningBenef() { + return miningBenef; + } + /** * Return the logs produced by the transaction. * diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java new file mode 100644 index 00000000000..87c8ff25c16 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java @@ -0,0 +1,62 @@ +/* + * Copyright Hyperledger Besu Contributors. + * + * 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.trie.diffbased.bonsai.cache; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import io.prometheus.client.guava.cache.CacheMetricsCollector; +import org.apache.tuweni.bytes.Bytes; +import org.apache.tuweni.bytes.Bytes32; +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.StorageSlotKey; +import org.hyperledger.besu.ethereum.trie.MerkleTrie; +import org.hyperledger.besu.ethereum.trie.MerkleTrieException; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; +import org.hyperledger.besu.ethereum.trie.diffbased.common.StorageSubscriber; +import org.hyperledger.besu.ethereum.trie.patricia.StoredMerklePatriciaTrie; +import org.hyperledger.besu.metrics.BesuMetricCategory; +import org.hyperledger.besu.metrics.ObservableMetricsSystem; +import org.hyperledger.besu.metrics.prometheus.PrometheusMetricsSystem; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; + +public class LazyBonsaiCachedMerkleTrieLoader extends BonsaiCachedMerkleTrieLoader{ + + + private final BonsaiCachedMerkleTrieLoader bonsaiCachedMerkleTrieLoader; + + public LazyBonsaiCachedMerkleTrieLoader(final ObservableMetricsSystem metricsSystem, final BonsaiCachedMerkleTrieLoader bonsaiCachedMerkleTrieLoader) { + super(metricsSystem); + this.bonsaiCachedMerkleTrieLoader = bonsaiCachedMerkleTrieLoader; + } + + public void preLoadAccount( + final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, + final Hash worldStateRootHash, + final Address account) { + + } + + public void preLoadStorageSlot( + final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, + final Address account, + final StorageSlotKey slotKey) { + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index 30b3d8440bc..7c727897dc0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -72,6 +72,15 @@ public BonsaiWorldState( evmConfiguration); } + public BonsaiWorldState(final BonsaiWorldState worldState) { + this( + new BonsaiWorldStateLayerStorage(worldState.getWorldStateStorage()), + worldState.bonsaiCachedMerkleTrieLoader, + worldState.cachedWorldStorageManager, + worldState.trieLogManager, + worldState.accumulator.getEvmConfiguration()); + } + public BonsaiWorldState( final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, final BonsaiCachedMerkleTrieLoader bonsaiCachedMerkleTrieLoader, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index 66169ee85a3..f8d8a5c2bd9 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -92,7 +92,7 @@ public DiffBasedWorldStateUpdateAccumulator( this.evmConfiguration = evmConfiguration; } - protected void cloneFromUpdater(final DiffBasedWorldStateUpdateAccumulator source) { + public void cloneFromUpdater(final DiffBasedWorldStateUpdateAccumulator source) { accountsToUpdate.putAll(source.getAccountsToUpdate()); codeToUpdate.putAll(source.codeToUpdate); storageToClear.addAll(source.storageToClear); @@ -110,7 +110,7 @@ protected Consumer getStoragePreloader() { return storagePreloader; } - protected EvmConfiguration getEvmConfiguration() { + public EvmConfiguration getEvmConfiguration() { return evmConfiguration; } From 466d1ca18e7e44ca642e433d0cb8d0e648f2506d Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 3 Jul 2024 09:28:04 +0200 Subject: [PATCH 02/35] clean code Signed-off-by: Karim Taam --- .../accumulator/DiffBasedWorldStateUpdateAccumulator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index 20f5f378411..2a320b24126 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -391,7 +391,7 @@ public void commit() { accountValue.setUpdated(null); } - getUpdatedAccounts() + getUpdatedAccounts().parallelStream() .forEach( tracked -> { final Address updatedAddress = tracked.getAddress(); From a2dc27f4e8684b629b8a1fde92b136a0afa0ffbb Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 3 Jul 2024 11:49:35 +0200 Subject: [PATCH 03/35] fix build Signed-off-by: Karim Taam --- .../besu/ethereum/mainnet/AbstractBlockProcessor.java | 9 +-------- .../diffbased/bonsai/worldview/BonsaiWorldState.java | 8 +++++--- 2 files changed, 6 insertions(+), 11 deletions(-) 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 a874f2f786b..70566d4a18e 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 @@ -37,6 +37,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.LazyBonsaiCachedMerkleTrieLoader; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldStateUpdateAccumulator; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator; @@ -279,14 +280,6 @@ public BlockProcessingResult processBlock( } } - // EIP-7685: process EL requests - final Optional requestProcessor = - protocolSpec.getRequestProcessorCoordinator(); - Optional> maybeRequests = Optional.empty(); - if (requestProcessor.isPresent()) { - maybeRequests = requestProcessor.get().process(worldState, receipts); - } - if (!rewardCoinbase(worldState, blockHeader, ommers, skipZeroBlockRewards)) { // no need to log, rewardCoinbase logs the error. if (worldState instanceof BonsaiWorldState) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index 791831bd9d7..c316cc84047 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -76,13 +76,14 @@ public BonsaiWorldState( diffBasedWorldStateConfig); } - public BonsaiWorldState(final BonsaiWorldState worldState) { + public BonsaiWorldState(final BonsaiWorldState worldState,final DiffBasedWorldStateConfig diffBasedWorldStateConfig) { this( new BonsaiWorldStateLayerStorage(worldState.getWorldStateStorage()), worldState.bonsaiCachedMerkleTrieLoader, worldState.cachedWorldStorageManager, worldState.trieLogManager, - worldState.accumulator.getEvmConfiguration()); + worldState.accumulator.getEvmConfiguration(), + diffBasedWorldStateConfig); } public BonsaiWorldState( @@ -93,7 +94,8 @@ public BonsaiWorldState( bonsaiCachedMerkleTrieLoader, worldState.cachedWorldStorageManager, worldState.trieLogManager, - worldState.accumulator.getEvmConfiguration()); + worldState.accumulator.getEvmConfiguration(), + worldState.worldStateConfig); } public BonsaiWorldState( From c43170412fb676cac8f9c5f3790a80cbf9216e23 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 3 Jul 2024 11:55:31 +0200 Subject: [PATCH 04/35] change config worldstate code Signed-off-by: Karim Taam --- .../besu/ethereum/mainnet/AbstractBlockProcessor.java | 3 --- .../trie/diffbased/bonsai/worldview/BonsaiWorldState.java | 8 +++++--- 2 files changed, 5 insertions(+), 6 deletions(-) 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 70566d4a18e..57e64b2340c 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 @@ -25,11 +25,9 @@ import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.MutableWorldState; -import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.Withdrawal; -import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.MerkleTrieException; @@ -37,7 +35,6 @@ import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.LazyBonsaiCachedMerkleTrieLoader; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldStateUpdateAccumulator; -import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator; diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index c316cc84047..8e7a9b4e49e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -76,14 +76,16 @@ public BonsaiWorldState( diffBasedWorldStateConfig); } - public BonsaiWorldState(final BonsaiWorldState worldState,final DiffBasedWorldStateConfig diffBasedWorldStateConfig) { + public BonsaiWorldState( + final BonsaiWorldState worldState, + final DiffBasedWorldStateConfig diffBasedWorldStateConfig) { this( new BonsaiWorldStateLayerStorage(worldState.getWorldStateStorage()), worldState.bonsaiCachedMerkleTrieLoader, worldState.cachedWorldStorageManager, worldState.trieLogManager, worldState.accumulator.getEvmConfiguration(), - diffBasedWorldStateConfig); + diffBasedWorldStateConfig); } public BonsaiWorldState( @@ -95,7 +97,7 @@ public BonsaiWorldState( worldState.cachedWorldStorageManager, worldState.trieLogManager, worldState.accumulator.getEvmConfiguration(), - worldState.worldStateConfig); + new DiffBasedWorldStateConfig(worldState.worldStateConfig)); } public BonsaiWorldState( From 95170f778ad2091d767b579f191da5aec00698c4 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 3 Jul 2024 12:03:33 +0200 Subject: [PATCH 05/35] update reference tests Signed-off-by: Karim Taam --- ethereum/referencetests/src/reference-test/external-resources | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/referencetests/src/reference-test/external-resources b/ethereum/referencetests/src/reference-test/external-resources index 52ddcbcef0d..faf33b47146 160000 --- a/ethereum/referencetests/src/reference-test/external-resources +++ b/ethereum/referencetests/src/reference-test/external-resources @@ -1 +1 @@ -Subproject commit 52ddcbcef0d58ec7de6b768b564725391a30b934 +Subproject commit faf33b471465d3c6cdc3d04fbd690895f78d33f2 From 81cdd37857c646872220a98c56055cd1449b8e52 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 3 Jul 2024 16:56:49 +0200 Subject: [PATCH 06/35] async commit and modify hashcode for StorageSlotKey Signed-off-by: Karim Taam --- .../java/org/hyperledger/besu/datatypes/StorageSlotKey.java | 2 +- .../besu/ethereum/mainnet/AbstractBlockProcessor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datatypes/src/main/java/org/hyperledger/besu/datatypes/StorageSlotKey.java b/datatypes/src/main/java/org/hyperledger/besu/datatypes/StorageSlotKey.java index a8bf7c9afd1..8404453cf18 100644 --- a/datatypes/src/main/java/org/hyperledger/besu/datatypes/StorageSlotKey.java +++ b/datatypes/src/main/java/org/hyperledger/besu/datatypes/StorageSlotKey.java @@ -94,7 +94,7 @@ public boolean equals(final Object o) { @Override public int hashCode() { - return Objects.hash(slotHash.hashCode()); + return slotHash.hashCode(); } @Override 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 57e64b2340c..8600a38b2da 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 @@ -168,6 +168,7 @@ public BlockProcessingResult processBlock( TransactionValidationParams.processingBlock(), privateMetadataUpdater, blobGasPrice); + roundWorldState.getAccumulator().commit(); transactionConflictChecker.saveParallelizedTransactionProcessingResult( transactionWithLocation, roundWorldState.getAccumulator(), result); }, @@ -191,7 +192,6 @@ public BlockProcessingResult processBlock( new TransactionConflictChecker.TransactionWithLocation(i, transaction), transactionAccumulator, blockUpdater)) { - transactionAccumulator.commit(); blockUpdater.cloneFromUpdaterWithPreloader(transactionAccumulator); transactionProcessingResult = transactionConflictChecker.getResultByTransaction().get((long) i); From 96b3c2323ddfe09b8a87b98b1bda20bcbe7347e6 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 4 Jul 2024 10:21:30 +0200 Subject: [PATCH 07/35] remove preload of withdrawal address Signed-off-by: Karim Taam --- .../besu/ethereum/mainnet/AbstractBlockProcessor.java | 7 ------- 1 file changed, 7 deletions(-) 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 8600a38b2da..16da5c5231b 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 @@ -137,13 +137,6 @@ public BlockProcessingResult processBlock( final BonsaiWorldStateUpdateAccumulator blockUpdater = (BonsaiWorldStateUpdateAccumulator) worldState.updater(); - // load withdrawal addresses in the cache in background - maybeWithdrawals.ifPresent( - withdrawals -> - CompletableFuture.runAsync( - () -> - withdrawals.forEach(withdrawal -> blockUpdater.get(withdrawal.getAddress())))); - final long time = System.currentTimeMillis(); for (int i = 0; i < transactions.size(); i++) { From 051236f94d7997d3a55f7e8515e81cb7799f7596 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 4 Jul 2024 12:26:46 +0200 Subject: [PATCH 08/35] add logs for map size Signed-off-by: Karim Taam --- .../DiffBasedWorldStateUpdateAccumulator.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index 2a320b24126..8b2d32be5d0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -490,6 +490,18 @@ public void commit() { tracked.setStorageWasCleared(false); // storage already cleared for this transaction } }); + + System.out.println("account " + accountsToUpdate.size()); + System.out.println("storage " + storageToUpdate.size()); + System.out.println("code " + codeToUpdate.size()); + storageToUpdate.forEach( + (address, storageSlotKeyDiffBasedValueStorageConsumingMap) -> { + System.out.println( + "storage map size for " + + address + + " " + + storageSlotKeyDiffBasedValueStorageConsumingMap.size()); + }); } @Override From 15b1f57df080625ccad202b73528b9079f9c8b0e Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 4 Jul 2024 12:40:20 +0200 Subject: [PATCH 09/35] delete empty storage map Signed-off-by: Karim Taam --- .../accumulator/DiffBasedWorldStateUpdateAccumulator.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index 8b2d32be5d0..81cf921d03c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -451,12 +451,6 @@ public void commit() { pendingStorageUpdates.clear(); } - // This is especially to avoid unnecessary computation for withdrawals and - // self-destruct beneficiaries - if (updatedAccount.getUpdatedStorage().isEmpty()) { - return; - } - // parallel stream here may cause database corruption updatedAccount .getUpdatedStorage() From fa801baab11f3dcca90deb2548736c92bf300588 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 4 Jul 2024 12:42:17 +0200 Subject: [PATCH 10/35] remove logs Signed-off-by: Karim Taam --- .../DiffBasedWorldStateUpdateAccumulator.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index 81cf921d03c..f59ae26f89c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -484,18 +484,7 @@ public void commit() { tracked.setStorageWasCleared(false); // storage already cleared for this transaction } }); - - System.out.println("account " + accountsToUpdate.size()); - System.out.println("storage " + storageToUpdate.size()); - System.out.println("code " + codeToUpdate.size()); - storageToUpdate.forEach( - (address, storageSlotKeyDiffBasedValueStorageConsumingMap) -> { - System.out.println( - "storage map size for " - + address - + " " - + storageSlotKeyDiffBasedValueStorageConsumingMap.size()); - }); + } @Override From 444e9912ecf4ee330a4585ba8a085ab968b207ac Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Thu, 4 Jul 2024 14:26:57 +0200 Subject: [PATCH 11/35] execute commit and persist phase sequentially Signed-off-by: Ameziane H --- .../trie/diffbased/bonsai/worldview/BonsaiWorldState.java | 6 +----- .../accumulator/DiffBasedWorldStateUpdateAccumulator.java | 3 +-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index 8e7a9b4e49e..08be847c794 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -155,11 +155,7 @@ private Hash internalCalculateRootHash( // that we can get the storage state hash Stream>>> storageStream = worldStateUpdater.getStorageToUpdate().entrySet().stream(); - if (maybeStateUpdater.isEmpty()) { - storageStream = - storageStream - .parallel(); // if we are not updating the state updater we can use parallel stream - } + storageStream.forEach( addressMapEntry -> updateAccountStorageState(maybeStateUpdater, worldStateUpdater, addressMapEntry)); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index f59ae26f89c..4cd7bbf8397 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -391,7 +391,7 @@ public void commit() { accountValue.setUpdated(null); } - getUpdatedAccounts().parallelStream() + getUpdatedAccounts().stream() .forEach( tracked -> { final Address updatedAddress = tracked.getAddress(); @@ -484,7 +484,6 @@ public void commit() { tracked.setStorageWasCleared(false); // storage already cleared for this transaction } }); - } @Override From 32c6a2fafd369fd5f2d92f2a1a83a9ef22276212 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Thu, 4 Jul 2024 15:51:13 +0200 Subject: [PATCH 12/35] Rollback sequential execution on persist and commit phase Initialize ConcurrentHashMap used in the accumulator to avoid collisions Signed-off-by: Ameziane H --- .../bonsai/worldview/BonsaiWorldState.java | 6 +++++ .../DiffBasedWorldStateUpdateAccumulator.java | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index 08be847c794..76974bebd09 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -156,6 +156,12 @@ private Hash internalCalculateRootHash( Stream>>> storageStream = worldStateUpdater.getStorageToUpdate().entrySet().stream(); + if (maybeStateUpdater.isEmpty()) { + storageStream = + storageStream + .parallel(); // if we are not updating the state updater we can use parallel stream + } + storageStream.forEach( addressMapEntry -> updateAccountStorageState(maybeStateUpdater, worldStateUpdater, addressMapEntry)); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index 4cd7bbf8397..b8992bbfb3f 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -72,9 +72,9 @@ public abstract class DiffBasedWorldStateUpdateAccumulator>> - storageToUpdate = new ConcurrentHashMap<>(); + storageToUpdate = new ConcurrentHashMap<>(1000); - private final Map storageKeyHashLookup = new ConcurrentHashMap<>(); + private final Map storageKeyHashLookup = new ConcurrentHashMap<>(1000); protected boolean isAccumulatorStateChanged; public DiffBasedWorldStateUpdateAccumulator( @@ -83,7 +83,8 @@ public DiffBasedWorldStateUpdateAccumulator( final Consumer storagePreloader, final EvmConfiguration evmConfiguration) { super(world, evmConfiguration); - this.accountsToUpdate = new AccountConsumingMap<>(new ConcurrentHashMap<>(), accountPreloader); + this.accountsToUpdate = + new AccountConsumingMap<>(new ConcurrentHashMap<>(1000), accountPreloader); this.accountPreloader = accountPreloader; this.storagePreloader = storagePreloader; this.isAccumulatorStateChanged = false; @@ -135,7 +136,7 @@ public void cloneFromUpdaterWithPreloader( address, k -> new StorageConsumingMap<>( - address, new ConcurrentHashMap<>(), storagePreloader)); + address, new ConcurrentHashMap<>(100), storagePreloader)); slots.forEach( (storageSlotKey, uInt256DiffBasedValue) -> { storageConsumingMap.put( @@ -182,7 +183,7 @@ public void clonePriorFromUpdater(final DiffBasedWorldStateUpdateAccumulator new StorageConsumingMap<>( - address, new ConcurrentHashMap<>(), storagePreloader)); + address, new ConcurrentHashMap<>(100), storagePreloader)); slots.forEach( (storageSlotKey, uInt256DiffBasedValue) -> { storageConsumingMap.putIfAbsent( @@ -356,7 +357,7 @@ public void commit() { deletedAddress, k -> new StorageConsumingMap<>( - deletedAddress, new ConcurrentHashMap<>(), storagePreloader)); + deletedAddress, new ConcurrentHashMap<>(100), storagePreloader)); final Iterator>> iter = deletedStorageUpdates.entrySet().iterator(); while (iter.hasNext()) { @@ -391,7 +392,7 @@ public void commit() { accountValue.setUpdated(null); } - getUpdatedAccounts().stream() + getUpdatedAccounts().parallelStream() .forEach( tracked -> { final Address updatedAddress = tracked.getAddress(); @@ -403,7 +404,7 @@ public void commit() { updatedAddress, k -> new StorageConsumingMap<>( - updatedAddress, new ConcurrentHashMap<>(), storagePreloader)); + updatedAddress, new ConcurrentHashMap<>(100), storagePreloader)); if (tracked.getWrappedAccount() == null) { updatedAccount = createAccount(this, tracked); @@ -528,7 +529,8 @@ public Optional getStorageValueByStorageSlotKey( .computeIfAbsent( address, key -> - new StorageConsumingMap<>(address, new ConcurrentHashMap<>(), storagePreloader)) + new StorageConsumingMap<>( + address, new ConcurrentHashMap<>(100), storagePreloader)) .put( storageSlotKey, new DiffBasedValue<>(valueUInt.orElse(null), valueUInt.orElse(null))); return valueUInt; @@ -752,7 +754,7 @@ private Map> maybeCreateStorageMap( final Map> storageMap, final Address address) { if (storageMap == null) { final StorageConsumingMap> newMap = - new StorageConsumingMap<>(address, new ConcurrentHashMap<>(), storagePreloader); + new StorageConsumingMap<>(address, new ConcurrentHashMap<>(100), storagePreloader); storageToUpdate.put(address, newMap); return newMap; } else { @@ -784,7 +786,8 @@ private void rollStorageChange( .computeIfAbsent( address, k -> - new StorageConsumingMap<>(address, new ConcurrentHashMap<>(), storagePreloader)) + new StorageConsumingMap<>( + address, new ConcurrentHashMap<>(100), storagePreloader)) .put(storageSlotKey, slotValue); } } From 05b8873ac0325273b7e8fa5c47237e40d0da7b5a Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 4 Jul 2024 18:53:43 +0200 Subject: [PATCH 13/35] clean code first step Signed-off-by: Karim Taam --- .../mainnet/AbstractBlockProcessor.java | 199 +++++++----------- ...PreloadConcurrentTransactionProcessor.java | 135 ++++++++++++ .../TransactionCollisionDetector.java} | 63 +----- 3 files changed, 224 insertions(+), 173 deletions(-) create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/{TransactionConflictChecker.java => parallelization/TransactionCollisionDetector.java} (68%) 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 16da5c5231b..5f810d31e26 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 @@ -25,17 +25,17 @@ import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.MutableWorldState; +import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.Withdrawal; +import org.hyperledger.besu.ethereum.mainnet.parallelization.PreloadConcurrentTransactionProcessor; +import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.MerkleTrieException; -import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.BonsaiAccount; -import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.LazyBonsaiCachedMerkleTrieLoader; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldStateUpdateAccumulator; -import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator; import org.hyperledger.besu.evm.tracing.OperationTracer; @@ -46,14 +46,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@SuppressWarnings("SuspiciousMethodCalls") public abstract class AbstractBlockProcessor implements BlockProcessor { @FunctionalInterface @@ -81,8 +77,6 @@ TransactionReceipt create( protected final MiningBeneficiaryCalculator miningBeneficiaryCalculator; - private static final Executor executor = Executors.newFixedThreadPool(4); - protected AbstractBlockProcessor( final MainnetTransactionProcessor transactionProcessor, final TransactionReceiptFactory transactionReceiptFactory, @@ -98,7 +92,6 @@ protected AbstractBlockProcessor( this.protocolSchedule = protocolSchedule; } - @SuppressWarnings({"unchecked", "ReassignedVariable"}) @Override public BlockProcessingResult processBlock( final Blockchain blockchain, @@ -112,15 +105,15 @@ public BlockProcessingResult processBlock( long currentGasUsed = 0; long currentBlobGasUsed = 0; + final PreloadConcurrentTransactionProcessor preloadConcurrentTransactionProcessor = + new PreloadConcurrentTransactionProcessor(transactionProcessor); + final ProtocolSpec protocolSpec = protocolSchedule.getByBlockHeader(blockHeader); protocolSpec.getBlockHashProcessor().processBlockHashes(blockchain, worldState, blockHeader); - final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(blockHeader, blockchain); final Address miningBeneficiary = miningBeneficiaryCalculator.calculateBeneficiary(blockHeader); - TransactionConflictChecker transactionConflictChecker = new TransactionConflictChecker(); - Optional maybeParentHeader = blockchain.getBlockHeader(blockHeader.getParentHash()); @@ -134,120 +127,73 @@ public BlockProcessingResult processBlock( calculateExcessBlobGasForParent(protocolSpec, parentHeader))) .orElse(Wei.ZERO); - final BonsaiWorldStateUpdateAccumulator blockUpdater = - (BonsaiWorldStateUpdateAccumulator) worldState.updater(); - - final long time = System.currentTimeMillis(); + preloadConcurrentTransactionProcessor.runAsyncPreloadBlock( + worldState, + blockHeader, + transactions, + miningBeneficiary, + blockHashLookup, + blobGasPrice, + privateMetadataUpdater); for (int i = 0; i < transactions.size(); i++) { - final TransactionConflictChecker.TransactionWithLocation transactionWithLocation = - new TransactionConflictChecker.TransactionWithLocation(i, transactions.get(i)); - CompletableFuture.runAsync( - () -> { - BonsaiWorldState roundWorldState = - new BonsaiWorldState( - (BonsaiWorldState) worldState, new LazyBonsaiCachedMerkleTrieLoader()); - WorldUpdater roundWorldStateUpdater = roundWorldState.updater(); - - final TransactionProcessingResult result = - transactionProcessor.processTransaction( - roundWorldStateUpdater, - blockHeader, - transactionWithLocation.transaction(), - miningBeneficiary, - OperationTracer.NO_TRACING, - blockHashLookup, - true, - TransactionValidationParams.processingBlock(), - privateMetadataUpdater, - blobGasPrice); - roundWorldState.getAccumulator().commit(); - transactionConflictChecker.saveParallelizedTransactionProcessingResult( - transactionWithLocation, roundWorldState.getAccumulator(), result); - }, - executor); - } - - System.out.println("preload " + (System.currentTimeMillis() - time)); - - int confirmedParallelizedTransaction = 0; - int conflictingButCachedTransaction = 0; - try { - for (int i = 0; i < transactions.size(); i++) { - Transaction transaction = transactions.get(i); - final TransactionProcessingResult transactionProcessingResult; - final DiffBasedWorldStateUpdateAccumulator transactionAccumulator = - (DiffBasedWorldStateUpdateAccumulator) - transactionConflictChecker.getAccumulatorByTransaction().get((long) i); - if (transactionAccumulator != null - && !transactionConflictChecker.checkConflicts( + final Transaction transaction = transactions.get(i); + if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) { + return new BlockProcessingResult(Optional.empty(), "provided gas insufficient"); + } + final WorldUpdater blockUpdater = worldState.updater(); + + TransactionProcessingResult transactionProcessingResult = + preloadConcurrentTransactionProcessor + .applyPreloadBlockResult(worldState, miningBeneficiary, transaction, i) + .orElse(null); + + if (transactionProcessingResult == null) { + transactionProcessingResult = + transactionProcessor.processTransaction( + blockUpdater, + blockHeader, + transaction, miningBeneficiary, - new TransactionConflictChecker.TransactionWithLocation(i, transaction), - transactionAccumulator, - blockUpdater)) { - blockUpdater.cloneFromUpdaterWithPreloader(transactionAccumulator); - transactionProcessingResult = - transactionConflictChecker.getResultByTransaction().get((long) i); - - confirmedParallelizedTransaction++; - } else { - if (transactionAccumulator != null) { - blockUpdater.clonePriorFromUpdater(transactionAccumulator); - conflictingButCachedTransaction++; - } - transactionProcessingResult = - transactionProcessor.processTransaction( - blockUpdater, - blockHeader, - transaction, - miningBeneficiary, - OperationTracer.NO_TRACING, - blockHashLookup, - true, - TransactionValidationParams.processingBlock(), - privateMetadataUpdater, - blobGasPrice); - } - if (transactionProcessingResult.isInvalid()) { - String errorMessage = - MessageFormat.format( - "Block processing error: transaction invalid {0}. Block {1} Transaction {2}", - transactionProcessingResult.getValidationResult().getErrorMessage(), - blockHeader.getHash().toHexString(), - transaction.getHash().toHexString()); - LOG.info(errorMessage); - if (worldState instanceof BonsaiWorldState) { - blockUpdater.reset(); - } - return new BlockProcessingResult(Optional.empty(), errorMessage); + OperationTracer.NO_TRACING, + blockHashLookup, + true, + TransactionValidationParams.processingBlock(), + privateMetadataUpdater, + blobGasPrice); + } + if (transactionProcessingResult.isInvalid()) { + String errorMessage = + MessageFormat.format( + "Block processing error: transaction invalid {0}. Block {1} Transaction {2}", + transactionProcessingResult.getValidationResult().getErrorMessage(), + blockHeader.getHash().toHexString(), + transaction.getHash().toHexString()); + LOG.info(errorMessage); + if (worldState instanceof BonsaiWorldState) { + ((BonsaiWorldStateUpdateAccumulator) blockUpdater).reset(); } + return new BlockProcessingResult(Optional.empty(), errorMessage); + } - final var coinbase = blockUpdater.getOrCreate(miningBeneficiary); - if (transactionProcessingResult.getMiningBenef() != null) { - coinbase.incrementBalance(transactionProcessingResult.getMiningBenef()); - } + final var coinbase = blockUpdater.getOrCreate(miningBeneficiary); + if (transactionProcessingResult.getMiningBenef() != null) { + coinbase.incrementBalance(transactionProcessingResult.getMiningBenef()); + } - blockUpdater.commit(); + blockUpdater.commit(); - currentGasUsed += transaction.getGasLimit() - transactionProcessingResult.getGasRemaining(); - if (transaction.getVersionedHashes().isPresent()) { - currentBlobGasUsed += - (transaction.getVersionedHashes().get().size() - * CancunGasCalculator.BLOB_GAS_PER_BLOB); - } - final TransactionReceipt transactionReceipt = - transactionReceiptFactory.create( - transaction.getType(), transactionProcessingResult, worldState, currentGasUsed); - receipts.add(transactionReceipt); + currentGasUsed += transaction.getGasLimit() - transactionProcessingResult.getGasRemaining(); + if (transaction.getVersionedHashes().isPresent()) { + currentBlobGasUsed += + (transaction.getVersionedHashes().get().size() * CancunGasCalculator.BLOB_GAS_PER_BLOB); } - System.out.println("conflictingButCachedTransaction " + conflictingButCachedTransaction); - System.out.println("confirmedParallelizedTransaction " + confirmedParallelizedTransaction); - } catch (Throwable e) { - e.printStackTrace(); - System.out.println("error " + e); + final TransactionReceipt transactionReceipt = + transactionReceiptFactory.create( + transaction.getType(), transactionProcessingResult, worldState, currentGasUsed); + receipts.add(transactionReceipt); } - if (blockHeader.getBlobGasUsed().isPresent() && currentBlobGasUsed != blockHeader.getBlobGasUsed().get()) { String errorMessage = @@ -269,6 +215,20 @@ public BlockProcessingResult processBlock( return new BlockProcessingResult(Optional.empty(), e); } } + System.out.println( + "conflictingButCachedTransaction result " + + preloadConcurrentTransactionProcessor.getConflictingButCachedTransaction()); + System.out.println( + "confirmedParallelizedTransaction result " + + preloadConcurrentTransactionProcessor.getConfirmedParallelizedTransaction()); + + // EIP-7685: process EL requests + final Optional requestProcessor = + protocolSpec.getRequestProcessorCoordinator(); + Optional> maybeRequests = Optional.empty(); + if (requestProcessor.isPresent()) { + maybeRequests = requestProcessor.get().process(worldState, receipts); + } if (!rewardCoinbase(worldState, blockHeader, ommers, skipZeroBlockRewards)) { // no need to log, rewardCoinbase logs the error. @@ -277,6 +237,7 @@ public BlockProcessingResult processBlock( } return new BlockProcessingResult(Optional.empty(), "ommer too old"); } + try { worldState.persist(blockHeader); } catch (MerkleTrieException e) { @@ -289,7 +250,9 @@ public BlockProcessingResult processBlock( LOG.error("failed persisting block", e); return new BlockProcessingResult(Optional.empty(), e); } - return new BlockProcessingResult(Optional.of(new BlockProcessingOutputs(worldState, receipts))); + + return new BlockProcessingResult( + Optional.of(new BlockProcessingOutputs(worldState, receipts, maybeRequests))); } protected boolean hasAvailableBlockBudget( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java new file mode 100644 index 00000000000..3bcf48ca3ce --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java @@ -0,0 +1,135 @@ +/* + * 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.parallelization; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.MutableWorldState; +import org.hyperledger.besu.ethereum.core.Transaction; +import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor; +import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; +import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; +import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.LazyBonsaiCachedMerkleTrieLoader; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; +import org.hyperledger.besu.evm.operation.BlockHashOperation; +import org.hyperledger.besu.evm.tracing.OperationTracer; +import org.hyperledger.besu.evm.worldstate.WorldUpdater; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +@SuppressWarnings({"unchecked", "rawtypes", "unused"}) +public class PreloadConcurrentTransactionProcessor { + + private static final Executor executor = Executors.newFixedThreadPool(4); + + private final MainnetTransactionProcessor transactionProcessor; + + private final TransactionCollisionDetector transactionCollisionDetector; + + int confirmedParallelizedTransaction = 0; + int conflictingButCachedTransaction = 0; + + public PreloadConcurrentTransactionProcessor( + final MainnetTransactionProcessor transactionProcessor) { + this.transactionProcessor = transactionProcessor; + this.transactionCollisionDetector = new TransactionCollisionDetector(); + } + + public void runAsyncPreloadBlock( + final MutableWorldState worldState, + final BlockHeader blockHeader, + final List transactions, + final Address miningBeneficiary, + final BlockHashOperation.BlockHashLookup blockHashLookup, + final Wei blobGasPrice, + final PrivateMetadataUpdater privateMetadataUpdater) { + confirmedParallelizedTransaction = 0; + conflictingButCachedTransaction = 0; + for (int i = 0; i < transactions.size(); i++) { + final Transaction transaction = transactions.get(i); + final long transactionIndex = i; + CompletableFuture.runAsync( + () -> { + DiffBasedWorldState roundWorldState = + new BonsaiWorldState( + (BonsaiWorldState) worldState, new LazyBonsaiCachedMerkleTrieLoader()); + WorldUpdater roundWorldStateUpdater = roundWorldState.updater(); + final TransactionProcessingResult result = + transactionProcessor.processTransaction( + roundWorldStateUpdater, + blockHeader, + transaction, + miningBeneficiary, + OperationTracer.NO_TRACING, + blockHashLookup, + true, + TransactionValidationParams.processingBlock(), + privateMetadataUpdater, + blobGasPrice); + roundWorldState.getAccumulator().commit(); + transactionCollisionDetector.saveParallelizedTransactionProcessingResult( + transactionIndex, roundWorldState.getAccumulator(), result); + }, + executor); + } + } + + public Optional applyPreloadBlockResult( + final MutableWorldState worldState, + final Address miningBeneficiary, + final Transaction transaction, + final long transactionIndex) { + final DiffBasedWorldState diffBasedWorldState = (DiffBasedWorldState) worldState; + final DiffBasedWorldStateUpdateAccumulator diffBasedWorldStateUpdateAccumulator = + (DiffBasedWorldStateUpdateAccumulator) diffBasedWorldState.updater(); + final Optional maybeTransactionProcessingResult; + final DiffBasedWorldStateUpdateAccumulator transactionAccumulator = + transactionCollisionDetector.getAccumulatorByTransaction().get(transactionIndex); + if (transactionAccumulator != null + && !transactionCollisionDetector.checkConflicts( + miningBeneficiary, + transaction, + transactionAccumulator, + diffBasedWorldStateUpdateAccumulator)) { + diffBasedWorldStateUpdateAccumulator.cloneFromUpdaterWithPreloader(transactionAccumulator); + maybeTransactionProcessingResult = + Optional.of(transactionCollisionDetector.getResultByTransaction().get(transactionIndex)); + confirmedParallelizedTransaction++; + } else { + if (transactionAccumulator != null) { + diffBasedWorldStateUpdateAccumulator.clonePriorFromUpdater(transactionAccumulator); + conflictingButCachedTransaction++; + } + maybeTransactionProcessingResult = Optional.empty(); + } + return maybeTransactionProcessingResult; + } + + public int getConfirmedParallelizedTransaction() { + return confirmedParallelizedTransaction; + } + + public int getConflictingButCachedTransaction() { + return conflictingButCachedTransaction; + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionConflictChecker.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java similarity index 68% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionConflictChecker.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java index 1a9e7690907..578c6a6519a 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionConflictChecker.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java @@ -12,7 +12,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ -package org.hyperledger.besu.ethereum.mainnet; +package org.hyperledger.besu.ethereum.mainnet.parallelization; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.ethereum.core.Transaction; @@ -21,12 +21,11 @@ import java.util.HashSet; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -public class TransactionConflictChecker { +public class TransactionCollisionDetector { private final Map> accumulatorByParallelizedTransaction = new ConcurrentHashMap<>(); @@ -35,16 +34,16 @@ public class TransactionConflictChecker { new ConcurrentHashMap<>(); public void saveParallelizedTransactionProcessingResult( - final TransactionWithLocation transaction, + final long transactionIndex, final DiffBasedWorldStateUpdateAccumulator accumulator, final TransactionProcessingResult result) { - accumulatorByParallelizedTransaction.put(transaction.getLocation(), accumulator); - resultByParallelizedTransaction.put(transaction.getLocation(), result); + accumulatorByParallelizedTransaction.put(transactionIndex, accumulator); + resultByParallelizedTransaction.put(transactionIndex, result); } public boolean checkConflicts( final Address producer, - final TransactionWithLocation transaction, + final Transaction transaction, final DiffBasedWorldStateUpdateAccumulator trxAccumulator, final DiffBasedWorldStateUpdateAccumulator blockAccumulator) { final Set
addressesTouchedByTransaction = @@ -60,7 +59,7 @@ public boolean checkConflicts( } private Set
getAddressesTouchedByTransaction( - final TransactionWithLocation transaction, + final Transaction transaction, final Optional> accumulator) { HashSet
addresses = new HashSet<>(); addresses.add(transaction.getSender()); @@ -71,14 +70,7 @@ private Set
getAddressesTouchedByTransaction( diffBasedWorldStateUpdateAccumulator -> { diffBasedWorldStateUpdateAccumulator .getAccountsToUpdate() - .forEach( - (address, diffBasedValue) -> { - addresses.add(address); - /*System.out.println("update "+diffBasedValue.getPrior()+" "+diffBasedValue.getUpdated()); - diffBasedWorldStateUpdateAccumulator.getTouchedAccounts().stream().forEach(account -> { - System.out.println(account); - });*/ - }); + .forEach((address, diffBasedValue) -> addresses.add(address)); addresses.addAll(diffBasedWorldStateUpdateAccumulator.getDeletedAccountAddresses()); }); return addresses; @@ -109,43 +101,4 @@ public Map> getAccumulatorByTransa public Map getResultByTransaction() { return resultByParallelizedTransaction; } - - public static final class TransactionWithLocation { - private final long location; - private final Transaction transaction; - - public TransactionWithLocation(final long location, final Transaction transaction) { - this.location = location; - this.transaction = transaction; - } - - public long getLocation() { - return location; - } - - public Transaction transaction() { - return transaction; - } - - public Address getSender() { - return transaction.getSender(); - } - - public Optional
getTo() { - return transaction.getTo(); - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - TransactionWithLocation that = (TransactionWithLocation) o; - return location == that.location; - } - - @Override - public int hashCode() { - return Objects.hash(location); - } - } } From 4728fd0d056098b475223f6abb4bb6b30c2bb09a Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Fri, 5 Jul 2024 15:25:40 +0200 Subject: [PATCH 14/35] clean code Signed-off-by: Karim Taam --- .../besu/crypto/Blake2bfMessageDigest.java | 30 ++++-- .../crypto/Blake2bfMessageDigestTest.java | 50 ++++++++++ .../mainnet/AbstractBlockProcessor.java | 21 +++- .../mainnet/MainnetTransactionProcessor.java | 31 +++--- .../ParallelizedTransactionContext.java | 65 ++++++++++++ ...PreloadConcurrentTransactionProcessor.java | 98 ++++++++++++++----- .../TransactionCollisionDetector.java | 38 ++----- .../TransactionProcessingResult.java | 11 --- .../bonsai/worldview/BonsaiWorldState.java | 6 +- .../DiffBasedWorldStateUpdateAccumulator.java | 1 - .../besu/evm/tracing/OperationTracer.java | 12 +++ 11 files changed, 261 insertions(+), 102 deletions(-) create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java diff --git a/crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/Blake2bfMessageDigest.java b/crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/Blake2bfMessageDigest.java index 63449d74b50..ad4fe7ddb15 100644 --- a/crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/Blake2bfMessageDigest.java +++ b/crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/Blake2bfMessageDigest.java @@ -34,6 +34,13 @@ public Blake2bfMessageDigest() { super(new Blake2bfDigest()); } + @Override + public Blake2bfMessageDigest clone() throws CloneNotSupportedException { + Blake2bfMessageDigest cloned = (Blake2bfMessageDigest) super.clone(); + cloned.digest = ((Blake2bfDigest) this.digest).clone(); + return cloned; + } + /** * Implementation of the `F` compression function of the Blake2b cryptographic hash function. * @@ -43,7 +50,7 @@ public Blake2bfMessageDigest() { * *

Optimized for 64-bit platforms */ - public static class Blake2bfDigest implements Digest { + public static class Blake2bfDigest implements Digest, Cloneable { /** The constant MESSAGE_LENGTH_BYTES. */ public static final int MESSAGE_LENGTH_BYTES = 213; @@ -71,18 +78,18 @@ public static class Blake2bfDigest implements Digest { // buffer which holds serialized input for this compression function // [ 4 bytes for rounds ][ 64 bytes for h ][ 128 bytes for m ] // [ 8 bytes for t_0 ][ 8 bytes for t_1 ][ 1 byte for f ] - private final byte[] buffer; + private byte[] buffer; private int bufferPos; // deserialized inputs for f compression - private final long[] h; - private final long[] m; - private final long[] t; + private long[] h; + private long[] m; + private long[] t; private boolean f; private long rounds; // unsigned integer represented as long - private final long[] v; + private long[] v; private static boolean useNative; static { @@ -112,6 +119,17 @@ public static class Blake2bfDigest implements Digest { v = new long[16]; } + @Override + public Blake2bfDigest clone() throws CloneNotSupportedException { + Blake2bfDigest cloned = (Blake2bfDigest) super.clone(); + cloned.buffer = this.buffer.clone(); + cloned.h = this.h.clone(); + cloned.m = this.m.clone(); + cloned.t = this.t.clone(); + cloned.v = this.v.clone(); + return cloned; + } + /** Disable native. */ public static void disableNative() { useNative = false; diff --git a/crypto/algorithms/src/test/java/org/hyperledger/besu/crypto/Blake2bfMessageDigestTest.java b/crypto/algorithms/src/test/java/org/hyperledger/besu/crypto/Blake2bfMessageDigestTest.java index bd00dc7dae1..390d7d41438 100644 --- a/crypto/algorithms/src/test/java/org/hyperledger/besu/crypto/Blake2bfMessageDigestTest.java +++ b/crypto/algorithms/src/test/java/org/hyperledger/besu/crypto/Blake2bfMessageDigestTest.java @@ -17,6 +17,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.stream.IntStream; + import org.bouncycastle.util.Pack; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -29,6 +36,16 @@ */ public class Blake2bfMessageDigestTest { + private static final SecureRandom SECURE_RANDOM; + + static { + try { + SECURE_RANDOM = SecureRandom.getInstanceStrong(); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } + private Blake2bfMessageDigest messageDigest; // output when input is all 0 @@ -124,6 +141,39 @@ public void throwsIfEmptyBufferUpdatedLargeByteArray() { .isInstanceOf(IllegalArgumentException.class); } + @SuppressWarnings("unchecked") + @Test + public void testDigestThreadSafety() throws ExecutionException, InterruptedException { + final byte[] input = new byte[213]; + ; + SECURE_RANDOM.nextBytes(input); + int numberOfHashes = 10; + + CompletableFuture[] futures = + IntStream.range(0, numberOfHashes) + .mapToObj( + i -> + CompletableFuture.supplyAsync( + () -> { + try { + MessageDigest clonedDigest = messageDigest.clone(); + clonedDigest.update(input); + byte[] digest = clonedDigest.digest(); + return digest; + } catch (CloneNotSupportedException e) { + throw new RuntimeException(e); + } + })) + .toArray(CompletableFuture[]::new); + + CompletableFuture.allOf(futures).get(); + + byte[] expectedHash = futures[0].get(); + for (CompletableFuture future : futures) { + assertThat(expectedHash).isEqualTo(future.get()); + } + } + @ParameterizedTest @CsvFileSource(resources = "eip152TestCases.csv", numLinesToSkip = 1) public void eip152TestCases(final String hexIn, final String hexExpected) { 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 5f810d31e26..379538a14fe 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 @@ -127,6 +127,13 @@ public BlockProcessingResult processBlock( calculateExcessBlobGasForParent(protocolSpec, parentHeader))) .orElse(Wei.ZERO); + /* + * The runAsyncPreloadBlock method is specifically working with BONSAI. + * It facilitates the parallel execution of transactions in the background through an optimistic strategy. + * Being non-blocking, it permits reading and modifying a majority of slots and accounts while also + * allowing transactions to be executed optimistically. This approach preloads most accounts and slots + * into the cache, and also reducing the need to replay transactions in the absence of collisions. + */ preloadConcurrentTransactionProcessor.runAsyncPreloadBlock( worldState, blockHeader, @@ -143,6 +150,15 @@ public BlockProcessingResult processBlock( } final WorldUpdater blockUpdater = worldState.updater(); + /* + * This applyPreloadBlockResult is designed to fetch the results of transactions processed by background threads. + * If the transactions were successfully executed in the background, their results are applied to the block. + * In the absence of collisions, the entire result is applied without re-executing the transaction. + * However, in the event of a conflict, only the data we read are added to the block cache, + * and the transaction is replayed. This approach minimizes the amount of data that needs to be + * fetched from the disk. If a transaction was not processed in time in the background, + * it is executed in the usual manner. + */ TransactionProcessingResult transactionProcessingResult = preloadConcurrentTransactionProcessor .applyPreloadBlockResult(worldState, miningBeneficiary, transaction, i) @@ -176,11 +192,6 @@ public BlockProcessingResult processBlock( return new BlockProcessingResult(Optional.empty(), errorMessage); } - final var coinbase = blockUpdater.getOrCreate(miningBeneficiary); - if (transactionProcessingResult.getMiningBenef() != null) { - coinbase.incrementBalance(transactionProcessingResult.getMiningBenef()); - } - blockUpdater.commit(); currentGasUsed += transaction.getGasLimit() - transactionProcessingResult.getGasRemaining(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java index 9da83b8cd07..1fae04515cd 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java @@ -483,6 +483,12 @@ public TransactionProcessingResult processTransaction( final Wei coinbaseWeiDelta = coinbaseCalculator.price(usedGas, transactionGasPrice, blockHeader.getBaseFee()); + operationTracer.traceTransactionBeforeMiningReward( + worldUpdater, transaction, coinbaseWeiDelta); + + final var coinbase = worldState.getOrCreate(miningBeneficiary); + coinbase.incrementBalance(coinbaseWeiDelta); + operationTracer.traceEndTransaction( worldUpdater, transaction, @@ -500,15 +506,12 @@ public TransactionProcessingResult processTransaction( } if (initialFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { - TransactionProcessingResult successful = - TransactionProcessingResult.successful( - initialFrame.getLogs(), - gasUsedByTransaction, - refundedGas, - initialFrame.getOutputData(), - validationResult); - successful.setMiningBenef(coinbaseWeiDelta); - return successful; + return TransactionProcessingResult.successful( + initialFrame.getLogs(), + gasUsedByTransaction, + refundedGas, + initialFrame.getOutputData(), + validationResult); } else { if (initialFrame.getExceptionalHaltReason().isPresent()) { LOG.debug( @@ -522,14 +525,8 @@ public TransactionProcessingResult processTransaction( transaction.getHash(), initialFrame.getRevertReason().get()); } - TransactionProcessingResult failed = - TransactionProcessingResult.failed( - gasUsedByTransaction, - refundedGas, - validationResult, - initialFrame.getRevertReason()); - failed.setMiningBenef(coinbaseWeiDelta); - return failed; + return TransactionProcessingResult.failed( + gasUsedByTransaction, refundedGas, validationResult, initialFrame.getRevertReason()); } } catch (final MerkleTrieException re) { operationTracer.traceEndTransaction( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java new file mode 100644 index 00000000000..9f1458a2041 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java @@ -0,0 +1,65 @@ +/* + * 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.parallelization; + +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; + +public record ParallelizedTransactionContext( + DiffBasedWorldStateUpdateAccumulator transactionAccumulator, + TransactionProcessingResult transactionProcessingResult, + boolean isMiningBeneficiaryTouchedPreRewardByTransaction, + Wei miningBeneficiaryReward) { + + public static class Builder { + private DiffBasedWorldStateUpdateAccumulator transactionAccumulator; + private TransactionProcessingResult transactionProcessingResult; + private boolean isMiningBeneficiaryTouchedPreRewardByTransaction; + private Wei miningBeneficiaryReward; + + public Builder transactionAccumulator( + final DiffBasedWorldStateUpdateAccumulator transactionAccumulator) { + this.transactionAccumulator = transactionAccumulator; + return this; + } + + public Builder transactionProcessingResult( + final TransactionProcessingResult transactionProcessingResult) { + this.transactionProcessingResult = transactionProcessingResult; + return this; + } + + public Builder isMiningBeneficiaryTouchedPreRewardByTransaction( + final boolean isMiningBeneficiaryTouchedPreRewardByTransaction) { + this.isMiningBeneficiaryTouchedPreRewardByTransaction = + isMiningBeneficiaryTouchedPreRewardByTransaction; + return this; + } + + public Builder miningBeneficiaryReward(final Wei miningBeneficiaryReward) { + this.miningBeneficiaryReward = miningBeneficiaryReward; + return this; + } + + public ParallelizedTransactionContext build() { + return new ParallelizedTransactionContext( + transactionAccumulator, + transactionProcessingResult, + isMiningBeneficiaryTouchedPreRewardByTransaction, + miningBeneficiaryReward); + } + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java index 3bcf48ca3ce..369fef3ed03 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java @@ -23,17 +23,18 @@ import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; -import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.LazyBonsaiCachedMerkleTrieLoader; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; import org.hyperledger.besu.evm.operation.BlockHashOperation; import org.hyperledger.besu.evm.tracing.OperationTracer; -import org.hyperledger.besu.evm.worldstate.WorldUpdater; +import org.hyperledger.besu.evm.worldstate.WorldView; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -46,6 +47,9 @@ public class PreloadConcurrentTransactionProcessor { private final TransactionCollisionDetector transactionCollisionDetector; + private final Map parallelizedTransactionContextByLocation = + new ConcurrentHashMap<>(); + int confirmedParallelizedTransaction = 0; int conflictingButCachedTransaction = 0; @@ -71,24 +75,59 @@ public void runAsyncPreloadBlock( CompletableFuture.runAsync( () -> { DiffBasedWorldState roundWorldState = - new BonsaiWorldState( - (BonsaiWorldState) worldState, new LazyBonsaiCachedMerkleTrieLoader()); - WorldUpdater roundWorldStateUpdater = roundWorldState.updater(); + new BonsaiWorldState((BonsaiWorldState) worldState); + + final ParallelizedTransactionContext.Builder contextBuilder = + new ParallelizedTransactionContext.Builder(); + final DiffBasedWorldStateUpdateAccumulator roundWorldStateUpdater = + (DiffBasedWorldStateUpdateAccumulator) roundWorldState.updater(); final TransactionProcessingResult result = transactionProcessor.processTransaction( roundWorldStateUpdater, blockHeader, transaction, miningBeneficiary, - OperationTracer.NO_TRACING, + new OperationTracer() { + @Override + public void traceTransactionBeforeMiningReward( + final WorldView worldView, + final org.hyperledger.besu.datatypes.Transaction tx, + final Wei miningReward) { + if (transactionCollisionDetector + .getAddressesTouchedByTransaction( + transaction, Optional.of(roundWorldStateUpdater)) + .contains(miningBeneficiary)) { + contextBuilder.isMiningBeneficiaryTouchedPreRewardByTransaction(true); + } + contextBuilder.miningBeneficiaryReward(miningReward); + } + }, blockHashLookup, true, TransactionValidationParams.processingBlock(), privateMetadataUpdater, blobGasPrice); + + // commit the accumulator roundWorldState.getAccumulator().commit(); - transactionCollisionDetector.saveParallelizedTransactionProcessingResult( - transactionIndex, roundWorldState.getAccumulator(), result); + + contextBuilder + .transactionAccumulator(roundWorldState.getAccumulator()) + .transactionProcessingResult(result); + + final ParallelizedTransactionContext parallelizedTransactionContext = + contextBuilder.build(); + if (!parallelizedTransactionContext + .isMiningBeneficiaryTouchedPreRewardByTransaction()) { + /* + *If the address of the mining beneficiary has been touched only for adding rewards, + *we remove it from the accumulator to avoid a false positive collision. + * The balance will be increased during the sequential processing. + */ + roundWorldStateUpdater.getAccountsToUpdate().remove(miningBeneficiary); + } + parallelizedTransactionContextByLocation.put( + transactionIndex, parallelizedTransactionContext); }, executor); } @@ -100,29 +139,34 @@ public Optional applyPreloadBlockResult( final Transaction transaction, final long transactionIndex) { final DiffBasedWorldState diffBasedWorldState = (DiffBasedWorldState) worldState; - final DiffBasedWorldStateUpdateAccumulator diffBasedWorldStateUpdateAccumulator = + final DiffBasedWorldStateUpdateAccumulator blockAccumulator = (DiffBasedWorldStateUpdateAccumulator) diffBasedWorldState.updater(); - final Optional maybeTransactionProcessingResult; - final DiffBasedWorldStateUpdateAccumulator transactionAccumulator = - transactionCollisionDetector.getAccumulatorByTransaction().get(transactionIndex); - if (transactionAccumulator != null - && !transactionCollisionDetector.checkConflicts( - miningBeneficiary, - transaction, - transactionAccumulator, - diffBasedWorldStateUpdateAccumulator)) { - diffBasedWorldStateUpdateAccumulator.cloneFromUpdaterWithPreloader(transactionAccumulator); - maybeTransactionProcessingResult = - Optional.of(transactionCollisionDetector.getResultByTransaction().get(transactionIndex)); - confirmedParallelizedTransaction++; - } else { - if (transactionAccumulator != null) { - diffBasedWorldStateUpdateAccumulator.clonePriorFromUpdater(transactionAccumulator); + final ParallelizedTransactionContext parallelizedTransactionContext = + parallelizedTransactionContextByLocation.get(transactionIndex); + if (parallelizedTransactionContext != null) { + final DiffBasedWorldStateUpdateAccumulator transactionAccumulator = + parallelizedTransactionContext.transactionAccumulator(); + final TransactionProcessingResult transactionProcessingResult = + parallelizedTransactionContext.transactionProcessingResult(); + final boolean hasCollision = + transactionCollisionDetector.hasCollision( + transaction, miningBeneficiary, parallelizedTransactionContext, blockAccumulator); + if (transactionProcessingResult.isSuccessful() && !hasCollision) { + blockAccumulator + .getOrCreate(miningBeneficiary) + .incrementBalance(parallelizedTransactionContext.miningBeneficiaryReward()); + + blockAccumulator.cloneFromUpdaterWithPreloader(transactionAccumulator); + + confirmedParallelizedTransaction++; + return Optional.of(transactionProcessingResult); + } else { + blockAccumulator.clonePriorFromUpdater(transactionAccumulator); conflictingButCachedTransaction++; + return Optional.empty(); } - maybeTransactionProcessingResult = Optional.empty(); } - return maybeTransactionProcessingResult; + return Optional.empty(); } public int getConfirmedParallelizedTransaction() { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java index 578c6a6519a..7735378bfc2 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java @@ -16,39 +16,23 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.ethereum.core.Transaction; -import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; import java.util.HashSet; -import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; public class TransactionCollisionDetector { - private final Map> - accumulatorByParallelizedTransaction = new ConcurrentHashMap<>(); - - private final Map resultByParallelizedTransaction = - new ConcurrentHashMap<>(); - - public void saveParallelizedTransactionProcessingResult( - final long transactionIndex, - final DiffBasedWorldStateUpdateAccumulator accumulator, - final TransactionProcessingResult result) { - accumulatorByParallelizedTransaction.put(transactionIndex, accumulator); - resultByParallelizedTransaction.put(transactionIndex, result); - } - - public boolean checkConflicts( - final Address producer, + public boolean hasCollision( final Transaction transaction, - final DiffBasedWorldStateUpdateAccumulator trxAccumulator, + final Address miningBeneficiary, + final ParallelizedTransactionContext parallelizedTransactionContext, final DiffBasedWorldStateUpdateAccumulator blockAccumulator) { final Set

addressesTouchedByTransaction = - getAddressesTouchedByTransaction(transaction, Optional.of(trxAccumulator)); - if (addressesTouchedByTransaction.contains(producer)) { + getAddressesTouchedByTransaction( + transaction, Optional.of(parallelizedTransactionContext.transactionAccumulator())); + if (addressesTouchedByTransaction.contains(miningBeneficiary)) { return true; } final Set
addressesTouchedByBlock = @@ -58,7 +42,7 @@ public boolean checkConflicts( return !commonAddresses.isEmpty(); } - private Set
getAddressesTouchedByTransaction( + public Set
getAddressesTouchedByTransaction( final Transaction transaction, final Optional> accumulator) { HashSet
addresses = new HashSet<>(); @@ -93,12 +77,4 @@ private Set
getAddressesTouchedByBlock( }); return addresses; } - - public Map> getAccumulatorByTransaction() { - return accumulatorByParallelizedTransaction; - } - - public Map getResultByTransaction() { - return resultByParallelizedTransaction; - } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/processing/TransactionProcessingResult.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/processing/TransactionProcessingResult.java index 06628315e87..eca28927bdd 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/processing/TransactionProcessingResult.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/processing/TransactionProcessingResult.java @@ -14,7 +14,6 @@ */ package org.hyperledger.besu.ethereum.processing; -import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.mainnet.ValidationResult; import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason; import org.hyperledger.besu.evm.log.Log; @@ -50,8 +49,6 @@ public enum Status { private final Bytes output; - private Wei miningBenef; - private final ValidationResult validationResult; private final Optional revertReason; @@ -109,14 +106,6 @@ public TransactionProcessingResult( this.revertReason = revertReason; } - public void setMiningBenef(final Wei miningBenef) { - this.miningBenef = miningBenef; - } - - public Wei getMiningBenef() { - return miningBenef; - } - /** * Return the logs produced by the transaction. * diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index 76974bebd09..2fdb75554dd 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -88,12 +88,10 @@ public BonsaiWorldState( diffBasedWorldStateConfig); } - public BonsaiWorldState( - final BonsaiWorldState worldState, - final BonsaiCachedMerkleTrieLoader bonsaiCachedMerkleTrieLoader) { + public BonsaiWorldState(final BonsaiWorldState worldState) { this( new BonsaiWorldStateLayerStorage(worldState.getWorldStateStorage()), - bonsaiCachedMerkleTrieLoader, + worldState.bonsaiCachedMerkleTrieLoader, worldState.cachedWorldStorageManager, worldState.trieLogManager, worldState.accumulator.getEvmConfiguration(), diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index b8992bbfb3f..00caa247294 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -104,7 +104,6 @@ public void cloneFromUpdater(final DiffBasedWorldStateUpdateAccumulator @SuppressWarnings("UseBulkOperation") public void cloneFromUpdaterWithPreloader( final DiffBasedWorldStateUpdateAccumulator source) { - source .getAccountsToUpdate() .forEach( diff --git a/evm/src/main/java/org/hyperledger/besu/evm/tracing/OperationTracer.java b/evm/src/main/java/org/hyperledger/besu/evm/tracing/OperationTracer.java index 34e28bbb32f..a656fc30e00 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/tracing/OperationTracer.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/tracing/OperationTracer.java @@ -16,6 +16,7 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Transaction; +import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.log.Log; @@ -85,6 +86,17 @@ default void tracePrepareTransaction(final WorldView worldView, final Transactio */ default void traceStartTransaction(final WorldView worldView, final Transaction transaction) {} + /** + * Trace the end of a transaction just before mining reward. + * + * @param worldView an immutable view of the execution context + * @param tx the transaction that just concluded + * @param miningReward the reward that the mining beneficiary will receive. + */ + default void traceTransactionBeforeMiningReward( + final WorldView worldView, final Transaction tx, final Wei miningReward) {} + ; + /** * Trace the end of a transaction. * From a03843fabfc8fa2d84664df4e2f7fcfc0a93beff Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Fri, 5 Jul 2024 16:02:09 +0200 Subject: [PATCH 15/35] use int and not long for context map Signed-off-by: Karim Taam --- .../PreloadConcurrentTransactionProcessor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java index 369fef3ed03..e124f496865 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java @@ -47,8 +47,8 @@ public class PreloadConcurrentTransactionProcessor { private final TransactionCollisionDetector transactionCollisionDetector; - private final Map parallelizedTransactionContextByLocation = - new ConcurrentHashMap<>(); + private final Map + parallelizedTransactionContextByLocation = new ConcurrentHashMap<>(); int confirmedParallelizedTransaction = 0; int conflictingButCachedTransaction = 0; @@ -71,7 +71,7 @@ public void runAsyncPreloadBlock( conflictingButCachedTransaction = 0; for (int i = 0; i < transactions.size(); i++) { final Transaction transaction = transactions.get(i); - final long transactionIndex = i; + final int transactionIndex = i; CompletableFuture.runAsync( () -> { DiffBasedWorldState roundWorldState = @@ -137,7 +137,7 @@ public Optional applyPreloadBlockResult( final MutableWorldState worldState, final Address miningBeneficiary, final Transaction transaction, - final long transactionIndex) { + final int transactionIndex) { final DiffBasedWorldState diffBasedWorldState = (DiffBasedWorldState) worldState; final DiffBasedWorldStateUpdateAccumulator blockAccumulator = (DiffBasedWorldStateUpdateAccumulator) diffBasedWorldState.updater(); From f1e7dfcb494c861bb9549e1eef6d13ad649e2032 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Fri, 5 Jul 2024 16:35:33 +0200 Subject: [PATCH 16/35] add javadoc and comment Signed-off-by: Karim Taam --- .../besu/ethereum/core/BlockHeader.java | 2 - ...PreloadConcurrentTransactionProcessor.java | 74 +++++++++++++++++-- .../TransactionCollisionDetector.java | 28 +++++++ .../LazyBonsaiCachedMerkleTrieLoader.java | 40 ---------- .../bonsai/worldview/BonsaiWorldState.java | 2 - 5 files changed, 95 insertions(+), 51 deletions(-) delete mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java 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 f9406343b33..46d2f0847a3 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 @@ -146,7 +146,6 @@ public void writeTo(final RLPOutput out) { out.writeBytes(parentHash); out.writeBytes(ommersHash); out.writeBytes(coinbase); - out.writeBytes(stateRoot); out.writeBytes(transactionsRoot); out.writeBytes(receiptsRoot); @@ -175,7 +174,6 @@ public void writeTo(final RLPOutput out) { if (requestsRoot != null) { out.writeBytes(requestsRoot); } - out.endList(); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java index e124f496865..ffbb921aea5 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java @@ -38,6 +38,12 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; +/** + * Optimizes transaction processing by executing transactions in parallel within a given block. + * Transactions are executed optimistically in a non-blocking manner. After execution, the class + * checks for potential conflicts among transactions to ensure data integrity before applying the + * results to the world state. + */ @SuppressWarnings({"unchecked", "rawtypes", "unused"}) public class PreloadConcurrentTransactionProcessor { @@ -53,12 +59,34 @@ public class PreloadConcurrentTransactionProcessor { int confirmedParallelizedTransaction = 0; int conflictingButCachedTransaction = 0; + /** + * Constructs a PreloadConcurrentTransactionProcessor with a specified transaction processor. This + * processor is responsible for the individual processing of transactions. + * + * @param transactionProcessor The transaction processor for processing individual transactions. + */ public PreloadConcurrentTransactionProcessor( final MainnetTransactionProcessor transactionProcessor) { this.transactionProcessor = transactionProcessor; this.transactionCollisionDetector = new TransactionCollisionDetector(); } + /** + * Initiates the parallel and optimistic execution of transactions within a block by creating a + * copy of the world state for each transaction. This method processes transactions in a + * non-blocking manner. Transactions are executed against their respective copies of the world + * state, ensuring that the original world state passed as a parameter remains unmodified during + * this process. + * + * @param worldState Mutable world state intended for applying transaction results. This world + * state is not modified directly; instead, copies are made for transaction execution. + * @param blockHeader Header of the current block containing the transactions. + * @param transactions List of transactions to be processed. + * @param miningBeneficiary Address of the beneficiary to receive mining rewards. + * @param blockHashLookup Function for block hash lookup. + * @param blobGasPrice Gas price for blob transactions. + * @param privateMetadataUpdater Updater for private transaction metadata. + */ public void runAsyncPreloadBlock( final MutableWorldState worldState, final BlockHeader blockHeader, @@ -71,7 +99,10 @@ public void runAsyncPreloadBlock( conflictingButCachedTransaction = 0; for (int i = 0; i < transactions.size(); i++) { final Transaction transaction = transactions.get(i); - final int transactionIndex = i; + final int transactionLocation = i; + /* + * All transactions are executed in the background by copying the world state of the block on which the transactions need to be executed, ensuring that each one has its own accumulator. + */ CompletableFuture.runAsync( () -> { DiffBasedWorldState roundWorldState = @@ -93,6 +124,12 @@ public void traceTransactionBeforeMiningReward( final WorldView worldView, final org.hyperledger.besu.datatypes.Transaction tx, final Wei miningReward) { + /* + * This part checks if the mining beneficiary's account was accessed before increasing its balance for rewards. + * Indeed, if the transaction has interacted with the address to read or modify it, + * it means that the value is necessary for the proper execution of the transaction and will therefore be considered in collision detection. + * If this is not the case, we can ignore this address during conflict detection. + */ if (transactionCollisionDetector .getAddressesTouchedByTransaction( transaction, Optional.of(roundWorldStateUpdater)) @@ -108,7 +145,7 @@ public void traceTransactionBeforeMiningReward( privateMetadataUpdater, blobGasPrice); - // commit the accumulator + // commit the accumulator in order to apply all the modifications roundWorldState.getAccumulator().commit(); contextBuilder @@ -120,29 +157,50 @@ public void traceTransactionBeforeMiningReward( if (!parallelizedTransactionContext .isMiningBeneficiaryTouchedPreRewardByTransaction()) { /* - *If the address of the mining beneficiary has been touched only for adding rewards, - *we remove it from the accumulator to avoid a false positive collision. + * If the address of the mining beneficiary has been touched only for adding rewards, + * we remove it from the accumulator to avoid a false positive collision. * The balance will be increased during the sequential processing. */ roundWorldStateUpdater.getAccountsToUpdate().remove(miningBeneficiary); } parallelizedTransactionContextByLocation.put( - transactionIndex, parallelizedTransactionContext); + transactionLocation, parallelizedTransactionContext); }, executor); } } + /** + * Applies the results of preloaded transactions to the world state after checking for conflicts. + * + *

If a transaction was executed optimistically without any detected conflicts, its result is + * directly applied to the world state. If there is a conflict, this method does not apply the + * transaction's modifications directly to the world state. Instead, it caches the data read from + * the database during the transaction's execution. This cached data is then used to optimize the + * replay of the transaction by reducing the need for additional reads from the disk, thereby + * making the replay process faster. This approach ensures that the integrity of the world state + * is maintained while optimizing the performance of transaction processing. + * + * @param worldState Mutable world state intended for applying transaction results. + * @param miningBeneficiary Address of the beneficiary for mining rewards. + * @param transaction Transaction for which the result is to be applied. + * @param transactionLocation Index of the transaction within the block. + * @return Optional containing the transaction processing result if applied, or empty if the + * transaction needs to be replayed due to a conflict. + */ public Optional applyPreloadBlockResult( final MutableWorldState worldState, final Address miningBeneficiary, final Transaction transaction, - final int transactionIndex) { + final int transactionLocation) { final DiffBasedWorldState diffBasedWorldState = (DiffBasedWorldState) worldState; final DiffBasedWorldStateUpdateAccumulator blockAccumulator = (DiffBasedWorldStateUpdateAccumulator) diffBasedWorldState.updater(); final ParallelizedTransactionContext parallelizedTransactionContext = - parallelizedTransactionContextByLocation.get(transactionIndex); + parallelizedTransactionContextByLocation.get(transactionLocation); + /* + * If `parallelizedTransactionContext` is not null, it means that the transaction had time to complete in the background. + */ if (parallelizedTransactionContext != null) { final DiffBasedWorldStateUpdateAccumulator transactionAccumulator = parallelizedTransactionContext.transactionAccumulator(); @@ -163,6 +221,8 @@ public Optional applyPreloadBlockResult( } else { blockAccumulator.clonePriorFromUpdater(transactionAccumulator); conflictingButCachedTransaction++; + // If there is a conflict, we return an empty result to signal the block processor to + // re-execute the transaction. return Optional.empty(); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java index 7735378bfc2..04d984b3756 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetector.java @@ -24,6 +24,18 @@ public class TransactionCollisionDetector { + /** + * Determines if a transaction has a collision based on the addresses it touches. A collision + * occurs if the transaction touches the mining beneficiary address or if there are common + * addresses touched by both the transaction and other transactions within the same block. + * + * @param transaction The transaction to check for collisions. + * @param miningBeneficiary The address of the mining beneficiary. + * @param parallelizedTransactionContext The context containing the accumulator for the + * transaction. + * @param blockAccumulator The accumulator for the block. + * @return true if there is a collision; false otherwise. + */ public boolean hasCollision( final Transaction transaction, final Address miningBeneficiary, @@ -42,6 +54,15 @@ public boolean hasCollision( return !commonAddresses.isEmpty(); } + /** + * Retrieves the set of addresses that were touched by a transaction. This includes the sender and + * recipient of the transaction, as well as any addresses that were read from or written to by the + * transaction's execution. + * + * @param transaction The transaction to analyze. + * @param accumulator An optional accumulator containing state changes made by the transaction. + * @return A set of addresses touched by the transaction. + */ public Set

getAddressesTouchedByTransaction( final Transaction transaction, final Optional> accumulator) { @@ -60,6 +81,13 @@ public Set
getAddressesTouchedByTransaction( return addresses; } + /** + * Retrieves the set of addresses that were touched by all transactions within a block. This + * method filters out addresses that were only read and not modified. + * + * @param accumulator An optional accumulator containing state changes made by the block. + * @return A set of addresses that were modified by the block's transactions. + */ private Set
getAddressesTouchedByBlock( final Optional> accumulator) { HashSet
addresses = new HashSet<>(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java deleted file mode 100644 index 44a5f82bc54..00000000000 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java +++ /dev/null @@ -1,40 +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.trie.diffbased.bonsai.cache; - -import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.datatypes.Hash; -import org.hyperledger.besu.datatypes.StorageSlotKey; -import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; -import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; - -public class LazyBonsaiCachedMerkleTrieLoader extends BonsaiCachedMerkleTrieLoader { - - public LazyBonsaiCachedMerkleTrieLoader() { - super(new NoOpMetricsSystem()); - } - - @Override - public void preLoadAccount( - final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, - final Hash worldStateRootHash, - final Address account) {} - - @Override - public void preLoadStorageSlot( - final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, - final Address account, - final StorageSlotKey slotKey) {} -} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index 2fdb75554dd..7fb58f07bae 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -153,13 +153,11 @@ private Hash internalCalculateRootHash( // that we can get the storage state hash Stream>>> storageStream = worldStateUpdater.getStorageToUpdate().entrySet().stream(); - if (maybeStateUpdater.isEmpty()) { storageStream = storageStream .parallel(); // if we are not updating the state updater we can use parallel stream } - storageStream.forEach( addressMapEntry -> updateAccountStorageState(maybeStateUpdater, worldStateUpdater, addressMapEntry)); From 3a35a1ab12ab6c75d97ec3161224f4e3feae0adc Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Fri, 5 Jul 2024 17:35:52 +0200 Subject: [PATCH 17/35] revert preload during background processing and remove map initial capacity Signed-off-by: Karim Taam --- ...PreloadConcurrentTransactionProcessor.java | 4 +- .../LazyBonsaiCachedMerkleTrieLoader.java | 40 +++++++++++++++++++ .../bonsai/worldview/BonsaiWorldState.java | 6 ++- .../DiffBasedWorldStateUpdateAccumulator.java | 23 +++++------ 4 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java index ffbb921aea5..2cd5c14fffe 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.LazyBonsaiCachedMerkleTrieLoader; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; @@ -106,7 +107,8 @@ public void runAsyncPreloadBlock( CompletableFuture.runAsync( () -> { DiffBasedWorldState roundWorldState = - new BonsaiWorldState((BonsaiWorldState) worldState); + new BonsaiWorldState( + (BonsaiWorldState) worldState, new LazyBonsaiCachedMerkleTrieLoader()); final ParallelizedTransactionContext.Builder contextBuilder = new ParallelizedTransactionContext.Builder(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java new file mode 100644 index 00000000000..44a5f82bc54 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java @@ -0,0 +1,40 @@ +/* + * 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.trie.diffbased.bonsai.cache; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.StorageSlotKey; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; + +public class LazyBonsaiCachedMerkleTrieLoader extends BonsaiCachedMerkleTrieLoader { + + public LazyBonsaiCachedMerkleTrieLoader() { + super(new NoOpMetricsSystem()); + } + + @Override + public void preLoadAccount( + final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, + final Hash worldStateRootHash, + final Address account) {} + + @Override + public void preLoadStorageSlot( + final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, + final Address account, + final StorageSlotKey slotKey) {} +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index 7fb58f07bae..c54fe50793c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -88,10 +88,12 @@ public BonsaiWorldState( diffBasedWorldStateConfig); } - public BonsaiWorldState(final BonsaiWorldState worldState) { + public BonsaiWorldState( + final BonsaiWorldState worldState, + final BonsaiCachedMerkleTrieLoader cachedMerkleTrieLoader) { this( new BonsaiWorldStateLayerStorage(worldState.getWorldStateStorage()), - worldState.bonsaiCachedMerkleTrieLoader, + cachedMerkleTrieLoader, worldState.cachedWorldStorageManager, worldState.trieLogManager, worldState.accumulator.getEvmConfiguration(), diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index 00caa247294..0e5e2b4e2fe 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -72,9 +72,9 @@ public abstract class DiffBasedWorldStateUpdateAccumulator>> - storageToUpdate = new ConcurrentHashMap<>(1000); + storageToUpdate = new ConcurrentHashMap<>(); - private final Map storageKeyHashLookup = new ConcurrentHashMap<>(1000); + private final Map storageKeyHashLookup = new ConcurrentHashMap<>(); protected boolean isAccumulatorStateChanged; public DiffBasedWorldStateUpdateAccumulator( @@ -83,8 +83,7 @@ public DiffBasedWorldStateUpdateAccumulator( final Consumer storagePreloader, final EvmConfiguration evmConfiguration) { super(world, evmConfiguration); - this.accountsToUpdate = - new AccountConsumingMap<>(new ConcurrentHashMap<>(1000), accountPreloader); + this.accountsToUpdate = new AccountConsumingMap<>(new ConcurrentHashMap<>(), accountPreloader); this.accountPreloader = accountPreloader; this.storagePreloader = storagePreloader; this.isAccumulatorStateChanged = false; @@ -135,7 +134,7 @@ public void cloneFromUpdaterWithPreloader( address, k -> new StorageConsumingMap<>( - address, new ConcurrentHashMap<>(100), storagePreloader)); + address, new ConcurrentHashMap<>(), storagePreloader)); slots.forEach( (storageSlotKey, uInt256DiffBasedValue) -> { storageConsumingMap.put( @@ -182,7 +181,7 @@ public void clonePriorFromUpdater(final DiffBasedWorldStateUpdateAccumulator new StorageConsumingMap<>( - address, new ConcurrentHashMap<>(100), storagePreloader)); + address, new ConcurrentHashMap<>(), storagePreloader)); slots.forEach( (storageSlotKey, uInt256DiffBasedValue) -> { storageConsumingMap.putIfAbsent( @@ -356,7 +355,7 @@ public void commit() { deletedAddress, k -> new StorageConsumingMap<>( - deletedAddress, new ConcurrentHashMap<>(100), storagePreloader)); + deletedAddress, new ConcurrentHashMap<>(), storagePreloader)); final Iterator>> iter = deletedStorageUpdates.entrySet().iterator(); while (iter.hasNext()) { @@ -403,7 +402,7 @@ public void commit() { updatedAddress, k -> new StorageConsumingMap<>( - updatedAddress, new ConcurrentHashMap<>(100), storagePreloader)); + updatedAddress, new ConcurrentHashMap<>(), storagePreloader)); if (tracked.getWrappedAccount() == null) { updatedAccount = createAccount(this, tracked); @@ -528,8 +527,7 @@ public Optional getStorageValueByStorageSlotKey( .computeIfAbsent( address, key -> - new StorageConsumingMap<>( - address, new ConcurrentHashMap<>(100), storagePreloader)) + new StorageConsumingMap<>(address, new ConcurrentHashMap<>(), storagePreloader)) .put( storageSlotKey, new DiffBasedValue<>(valueUInt.orElse(null), valueUInt.orElse(null))); return valueUInt; @@ -753,7 +751,7 @@ private Map> maybeCreateStorageMap( final Map> storageMap, final Address address) { if (storageMap == null) { final StorageConsumingMap> newMap = - new StorageConsumingMap<>(address, new ConcurrentHashMap<>(100), storagePreloader); + new StorageConsumingMap<>(address, new ConcurrentHashMap<>(), storagePreloader); storageToUpdate.put(address, newMap); return newMap; } else { @@ -785,8 +783,7 @@ private void rollStorageChange( .computeIfAbsent( address, k -> - new StorageConsumingMap<>( - address, new ConcurrentHashMap<>(100), storagePreloader)) + new StorageConsumingMap<>(address, new ConcurrentHashMap<>(), storagePreloader)) .put(storageSlotKey, slotValue); } } From b937582481500159fc93ca9df32b7f592abdda25 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Tue, 9 Jul 2024 12:52:22 +0200 Subject: [PATCH 18/35] Set the executor size to the numbers of CPU threads Signed-off-by: Ameziane H --- .../parallelization/PreloadConcurrentTransactionProcessor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java index 2cd5c14fffe..f5da329e1ac 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java @@ -48,7 +48,8 @@ @SuppressWarnings({"unchecked", "rawtypes", "unused"}) public class PreloadConcurrentTransactionProcessor { - private static final Executor executor = Executors.newFixedThreadPool(4); + private static final int NCPU = Runtime.getRuntime().availableProcessors(); + private static final Executor executor = Executors.newFixedThreadPool(NCPU); private final MainnetTransactionProcessor transactionProcessor; From a50dc04eccbfb51d03ba1363e7a3321e78ab6a7c Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Tue, 9 Jul 2024 17:24:06 +0200 Subject: [PATCH 19/35] add flag and tests Signed-off-by: Karim Taam --- .../org/hyperledger/besu/cli/BesuCommand.java | 1 + .../options/stable/DataStorageOptions.java | 81 +++-- .../controller/BesuControllerBuilder.java | 8 + .../CliqueBesuControllerBuilder.java | 3 +- .../controller/IbftBesuControllerBuilder.java | 3 +- .../MainnetBesuControllerBuilder.java | 3 +- .../MergeBesuControllerBuilder.java | 3 +- .../controller/QbftBesuControllerBuilder.java | 3 +- .../besu/cli/CommandTestAbstract.java | 1 + .../clique/CliqueProtocolSchedule.java | 12 +- .../bft/BaseBftProtocolScheduleBuilder.java | 6 +- .../ibft/support/TestContextBuilder.java | 2 +- .../ibft/IbftProtocolScheduleBuilder.java | 12 +- .../merge/MergeProtocolSchedule.java | 12 +- .../merge/TransitionProtocolSchedule.java | 12 +- .../qbft/support/TestContextBuilder.java | 2 +- .../qbft/QbftProtocolScheduleBuilder.java | 18 +- .../api/jsonrpc/BlockchainImporter.java | 2 +- .../methods/ExecutionEngineJsonRpcMethod.java | 1 + .../flat/RewardTraceGeneratorTest.java | 2 + .../AbstractBlockTransactionSelectorTest.java | 3 +- .../FixedDifficultyProtocolSchedule.java | 18 +- .../mainnet/AbstractBlockProcessor.java | 75 +++-- .../mainnet/ClassicBlockProcessor.java | 2 + .../mainnet/ClassicProtocolSpecs.java | 95 ++++-- .../mainnet/MainnetBlockProcessor.java | 2 + .../mainnet/MainnetProtocolSchedule.java | 27 +- .../mainnet/MainnetProtocolSpecFactory.java | 162 ++++++++-- .../mainnet/MainnetProtocolSpecs.java | 170 +++++++--- .../mainnet/ProtocolScheduleBuilder.java | 24 +- .../besu/ethereum/mainnet/ProtocolSpec.java | 9 + .../ethereum/mainnet/ProtocolSpecBuilder.java | 12 + ...elizedConcurrentTransactionProcessor.java} | 151 +++++---- .../worldstate/DataStorageConfiguration.java | 8 + .../ethereum/core/BlockchainSetupUtil.java | 3 +- .../core/ExecutionContextTestFixture.java | 3 +- .../core/ProtocolScheduleFixture.java | 3 +- .../BlockImportExceptionHandlingTest.java | 1 + .../fixed/FixedProtocolScheduleTest.java | 3 +- .../mainnet/AbstractBlockProcessorTest.java | 3 + .../mainnet/DefaultProtocolScheduleTest.java | 3 +- .../mainnet/MainnetBlockProcessorTest.java | 2 + .../mainnet/MainnetProtocolScheduleTest.java | 9 +- .../mainnet/ProtocolScheduleBuilderTest.java | 6 +- .../TransactionCollisionDetectorTest.java | 294 ++++++++++++++++++ .../bonsai/AbstractIsolationTests.java | 3 +- .../ReferenceTestProtocolSchedules.java | 3 +- .../NoRewardProtocolScheduleWrapper.java | 2 + .../ethereum/retesteth/RetestethContext.java | 6 +- 49 files changed, 984 insertions(+), 305 deletions(-) rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/{PreloadConcurrentTransactionProcessor.java => ParallelizedConcurrentTransactionProcessor.java} (69%) create mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetectorTest.java diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 12752f2e9a1..3e0c801ff36 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -1905,6 +1905,7 @@ public BesuControllerBuilder getControllerBuilder() { .pkiBlockCreationConfiguration(maybePkiBlockCreationConfiguration()) .clock(Clock.systemUTC()) .isRevertReasonEnabled(isRevertReasonEnabled) + .isParallelPreloadTxEnabled(dataStorageConfiguration.getUnstable().isParallelPreloadTxEnabled()) .storageProvider(storageProvider) .gasLimitCalculator( miningParametersSupplier.get().getTargetGasLimit().isPresent() diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java index d1cb4f721b2..4490880f56c 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java @@ -122,6 +122,15 @@ public static class Unstable { "Enables code storage using code hash instead of by account hash. (default: ${DEFAULT-VALUE})") private boolean bonsaiCodeUsingCodeHashEnabled = DEFAULT_BONSAI_CODE_USING_CODE_HASH_ENABLED; + @CommandLine.Option( + hidden = true, + names = {"--Xbonsai-parallel-preload-tx-enabled"}, + arity = "1", + description = + "Enables parallel preloading of transactions to optimize processing speed by concurrently loading and executing necessary data in advance. (default: ${DEFAULT-VALUE})") + private Boolean isParallelPreloadTxEnabled = false; + + /** Default Constructor. */ Unstable() {} } @@ -142,40 +151,48 @@ public static DataStorageOptions create() { * @param syncMode the sync mode */ public void validate(final CommandLine commandLine, final SyncMode syncMode) { - if (DataStorageFormat.BONSAI == dataStorageFormat && bonsaiLimitTrieLogsEnabled) { - if (SyncMode.FULL == syncMode) { - throw new CommandLine.ParameterException( - commandLine, - String.format( - "Cannot enable " + BONSAI_LIMIT_TRIE_LOGS_ENABLED + " with sync-mode %s", - syncMode)); + if (DataStorageFormat.BONSAI == dataStorageFormat) { + if(bonsaiLimitTrieLogsEnabled) { + if (SyncMode.FULL == syncMode) { + throw new CommandLine.ParameterException( + commandLine, + String.format( + "Cannot enable " + BONSAI_LIMIT_TRIE_LOGS_ENABLED + " with sync-mode %s", + syncMode)); + } + if (bonsaiMaxLayersToLoad < MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT) { + throw new CommandLine.ParameterException( + commandLine, + String.format( + BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD + " minimum value is %d", + MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT)); + } + if (bonsaiTrieLogPruningWindowSize <= 0) { + throw new CommandLine.ParameterException( + commandLine, + String.format( + BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE + "=%d must be greater than 0", + bonsaiTrieLogPruningWindowSize)); + } + if (bonsaiTrieLogPruningWindowSize <= bonsaiMaxLayersToLoad) { + throw new CommandLine.ParameterException( + commandLine, + String.format( + BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE + + "=%d must be greater than " + + BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD + + "=%d", + bonsaiTrieLogPruningWindowSize, + bonsaiMaxLayersToLoad)); + } } - if (bonsaiMaxLayersToLoad < MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT) { - throw new CommandLine.ParameterException( - commandLine, - String.format( - BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD + " minimum value is %d", - MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT)); - } - if (bonsaiTrieLogPruningWindowSize <= 0) { - throw new CommandLine.ParameterException( - commandLine, - String.format( - BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE + "=%d must be greater than 0", - bonsaiTrieLogPruningWindowSize)); - } - if (bonsaiTrieLogPruningWindowSize <= bonsaiMaxLayersToLoad) { - throw new CommandLine.ParameterException( - commandLine, - String.format( - BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE - + "=%d must be greater than " - + BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD - + "=%d", - bonsaiTrieLogPruningWindowSize, - bonsaiMaxLayersToLoad)); + } else { + if(unstableOptions.isParallelPreloadTxEnabled){ + throw new CommandLine.ParameterException(commandLine, + "Transaction parallelization is not supported unless operating in a 'diffbased' mode, such as Bonsai."); } } + } /** @@ -196,6 +213,8 @@ public static DataStorageOptions fromConfig(final DataStorageConfiguration domai domainObject.getUnstable().getBonsaiFullFlatDbEnabled(); dataStorageOptions.unstableOptions.bonsaiCodeUsingCodeHashEnabled = domainObject.getUnstable().getBonsaiCodeStoredByCodeHashEnabled(); + dataStorageOptions.unstableOptions.isParallelPreloadTxEnabled = + domainObject.getUnstable().isParallelPreloadTxEnabled(); return dataStorageOptions; } diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java index ac0fa25fd30..11bfaf9aa5b 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -208,6 +208,8 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides private int numberOfBlocksToCache = 0; + protected boolean isParallelPreloadTxEnabled; + /** Instantiates a new Besu controller builder. */ protected BesuControllerBuilder() {} @@ -529,6 +531,12 @@ public BesuControllerBuilder randomPeerPriority(final Boolean randomPeerPriority return this; } + public BesuControllerBuilder isParallelPreloadTxEnabled( + final boolean isParallelPreloadTxEnabled) { + this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; + return this; + } + /** * Build besu controller. * diff --git a/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java index c1274240694..2b879a958d4 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java @@ -136,7 +136,8 @@ protected ProtocolSchedule createProtocolSchedule() { isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java index 473549e0bd7..a3885250c75 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java @@ -291,7 +291,8 @@ protected ProtocolSchedule createProtocolSchedule() { bftExtraDataCodec().get(), evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java index 27570483c12..8f74300747e 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java @@ -99,7 +99,8 @@ protected ProtocolSchedule createProtocolSchedule() { isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java index 1e8da674a50..b55c40779f7 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java @@ -174,7 +174,8 @@ protected ProtocolSchedule createProtocolSchedule() { privacyParameters, isRevertReasonEnabled, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java index 030173acb0b..03cc044abbb 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java @@ -335,7 +335,8 @@ protected ProtocolSchedule createProtocolSchedule() { bftExtraDataCodec().get(), evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } @Override diff --git a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java index f620c729b68..3e75b99d3d7 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java @@ -303,6 +303,7 @@ public void initMocks() throws Exception { when(mockControllerBuilder.cacheLastBlocks(any())).thenReturn(mockControllerBuilder); when(mockControllerBuilder.genesisStateHashCacheEnabled(any())) .thenReturn(mockControllerBuilder); + when(mockControllerBuilder.isParallelPreloadTxEnabled(false)).thenReturn(mockControllerBuilder); // doReturn used because of generic BesuController doReturn(mockController).when(mockControllerBuilder).build(); diff --git a/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java b/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java index 91013ab97c9..80388281e45 100644 --- a/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java +++ b/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java @@ -74,7 +74,8 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { final CliqueConfigOptions cliqueConfig = config.getCliqueConfigOptions(); @@ -110,7 +111,8 @@ public static ProtocolSchedule create( isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager) + badBlockManager, + isParallelPreloadTxEnabled) .createProtocolSchedule(); } @@ -134,7 +136,8 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return create( config, forksSchedule, @@ -143,7 +146,8 @@ public static ProtocolSchedule create( isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } private static ProtocolSpecBuilder applyCliqueSpecificModifications( diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java index da81ce80b7c..439e6c35bd2 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java @@ -68,7 +68,8 @@ public BftProtocolSchedule createProtocolSchedule( final BftExtraDataCodec bftExtraDataCodec, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { final Map> specMap = new HashMap<>(); forksSchedule @@ -90,7 +91,8 @@ public BftProtocolSchedule createProtocolSchedule( isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager) + badBlockManager, + isParallelPreloadTxEnabled) .createProtocolSchedule(); return new BftProtocolSchedule((DefaultProtocolSchedule) protocolSchedule); } diff --git a/consensus/ibft/src/integration-test/java/org/hyperledger/besu/consensus/ibft/support/TestContextBuilder.java b/consensus/ibft/src/integration-test/java/org/hyperledger/besu/consensus/ibft/support/TestContextBuilder.java index 55a2f3551a1..fcd3db92138 100644 --- a/consensus/ibft/src/integration-test/java/org/hyperledger/besu/consensus/ibft/support/TestContextBuilder.java +++ b/consensus/ibft/src/integration-test/java/org/hyperledger/besu/consensus/ibft/support/TestContextBuilder.java @@ -333,7 +333,7 @@ private static ControllerAndState createControllerAndFinalState( IBFT_EXTRA_DATA_ENCODER, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), false); ///////////////////////////////////////////////////////////////////////////////////// // From here down is BASICALLY taken from IbftBesuController diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java index 5cad697c537..0412565188d 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java @@ -56,7 +56,8 @@ public static BftProtocolSchedule create( final BftExtraDataCodec bftExtraDataCodec, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return new IbftProtocolScheduleBuilder() .createProtocolSchedule( config, @@ -66,7 +67,8 @@ public static BftProtocolSchedule create( bftExtraDataCodec, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } /** @@ -86,7 +88,8 @@ public static BftProtocolSchedule create( final BftExtraDataCodec bftExtraDataCodec, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return create( config, forksSchedule, @@ -95,7 +98,8 @@ public static BftProtocolSchedule create( bftExtraDataCodec, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } @Override diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java index ff92319ae39..a5f55b6f0b7 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java @@ -55,13 +55,15 @@ public static ProtocolSchedule create( final GenesisConfigOptions config, final boolean isRevertReasonEnabled, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return create( config, PrivacyParameters.DEFAULT, isRevertReasonEnabled, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } /** @@ -79,7 +81,8 @@ public static ProtocolSchedule create( final PrivacyParameters privacyParameters, final boolean isRevertReasonEnabled, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { Map> postMergeModifications = new HashMap<>(); @@ -98,7 +101,8 @@ public static ProtocolSchedule create( isRevertReasonEnabled, EvmConfiguration.DEFAULT, miningParameters, - badBlockManager) + badBlockManager, + isParallelPreloadTxEnabled) .createProtocolSchedule(); } diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java index faab15dac4a..43ebcfdd9db 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java @@ -70,12 +70,18 @@ public TransitionProtocolSchedule( public static TransitionProtocolSchedule fromConfig( final GenesisConfigOptions genesisConfigOptions, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { ProtocolSchedule preMergeProtocolSchedule = - MainnetProtocolSchedule.fromConfig(genesisConfigOptions, miningParameters, badBlockManager); + MainnetProtocolSchedule.fromConfig( + genesisConfigOptions, miningParameters, badBlockManager, isParallelPreloadTxEnabled); ProtocolSchedule postMergeProtocolSchedule = MergeProtocolSchedule.create( - genesisConfigOptions, false, miningParameters, badBlockManager); + genesisConfigOptions, + false, + miningParameters, + badBlockManager, + isParallelPreloadTxEnabled); return new TransitionProtocolSchedule( preMergeProtocolSchedule, postMergeProtocolSchedule, PostMergeContext.get()); } diff --git a/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java b/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java index 7a014986a24..70d3bfd47bf 100644 --- a/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java +++ b/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java @@ -438,7 +438,7 @@ private static ControllerAndState createControllerAndFinalState( BFT_EXTRA_DATA_ENCODER, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), false); final BftValidatorOverrides validatorOverrides = convertBftForks(qbftForks); final TransactionSimulator transactionSimulator = diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java index 58a50efa261..daab7da7d63 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java @@ -60,7 +60,8 @@ public static BftProtocolSchedule create( final BftExtraDataCodec bftExtraDataCodec, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return new QbftProtocolScheduleBuilder() .createProtocolSchedule( config, @@ -70,7 +71,8 @@ public static BftProtocolSchedule create( bftExtraDataCodec, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } /** @@ -90,7 +92,8 @@ public static BftProtocolSchedule create( final BftExtraDataCodec bftExtraDataCodec, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return create( config, qbftForksSchedule, @@ -99,7 +102,8 @@ public static BftProtocolSchedule create( bftExtraDataCodec, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } /** @@ -119,7 +123,8 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final BftExtraDataCodec bftExtraDataCodec, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return create( config, qbftForksSchedule, @@ -128,7 +133,8 @@ public static ProtocolSchedule create( bftExtraDataCodec, EvmConfiguration.DEFAULT, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } @Override diff --git a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/BlockchainImporter.java b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/BlockchainImporter.java index 2a62331d336..db9cc58e6b7 100644 --- a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/BlockchainImporter.java +++ b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/BlockchainImporter.java @@ -46,7 +46,7 @@ public BlockchainImporter(final URL blocksUrl, final String genesisJson) throws MainnetProtocolSchedule.fromConfig( GenesisConfigFile.fromConfig(genesisJson).getConfigOptions(), MiningParameters.newDefault(), - new BadBlockManager()); + new BadBlockManager(), false); final BlockHeaderFunctions blockHeaderFunctions = ScheduleBasedBlockHeaderFunctions.create(protocolSchedule); blocks = new ArrayList<>(); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java index 6e216d46936..f921b1cca13 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java @@ -106,6 +106,7 @@ public final JsonRpcResponse response(final JsonRpcRequestContext request) { .addArgument(this.getName()) .addArgument(t.getMessage()) .log(); + t.printStackTrace(System.out); } return new JsonRpcErrorResponse( request.getRequest().getId(), RpcErrorType.INVALID_REQUEST); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java index f8275182051..18a9ff0af4d 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java @@ -91,6 +91,7 @@ public void assertThatTraceGeneratorReturnValidRewardsForMainnetBlockProcessor() blockReward, BlockHeader::getCoinbase, true, + false, protocolSchedule); when(protocolSpec.getBlockProcessor()).thenReturn(blockProcessor); @@ -150,6 +151,7 @@ public void assertThatTraceGeneratorReturnValidRewardsForClassicBlockProcessor() blockReward, BlockHeader::getCoinbase, true, + false, eraRounds, protocolSchedule); when(protocolSpec.getBlockProcessor()).thenReturn(blockProcessor); diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java index d70589ae832..6fc263c3265 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java @@ -223,7 +223,8 @@ public void emptyPendingTransactionsResultsInEmptyVettingResult() { GenesisConfigFile.fromResource("/dev.json").getConfigOptions(), EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); final MainnetTransactionProcessor mainnetTransactionProcessor = protocolSchedule.getByBlockHeader(blockHeader(0)).getTransactionProcessor(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java index b7f8395d92f..3435985b351 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java @@ -32,7 +32,8 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return new ProtocolScheduleBuilder( config, ProtocolSpecAdapters.create( @@ -43,7 +44,8 @@ public static ProtocolSchedule create( isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager) + badBlockManager, + isParallelPreloadTxEnabled) .createProtocolSchedule(); } @@ -52,27 +54,31 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return create( config, PrivacyParameters.DEFAULT, isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } public static ProtocolSchedule create( final GenesisConfigOptions config, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return create( config, PrivacyParameters.DEFAULT, false, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } } 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 379538a14fe..0000b4790c1 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 @@ -29,13 +29,14 @@ import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.Withdrawal; -import org.hyperledger.besu.ethereum.mainnet.parallelization.PreloadConcurrentTransactionProcessor; +import org.hyperledger.besu.ethereum.mainnet.parallelization.ParallelizedConcurrentTransactionProcessor; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.MerkleTrieException; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldStateUpdateAccumulator; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator; import org.hyperledger.besu.evm.tracing.OperationTracer; @@ -67,6 +68,7 @@ TransactionReceipt create( static final int MAX_GENERATION = 6; protected final MainnetTransactionProcessor transactionProcessor; + private final boolean isParallelPreloadTxEnabled; protected final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory; @@ -83,8 +85,10 @@ protected AbstractBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, + final boolean isParallelPreloadTxEnabled, final ProtocolSchedule protocolSchedule) { this.transactionProcessor = transactionProcessor; + this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; this.transactionReceiptFactory = transactionReceiptFactory; this.blockReward = blockReward; this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; @@ -105,9 +109,6 @@ public BlockProcessingResult processBlock( long currentGasUsed = 0; long currentBlobGasUsed = 0; - final PreloadConcurrentTransactionProcessor preloadConcurrentTransactionProcessor = - new PreloadConcurrentTransactionProcessor(transactionProcessor); - final ProtocolSpec protocolSpec = protocolSchedule.getByBlockHeader(blockHeader); protocolSpec.getBlockHashProcessor().processBlockHashes(blockchain, worldState, blockHeader); @@ -127,42 +128,46 @@ public BlockProcessingResult processBlock( calculateExcessBlobGasForParent(protocolSpec, parentHeader))) .orElse(Wei.ZERO); - /* - * The runAsyncPreloadBlock method is specifically working with BONSAI. - * It facilitates the parallel execution of transactions in the background through an optimistic strategy. - * Being non-blocking, it permits reading and modifying a majority of slots and accounts while also - * allowing transactions to be executed optimistically. This approach preloads most accounts and slots - * into the cache, and also reducing the need to replay transactions in the absence of collisions. - */ - preloadConcurrentTransactionProcessor.runAsyncPreloadBlock( - worldState, - blockHeader, - transactions, - miningBeneficiary, - blockHashLookup, - blobGasPrice, - privateMetadataUpdater); + Optional preloadConcurrentTransactionProcessor = + Optional.empty(); + if (isParallelPreloadTxEnabled) { + if ((worldState instanceof DiffBasedWorldState)) { + preloadConcurrentTransactionProcessor = + Optional.of(new ParallelizedConcurrentTransactionProcessor(transactionProcessor)); + // runAsyncPreloadBlock, if activated, facilitates the non-blocking parallel execution of + // transactions in the background through an optimistic strategy. + preloadConcurrentTransactionProcessor + .get() + .runAsyncPreloadBlock( + worldState, + blockHeader, + transactions, + miningBeneficiary, + blockHashLookup, + blobGasPrice, + privateMetadataUpdater); + } + } for (int i = 0; i < transactions.size(); i++) { final Transaction transaction = transactions.get(i); + if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) { return new BlockProcessingResult(Optional.empty(), "provided gas insufficient"); } final WorldUpdater blockUpdater = worldState.updater(); - /* - * This applyPreloadBlockResult is designed to fetch the results of transactions processed by background threads. - * If the transactions were successfully executed in the background, their results are applied to the block. - * In the absence of collisions, the entire result is applied without re-executing the transaction. - * However, in the event of a conflict, only the data we read are added to the block cache, - * and the transaction is replayed. This approach minimizes the amount of data that needs to be - * fetched from the disk. If a transaction was not processed in time in the background, - * it is executed in the usual manner. - */ - TransactionProcessingResult transactionProcessingResult = - preloadConcurrentTransactionProcessor - .applyPreloadBlockResult(worldState, miningBeneficiary, transaction, i) - .orElse(null); + TransactionProcessingResult transactionProcessingResult = null; + + if (isParallelPreloadTxEnabled && preloadConcurrentTransactionProcessor.isPresent()) { + // applyPreloadBlockResult, if activated, fetch the results of transactions processed by + // background threads. + transactionProcessingResult = + preloadConcurrentTransactionProcessor + .get() + .applyPreloadBlockResult(worldState, miningBeneficiary, transaction, i) + .orElse(null); + } if (transactionProcessingResult == null) { transactionProcessingResult = @@ -226,12 +231,6 @@ public BlockProcessingResult processBlock( return new BlockProcessingResult(Optional.empty(), e); } } - System.out.println( - "conflictingButCachedTransaction result " - + preloadConcurrentTransactionProcessor.getConflictingButCachedTransaction()); - System.out.println( - "confirmedParallelizedTransaction result " - + preloadConcurrentTransactionProcessor.getConfirmedParallelizedTransaction()); // EIP-7685: process EL requests final Optional requestProcessor = diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java index 044017b8728..1a0c6315079 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java @@ -41,6 +41,7 @@ public ClassicBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, + final boolean isParallelPreloadTxEnabled, final OptionalLong eraLen, final ProtocolSchedule protocolSchedule) { super( @@ -49,6 +50,7 @@ public ClassicBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, + isParallelPreloadTxEnabled, protocolSchedule); eraLength = eraLen.orElse(DEFAULT_ERA_LENGTH); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java index aec844894f7..6b01c6e88b8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java @@ -54,16 +54,18 @@ private ClassicProtocolSpecs() { } public static ProtocolSpecBuilder classicRecoveryInitDefinition( - final EvmConfiguration evmConfiguration) { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration) + final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled) .blockHeaderValidatorBuilder( feeMarket -> MainnetBlockHeaderValidator.createClassicValidator()) .name("ClassicRecoveryInit"); } public static ProtocolSpecBuilder tangerineWhistleDefinition( - final Optional chainId, final EvmConfiguration evmConfiguration) { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration) + final Optional chainId, + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled) .isReplayProtectionSupported(true) .gasCalculator(TangerineWhistleGasCalculator::new) .transactionValidatorFactoryBuilder( @@ -74,8 +76,10 @@ public static ProtocolSpecBuilder tangerineWhistleDefinition( } public static ProtocolSpecBuilder dieHardDefinition( - final Optional chainId, final EvmConfiguration evmConfiguration) { - return tangerineWhistleDefinition(chainId, evmConfiguration) + final Optional chainId, + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return tangerineWhistleDefinition(chainId, evmConfiguration, isParallelPreloadTxEnabled) .gasCalculator(DieHardGasCalculator::new) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_PAUSED) .name("DieHard"); @@ -84,8 +88,9 @@ public static ProtocolSpecBuilder dieHardDefinition( public static ProtocolSpecBuilder gothamDefinition( final Optional chainId, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return dieHardDefinition(chainId, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return dieHardDefinition(chainId, evmConfiguration, isParallelPreloadTxEnabled) .blockReward(MAX_BLOCK_REWARD) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_DELAYED) .blockProcessorBuilder( @@ -94,6 +99,7 @@ public static ProtocolSpecBuilder gothamDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, + parallelPreloadTxEnabled, protocolSchedule) -> new ClassicBlockProcessor( transactionProcessor, @@ -101,6 +107,7 @@ public static ProtocolSpecBuilder gothamDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, + parallelPreloadTxEnabled, ecip1017EraRounds, protocolSchedule)) .name("Gotham"); @@ -109,8 +116,10 @@ public static ProtocolSpecBuilder gothamDefinition( public static ProtocolSpecBuilder defuseDifficultyBombDefinition( final Optional chainId, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return gothamDefinition( + chainId, ecip1017EraRounds, evmConfiguration, isParallelPreloadTxEnabled) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_REMOVED) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -123,8 +132,10 @@ public static ProtocolSpecBuilder atlantisDefinition( final Optional chainId, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return gothamDefinition( + chainId, ecip1017EraRounds, evmConfiguration, isParallelPreloadTxEnabled) .evmBuilder(MainnetEVMs::byzantium) .evmConfiguration(evmConfiguration) .gasCalculator(SpuriousDragonGasCalculator::new) @@ -163,8 +174,14 @@ public static ProtocolSpecBuilder aghartaDefinition( final Optional chainId, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return atlantisDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return atlantisDefinition( + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled) .evmBuilder(MainnetEVMs::constantinople) .gasCalculator(PetersburgGasCalculator::new) .evmBuilder(MainnetEVMs::constantinople) @@ -176,8 +193,14 @@ public static ProtocolSpecBuilder phoenixDefinition( final Optional chainId, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return aghartaDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return aghartaDefinition( + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled) .gasCalculator(IstanbulGasCalculator::new) .evmBuilder( (gasCalculator, evmConfig) -> @@ -191,8 +214,14 @@ public static ProtocolSpecBuilder thanosDefinition( final Optional chainId, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return phoenixDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return phoenixDefinition( + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled) .blockHeaderValidatorBuilder( feeMarket -> MainnetBlockHeaderValidator.createPgaBlockHeaderValidator( @@ -228,8 +257,14 @@ public static ProtocolSpecBuilder magnetoDefinition( final Optional chainId, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return thanosDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return thanosDefinition( + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled) .gasCalculator(BerlinGasCalculator::new) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -250,8 +285,14 @@ public static ProtocolSpecBuilder mystiqueDefinition( final Optional chainId, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return magnetoDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return magnetoDefinition( + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled) .gasCalculator(LondonGasCalculator::new) .contractCreationProcessorBuilder( evm -> @@ -264,8 +305,14 @@ public static ProtocolSpecBuilder spiralDefinition( final Optional chainId, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, - final EvmConfiguration evmConfiguration) { - return mystiqueDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return mystiqueDefinition( + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled) // EIP-3860 .gasCalculator(ShanghaiGasCalculator::new) // EIP-3855 diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java index 9f2096f63d2..dfbbe2bc28b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java @@ -36,6 +36,7 @@ public MainnetBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, + final boolean isParallelPreloadTxEnabled, final ProtocolSchedule protocolSchedule) { super( transactionProcessor, @@ -43,6 +44,7 @@ public MainnetBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, + isParallelPreloadTxEnabled, protocolSchedule); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java index 794f96cfb39..e09efd886bd 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java @@ -48,7 +48,8 @@ public static ProtocolSchedule fromConfig( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { if (FixedDifficultyCalculators.isFixedDifficultyInConfig(config)) { return FixedDifficultyProtocolSchedule.create( config, @@ -56,7 +57,8 @@ public static ProtocolSchedule fromConfig( isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } return new ProtocolScheduleBuilder( config, @@ -66,7 +68,8 @@ public static ProtocolSchedule fromConfig( isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager) + badBlockManager, + isParallelPreloadTxEnabled) .createProtocolSchedule(); } @@ -86,14 +89,16 @@ public static ProtocolSchedule fromConfig( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return fromConfig( config, PrivacyParameters.DEFAULT, isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } /** @@ -110,14 +115,16 @@ public static ProtocolSchedule fromConfig( final GenesisConfigOptions config, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return fromConfig( config, PrivacyParameters.DEFAULT, false, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } /** @@ -132,13 +139,15 @@ public static ProtocolSchedule fromConfig( public static ProtocolSchedule fromConfig( final GenesisConfigOptions config, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { return fromConfig( config, PrivacyParameters.DEFAULT, false, EvmConfiguration.DEFAULT, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java index aa9bae6c7e3..3743a360431 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java @@ -30,117 +30,171 @@ public class MainnetProtocolSpecFactory { private final EvmConfiguration evmConfiguration; private final MiningParameters miningParameters; + private final boolean isParallelPreloadTxEnabled; + public MainnetProtocolSpecFactory( final Optional chainId, final boolean isRevertReasonEnabled, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { this.chainId = chainId; this.isRevertReasonEnabled = isRevertReasonEnabled; this.ecip1017EraRounds = ecip1017EraRounds; this.evmConfiguration = evmConfiguration; this.miningParameters = miningParameters; + this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; } public ProtocolSpecBuilder frontierDefinition() { - return MainnetProtocolSpecs.frontierDefinition(evmConfiguration); + return MainnetProtocolSpecs.frontierDefinition(evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder homesteadDefinition() { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration); + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder daoRecoveryInitDefinition() { - return MainnetProtocolSpecs.daoRecoveryInitDefinition(evmConfiguration); + return MainnetProtocolSpecs.daoRecoveryInitDefinition( + evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder daoRecoveryTransitionDefinition() { - return MainnetProtocolSpecs.daoRecoveryTransitionDefinition(evmConfiguration); + return MainnetProtocolSpecs.daoRecoveryTransitionDefinition( + evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder tangerineWhistleDefinition() { - return MainnetProtocolSpecs.tangerineWhistleDefinition(evmConfiguration); + return MainnetProtocolSpecs.tangerineWhistleDefinition( + evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder spuriousDragonDefinition() { - return MainnetProtocolSpecs.spuriousDragonDefinition(chainId, evmConfiguration); + return MainnetProtocolSpecs.spuriousDragonDefinition( + chainId, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder byzantiumDefinition() { return MainnetProtocolSpecs.byzantiumDefinition( - chainId, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder constantinopleDefinition() { return MainnetProtocolSpecs.constantinopleDefinition( - chainId, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder petersburgDefinition() { return MainnetProtocolSpecs.petersburgDefinition( - chainId, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder istanbulDefinition() { return MainnetProtocolSpecs.istanbulDefinition( - chainId, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder muirGlacierDefinition() { return MainnetProtocolSpecs.muirGlacierDefinition( - chainId, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder berlinDefinition() { - return MainnetProtocolSpecs.berlinDefinition(chainId, isRevertReasonEnabled, evmConfiguration); + return MainnetProtocolSpecs.berlinDefinition( + chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder londonDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.londonDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder arrowGlacierDefinition( final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.arrowGlacierDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder grayGlacierDefinition( final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.grayGlacierDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder parisDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.parisDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder shanghaiDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.shanghaiDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder cancunDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.cancunDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder cancunEOFDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.cancunEOFDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder pragueDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.pragueDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder pragueEOFDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.pragueEOFDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } /** @@ -156,7 +210,12 @@ public ProtocolSpecBuilder pragueEOFDefinition(final GenesisConfigOptions genesi */ public ProtocolSpecBuilder futureEipsDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.futureEipsDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } /** @@ -172,57 +231,92 @@ public ProtocolSpecBuilder futureEipsDefinition(final GenesisConfigOptions genes public ProtocolSpecBuilder experimentalEipsDefinition( final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.experimentalEipsDefinition( - chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + isRevertReasonEnabled, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); } //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// // Classic Protocol Specs public ProtocolSpecBuilder dieHardDefinition() { - return ClassicProtocolSpecs.dieHardDefinition(chainId, evmConfiguration); + return ClassicProtocolSpecs.dieHardDefinition( + chainId, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder gothamDefinition() { - return ClassicProtocolSpecs.gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration); + return ClassicProtocolSpecs.gothamDefinition( + chainId, ecip1017EraRounds, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder defuseDifficultyBombDefinition() { return ClassicProtocolSpecs.defuseDifficultyBombDefinition( - chainId, ecip1017EraRounds, evmConfiguration); + chainId, ecip1017EraRounds, evmConfiguration, isParallelPreloadTxEnabled); } public ProtocolSpecBuilder atlantisDefinition() { return ClassicProtocolSpecs.atlantisDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder aghartaDefinition() { return ClassicProtocolSpecs.aghartaDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder phoenixDefinition() { return ClassicProtocolSpecs.phoenixDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder thanosDefinition() { return ClassicProtocolSpecs.thanosDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder magnetoDefinition() { return ClassicProtocolSpecs.magnetoDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder mystiqueDefinition() { return ClassicProtocolSpecs.mystiqueDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled); } public ProtocolSpecBuilder spiralDefinition() { return ClassicProtocolSpecs.spiralDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelPreloadTxEnabled); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index b4a75c49c28..b6564bb631f 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -101,7 +101,8 @@ public abstract class MainnetProtocolSpecs { private MainnetProtocolSpecs() {} - public static ProtocolSpecBuilder frontierDefinition(final EvmConfiguration evmConfiguration) { + public static ProtocolSpecBuilder frontierDefinition( + final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { return new ProtocolSpecBuilder() .gasCalculator(FrontierGasCalculator::new) .gasLimitCalculatorBuilder(feeMarket -> new FrontierTargetingGasLimitCalculator()) @@ -152,6 +153,7 @@ public static ProtocolSpecBuilder frontierDefinition(final EvmConfiguration evmC .transactionReceiptFactory(MainnetProtocolSpecs::frontierTransactionReceiptFactory) .blockReward(FRONTIER_BLOCK_REWARD) .skipZeroBlockRewards(false) + .isParallelPreloadTxEnabled(isParallelPreloadTxEnabled) .blockProcessorBuilder(MainnetBlockProcessor::new) .blockValidatorBuilder(MainnetProtocolSpecs.blockValidatorBuilder()) .blockImporterBuilder(MainnetBlockImporter::new) @@ -173,8 +175,9 @@ public static BlockValidatorBuilder blockValidatorBuilder() { return MainnetBlockValidator::new; } - public static ProtocolSpecBuilder homesteadDefinition(final EvmConfiguration evmConfiguration) { - return frontierDefinition(evmConfiguration) + public static ProtocolSpecBuilder homesteadDefinition( + final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { + return frontierDefinition(evmConfiguration, isParallelPreloadTxEnabled) .gasCalculator(HomesteadGasCalculator::new) .evmBuilder(MainnetEVMs::homestead) .contractCreationProcessorBuilder( @@ -190,8 +193,8 @@ public static ProtocolSpecBuilder homesteadDefinition(final EvmConfiguration evm } public static ProtocolSpecBuilder daoRecoveryInitDefinition( - final EvmConfiguration evmConfiguration) { - return homesteadDefinition(evmConfiguration) + final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { + return homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled) .blockHeaderValidatorBuilder(feeMarket -> MainnetBlockHeaderValidator.createDaoValidator()) .blockProcessorBuilder( (transactionProcessor, @@ -199,6 +202,7 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, + parallelPreloadTxEnabled, protocolSchedule) -> new DaoBlockProcessor( new MainnetBlockProcessor( @@ -207,27 +211,30 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, + parallelPreloadTxEnabled, protocolSchedule))) .name("DaoRecoveryInit"); } public static ProtocolSpecBuilder daoRecoveryTransitionDefinition( - final EvmConfiguration evmConfiguration) { - return daoRecoveryInitDefinition(evmConfiguration) + final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { + return daoRecoveryInitDefinition(evmConfiguration, isParallelPreloadTxEnabled) .blockProcessorBuilder(MainnetBlockProcessor::new) .name("DaoRecoveryTransition"); } public static ProtocolSpecBuilder tangerineWhistleDefinition( - final EvmConfiguration evmConfiguration) { - return homesteadDefinition(evmConfiguration) + final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { + return homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled) .gasCalculator(TangerineWhistleGasCalculator::new) .name("TangerineWhistle"); } public static ProtocolSpecBuilder spuriousDragonDefinition( - final Optional chainId, final EvmConfiguration evmConfiguration) { - return tangerineWhistleDefinition(evmConfiguration) + final Optional chainId, + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return tangerineWhistleDefinition(evmConfiguration, isParallelPreloadTxEnabled) .isReplayProtectionSupported(true) .gasCalculator(SpuriousDragonGasCalculator::new) .skipZeroBlockRewards(true) @@ -271,8 +278,9 @@ public static ProtocolSpecBuilder spuriousDragonDefinition( public static ProtocolSpecBuilder byzantiumDefinition( final Optional chainId, final boolean enableRevertReason, - final EvmConfiguration evmConfiguration) { - return spuriousDragonDefinition(chainId, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return spuriousDragonDefinition(chainId, evmConfiguration, isParallelPreloadTxEnabled) .gasCalculator(ByzantiumGasCalculator::new) .evmBuilder(MainnetEVMs::byzantium) .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::byzantium) @@ -301,8 +309,10 @@ public static ProtocolSpecBuilder byzantiumDefinition( public static ProtocolSpecBuilder constantinopleDefinition( final Optional chainId, final boolean enableRevertReason, - final EvmConfiguration evmConfiguration) { - return byzantiumDefinition(chainId, enableRevertReason, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return byzantiumDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) .difficultyCalculator(MainnetDifficultyCalculators.CONSTANTINOPLE) .gasCalculator(ConstantinopleGasCalculator::new) .evmBuilder(MainnetEVMs::constantinople) @@ -313,8 +323,10 @@ public static ProtocolSpecBuilder constantinopleDefinition( public static ProtocolSpecBuilder petersburgDefinition( final Optional chainId, final boolean enableRevertReason, - final EvmConfiguration evmConfiguration) { - return constantinopleDefinition(chainId, enableRevertReason, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return constantinopleDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) .gasCalculator(PetersburgGasCalculator::new) .name("Petersburg"); } @@ -322,8 +334,10 @@ public static ProtocolSpecBuilder petersburgDefinition( public static ProtocolSpecBuilder istanbulDefinition( final Optional chainId, final boolean enableRevertReason, - final EvmConfiguration evmConfiguration) { - return petersburgDefinition(chainId, enableRevertReason, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return petersburgDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) .gasCalculator(IstanbulGasCalculator::new) .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -344,8 +358,10 @@ public static ProtocolSpecBuilder istanbulDefinition( static ProtocolSpecBuilder muirGlacierDefinition( final Optional chainId, final boolean enableRevertReason, - final EvmConfiguration evmConfiguration) { - return istanbulDefinition(chainId, enableRevertReason, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return istanbulDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) .difficultyCalculator(MainnetDifficultyCalculators.MUIR_GLACIER) .name("MuirGlacier"); } @@ -353,8 +369,10 @@ static ProtocolSpecBuilder muirGlacierDefinition( static ProtocolSpecBuilder berlinDefinition( final Optional chainId, final boolean enableRevertReason, - final EvmConfiguration evmConfiguration) { - return muirGlacierDefinition(chainId, enableRevertReason, evmConfiguration) + final EvmConfiguration evmConfiguration, + final boolean isParallelPreloadTxEnabled) { + return muirGlacierDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) .gasCalculator(BerlinGasCalculator::new) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -376,7 +394,8 @@ static ProtocolSpecBuilder londonDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(Long.MAX_VALUE); final BaseFeeMarket londonFeeMarket; @@ -390,7 +409,8 @@ static ProtocolSpecBuilder londonDefinition( londonFeeMarket = FeeMarket.london(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); } - return berlinDefinition(chainId, enableRevertReason, evmConfiguration) + return berlinDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) .feeMarket(londonFeeMarket) .gasCalculator(LondonGasCalculator::new) .gasLimitCalculatorBuilder( @@ -455,9 +475,15 @@ static ProtocolSpecBuilder arrowGlacierDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { return londonDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled) .difficultyCalculator(MainnetDifficultyCalculators.ARROW_GLACIER) .name("ArrowGlacier"); } @@ -467,9 +493,15 @@ static ProtocolSpecBuilder grayGlacierDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { return arrowGlacierDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled) .difficultyCalculator(MainnetDifficultyCalculators.GRAY_GLACIER) .name("GrayGlacier"); } @@ -479,10 +511,16 @@ static ProtocolSpecBuilder parisDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { return grayGlacierDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled) .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.paris(gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) @@ -499,9 +537,15 @@ static ProtocolSpecBuilder shanghaiDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { return parisDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled) // gas calculator has new code to support EIP-3860 limit and meter initcode .gasCalculator(ShanghaiGasCalculator::new) // EVM has a new operation for EIP-3855 PUSH0 instruction @@ -550,7 +594,8 @@ static ProtocolSpecBuilder cancunDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(0L); final BaseFeeMarket cancunFeeMarket; if (genesisConfigOptions.isZeroBaseFee()) { @@ -565,7 +610,12 @@ static ProtocolSpecBuilder cancunDefinition( } return shanghaiDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled) .feeMarket(cancunFeeMarket) // gas calculator for EIP-4844 blob gas .gasCalculator(CancunGasCalculator::new) @@ -622,11 +672,17 @@ static ProtocolSpecBuilder cancunEOFDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { ProtocolSpecBuilder protocolSpecBuilder = cancunDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); return addEOF(chainId, evmConfiguration, protocolSpecBuilder).name("CancunEOF"); } @@ -635,13 +691,19 @@ static ProtocolSpecBuilder pragueDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { final Address depositContractAddress = genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS); return cancunDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled) // EIP-3074 AUTH and AUTCALL gas .gasCalculator(PragueGasCalculator::new) // EIP-3074 AUTH and AUTCALL @@ -668,11 +730,17 @@ static ProtocolSpecBuilder pragueEOFDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { ProtocolSpecBuilder protocolSpecBuilder = pragueDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters); + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled); return addEOF(chainId, evmConfiguration, protocolSpecBuilder).name("PragueEOF"); } @@ -704,9 +772,15 @@ static ProtocolSpecBuilder futureEipsDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { return pragueEOFDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled) // Use Future EIP configured EVM .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -731,10 +805,16 @@ static ProtocolSpecBuilder experimentalEipsDefinition( final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, - final MiningParameters miningParameters) { + final MiningParameters miningParameters, + final boolean isParallelPreloadTxEnabled) { return futureEipsDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + chainId, + enableRevertReason, + genesisConfigOptions, + evmConfiguration, + miningParameters, + isParallelPreloadTxEnabled) .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.experimentalEips( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java index 649442f88c1..7c5ca82b89c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java @@ -46,6 +46,8 @@ public class ProtocolScheduleBuilder { private final MiningParameters miningParameters; private final BadBlockManager badBlockManager; + private final boolean isParallelPreloadTxEnabled; + public ProtocolScheduleBuilder( final GenesisConfigOptions config, final BigInteger defaultChainId, @@ -54,7 +56,8 @@ public ProtocolScheduleBuilder( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { this( config, Optional.of(defaultChainId), @@ -63,7 +66,8 @@ public ProtocolScheduleBuilder( isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } public ProtocolScheduleBuilder( @@ -73,7 +77,8 @@ public ProtocolScheduleBuilder( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { this( config, Optional.empty(), @@ -82,7 +87,8 @@ public ProtocolScheduleBuilder( isRevertReasonEnabled, evmConfiguration, miningParameters, - badBlockManager); + badBlockManager, + isParallelPreloadTxEnabled); } private ProtocolScheduleBuilder( @@ -93,7 +99,8 @@ private ProtocolScheduleBuilder( final boolean isRevertReasonEnabled, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final BadBlockManager badBlockManager) { + final BadBlockManager badBlockManager, + final boolean isParallelPreloadTxEnabled) { this.config = config; this.protocolSpecAdapters = protocolSpecAdapters; this.privacyParameters = privacyParameters; @@ -102,6 +109,7 @@ private ProtocolScheduleBuilder( this.defaultChainId = defaultChainId; this.miningParameters = miningParameters; this.badBlockManager = badBlockManager; + this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; } public ProtocolSchedule createProtocolSchedule() { @@ -121,7 +129,8 @@ private void initSchedule( config.getEcip1017EraRounds(), evmConfiguration.overrides( config.getContractSizeLimit(), OptionalInt.empty(), config.getEvmStackSize()), - miningParameters); + miningParameters, + isParallelPreloadTxEnabled); validateForkOrdering(); @@ -203,7 +212,8 @@ private void initSchedule( protocolSchedule, BuilderMapEntry.MilestoneType.BLOCK_NUMBER, classicBlockNumber, - ClassicProtocolSpecs.classicRecoveryInitDefinition(evmConfiguration), + ClassicProtocolSpecs.classicRecoveryInitDefinition( + evmConfiguration, isParallelPreloadTxEnabled), Function.identity()); protocolSchedule.putBlockNumberMilestone( classicBlockNumber + 1, originalProtocolSpec); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java index b364679aa8b..0e7d9004819 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java @@ -70,6 +70,8 @@ public class ProtocolSpec { private final boolean skipZeroBlockRewards; + private final boolean isParallelPreloadTxEnabled; + private final PrivateTransactionProcessor privateTransactionProcessor; private final FeeMarket feeMarket; @@ -105,6 +107,7 @@ public class ProtocolSpec { * @param miningBeneficiaryCalculator determines to whom mining proceeds are paid * @param precompileContractRegistry all the pre-compiled contracts added * @param skipZeroBlockRewards should rewards be skipped if it is zero + * @param isParallelPreloadTxEnabled indicates whether parallel transaction preloading is enabled. * @param gasCalculator the gas calculator to use. * @param gasLimitCalculator the gas limit calculator to use. * @param feeMarket an {@link Optional} wrapping {@link FeeMarket} class if appropriate. @@ -136,6 +139,7 @@ public ProtocolSpec( final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final PrecompileContractRegistry precompileContractRegistry, final boolean skipZeroBlockRewards, + final boolean isParallelPreloadTxEnabled, final GasCalculator gasCalculator, final GasLimitCalculator gasLimitCalculator, final FeeMarket feeMarket, @@ -165,6 +169,7 @@ public ProtocolSpec( this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; this.precompileContractRegistry = precompileContractRegistry; this.skipZeroBlockRewards = skipZeroBlockRewards; + this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; this.gasCalculator = gasCalculator; this.gasLimitCalculator = gasLimitCalculator; this.feeMarket = feeMarket; @@ -319,6 +324,10 @@ public boolean isSkipZeroBlockRewards() { return skipZeroBlockRewards; } + public boolean isParallelPreloadTxEnabled() { + return isParallelPreloadTxEnabled; + } + public MiningBeneficiaryCalculator getMiningBeneficiaryCalculator() { return miningBeneficiaryCalculator; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index cd886b6c847..02e92dff06d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -51,6 +51,7 @@ public class ProtocolSpecBuilder { private Function gasLimitCalculatorBuilder; private Wei blockReward; private boolean skipZeroBlockRewards; + private BlockHeaderFunctions blockHeaderFunctions; private AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory; private DifficultyCalculator difficultyCalculator; @@ -66,9 +67,12 @@ public class ProtocolSpecBuilder { private BiFunction messageCallProcessorBuilder; private TransactionProcessorBuilder transactionProcessorBuilder; + private BlockProcessorBuilder blockProcessorBuilder; private BlockValidatorBuilder blockValidatorBuilder; private BlockImporterBuilder blockImporterBuilder; + + private boolean isParallelPreloadTxEnabled = false; private String name; private MiningBeneficiaryCalculator miningBeneficiaryCalculator; private PrivacyParameters privacyParameters; @@ -142,6 +146,11 @@ public ProtocolSpecBuilder blockHeaderValidatorBuilder( return this; } + public ProtocolSpecBuilder isParallelPreloadTxEnabled(final boolean isParallelPreloadTxEnabled) { + this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; + return this; + } + public ProtocolSpecBuilder ommerHeaderValidatorBuilder( final Function ommerHeaderValidatorBuilder) { this.ommerHeaderValidatorBuilder = ommerHeaderValidatorBuilder; @@ -393,6 +402,7 @@ public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { miningBeneficiaryCalculator, precompileContractRegistry, skipZeroBlockRewards, + isParallelPreloadTxEnabled, gasCalculator, gasLimitCalculator, feeMarket, @@ -450,6 +460,7 @@ private BlockProcessor createBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, + isParallelPreloadTxEnabled, protocolSchedule); } @@ -489,6 +500,7 @@ BlockProcessor apply( Wei blockReward, MiningBeneficiaryCalculator miningBeneficiaryCalculator, boolean skipZeroBlockRewards, + final boolean isParallelPreloadTxEnabled, ProtocolSchedule protocolSchedule); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java similarity index 69% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java index f5da329e1ac..73c512ff1fd 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/PreloadConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java @@ -39,6 +39,8 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import com.google.common.annotations.VisibleForTesting; + /** * Optimizes transaction processing by executing transactions in parallel within a given block. * Transactions are executed optimistically in a non-blocking manner. After execution, the class @@ -46,7 +48,7 @@ * results to the world state. */ @SuppressWarnings({"unchecked", "rawtypes", "unused"}) -public class PreloadConcurrentTransactionProcessor { +public class ParallelizedConcurrentTransactionProcessor { private static final int NCPU = Runtime.getRuntime().availableProcessors(); private static final Executor executor = Executors.newFixedThreadPool(NCPU); @@ -67,7 +69,7 @@ public class PreloadConcurrentTransactionProcessor { * * @param transactionProcessor The transaction processor for processing individual transactions. */ - public PreloadConcurrentTransactionProcessor( + public ParallelizedConcurrentTransactionProcessor( final MainnetTransactionProcessor transactionProcessor) { this.transactionProcessor = transactionProcessor; this.transactionCollisionDetector = new TransactionCollisionDetector(); @@ -106,73 +108,90 @@ public void runAsyncPreloadBlock( * All transactions are executed in the background by copying the world state of the block on which the transactions need to be executed, ensuring that each one has its own accumulator. */ CompletableFuture.runAsync( - () -> { - DiffBasedWorldState roundWorldState = - new BonsaiWorldState( - (BonsaiWorldState) worldState, new LazyBonsaiCachedMerkleTrieLoader()); - - final ParallelizedTransactionContext.Builder contextBuilder = - new ParallelizedTransactionContext.Builder(); - final DiffBasedWorldStateUpdateAccumulator roundWorldStateUpdater = - (DiffBasedWorldStateUpdateAccumulator) roundWorldState.updater(); - final TransactionProcessingResult result = - transactionProcessor.processTransaction( - roundWorldStateUpdater, - blockHeader, - transaction, - miningBeneficiary, - new OperationTracer() { - @Override - public void traceTransactionBeforeMiningReward( - final WorldView worldView, - final org.hyperledger.besu.datatypes.Transaction tx, - final Wei miningReward) { - /* - * This part checks if the mining beneficiary's account was accessed before increasing its balance for rewards. - * Indeed, if the transaction has interacted with the address to read or modify it, - * it means that the value is necessary for the proper execution of the transaction and will therefore be considered in collision detection. - * If this is not the case, we can ignore this address during conflict detection. - */ - if (transactionCollisionDetector - .getAddressesTouchedByTransaction( - transaction, Optional.of(roundWorldStateUpdater)) - .contains(miningBeneficiary)) { - contextBuilder.isMiningBeneficiaryTouchedPreRewardByTransaction(true); - } - contextBuilder.miningBeneficiaryReward(miningReward); - } - }, - blockHashLookup, - true, - TransactionValidationParams.processingBlock(), - privateMetadataUpdater, - blobGasPrice); - - // commit the accumulator in order to apply all the modifications - roundWorldState.getAccumulator().commit(); - - contextBuilder - .transactionAccumulator(roundWorldState.getAccumulator()) - .transactionProcessingResult(result); - - final ParallelizedTransactionContext parallelizedTransactionContext = - contextBuilder.build(); - if (!parallelizedTransactionContext - .isMiningBeneficiaryTouchedPreRewardByTransaction()) { - /* - * If the address of the mining beneficiary has been touched only for adding rewards, - * we remove it from the accumulator to avoid a false positive collision. - * The balance will be increased during the sequential processing. - */ - roundWorldStateUpdater.getAccountsToUpdate().remove(miningBeneficiary); - } - parallelizedTransactionContextByLocation.put( - transactionLocation, parallelizedTransactionContext); - }, + () -> + runTransaction( + worldState, + blockHeader, + transactionLocation, + transaction, + miningBeneficiary, + blockHashLookup, + blobGasPrice, + privateMetadataUpdater), executor); } } + @VisibleForTesting + public void runTransaction( + final MutableWorldState worldState, + final BlockHeader blockHeader, + final int transactionLocation, + final Transaction transaction, + final Address miningBeneficiary, + final BlockHashOperation.BlockHashLookup blockHashLookup, + final Wei blobGasPrice, + final PrivateMetadataUpdater privateMetadataUpdater) { + final DiffBasedWorldState roundWorldState = + new BonsaiWorldState((BonsaiWorldState) worldState, new LazyBonsaiCachedMerkleTrieLoader()); + + final ParallelizedTransactionContext.Builder contextBuilder = + new ParallelizedTransactionContext.Builder(); + final DiffBasedWorldStateUpdateAccumulator roundWorldStateUpdater = + (DiffBasedWorldStateUpdateAccumulator) roundWorldState.updater(); + final TransactionProcessingResult result = + transactionProcessor.processTransaction( + roundWorldStateUpdater, + blockHeader, + transaction, + miningBeneficiary, + new OperationTracer() { + @Override + public void traceTransactionBeforeMiningReward( + final WorldView worldView, + final org.hyperledger.besu.datatypes.Transaction tx, + final Wei miningReward) { + /* + * This part checks if the mining beneficiary's account was accessed before increasing its balance for rewards. + * Indeed, if the transaction has interacted with the address to read or modify it, + * it means that the value is necessary for the proper execution of the transaction and will therefore be considered in collision detection. + * If this is not the case, we can ignore this address during conflict detection. + */ + if (transactionCollisionDetector + .getAddressesTouchedByTransaction( + transaction, Optional.of(roundWorldStateUpdater)) + .contains(miningBeneficiary)) { + contextBuilder.isMiningBeneficiaryTouchedPreRewardByTransaction(true); + } + contextBuilder.miningBeneficiaryReward(miningReward); + } + }, + blockHashLookup, + true, + TransactionValidationParams.processingBlock(), + privateMetadataUpdater, + blobGasPrice); + + // commit the accumulator in order to apply all the modifications + roundWorldState.getAccumulator().commit(); + + contextBuilder + .transactionAccumulator(roundWorldState.getAccumulator()) + .transactionProcessingResult(result); + + final ParallelizedTransactionContext parallelizedTransactionContext = contextBuilder.build(); + if (!parallelizedTransactionContext.isMiningBeneficiaryTouchedPreRewardByTransaction()) { + /* + * If the address of the mining beneficiary has been touched only for adding rewards, + * we remove it from the accumulator to avoid a false positive collision. + * The balance will be increased during the sequential processing. + */ + roundWorldStateUpdater.getAccountsToUpdate().remove(miningBeneficiary); + } + parallelizedTransactionContextByLocation.put( + transactionLocation, parallelizedTransactionContext); + } + /** * Applies the results of preloaded transactions to the world state after checking for conflicts. * @@ -200,7 +219,7 @@ public Optional applyPreloadBlockResult( final DiffBasedWorldStateUpdateAccumulator blockAccumulator = (DiffBasedWorldStateUpdateAccumulator) diffBasedWorldState.updater(); final ParallelizedTransactionContext parallelizedTransactionContext = - parallelizedTransactionContextByLocation.get(transactionLocation); + parallelizedTransactionContextByLocation.remove(transactionLocation); /* * If `parallelizedTransactionContext` is not null, it means that the transaction had time to complete in the background. */ diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java index 646e67d2da5..02facdccdf8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java @@ -85,6 +85,8 @@ interface Unstable { boolean DEFAULT_BONSAI_FULL_FLAT_DB_ENABLED = true; boolean DEFAULT_BONSAI_CODE_USING_CODE_HASH_ENABLED = true; + boolean DEFAULT_PARALLEL_PRELOAD_TRX_ENABLED = false; + DataStorageConfiguration.Unstable DEFAULT = ImmutableDataStorageConfiguration.Unstable.builder().build(); @@ -100,5 +102,11 @@ default boolean getBonsaiFullFlatDbEnabled() { default boolean getBonsaiCodeStoredByCodeHashEnabled() { return DEFAULT_BONSAI_CODE_USING_CODE_HASH_ENABLED; } + + @Value.Default + default boolean isParallelPreloadTxEnabled() { + return DEFAULT_PARALLEL_PRELOAD_TRX_ENABLED; + } + } } diff --git a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockchainSetupUtil.java b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockchainSetupUtil.java index 60b40c5f24b..44bb5d10075 100644 --- a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockchainSetupUtil.java +++ b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockchainSetupUtil.java @@ -142,7 +142,8 @@ private static ProtocolSchedule mainnetProtocolScheduleProvider( genesisConfigFile.getConfigOptions(), EvmConfiguration.DEFAULT, MiningParameters.newDefault(), - new BadBlockManager()); + new BadBlockManager(), + false); } private static ProtocolContext mainnetProtocolContextProvider( diff --git a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java index 3aa483e1a9e..0346ed74e04 100644 --- a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java +++ b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java @@ -142,7 +142,8 @@ public ExecutionContextTestFixture build() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); } if (blockchainKeyValueStorage == null) { diff --git a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ProtocolScheduleFixture.java b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ProtocolScheduleFixture.java index a4c6556ea34..d7f8089745c 100644 --- a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ProtocolScheduleFixture.java +++ b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ProtocolScheduleFixture.java @@ -39,7 +39,8 @@ public class ProtocolScheduleFixture { false, EvmConfiguration.DEFAULT, MiningParameters.newDefault(), - new BadBlockManager()); + new BadBlockManager(), + false); private static GenesisConfigOptions getMainnetConfigOptions() { // this method avoids reading all the alloc accounts when all we want is the "config" section diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java index d2d1fed8b73..ef90eb6267b 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java @@ -75,6 +75,7 @@ class BlockImportExceptionHandlingTest { Wei.ZERO, BlockHeader::getCoinbase, true, + false, protocolSchedule); private final BlockHeaderValidator blockHeaderValidator = mock(BlockHeaderValidator.class); private final BlockBodyValidator blockBodyValidator = mock(BlockBodyValidator.class); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedProtocolScheduleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedProtocolScheduleTest.java index adaf4c476b2..00e0d674845 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedProtocolScheduleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedProtocolScheduleTest.java @@ -36,7 +36,8 @@ public void reportedDifficultyForAllBlocksIsAFixedValue() { GenesisConfigFile.fromResource("/dev.json").getConfigOptions(), EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); final BlockHeaderTestFixture headerBuilder = new BlockHeaderTestFixture(); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java index 2a66c6e1151..aa4a47857d9 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java @@ -81,6 +81,7 @@ void baseSetup() { Wei.ZERO, BlockHeader::getCoinbase, true, + false, protocolSchedule); } @@ -141,6 +142,7 @@ protected TestBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, + final boolean isParallelPreloadTxEnabled, final ProtocolSchedule protocolSchedule) { super( transactionProcessor, @@ -148,6 +150,7 @@ protected TestBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, + isParallelPreloadTxEnabled, protocolSchedule); } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolScheduleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolScheduleTest.java index 9e4522912d7..db411523623 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolScheduleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolScheduleTest.java @@ -61,7 +61,8 @@ public void setup() { isRevertReasonEnabled, evmConfiguration, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); } @Test diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java index a06aece37bd..ea5795daabf 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java @@ -65,6 +65,7 @@ public void noAccountCreatedWhenBlockRewardIsZeroAndSkipped() { Wei.ZERO, BlockHeader::getCoinbase, true, + false, protocolSchedule); final MutableWorldState worldState = ReferenceTestWorldState.create(emptyMap()); @@ -91,6 +92,7 @@ public void accountCreatedWhenBlockRewardIsZeroAndNotSkipped() { Wei.ZERO, BlockHeader::getCoinbase, false, + false, protocolSchedule); final MutableWorldState worldState = ReferenceTestWorldState.create(emptyMap()); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolScheduleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolScheduleTest.java index fa8cda5cffc..b4b6f6539cc 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolScheduleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolScheduleTest.java @@ -73,7 +73,8 @@ public void shouldOnlyUseFrontierWhenEmptyJsonConfigIsUsed() { GenesisConfigFile.fromConfig("{}").getConfigOptions(), EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); Assertions.assertThat(sched.getByBlockHeader(blockHeader(1L)).getName()).isEqualTo("Frontier"); Assertions.assertThat(sched.getByBlockHeader(blockHeader(Long.MAX_VALUE)).getName()) .isEqualTo("Frontier"); @@ -88,7 +89,8 @@ public void createFromConfigWithSettings() { GenesisConfigFile.fromConfig(json).getConfigOptions(), EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); Assertions.assertThat(sched.getByBlockHeader(blockHeader(1)).getName()).isEqualTo("Frontier"); Assertions.assertThat(sched.getByBlockHeader(blockHeader(2)).getName()).isEqualTo("Homestead"); Assertions.assertThat(sched.getByBlockHeader(blockHeader(3)).getName()) @@ -120,7 +122,8 @@ public void outOfOrderConstantinoplesFail() { GenesisConfigFile.fromConfig(json).getConfigOptions(), EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager())); + new BadBlockManager(), + false)); } private BlockHeader blockHeader(final long number) { diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilderTest.java index c7be26039e3..e1fbd071180 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilderTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilderTest.java @@ -61,7 +61,8 @@ public void setup() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); } @Test @@ -216,7 +217,8 @@ private MilestoneStreamingProtocolSchedule createScheduleModifiedAt(final int bl false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); return new MilestoneStreamingProtocolSchedule( (DefaultProtocolSchedule) builder.createProtocolSchedule()); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetectorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetectorTest.java new file mode 100644 index 00000000000..38bbc48acf8 --- /dev/null +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetectorTest.java @@ -0,0 +1,294 @@ +/* + * 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.parallelization; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.spy; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.Transaction; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.BonsaiAccount; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldStateUpdateAccumulator; +import org.hyperledger.besu.ethereum.trie.diffbased.common.DiffBasedValue; +import org.hyperledger.besu.evm.internal.EvmConfiguration; + +import java.math.BigInteger; + +import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class TransactionCollisionDetectorTest { + + private TransactionCollisionDetector collisionDetector; + @Mock BonsaiWorldState worldState; + BonsaiWorldStateUpdateAccumulator bonsaiUpdater; + BonsaiWorldStateUpdateAccumulator trxUpdater; + + @BeforeEach + public void setUp() { + collisionDetector = new TransactionCollisionDetector(); + bonsaiUpdater = + new BonsaiWorldStateUpdateAccumulator( + worldState, (__, ___) -> {}, (__, ___) -> {}, EvmConfiguration.DEFAULT); + trxUpdater = + new BonsaiWorldStateUpdateAccumulator( + worldState, (__, ___) -> {}, (__, ___) -> {}, EvmConfiguration.DEFAULT); + } + + private Transaction createTransaction(final Address sender, final Address to) { + return new Transaction.Builder() + .nonce(1) + .gasPrice(Wei.of(1)) + .gasLimit(21000) + .to(to) + .value(Wei.ZERO) + .payload(Bytes.EMPTY) + .chainId(BigInteger.ONE) + .sender(sender) + .build(); + } + + private BonsaiAccount createAccount(final Address address) { + return new BonsaiAccount( + worldState, + address, + Hash.hash(Address.ZERO), + 0, + Wei.ONE, + Hash.EMPTY_TRIE_HASH, + Hash.EMPTY, + false); + } + + @Test + void testCollisionWithModifiedBalance() { + final Address address = Address.fromHexString("0x1"); + final BonsaiAccount priorAccountValue = createAccount(address); + final BonsaiAccount nextAccountValue = new BonsaiAccount(priorAccountValue, worldState, true); + nextAccountValue.setBalance(Wei.MAX_WEI); + + // Simulate that the address was already modified in the block + bonsaiUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, nextAccountValue)); + + final Transaction transaction = createTransaction(address, address); + + // Simulate that the address is read in the next transaction + trxUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, priorAccountValue)); + + boolean hasCollision = + collisionDetector.hasCollision( + transaction, + Address.ZERO, + new ParallelizedTransactionContext(trxUpdater, null, false, Wei.ZERO), + bonsaiUpdater); + + assertTrue(hasCollision, "Expected a collision with the modified address"); + } + + @Test + void testCollisionWithModifiedNonce() { + final Address address = Address.fromHexString("0x1"); + final BonsaiAccount priorAccountValue = createAccount(address); + final BonsaiAccount nextAccountValue = new BonsaiAccount(priorAccountValue, worldState, true); + nextAccountValue.setNonce(1); + + // Simulate that the address was already modified in the block + bonsaiUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, nextAccountValue)); + + final Transaction transaction = createTransaction(address, address); + + // Simulate that the address is read in the next transaction + trxUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, priorAccountValue)); + + boolean hasCollision = + collisionDetector.hasCollision( + transaction, + Address.ZERO, + new ParallelizedTransactionContext(trxUpdater, null, false, Wei.ZERO), + bonsaiUpdater); + + assertTrue(hasCollision, "Expected a collision with the modified address"); + } + + @Test + void testCollisionWithModifiedCode() { + final Address address = Address.fromHexString("0x1"); + final BonsaiAccount priorAccountValue = createAccount(address); + final BonsaiAccount nextAccountValue = new BonsaiAccount(priorAccountValue, worldState, true); + nextAccountValue.setCode(Bytes.repeat((byte) 0x01, 10)); + + // Simulate that the address was already modified in the block + bonsaiUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, nextAccountValue)); + + final Transaction transaction = createTransaction(address, address); + + // Simulate that the address is read in the next transaction + trxUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, priorAccountValue)); + + boolean hasCollision = + collisionDetector.hasCollision( + transaction, + Address.ZERO, + new ParallelizedTransactionContext(trxUpdater, null, false, Wei.ZERO), + bonsaiUpdater); + + assertTrue(hasCollision, "Expected a collision with the modified address"); + } + + @Test + void testCollisionWithModifiedStorageRoot() { + final Address address = Address.fromHexString("0x1"); + final BonsaiAccount priorAccountValue = createAccount(address); + final BonsaiAccount nextAccountValue = new BonsaiAccount(priorAccountValue, worldState, true); + nextAccountValue.setStorageRoot(Hash.EMPTY); + + // Simulate that the address was already modified in the block + bonsaiUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, nextAccountValue)); + + final Transaction transaction = createTransaction(address, address); + + // Simulate that the address is read in the next transaction + trxUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, priorAccountValue)); + + boolean hasCollision = + collisionDetector.hasCollision( + transaction, + Address.ZERO, + new ParallelizedTransactionContext(trxUpdater, null, false, Wei.ZERO), + bonsaiUpdater); + + assertTrue(hasCollision, "Expected a collision with the modified address"); + } + + @Test + void testCollisionWithMiningBeneficiaryAddress() { + final Address miningBeneficiary = Address.ZERO; + final Address address = Address.fromHexString("0x1"); + + final Transaction transaction = createTransaction(miningBeneficiary, address); + + boolean hasCollision = + collisionDetector.hasCollision( + transaction, + miningBeneficiary, + new ParallelizedTransactionContext(trxUpdater, null, false, Wei.ZERO), + bonsaiUpdater); + + assertTrue(hasCollision, "Expected collision with the mining beneficiary address as sender"); + } + + @Test + void testCollisionWithAnotherMiningBeneficiaryAddress() { + final Address miningBeneficiary = Address.ZERO; + final Address address = Address.fromHexString("0x1"); + final BonsaiAccount miningBeneficiaryValue = createAccount(address); + + final Transaction transaction = createTransaction(address, address); + + // Simulate that the mining beneficiary is read in the next transaction + trxUpdater + .getAccountsToUpdate() + .put( + miningBeneficiary, + new DiffBasedValue<>(miningBeneficiaryValue, miningBeneficiaryValue)); + + boolean hasCollision = + collisionDetector.hasCollision( + transaction, + miningBeneficiary, + new ParallelizedTransactionContext(trxUpdater, null, true, Wei.ZERO), + bonsaiUpdater); + + assertTrue(hasCollision, "Expected collision with the read mining beneficiary address"); + } + + @Test + void testCollisionWithDeletedAddress() { + final Address address = Address.fromHexString("0x1"); + final BonsaiAccount accountValue = createAccount(address); + + // Simulate that the address was deleted in the block + bonsaiUpdater.getDeletedAccountAddresses().add(address); + + final Transaction transaction = createTransaction(address, address); + final BonsaiWorldStateUpdateAccumulator trxUpdater = + spy( + new BonsaiWorldStateUpdateAccumulator( + worldState, (__, ___) -> {}, (__, ___) -> {}, EvmConfiguration.DEFAULT)); + // Simulate that the deleted address is read in the next transaction + trxUpdater.getAccountsToUpdate().put(address, new DiffBasedValue<>(accountValue, accountValue)); + + boolean hasCollision = + collisionDetector.hasCollision( + transaction, + Address.ZERO, + new ParallelizedTransactionContext(trxUpdater, null, false, Wei.ZERO), + bonsaiUpdater); + + assertTrue(hasCollision, "Expected a collision with the deleted address"); + } + + @Test + void testCollisionWithNoModifiedAddress() { + final Address address = Address.fromHexString("0x1"); + final BonsaiAccount priorAccountValue = createAccount(address); + + // Simulate that the address was already read in the block + bonsaiUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, priorAccountValue)); + + final Transaction transaction = createTransaction(address, address); + + // Simulate that the address is read in the next transaction + trxUpdater + .getAccountsToUpdate() + .put(address, new DiffBasedValue<>(priorAccountValue, priorAccountValue)); + + boolean hasCollision = + collisionDetector.hasCollision( + transaction, + Address.ZERO, + new ParallelizedTransactionContext(trxUpdater, null, false, Wei.ZERO), + bonsaiUpdater); + + assertFalse(hasCollision, "Expected no collision with the read address"); + } +} diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/AbstractIsolationTests.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/AbstractIsolationTests.java index 845b859ef73..998df3a7f05 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/AbstractIsolationTests.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/AbstractIsolationTests.java @@ -105,7 +105,8 @@ public abstract class AbstractIsolationTests { MainnetProtocolSchedule.fromConfig( GenesisConfigFile.fromResource("/dev.json").getConfigOptions(), MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); protected final GenesisState genesisState = GenesisState.fromConfig(GenesisConfigFile.fromResource("/dev.json"), protocolSchedule); protected final MutableBlockchain blockchain = createInMemoryBlockchain(genesisState.getBlock()); diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java index 4d62c314ae3..4eca0033444 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java @@ -125,7 +125,8 @@ private static ProtocolSchedule createSchedule(final GenesisConfigOptions option false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); } diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java index 99210f57d29..83bb8b6d894 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java @@ -55,6 +55,7 @@ public ProtocolSpec getByBlockHeader(final ProcessableBlockHeader blockHeader) { Wei.ZERO, original.getMiningBeneficiaryCalculator(), original.isSkipZeroBlockRewards(), + original.isParallelPreloadTxEnabled(), delegate); final BlockValidator noRewardBlockValidator = new MainnetBlockValidator( @@ -82,6 +83,7 @@ public ProtocolSpec getByBlockHeader(final ProcessableBlockHeader blockHeader) { original.getMiningBeneficiaryCalculator(), original.getPrecompileContractRegistry(), original.isSkipZeroBlockRewards(), + original.isParallelPreloadTxEnabled(), original.getGasCalculator(), original.getGasLimitCalculator(), original.getFeeMarket(), diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java index eb43f96dfb9..1e88f885230 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java @@ -158,7 +158,11 @@ private boolean buildContext( JsonUtil.getObjectNode(genesisConfig, "config").get()); protocolSchedule = MainnetProtocolSchedule.fromConfig( - jsonGenesisConfigOptions, EvmConfiguration.DEFAULT, miningParameters, badBlockManager); + jsonGenesisConfigOptions, + EvmConfiguration.DEFAULT, + miningParameters, + badBlockManager, + false); if ("NoReward".equalsIgnoreCase(sealEngine)) { protocolSchedule = new NoRewardProtocolScheduleWrapper(protocolSchedule, badBlockManager); } From 7ec17b6080a77f96a801135c3f90ea13d700cd07 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 10 Jul 2024 10:19:56 +0200 Subject: [PATCH 20/35] clean code Signed-off-by: Karim Taam --- .../org/hyperledger/besu/cli/BesuCommand.java | 3 +- .../options/stable/DataStorageOptions.java | 12 +- .../controller/BesuControllerBuilder.java | 7 +- .../CliqueBesuControllerBuilder.java | 2 +- .../controller/IbftBesuControllerBuilder.java | 2 +- .../MainnetBesuControllerBuilder.java | 2 +- .../MergeBesuControllerBuilder.java | 2 +- .../controller/QbftBesuControllerBuilder.java | 2 +- .../besu/cli/CommandTestAbstract.java | 2 +- .../clique/CliqueProtocolSchedule.java | 8 +- .../bft/BaseBftProtocolScheduleBuilder.java | 4 +- .../BaseBftProtocolScheduleBuilderTest.java | 3 +- .../ibft/IbftProtocolScheduleBuilder.java | 8 +- .../merge/MergeProtocolSchedule.java | 8 +- .../merge/TransitionProtocolSchedule.java | 10 +- .../qbft/QbftProtocolScheduleBuilder.java | 12 +- .../FixedDifficultyProtocolSchedule.java | 12 +- .../mainnet/AbstractBlockProcessor.java | 29 ++--- .../mainnet/ClassicBlockProcessor.java | 4 +- .../mainnet/ClassicProtocolSpecs.java | 78 +++++-------- .../mainnet/MainnetBlockProcessor.java | 4 +- .../mainnet/MainnetProtocolSchedule.java | 18 +-- .../mainnet/MainnetProtocolSpecFactory.java | 103 ++++++------------ .../mainnet/MainnetProtocolSpecs.java | 101 ++++++++--------- .../mainnet/ProtocolScheduleBuilder.java | 18 +-- .../besu/ethereum/mainnet/ProtocolSpec.java | 12 +- .../ethereum/mainnet/ProtocolSpecBuilder.java | 12 +- ...lelizedConcurrentTransactionProcessor.java | 17 +-- ... => NoopBonsaiCachedMerkleTrieLoader.java} | 12 +- .../DiffBasedWorldStateUpdateAccumulator.java | 29 ++++- .../worldstate/DataStorageConfiguration.java | 2 +- .../mainnet/AbstractBlockProcessorTest.java | 4 +- .../mainnet/DifficultyCalculatorTests.java | 28 ++--- .../NoRewardProtocolScheduleWrapper.java | 4 +- 34 files changed, 267 insertions(+), 307 deletions(-) rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/{LazyBonsaiCachedMerkleTrieLoader.java => NoopBonsaiCachedMerkleTrieLoader.java} (86%) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index ba329c5e9be..5bbaf950eae 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -1905,8 +1905,7 @@ public BesuControllerBuilder getControllerBuilder() { .pkiBlockCreationConfiguration(maybePkiBlockCreationConfiguration()) .clock(Clock.systemUTC()) .isRevertReasonEnabled(isRevertReasonEnabled) - .isParallelPreloadTxEnabled( - dataStorageConfiguration.getUnstable().isParallelPreloadTxEnabled()) + .isParallelTxEnabled(dataStorageConfiguration.getUnstable().isParallelTxEnabled()) .storageProvider(storageProvider) .gasLimitCalculator( miningParametersSupplier.get().getTargetGasLimit().isPresent() diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java index 9aadfa47bc2..788ddb1b8f6 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java @@ -124,11 +124,11 @@ public static class Unstable { @CommandLine.Option( hidden = true, - names = {"--Xbonsai-parallel-preload-tx-enabled"}, + names = {"--Xbonsai-parallel-tx-enabled"}, arity = "1", description = - "Enables parallel preloading of transactions to optimize processing speed by concurrently loading and executing necessary data in advance. (default: ${DEFAULT-VALUE})") - private Boolean isParallelPreloadTxEnabled = false; + "Enables parallelization of transactions to optimize processing speed by concurrently loading and executing necessary data in advance. (default: ${DEFAULT-VALUE})") + private Boolean isParallelTxEnabled = false; /** Default Constructor. */ Unstable() {} @@ -188,7 +188,7 @@ public void validate(final CommandLine commandLine, final SyncMode syncMode) { } } } else { - if (unstableOptions.isParallelPreloadTxEnabled) { + if (unstableOptions.isParallelTxEnabled) { throw new CommandLine.ParameterException( commandLine, "Transaction parallelization is not supported unless operating in a 'diffbased' mode, such as Bonsai."); @@ -214,8 +214,8 @@ public static DataStorageOptions fromConfig(final DataStorageConfiguration domai domainObject.getUnstable().getBonsaiFullFlatDbEnabled(); dataStorageOptions.unstableOptions.bonsaiCodeUsingCodeHashEnabled = domainObject.getUnstable().getBonsaiCodeStoredByCodeHashEnabled(); - dataStorageOptions.unstableOptions.isParallelPreloadTxEnabled = - domainObject.getUnstable().isParallelPreloadTxEnabled(); + dataStorageOptions.unstableOptions.isParallelTxEnabled = + domainObject.getUnstable().isParallelTxEnabled(); return dataStorageOptions; } diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java index 742b48fd2fb..f6e4cc1d4b8 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -208,7 +208,7 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides private int numberOfBlocksToCache = 0; - protected boolean isParallelPreloadTxEnabled; + protected boolean isParallelTxEnabled; /** Instantiates a new Besu controller builder. */ protected BesuControllerBuilder() {} @@ -531,9 +531,8 @@ public BesuControllerBuilder randomPeerPriority(final Boolean randomPeerPriority return this; } - public BesuControllerBuilder isParallelPreloadTxEnabled( - final boolean isParallelPreloadTxEnabled) { - this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; + public BesuControllerBuilder isParallelTxEnabled(final boolean isParallelTxEnabled) { + this.isParallelTxEnabled = isParallelTxEnabled; return this; } diff --git a/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java index 2b879a958d4..d9c6bdab7c8 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java @@ -137,7 +137,7 @@ protected ProtocolSchedule createProtocolSchedule() { evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java index a3885250c75..c876939ad54 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java @@ -292,7 +292,7 @@ protected ProtocolSchedule createProtocolSchedule() { evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java index 8f74300747e..38bac0df023 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java @@ -100,7 +100,7 @@ protected ProtocolSchedule createProtocolSchedule() { evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java index c342adfe6b1..c0dc1428159 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java @@ -178,7 +178,7 @@ protected ProtocolSchedule createProtocolSchedule() { isRevertReasonEnabled, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java index 03cc044abbb..5ae6f898b50 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java @@ -336,7 +336,7 @@ protected ProtocolSchedule createProtocolSchedule() { evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } @Override diff --git a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java index 3e75b99d3d7..a45729b2bb2 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java @@ -303,7 +303,7 @@ public void initMocks() throws Exception { when(mockControllerBuilder.cacheLastBlocks(any())).thenReturn(mockControllerBuilder); when(mockControllerBuilder.genesisStateHashCacheEnabled(any())) .thenReturn(mockControllerBuilder); - when(mockControllerBuilder.isParallelPreloadTxEnabled(false)).thenReturn(mockControllerBuilder); + when(mockControllerBuilder.isParallelTxEnabled(false)).thenReturn(mockControllerBuilder); // doReturn used because of generic BesuController doReturn(mockController).when(mockControllerBuilder).build(); diff --git a/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java b/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java index 80388281e45..afd1160ce58 100644 --- a/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java +++ b/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java @@ -75,7 +75,7 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { final CliqueConfigOptions cliqueConfig = config.getCliqueConfigOptions(); @@ -112,7 +112,7 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .createProtocolSchedule(); } @@ -137,7 +137,7 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return create( config, forksSchedule, @@ -147,7 +147,7 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } private static ProtocolSpecBuilder applyCliqueSpecificModifications( diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java index 439e6c35bd2..807c6279dd6 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java @@ -69,7 +69,7 @@ public BftProtocolSchedule createProtocolSchedule( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { final Map> specMap = new HashMap<>(); forksSchedule @@ -92,7 +92,7 @@ public BftProtocolSchedule createProtocolSchedule( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .createProtocolSchedule(); return new BftProtocolSchedule((DefaultProtocolSchedule) protocolSchedule); } diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java index 9b05bd7a365..9cc77f75dc9 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java @@ -245,7 +245,8 @@ protected BlockHeaderValidator.Builder createBlockHeaderRuleset( bftExtraDataCodec, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); } private BftConfigOptions createBftConfig(final BigInteger blockReward) { diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java index 0412565188d..5edfe0f2642 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java @@ -57,7 +57,7 @@ public static BftProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return new IbftProtocolScheduleBuilder() .createProtocolSchedule( config, @@ -68,7 +68,7 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } /** @@ -89,7 +89,7 @@ public static BftProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return create( config, forksSchedule, @@ -99,7 +99,7 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } @Override diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java index a5f55b6f0b7..b45448a1721 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java @@ -56,14 +56,14 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return create( config, PrivacyParameters.DEFAULT, isRevertReasonEnabled, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } /** @@ -82,7 +82,7 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { Map> postMergeModifications = new HashMap<>(); @@ -102,7 +102,7 @@ public static ProtocolSchedule create( EvmConfiguration.DEFAULT, miningParameters, badBlockManager, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .createProtocolSchedule(); } diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java index 43ebcfdd9db..080e98f4c12 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java @@ -71,17 +71,13 @@ public static TransitionProtocolSchedule fromConfig( final GenesisConfigOptions genesisConfigOptions, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { ProtocolSchedule preMergeProtocolSchedule = MainnetProtocolSchedule.fromConfig( - genesisConfigOptions, miningParameters, badBlockManager, isParallelPreloadTxEnabled); + genesisConfigOptions, miningParameters, badBlockManager, isParallelTxEnabled); ProtocolSchedule postMergeProtocolSchedule = MergeProtocolSchedule.create( - genesisConfigOptions, - false, - miningParameters, - badBlockManager, - isParallelPreloadTxEnabled); + genesisConfigOptions, false, miningParameters, badBlockManager, isParallelTxEnabled); return new TransitionProtocolSchedule( preMergeProtocolSchedule, postMergeProtocolSchedule, PostMergeContext.get()); } diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java index daab7da7d63..abf66f4f442 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java @@ -61,7 +61,7 @@ public static BftProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return new QbftProtocolScheduleBuilder() .createProtocolSchedule( config, @@ -72,7 +72,7 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } /** @@ -93,7 +93,7 @@ public static BftProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return create( config, qbftForksSchedule, @@ -103,7 +103,7 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } /** @@ -124,7 +124,7 @@ public static ProtocolSchedule create( final BftExtraDataCodec bftExtraDataCodec, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return create( config, qbftForksSchedule, @@ -134,7 +134,7 @@ public static ProtocolSchedule create( EvmConfiguration.DEFAULT, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } @Override diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java index 3435985b351..9a95bb33b63 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java @@ -33,7 +33,7 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return new ProtocolScheduleBuilder( config, ProtocolSpecAdapters.create( @@ -45,7 +45,7 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .createProtocolSchedule(); } @@ -55,7 +55,7 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return create( config, PrivacyParameters.DEFAULT, @@ -63,7 +63,7 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public static ProtocolSchedule create( @@ -71,7 +71,7 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return create( config, PrivacyParameters.DEFAULT, @@ -79,6 +79,6 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } } 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 2c05d46b4f8..e5d6cd18d0f 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 @@ -69,7 +69,7 @@ TransactionReceipt create( static final int MAX_GENERATION = 6; protected final MainnetTransactionProcessor transactionProcessor; - private final boolean isParallelPreloadTxEnabled; + private final boolean isParallelTxEnabled; protected final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory; @@ -86,10 +86,10 @@ protected AbstractBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final boolean isParallelPreloadTxEnabled, + final boolean isParallelTxEnabled, final ProtocolSchedule protocolSchedule) { this.transactionProcessor = transactionProcessor; - this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; + this.isParallelTxEnabled = isParallelTxEnabled; this.transactionReceiptFactory = transactionReceiptFactory; this.blockReward = blockReward; this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; @@ -130,17 +130,17 @@ public BlockProcessingResult processBlock( calculateExcessBlobGasForParent(protocolSpec, parentHeader))) .orElse(Wei.ZERO); - Optional preloadConcurrentTransactionProcessor = - Optional.empty(); - if (isParallelPreloadTxEnabled) { + Optional + parallelizedConcurrentTransactionProcessor = Optional.empty(); + if (isParallelTxEnabled) { if ((worldState instanceof DiffBasedWorldState)) { - preloadConcurrentTransactionProcessor = + parallelizedConcurrentTransactionProcessor = Optional.of(new ParallelizedConcurrentTransactionProcessor(transactionProcessor)); - // runAsyncPreloadBlock, if activated, facilitates the non-blocking parallel execution of + // runAsyncBlock, if activated, facilitates the non-blocking parallel execution of // transactions in the background through an optimistic strategy. - preloadConcurrentTransactionProcessor + parallelizedConcurrentTransactionProcessor .get() - .runAsyncPreloadBlock( + .runAsyncBlock( worldState, blockHeader, transactions, @@ -160,13 +160,14 @@ public BlockProcessingResult processBlock( TransactionProcessingResult transactionProcessingResult = null; - if (isParallelPreloadTxEnabled && preloadConcurrentTransactionProcessor.isPresent()) { - // applyPreloadBlockResult, if activated, fetch the results of transactions processed by + if (isParallelTxEnabled && parallelizedConcurrentTransactionProcessor.isPresent()) { + // applyParallelizedTransactionResult, if activated, fetch the results of transactions + // processed by // background threads. transactionProcessingResult = - preloadConcurrentTransactionProcessor + parallelizedConcurrentTransactionProcessor .get() - .applyPreloadBlockResult(worldState, miningBeneficiary, transaction, i) + .applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, i) .orElse(null); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java index 1a0c6315079..c14877e20ac 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java @@ -41,7 +41,7 @@ public ClassicBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final boolean isParallelPreloadTxEnabled, + final boolean isParallelTxEnabled, final OptionalLong eraLen, final ProtocolSchedule protocolSchedule) { super( @@ -50,7 +50,7 @@ public ClassicBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - isParallelPreloadTxEnabled, + isParallelTxEnabled, protocolSchedule); eraLength = eraLen.orElse(DEFAULT_ERA_LENGTH); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java index 6b01c6e88b8..03092ab7fee 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java @@ -54,8 +54,8 @@ private ClassicProtocolSpecs() { } public static ProtocolSpecBuilder classicRecoveryInitDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled) + final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelTxEnabled) .blockHeaderValidatorBuilder( feeMarket -> MainnetBlockHeaderValidator.createClassicValidator()) .name("ClassicRecoveryInit"); @@ -64,8 +64,8 @@ public static ProtocolSpecBuilder classicRecoveryInitDefinition( public static ProtocolSpecBuilder tangerineWhistleDefinition( final Optional chainId, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelTxEnabled) .isReplayProtectionSupported(true) .gasCalculator(TangerineWhistleGasCalculator::new) .transactionValidatorFactoryBuilder( @@ -78,8 +78,8 @@ public static ProtocolSpecBuilder tangerineWhistleDefinition( public static ProtocolSpecBuilder dieHardDefinition( final Optional chainId, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return tangerineWhistleDefinition(chainId, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return tangerineWhistleDefinition(chainId, evmConfiguration, isParallelTxEnabled) .gasCalculator(DieHardGasCalculator::new) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_PAUSED) .name("DieHard"); @@ -89,8 +89,8 @@ public static ProtocolSpecBuilder gothamDefinition( final Optional chainId, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return dieHardDefinition(chainId, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return dieHardDefinition(chainId, evmConfiguration, isParallelTxEnabled) .blockReward(MAX_BLOCK_REWARD) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_DELAYED) .blockProcessorBuilder( @@ -99,7 +99,7 @@ public static ProtocolSpecBuilder gothamDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - parallelPreloadTxEnabled, + parallelTxEnabled, protocolSchedule) -> new ClassicBlockProcessor( transactionProcessor, @@ -107,7 +107,7 @@ public static ProtocolSpecBuilder gothamDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - parallelPreloadTxEnabled, + parallelTxEnabled, ecip1017EraRounds, protocolSchedule)) .name("Gotham"); @@ -117,9 +117,8 @@ public static ProtocolSpecBuilder defuseDifficultyBombDefinition( final Optional chainId, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return gothamDefinition( - chainId, ecip1017EraRounds, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_REMOVED) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -133,9 +132,8 @@ public static ProtocolSpecBuilder atlantisDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return gothamDefinition( - chainId, ecip1017EraRounds, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) .evmBuilder(MainnetEVMs::byzantium) .evmConfiguration(evmConfiguration) .gasCalculator(SpuriousDragonGasCalculator::new) @@ -175,13 +173,9 @@ public static ProtocolSpecBuilder aghartaDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return atlantisDefinition( - chainId, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled) + chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) .evmBuilder(MainnetEVMs::constantinople) .gasCalculator(PetersburgGasCalculator::new) .evmBuilder(MainnetEVMs::constantinople) @@ -194,13 +188,9 @@ public static ProtocolSpecBuilder phoenixDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return aghartaDefinition( - chainId, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled) + chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) .gasCalculator(IstanbulGasCalculator::new) .evmBuilder( (gasCalculator, evmConfig) -> @@ -215,13 +205,9 @@ public static ProtocolSpecBuilder thanosDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return phoenixDefinition( - chainId, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled) + chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) .blockHeaderValidatorBuilder( feeMarket -> MainnetBlockHeaderValidator.createPgaBlockHeaderValidator( @@ -258,13 +244,9 @@ public static ProtocolSpecBuilder magnetoDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return thanosDefinition( - chainId, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled) + chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) .gasCalculator(BerlinGasCalculator::new) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -286,13 +268,9 @@ public static ProtocolSpecBuilder mystiqueDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return magnetoDefinition( - chainId, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled) + chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) .gasCalculator(LondonGasCalculator::new) .contractCreationProcessorBuilder( evm -> @@ -306,13 +284,9 @@ public static ProtocolSpecBuilder spiralDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return mystiqueDefinition( - chainId, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled) + chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) // EIP-3860 .gasCalculator(ShanghaiGasCalculator::new) // EIP-3855 diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java index dfbbe2bc28b..603ca089b08 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java @@ -36,7 +36,7 @@ public MainnetBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final boolean isParallelPreloadTxEnabled, + final boolean isParallelTxEnabled, final ProtocolSchedule protocolSchedule) { super( transactionProcessor, @@ -44,7 +44,7 @@ public MainnetBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - isParallelPreloadTxEnabled, + isParallelTxEnabled, protocolSchedule); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java index e09efd886bd..2cffc6de311 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java @@ -49,7 +49,7 @@ public static ProtocolSchedule fromConfig( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { if (FixedDifficultyCalculators.isFixedDifficultyInConfig(config)) { return FixedDifficultyProtocolSchedule.create( config, @@ -58,7 +58,7 @@ public static ProtocolSchedule fromConfig( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } return new ProtocolScheduleBuilder( config, @@ -69,7 +69,7 @@ public static ProtocolSchedule fromConfig( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .createProtocolSchedule(); } @@ -90,7 +90,7 @@ public static ProtocolSchedule fromConfig( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return fromConfig( config, PrivacyParameters.DEFAULT, @@ -98,7 +98,7 @@ public static ProtocolSchedule fromConfig( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } /** @@ -116,7 +116,7 @@ public static ProtocolSchedule fromConfig( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return fromConfig( config, PrivacyParameters.DEFAULT, @@ -124,7 +124,7 @@ public static ProtocolSchedule fromConfig( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } /** @@ -140,7 +140,7 @@ public static ProtocolSchedule fromConfig( final GenesisConfigOptions config, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return fromConfig( config, PrivacyParameters.DEFAULT, @@ -148,6 +148,6 @@ public static ProtocolSchedule fromConfig( EvmConfiguration.DEFAULT, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java index 3743a360431..d86fcbee921 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java @@ -30,7 +30,7 @@ public class MainnetProtocolSpecFactory { private final EvmConfiguration evmConfiguration; private final MiningParameters miningParameters; - private final boolean isParallelPreloadTxEnabled; + private final boolean isParallelTxEnabled; public MainnetProtocolSpecFactory( final Optional chainId, @@ -38,71 +38,69 @@ public MainnetProtocolSpecFactory( final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { this.chainId = chainId; this.isRevertReasonEnabled = isRevertReasonEnabled; this.ecip1017EraRounds = ecip1017EraRounds; this.evmConfiguration = evmConfiguration; this.miningParameters = miningParameters; - this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; + this.isParallelTxEnabled = isParallelTxEnabled; } public ProtocolSpecBuilder frontierDefinition() { - return MainnetProtocolSpecs.frontierDefinition(evmConfiguration, isParallelPreloadTxEnabled); + return MainnetProtocolSpecs.frontierDefinition(evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder homesteadDefinition() { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled); + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder daoRecoveryInitDefinition() { - return MainnetProtocolSpecs.daoRecoveryInitDefinition( - evmConfiguration, isParallelPreloadTxEnabled); + return MainnetProtocolSpecs.daoRecoveryInitDefinition(evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder daoRecoveryTransitionDefinition() { return MainnetProtocolSpecs.daoRecoveryTransitionDefinition( - evmConfiguration, isParallelPreloadTxEnabled); + evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder tangerineWhistleDefinition() { - return MainnetProtocolSpecs.tangerineWhistleDefinition( - evmConfiguration, isParallelPreloadTxEnabled); + return MainnetProtocolSpecs.tangerineWhistleDefinition(evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder spuriousDragonDefinition() { return MainnetProtocolSpecs.spuriousDragonDefinition( - chainId, evmConfiguration, isParallelPreloadTxEnabled); + chainId, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder byzantiumDefinition() { return MainnetProtocolSpecs.byzantiumDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder constantinopleDefinition() { return MainnetProtocolSpecs.constantinopleDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder petersburgDefinition() { return MainnetProtocolSpecs.petersburgDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder istanbulDefinition() { return MainnetProtocolSpecs.istanbulDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder muirGlacierDefinition() { return MainnetProtocolSpecs.muirGlacierDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder berlinDefinition() { return MainnetProtocolSpecs.berlinDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder londonDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -112,7 +110,7 @@ public ProtocolSpecBuilder londonDefinition(final GenesisConfigOptions genesisCo genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolSpecBuilder arrowGlacierDefinition( @@ -123,7 +121,7 @@ public ProtocolSpecBuilder arrowGlacierDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolSpecBuilder grayGlacierDefinition( @@ -134,7 +132,7 @@ public ProtocolSpecBuilder grayGlacierDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolSpecBuilder parisDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -144,7 +142,7 @@ public ProtocolSpecBuilder parisDefinition(final GenesisConfigOptions genesisCon genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolSpecBuilder shanghaiDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -154,7 +152,7 @@ public ProtocolSpecBuilder shanghaiDefinition(final GenesisConfigOptions genesis genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolSpecBuilder cancunDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -164,7 +162,7 @@ public ProtocolSpecBuilder cancunDefinition(final GenesisConfigOptions genesisCo genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolSpecBuilder cancunEOFDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -174,7 +172,7 @@ public ProtocolSpecBuilder cancunEOFDefinition(final GenesisConfigOptions genesi genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolSpecBuilder pragueDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -184,7 +182,7 @@ public ProtocolSpecBuilder pragueDefinition(final GenesisConfigOptions genesisCo genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolSpecBuilder pragueEOFDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -194,7 +192,7 @@ public ProtocolSpecBuilder pragueEOFDefinition(final GenesisConfigOptions genesi genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } /** @@ -215,7 +213,7 @@ public ProtocolSpecBuilder futureEipsDefinition(final GenesisConfigOptions genes genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } /** @@ -236,87 +234,58 @@ public ProtocolSpecBuilder experimentalEipsDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// // Classic Protocol Specs public ProtocolSpecBuilder dieHardDefinition() { - return ClassicProtocolSpecs.dieHardDefinition( - chainId, evmConfiguration, isParallelPreloadTxEnabled); + return ClassicProtocolSpecs.dieHardDefinition(chainId, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder gothamDefinition() { return ClassicProtocolSpecs.gothamDefinition( - chainId, ecip1017EraRounds, evmConfiguration, isParallelPreloadTxEnabled); + chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder defuseDifficultyBombDefinition() { return ClassicProtocolSpecs.defuseDifficultyBombDefinition( - chainId, ecip1017EraRounds, evmConfiguration, isParallelPreloadTxEnabled); + chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder atlantisDefinition() { return ClassicProtocolSpecs.atlantisDefinition( - chainId, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder aghartaDefinition() { return ClassicProtocolSpecs.aghartaDefinition( - chainId, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder phoenixDefinition() { return ClassicProtocolSpecs.phoenixDefinition( - chainId, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder thanosDefinition() { return ClassicProtocolSpecs.thanosDefinition( - chainId, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder magnetoDefinition() { return ClassicProtocolSpecs.magnetoDefinition( - chainId, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder mystiqueDefinition() { return ClassicProtocolSpecs.mystiqueDefinition( - chainId, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } public ProtocolSpecBuilder spiralDefinition() { return ClassicProtocolSpecs.spiralDefinition( - chainId, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration, - isParallelPreloadTxEnabled); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index b6564bb631f..f44ef21a7fe 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -102,7 +102,7 @@ public abstract class MainnetProtocolSpecs { private MainnetProtocolSpecs() {} public static ProtocolSpecBuilder frontierDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { + final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { return new ProtocolSpecBuilder() .gasCalculator(FrontierGasCalculator::new) .gasLimitCalculatorBuilder(feeMarket -> new FrontierTargetingGasLimitCalculator()) @@ -153,7 +153,7 @@ public static ProtocolSpecBuilder frontierDefinition( .transactionReceiptFactory(MainnetProtocolSpecs::frontierTransactionReceiptFactory) .blockReward(FRONTIER_BLOCK_REWARD) .skipZeroBlockRewards(false) - .isParallelPreloadTxEnabled(isParallelPreloadTxEnabled) + .isParallelTxEnabled(isParallelTxEnabled) .blockProcessorBuilder(MainnetBlockProcessor::new) .blockValidatorBuilder(MainnetProtocolSpecs.blockValidatorBuilder()) .blockImporterBuilder(MainnetBlockImporter::new) @@ -176,8 +176,8 @@ public static BlockValidatorBuilder blockValidatorBuilder() { } public static ProtocolSpecBuilder homesteadDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { - return frontierDefinition(evmConfiguration, isParallelPreloadTxEnabled) + final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { + return frontierDefinition(evmConfiguration, isParallelTxEnabled) .gasCalculator(HomesteadGasCalculator::new) .evmBuilder(MainnetEVMs::homestead) .contractCreationProcessorBuilder( @@ -193,8 +193,8 @@ public static ProtocolSpecBuilder homesteadDefinition( } public static ProtocolSpecBuilder daoRecoveryInitDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { - return homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled) + final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { + return homesteadDefinition(evmConfiguration, isParallelTxEnabled) .blockHeaderValidatorBuilder(feeMarket -> MainnetBlockHeaderValidator.createDaoValidator()) .blockProcessorBuilder( (transactionProcessor, @@ -202,7 +202,7 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - parallelPreloadTxEnabled, + parallelTxEnabled, protocolSchedule) -> new DaoBlockProcessor( new MainnetBlockProcessor( @@ -211,21 +211,21 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - parallelPreloadTxEnabled, + parallelTxEnabled, protocolSchedule))) .name("DaoRecoveryInit"); } public static ProtocolSpecBuilder daoRecoveryTransitionDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { - return daoRecoveryInitDefinition(evmConfiguration, isParallelPreloadTxEnabled) + final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { + return daoRecoveryInitDefinition(evmConfiguration, isParallelTxEnabled) .blockProcessorBuilder(MainnetBlockProcessor::new) .name("DaoRecoveryTransition"); } public static ProtocolSpecBuilder tangerineWhistleDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelPreloadTxEnabled) { - return homesteadDefinition(evmConfiguration, isParallelPreloadTxEnabled) + final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { + return homesteadDefinition(evmConfiguration, isParallelTxEnabled) .gasCalculator(TangerineWhistleGasCalculator::new) .name("TangerineWhistle"); } @@ -233,8 +233,8 @@ public static ProtocolSpecBuilder tangerineWhistleDefinition( public static ProtocolSpecBuilder spuriousDragonDefinition( final Optional chainId, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return tangerineWhistleDefinition(evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return tangerineWhistleDefinition(evmConfiguration, isParallelTxEnabled) .isReplayProtectionSupported(true) .gasCalculator(SpuriousDragonGasCalculator::new) .skipZeroBlockRewards(true) @@ -279,8 +279,8 @@ public static ProtocolSpecBuilder byzantiumDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return spuriousDragonDefinition(chainId, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return spuriousDragonDefinition(chainId, evmConfiguration, isParallelTxEnabled) .gasCalculator(ByzantiumGasCalculator::new) .evmBuilder(MainnetEVMs::byzantium) .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::byzantium) @@ -310,9 +310,8 @@ public static ProtocolSpecBuilder constantinopleDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return byzantiumDefinition( - chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return byzantiumDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) .difficultyCalculator(MainnetDifficultyCalculators.CONSTANTINOPLE) .gasCalculator(ConstantinopleGasCalculator::new) .evmBuilder(MainnetEVMs::constantinople) @@ -324,9 +323,9 @@ public static ProtocolSpecBuilder petersburgDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return constantinopleDefinition( - chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) + chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) .gasCalculator(PetersburgGasCalculator::new) .name("Petersburg"); } @@ -335,9 +334,8 @@ public static ProtocolSpecBuilder istanbulDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return petersburgDefinition( - chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return petersburgDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) .gasCalculator(IstanbulGasCalculator::new) .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -359,9 +357,8 @@ static ProtocolSpecBuilder muirGlacierDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return istanbulDefinition( - chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return istanbulDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) .difficultyCalculator(MainnetDifficultyCalculators.MUIR_GLACIER) .name("MuirGlacier"); } @@ -370,9 +367,8 @@ static ProtocolSpecBuilder berlinDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelPreloadTxEnabled) { - return muirGlacierDefinition( - chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) + final boolean isParallelTxEnabled) { + return muirGlacierDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) .gasCalculator(BerlinGasCalculator::new) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -395,7 +391,7 @@ static ProtocolSpecBuilder londonDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(Long.MAX_VALUE); final BaseFeeMarket londonFeeMarket; @@ -409,8 +405,7 @@ static ProtocolSpecBuilder londonDefinition( londonFeeMarket = FeeMarket.london(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); } - return berlinDefinition( - chainId, enableRevertReason, evmConfiguration, isParallelPreloadTxEnabled) + return berlinDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) .feeMarket(londonFeeMarket) .gasCalculator(LondonGasCalculator::new) .gasLimitCalculatorBuilder( @@ -476,14 +471,14 @@ static ProtocolSpecBuilder arrowGlacierDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return londonDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .difficultyCalculator(MainnetDifficultyCalculators.ARROW_GLACIER) .name("ArrowGlacier"); } @@ -494,14 +489,14 @@ static ProtocolSpecBuilder grayGlacierDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return arrowGlacierDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .difficultyCalculator(MainnetDifficultyCalculators.GRAY_GLACIER) .name("GrayGlacier"); } @@ -512,7 +507,7 @@ static ProtocolSpecBuilder parisDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return grayGlacierDefinition( chainId, @@ -520,7 +515,7 @@ static ProtocolSpecBuilder parisDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.paris(gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) @@ -538,14 +533,14 @@ static ProtocolSpecBuilder shanghaiDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return parisDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled) + isParallelTxEnabled) // gas calculator has new code to support EIP-3860 limit and meter initcode .gasCalculator(ShanghaiGasCalculator::new) // EVM has a new operation for EIP-3855 PUSH0 instruction @@ -595,7 +590,7 @@ static ProtocolSpecBuilder cancunDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(0L); final BaseFeeMarket cancunFeeMarket; if (genesisConfigOptions.isZeroBaseFee()) { @@ -615,7 +610,7 @@ static ProtocolSpecBuilder cancunDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .feeMarket(cancunFeeMarket) // gas calculator for EIP-4844 blob gas .gasCalculator(CancunGasCalculator::new) @@ -673,7 +668,7 @@ static ProtocolSpecBuilder cancunEOFDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { ProtocolSpecBuilder protocolSpecBuilder = cancunDefinition( @@ -682,7 +677,7 @@ static ProtocolSpecBuilder cancunEOFDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); return addEOF(chainId, evmConfiguration, protocolSpecBuilder).name("CancunEOF"); } @@ -692,7 +687,7 @@ static ProtocolSpecBuilder pragueDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { final Address depositContractAddress = genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS); @@ -703,7 +698,7 @@ static ProtocolSpecBuilder pragueDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled) + isParallelTxEnabled) // EIP-3074 AUTH and AUTCALL gas .gasCalculator(PragueGasCalculator::new) // EIP-3074 AUTH and AUTCALL @@ -731,7 +726,7 @@ static ProtocolSpecBuilder pragueEOFDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { ProtocolSpecBuilder protocolSpecBuilder = pragueDefinition( @@ -740,7 +735,7 @@ static ProtocolSpecBuilder pragueEOFDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); return addEOF(chainId, evmConfiguration, protocolSpecBuilder).name("PragueEOF"); } @@ -773,14 +768,14 @@ static ProtocolSpecBuilder futureEipsDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return pragueEOFDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled) + isParallelTxEnabled) // Use Future EIP configured EVM .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -806,7 +801,7 @@ static ProtocolSpecBuilder experimentalEipsDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { return futureEipsDefinition( chainId, @@ -814,7 +809,7 @@ static ProtocolSpecBuilder experimentalEipsDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelPreloadTxEnabled) + isParallelTxEnabled) .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.experimentalEips( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java index 7c5ca82b89c..6147cf332af 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java @@ -46,7 +46,7 @@ public class ProtocolScheduleBuilder { private final MiningParameters miningParameters; private final BadBlockManager badBlockManager; - private final boolean isParallelPreloadTxEnabled; + private final boolean isParallelTxEnabled; public ProtocolScheduleBuilder( final GenesisConfigOptions config, @@ -57,7 +57,7 @@ public ProtocolScheduleBuilder( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { this( config, Optional.of(defaultChainId), @@ -67,7 +67,7 @@ public ProtocolScheduleBuilder( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } public ProtocolScheduleBuilder( @@ -78,7 +78,7 @@ public ProtocolScheduleBuilder( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { this( config, Optional.empty(), @@ -88,7 +88,7 @@ public ProtocolScheduleBuilder( evmConfiguration, miningParameters, badBlockManager, - isParallelPreloadTxEnabled); + isParallelTxEnabled); } private ProtocolScheduleBuilder( @@ -100,7 +100,7 @@ private ProtocolScheduleBuilder( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelPreloadTxEnabled) { + final boolean isParallelTxEnabled) { this.config = config; this.protocolSpecAdapters = protocolSpecAdapters; this.privacyParameters = privacyParameters; @@ -109,7 +109,7 @@ private ProtocolScheduleBuilder( this.defaultChainId = defaultChainId; this.miningParameters = miningParameters; this.badBlockManager = badBlockManager; - this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; + this.isParallelTxEnabled = isParallelTxEnabled; } public ProtocolSchedule createProtocolSchedule() { @@ -130,7 +130,7 @@ private void initSchedule( evmConfiguration.overrides( config.getContractSizeLimit(), OptionalInt.empty(), config.getEvmStackSize()), miningParameters, - isParallelPreloadTxEnabled); + isParallelTxEnabled); validateForkOrdering(); @@ -213,7 +213,7 @@ private void initSchedule( BuilderMapEntry.MilestoneType.BLOCK_NUMBER, classicBlockNumber, ClassicProtocolSpecs.classicRecoveryInitDefinition( - evmConfiguration, isParallelPreloadTxEnabled), + evmConfiguration, isParallelTxEnabled), Function.identity()); protocolSchedule.putBlockNumberMilestone( classicBlockNumber + 1, originalProtocolSpec); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java index 0e7d9004819..9f41fc96491 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java @@ -70,7 +70,7 @@ public class ProtocolSpec { private final boolean skipZeroBlockRewards; - private final boolean isParallelPreloadTxEnabled; + private final boolean isParallelTxEnabled; private final PrivateTransactionProcessor privateTransactionProcessor; @@ -107,7 +107,7 @@ public class ProtocolSpec { * @param miningBeneficiaryCalculator determines to whom mining proceeds are paid * @param precompileContractRegistry all the pre-compiled contracts added * @param skipZeroBlockRewards should rewards be skipped if it is zero - * @param isParallelPreloadTxEnabled indicates whether parallel transaction preloading is enabled. + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @param gasCalculator the gas calculator to use. * @param gasLimitCalculator the gas limit calculator to use. * @param feeMarket an {@link Optional} wrapping {@link FeeMarket} class if appropriate. @@ -139,7 +139,7 @@ public ProtocolSpec( final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final PrecompileContractRegistry precompileContractRegistry, final boolean skipZeroBlockRewards, - final boolean isParallelPreloadTxEnabled, + final boolean isParallelTxEnabled, final GasCalculator gasCalculator, final GasLimitCalculator gasLimitCalculator, final FeeMarket feeMarket, @@ -169,7 +169,7 @@ public ProtocolSpec( this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; this.precompileContractRegistry = precompileContractRegistry; this.skipZeroBlockRewards = skipZeroBlockRewards; - this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; + this.isParallelTxEnabled = isParallelTxEnabled; this.gasCalculator = gasCalculator; this.gasLimitCalculator = gasLimitCalculator; this.feeMarket = feeMarket; @@ -324,8 +324,8 @@ public boolean isSkipZeroBlockRewards() { return skipZeroBlockRewards; } - public boolean isParallelPreloadTxEnabled() { - return isParallelPreloadTxEnabled; + public boolean isParallelTxEnabled() { + return isParallelTxEnabled; } public MiningBeneficiaryCalculator getMiningBeneficiaryCalculator() { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index 02e92dff06d..cb94ae53adc 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -72,7 +72,7 @@ public class ProtocolSpecBuilder { private BlockValidatorBuilder blockValidatorBuilder; private BlockImporterBuilder blockImporterBuilder; - private boolean isParallelPreloadTxEnabled = false; + private boolean isParallelTxEnabled = false; private String name; private MiningBeneficiaryCalculator miningBeneficiaryCalculator; private PrivacyParameters privacyParameters; @@ -146,8 +146,8 @@ public ProtocolSpecBuilder blockHeaderValidatorBuilder( return this; } - public ProtocolSpecBuilder isParallelPreloadTxEnabled(final boolean isParallelPreloadTxEnabled) { - this.isParallelPreloadTxEnabled = isParallelPreloadTxEnabled; + public ProtocolSpecBuilder isParallelTxEnabled(final boolean isParallelTxEnabled) { + this.isParallelTxEnabled = isParallelTxEnabled; return this; } @@ -402,7 +402,7 @@ public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { miningBeneficiaryCalculator, precompileContractRegistry, skipZeroBlockRewards, - isParallelPreloadTxEnabled, + isParallelTxEnabled, gasCalculator, gasLimitCalculator, feeMarket, @@ -460,7 +460,7 @@ private BlockProcessor createBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - isParallelPreloadTxEnabled, + isParallelTxEnabled, protocolSchedule); } @@ -500,7 +500,7 @@ BlockProcessor apply( Wei blockReward, MiningBeneficiaryCalculator miningBeneficiaryCalculator, boolean skipZeroBlockRewards, - final boolean isParallelPreloadTxEnabled, + final boolean isParallelTxEnabled, ProtocolSchedule protocolSchedule); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java index 73c512ff1fd..59163b77063 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java @@ -23,7 +23,7 @@ import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; -import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.LazyBonsaiCachedMerkleTrieLoader; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.NoopBonsaiCachedMerkleTrieLoader; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; @@ -47,7 +47,7 @@ * checks for potential conflicts among transactions to ensure data integrity before applying the * results to the world state. */ -@SuppressWarnings({"unchecked", "rawtypes", "unused"}) +@SuppressWarnings({"unchecked", "rawtypes"}) public class ParallelizedConcurrentTransactionProcessor { private static final int NCPU = Runtime.getRuntime().availableProcessors(); @@ -91,7 +91,7 @@ public ParallelizedConcurrentTransactionProcessor( * @param blobGasPrice Gas price for blob transactions. * @param privateMetadataUpdater Updater for private transaction metadata. */ - public void runAsyncPreloadBlock( + public void runAsyncBlock( final MutableWorldState worldState, final BlockHeader blockHeader, final List transactions, @@ -133,7 +133,7 @@ public void runTransaction( final Wei blobGasPrice, final PrivateMetadataUpdater privateMetadataUpdater) { final DiffBasedWorldState roundWorldState = - new BonsaiWorldState((BonsaiWorldState) worldState, new LazyBonsaiCachedMerkleTrieLoader()); + new BonsaiWorldState((BonsaiWorldState) worldState, new NoopBonsaiCachedMerkleTrieLoader()); final ParallelizedTransactionContext.Builder contextBuilder = new ParallelizedTransactionContext.Builder(); @@ -193,7 +193,8 @@ public void traceTransactionBeforeMiningReward( } /** - * Applies the results of preloaded transactions to the world state after checking for conflicts. + * Applies the results of parallelized transactions to the world state after checking for + * conflicts. * *

If a transaction was executed optimistically without any detected conflicts, its result is * directly applied to the world state. If there is a conflict, this method does not apply the @@ -210,7 +211,7 @@ public void traceTransactionBeforeMiningReward( * @return Optional containing the transaction processing result if applied, or empty if the * transaction needs to be replayed due to a conflict. */ - public Optional applyPreloadBlockResult( + public Optional applyParallelizedTransactionResult( final MutableWorldState worldState, final Address miningBeneficiary, final Transaction transaction, @@ -236,12 +237,12 @@ public Optional applyPreloadBlockResult( .getOrCreate(miningBeneficiary) .incrementBalance(parallelizedTransactionContext.miningBeneficiaryReward()); - blockAccumulator.cloneFromUpdaterWithPreloader(transactionAccumulator); + blockAccumulator.importStateChangesFromSource(transactionAccumulator); confirmedParallelizedTransaction++; return Optional.of(transactionProcessingResult); } else { - blockAccumulator.clonePriorFromUpdater(transactionAccumulator); + blockAccumulator.importPriorStateFromSource(transactionAccumulator); conflictingButCachedTransaction++; // If there is a conflict, we return an empty result to signal the block processor to // re-execute the transaction. diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/NoopBonsaiCachedMerkleTrieLoader.java similarity index 86% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/NoopBonsaiCachedMerkleTrieLoader.java index 44a5f82bc54..8f58e697fee 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/LazyBonsaiCachedMerkleTrieLoader.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/NoopBonsaiCachedMerkleTrieLoader.java @@ -20,9 +20,9 @@ import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; -public class LazyBonsaiCachedMerkleTrieLoader extends BonsaiCachedMerkleTrieLoader { +public class NoopBonsaiCachedMerkleTrieLoader extends BonsaiCachedMerkleTrieLoader { - public LazyBonsaiCachedMerkleTrieLoader() { + public NoopBonsaiCachedMerkleTrieLoader() { super(new NoOpMetricsSystem()); } @@ -30,11 +30,15 @@ public LazyBonsaiCachedMerkleTrieLoader() { public void preLoadAccount( final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, final Hash worldStateRootHash, - final Address account) {} + final Address account) { + // noop + } @Override public void preLoadStorageSlot( final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, final Address account, - final StorageSlotKey slotKey) {} + final StorageSlotKey slotKey) { + // noop + } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java index 0e5e2b4e2fe..c28bb731b5b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/accumulator/DiffBasedWorldStateUpdateAccumulator.java @@ -100,8 +100,17 @@ public void cloneFromUpdater(final DiffBasedWorldStateUpdateAccumulator this.isAccumulatorStateChanged = true; } - @SuppressWarnings("UseBulkOperation") - public void cloneFromUpdaterWithPreloader( + /** + * Integrates prior state changes from an external source into the current state. This method + * retrieves state modifications from the specified source and adds them to the current state's + * list of modifications. It does not remove any existing elements in the current state's + * modification list. If a modification has been made in both the current state and the source, + * the modification from the source will be taken. This approach ensures that the source's state + * changes are prioritized and overrides any conflicting changes in the current state. + * + * @param source The source accumulator + */ + public void importStateChangesFromSource( final DiffBasedWorldStateUpdateAccumulator source) { source .getAccountsToUpdate() @@ -143,12 +152,24 @@ public void cloneFromUpdaterWithPreloader( uInt256DiffBasedValue.getPrior(), uInt256DiffBasedValue.getUpdated())); }); }); - source.storageToClear.forEach(storageToClear::add); + storageToClear.addAll(source.storageToClear); this.isAccumulatorStateChanged = true; } - public void clonePriorFromUpdater(final DiffBasedWorldStateUpdateAccumulator source) { + /** + * Imports unchanged state data from an external source into the current state. This method + * focuses on integrating state data from the specified source that has been read but not + * modified. + * + *

The method ensures that only new, unmodified data from the source is added to the current + * state. If a state data has already been read or modified in the current state, it will not be + * added again to avoid overwriting any existing modifications. + * + * @param source The source accumulator + */ + public void importPriorStateFromSource( + final DiffBasedWorldStateUpdateAccumulator source) { source .getAccountsToUpdate() diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java index 05080de29ab..49657c6ec9e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java @@ -104,7 +104,7 @@ default boolean getBonsaiCodeStoredByCodeHashEnabled() { } @Value.Default - default boolean isParallelPreloadTxEnabled() { + default boolean isParallelTxEnabled() { return DEFAULT_PARALLEL_PRELOAD_TRX_ENABLED; } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java index aa4a47857d9..f8ed0352e04 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java @@ -142,7 +142,7 @@ protected TestBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final boolean isParallelPreloadTxEnabled, + final boolean isParallelTxEnabled, final ProtocolSchedule protocolSchedule) { super( transactionProcessor, @@ -150,7 +150,7 @@ protected TestBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - isParallelPreloadTxEnabled, + isParallelTxEnabled, protocolSchedule); } diff --git a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.java b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.java index 6377b1ae3ba..9ecc8526f66 100644 --- a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.java +++ b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.java @@ -59,64 +59,64 @@ public static Stream getTestParametersForConfig() throws IOException MainnetProtocolSchedule.fromConfig( GenesisConfigFile.mainnet() .getConfigOptions(postMergeOverrides), - EvmConfiguration.DEFAULT, MiningParameters.newDefault(), new BadBlockManager())), + EvmConfiguration.DEFAULT, MiningParameters.newDefault(), new BadBlockManager(), false)), Arguments.of( "/DifficultyTests/dfGrayGlacier/difficultyGrayGlacierForkBlock.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager()) + new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfGrayGlacier/difficultyGrayGlacierTimeDiff1.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager()) + new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfGrayGlacier/difficultyGrayGlacierTimeDiff2.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager()) + new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfArrowGlacier/difficultyArrowGlacierForkBlock.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager()) + new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfArrowGlacier/difficultyArrowGlacierTimeDiff1.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager()) + new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfArrowGlacier/difficultyArrowGlacierTimeDiff2.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager()) + new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfByzantium/difficultyByzantium.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().byzantiumBlock(0), MiningParameters.newDefault(), new BadBlockManager()) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().byzantiumBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfConstantinople/difficultyConstantinople.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().constantinopleBlock(0), MiningParameters.newDefault(), new BadBlockManager()) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().constantinopleBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfEIP2384/difficultyEIP2384.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager()) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfEIP2384/difficultyEIP2384_random.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager()) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfEIP2384/difficultyEIP2384_random_to20M.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager()) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfFrontier/difficultyFrontier.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions(), MiningParameters.newDefault(), new BadBlockManager()) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions(), MiningParameters.newDefault(), new BadBlockManager(), false) ), Arguments.of( "/DifficultyTests/dfHomestead/difficultyHomestead.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().homesteadBlock(0), MiningParameters.newDefault(), new BadBlockManager()) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().homesteadBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) )); } diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java index 83bb8b6d894..760b7985245 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java @@ -55,7 +55,7 @@ public ProtocolSpec getByBlockHeader(final ProcessableBlockHeader blockHeader) { Wei.ZERO, original.getMiningBeneficiaryCalculator(), original.isSkipZeroBlockRewards(), - original.isParallelPreloadTxEnabled(), + original.isParallelTxEnabled(), delegate); final BlockValidator noRewardBlockValidator = new MainnetBlockValidator( @@ -83,7 +83,7 @@ public ProtocolSpec getByBlockHeader(final ProcessableBlockHeader blockHeader) { original.getMiningBeneficiaryCalculator(), original.getPrecompileContractRegistry(), original.isSkipZeroBlockRewards(), - original.isParallelPreloadTxEnabled(), + original.isParallelTxEnabled(), original.getGasCalculator(), original.getGasLimitCalculator(), original.getFeeMarket(), From 69f36b618d3a0e61ba324cd502b804fc695a5795 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 10 Jul 2024 11:48:10 +0200 Subject: [PATCH 21/35] fix build Signed-off-by: Karim Taam --- .../clique/CliqueProtocolSchedule.java | 2 + .../bft/BaseBftProtocolScheduleBuilder.java | 1 + .../CombinedProtocolScheduleFactoryTest.java | 3 +- .../ibft/IbftProtocolScheduleBuilder.java | 2 + .../merge/MergeProtocolSchedule.java | 2 + .../merge/TransitionProtocolSchedule.java | 1 + .../qbft/QbftProtocolScheduleBuilder.java | 3 + .../mainnet/MainnetProtocolSchedule.java | 4 + ...lelizedConcurrentTransactionProcessor.java | 8 + .../ParallelizedTransactionContext.java | 2 +- ...zedConcurrentTransactionProcessorTest.java | 210 ++++++++++++++++++ .../TransactionCollisionDetectorTest.java | 6 +- .../evmtool/MainnetGenesisFileModule.java | 9 +- 13 files changed, 244 insertions(+), 9 deletions(-) create mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessorTest.java diff --git a/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java b/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java index afd1160ce58..a90cd067a5e 100644 --- a/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java +++ b/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java @@ -64,6 +64,7 @@ public class CliqueProtocolSchedule { * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public static ProtocolSchedule create( @@ -126,6 +127,7 @@ public static ProtocolSchedule create( * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ @VisibleForTesting diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java index 807c6279dd6..2a69ed8af3d 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java @@ -58,6 +58,7 @@ protected BaseBftProtocolScheduleBuilder() {} * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public BftProtocolSchedule createProtocolSchedule( diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java index 4e3cab78e7f..175b63a038c 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java @@ -177,7 +177,8 @@ private BftProtocolSchedule createProtocolSchedule( false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); return new BftProtocolSchedule( (DefaultProtocolSchedule) protocolScheduleBuilder.createProtocolSchedule()); diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java index 5edfe0f2642..f27ae074a88 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java @@ -46,6 +46,7 @@ protected IbftProtocolScheduleBuilder() {} * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public static BftProtocolSchedule create( @@ -80,6 +81,7 @@ public static BftProtocolSchedule create( * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public static BftProtocolSchedule create( diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java index b45448a1721..87798a34e68 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java @@ -49,6 +49,7 @@ public class MergeProtocolSchedule { * @param isRevertReasonEnabled the is revert reason enabled * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public static ProtocolSchedule create( @@ -74,6 +75,7 @@ public static ProtocolSchedule create( * @param isRevertReasonEnabled the is revert reason enabled * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public static ProtocolSchedule create( diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java index 080e98f4c12..34b21d9e498 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java @@ -65,6 +65,7 @@ public TransitionProtocolSchedule( * milestone starting points * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return an initialised TransitionProtocolSchedule using post-merge defaults */ public static TransitionProtocolSchedule fromConfig( diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java index abf66f4f442..c334583c52a 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java @@ -50,6 +50,7 @@ public class QbftProtocolScheduleBuilder extends BaseBftProtocolScheduleBuilder * @param evmConfiguration the evm configuration * @param miningParameters The mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public static BftProtocolSchedule create( @@ -84,6 +85,7 @@ public static BftProtocolSchedule create( * @param evmConfiguration the evm configuration * @param miningParameters The mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public static BftProtocolSchedule create( @@ -115,6 +117,7 @@ public static BftProtocolSchedule create( * @param bftExtraDataCodec the bft extra data codec * @param miningParameters The mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return the protocol schedule */ public static ProtocolSchedule create( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java index 2cffc6de311..38990eaca9e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java @@ -40,6 +40,7 @@ public class MainnetProtocolSchedule { * @param evmConfiguration how to configure the EVMs jumpdest cache * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return A configured mainnet protocol schedule */ public static ProtocolSchedule fromConfig( @@ -82,6 +83,7 @@ public static ProtocolSchedule fromConfig( * @param evmConfiguration how to configure the EVMs jumpdest cache * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return A configured mainnet protocol schedule */ public static ProtocolSchedule fromConfig( @@ -109,6 +111,7 @@ public static ProtocolSchedule fromConfig( * @param evmConfiguration size of * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return A configured mainnet protocol schedule */ public static ProtocolSchedule fromConfig( @@ -134,6 +137,7 @@ public static ProtocolSchedule fromConfig( * starting points * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @return A configured mainnet protocol schedule */ public static ProtocolSchedule fromConfig( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java index 59163b77063..55af102caed 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java @@ -75,6 +75,14 @@ public ParallelizedConcurrentTransactionProcessor( this.transactionCollisionDetector = new TransactionCollisionDetector(); } + @VisibleForTesting + public ParallelizedConcurrentTransactionProcessor( + final MainnetTransactionProcessor transactionProcessor, + final TransactionCollisionDetector transactionCollisionDetector) { + this.transactionProcessor = transactionProcessor; + this.transactionCollisionDetector = transactionCollisionDetector; + } + /** * Initiates the parallel and optimistic execution of transactions within a block by creating a * copy of the world state for each transaction. This method processes transactions in a diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java index 9f1458a2041..c9ff32bcb99 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java @@ -28,7 +28,7 @@ public static class Builder { private DiffBasedWorldStateUpdateAccumulator transactionAccumulator; private TransactionProcessingResult transactionProcessingResult; private boolean isMiningBeneficiaryTouchedPreRewardByTransaction; - private Wei miningBeneficiaryReward; + private Wei miningBeneficiaryReward = Wei.ZERO; public Builder transactionAccumulator( final DiffBasedWorldStateUpdateAccumulator transactionAccumulator) { diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessorTest.java new file mode 100644 index 00000000000..8c154031b4f --- /dev/null +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessorTest.java @@ -0,0 +1,210 @@ +/* + * 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.parallelization; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider; +import org.hyperledger.besu.ethereum.core.Transaction; +import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor; +import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; +import org.hyperledger.besu.ethereum.mainnet.ValidationResult; +import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; +import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; +import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.NoOpBonsaiCachedWorldStorageManager; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.NoopBonsaiCachedMerkleTrieLoader; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; +import org.hyperledger.besu.ethereum.trie.diffbased.common.trielog.NoOpTrieLogManager; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; +import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; +import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.evm.operation.BlockHashOperation; +import org.hyperledger.besu.evm.tracing.OperationTracer; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; + +import java.util.Collections; +import java.util.Optional; + +import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class ParallelizedConcurrentTransactionProcessorTest { + + @Mock private MainnetTransactionProcessor transactionProcessor; + @Mock private BlockHeader blockHeader; + @Mock private Transaction transaction; + @Mock private PrivateMetadataUpdater privateMetadataUpdater; + @Mock private TransactionCollisionDetector transactionCollisionDetector; + + private BonsaiWorldState worldState; + + private ParallelizedConcurrentTransactionProcessor processor; + + @BeforeEach + void setUp() { + processor = + new ParallelizedConcurrentTransactionProcessor( + transactionProcessor, transactionCollisionDetector); + final BonsaiWorldStateKeyValueStorage bonsaiWorldStateKeyValueStorage = + new BonsaiWorldStateKeyValueStorage( + new InMemoryKeyValueStorageProvider(), + new NoOpMetricsSystem(), + DataStorageConfiguration.DEFAULT_BONSAI_CONFIG); + worldState = + new BonsaiWorldState( + bonsaiWorldStateKeyValueStorage, + new NoopBonsaiCachedMerkleTrieLoader(), + new NoOpBonsaiCachedWorldStorageManager(bonsaiWorldStateKeyValueStorage), + new NoOpTrieLogManager(), + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); + when(transactionCollisionDetector.hasCollision(any(), any(), any(), any())).thenReturn(false); + } + + @Test + void testRunTransaction() { + Address miningBeneficiary = Address.fromHexString("0x1"); + Wei blobGasPrice = Wei.ZERO; + + Mockito.when( + transactionProcessor.processTransaction( + any(), any(), any(), any(), any(), any(), anyBoolean(), any(), any(), any())) + .thenReturn( + TransactionProcessingResult.successful( + Collections.emptyList(), 0, 0, Bytes.EMPTY, ValidationResult.valid())); + + processor.runTransaction( + worldState, + blockHeader, + 0, + transaction, + miningBeneficiary, + (blockNumber) -> Hash.EMPTY, + blobGasPrice, + privateMetadataUpdater); + + verify(transactionProcessor, times(1)) + .processTransaction( + any(DiffBasedWorldStateUpdateAccumulator.class), + eq(blockHeader), + eq(transaction), + eq(miningBeneficiary), + any(OperationTracer.class), + any(BlockHashOperation.BlockHashLookup.class), + eq(true), + eq(TransactionValidationParams.processingBlock()), + eq(privateMetadataUpdater), + eq(blobGasPrice)); + + assertTrue( + processor + .applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, 0) + .isPresent(), + "Expected the transaction context to be stored"); + } + + @Test + void testRunTransactionWithFailure() { + Address miningBeneficiary = Address.fromHexString("0x1"); + Wei blobGasPrice = Wei.ZERO; + + when(transactionProcessor.processTransaction( + any(), any(), any(), any(), any(), any(), anyBoolean(), any(), any(), any())) + .thenReturn( + TransactionProcessingResult.failed( + 0, + 0, + ValidationResult.invalid( + TransactionInvalidReason.BLOB_GAS_PRICE_BELOW_CURRENT_BLOB_BASE_FEE), + Optional.of(Bytes.EMPTY))); + + processor.runTransaction( + worldState, + blockHeader, + 0, + transaction, + miningBeneficiary, + (blockNumber) -> Hash.EMPTY, + blobGasPrice, + privateMetadataUpdater); + + Optional result = + processor.applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, 0); + assertTrue(result.isEmpty(), "Expected the transaction result to indicate a failure"); + } + + @Test + void testRunTransactionWithConflict() { + + Address miningBeneficiary = Address.fromHexString("0x1"); + Wei blobGasPrice = Wei.ZERO; + + Mockito.when( + transactionProcessor.processTransaction( + any(), any(), any(), any(), any(), any(), anyBoolean(), any(), any(), any())) + .thenReturn( + TransactionProcessingResult.successful( + Collections.emptyList(), 0, 0, Bytes.EMPTY, ValidationResult.valid())); + + processor.runTransaction( + worldState, + blockHeader, + 0, + transaction, + miningBeneficiary, + (blockNumber) -> Hash.EMPTY, + blobGasPrice, + privateMetadataUpdater); + + verify(transactionProcessor, times(1)) + .processTransaction( + any(DiffBasedWorldStateUpdateAccumulator.class), + eq(blockHeader), + eq(transaction), + eq(miningBeneficiary), + any(OperationTracer.class), + any(BlockHashOperation.BlockHashLookup.class), + eq(true), + eq(TransactionValidationParams.processingBlock()), + eq(privateMetadataUpdater), + eq(blobGasPrice)); + + // simulate a conflict + when(transactionCollisionDetector.hasCollision(any(), any(), any(), any())).thenReturn(true); + + Optional result = + processor.applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, 0); + assertTrue(result.isEmpty(), "Expected no transaction result to be applied due to conflict"); + } +} diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetectorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetectorTest.java index 38bbc48acf8..0cd1bad3c57 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetectorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/TransactionCollisionDetectorTest.java @@ -16,7 +16,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.spy; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; @@ -248,10 +247,7 @@ void testCollisionWithDeletedAddress() { bonsaiUpdater.getDeletedAccountAddresses().add(address); final Transaction transaction = createTransaction(address, address); - final BonsaiWorldStateUpdateAccumulator trxUpdater = - spy( - new BonsaiWorldStateUpdateAccumulator( - worldState, (__, ___) -> {}, (__, ___) -> {}, EvmConfiguration.DEFAULT)); + // Simulate that the deleted address is read in the next transaction trxUpdater.getAccountsToUpdate().put(address, new DiffBasedValue<>(accountValue, accountValue)); diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java index db70ccf41f0..02accb4cffc 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java @@ -80,7 +80,11 @@ ProtocolSchedule provideProtocolSchedule( } return MainnetProtocolSchedule.fromConfig( - configOptions, evmConfiguration, MiningParameters.newDefault(), new BadBlockManager()); + configOptions, + evmConfiguration, + MiningParameters.newDefault(), + new BadBlockManager(), + false); } public static Map> createSchedules() { @@ -145,7 +149,8 @@ private static Supplier createSchedule(final GenesisConfigOpti false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); } } From 6baafdc56e49327ebf45452a7395788d5d7ad858 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 10 Jul 2024 14:36:45 +0200 Subject: [PATCH 22/35] fix tests Signed-off-by: Karim Taam --- .../besu/controller/BesuControllerBuilder.java | 8 ++++++++ .../besu/ForkIdsNetworkConfigTest.java | 8 ++++++-- .../clique/CliqueProtocolScheduleTest.java | 15 ++++++++++----- .../blockcreation/CliqueBlockCreatorTest.java | 3 ++- .../blockcreation/CliqueMinerExecutorTest.java | 3 ++- .../consensus/ibft/IbftProtocolScheduleTest.java | 3 ++- .../ibft/blockcreation/BftBlockCreatorTest.java | 3 ++- .../statemachine/IbftBlockHeightManagerTest.java | 3 ++- .../merge/MergeProtocolScheduleTest.java | 11 ++++++----- .../blockcreation/MergeGenesisConfigHelper.java | 3 ++- .../consensus/qbft/QbftProtocolScheduleTest.java | 3 ++- .../statemachine/QbftBlockHeightManagerTest.java | 3 ++- .../methods/ExecutionEngineJsonRpcMethod.java | 1 - .../JsonRpcHttpServiceHostAllowlistTest.java | 3 ++- .../api/jsonrpc/JsonRpcHttpServiceLoginTest.java | 5 ++++- .../api/jsonrpc/JsonRpcHttpServiceTestBase.java | 3 ++- .../JsonRpcHttpServiceTlsClientAuthTest.java | 3 ++- ...JsonRpcHttpServiceTlsMisconfigurationTest.java | 3 ++- .../api/jsonrpc/JsonRpcHttpServiceTlsTest.java | 3 ++- .../methods/EthGetTransactionReceiptTest.java | 2 ++ .../websocket/WebSocketServiceLoginTest.java | 3 ++- .../blockcreation/AbstractBlockCreatorTest.java | 3 ++- ...gacyFeeMarketBlockTransactionSelectorTest.java | 3 ++- ...ndonFeeMarketBlockTransactionSelectorTest.java | 3 ++- .../blockcreation/PoWBlockCreatorTest.java | 12 ++++++++---- .../ethereum/mainnet/AbstractBlockProcessor.java | 3 +-- .../worldstate/DataStorageConfiguration.java | 4 ++-- .../eth/messages/BlockBodiesMessageTest.java | 3 ++- .../eth/messages/BlockHeadersMessageTest.java | 3 ++- .../ethereum/eth/sync/ChainHeadTrackerTest.java | 3 ++- .../backwardsync/BackwardSyncContextTest.java | 5 ++++- .../sync/backwardsync/BackwardSyncStepTest.java | 5 ++++- .../sync/backwardsync/ForwardSyncStepTest.java | 5 ++++- .../transactions/AbstractTransactionPoolTest.java | 3 ++- .../besu/ethereum/eth/transactions/TestNode.java | 3 ++- .../transactions/TransactionPoolFactoryTest.java | 3 ++- 36 files changed, 105 insertions(+), 48 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java index f6e4cc1d4b8..601e5c7057e 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -531,6 +531,14 @@ public BesuControllerBuilder randomPeerPriority(final Boolean randomPeerPriority return this; } + /** + * Sets whether parallel transaction processing is enabled. When parallel transaction processing + * is enabled, transactions within a block can be processed in parallel and potentially improving + * performance + * + * @param isParallelTxEnabled true to enable parallel transaction + * @return the besu controller + */ public BesuControllerBuilder isParallelTxEnabled(final boolean isParallelTxEnabled) { this.isParallelTxEnabled = isParallelTxEnabled; return this; diff --git a/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java b/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java index ae338f27cac..6dc53dcfeb2 100644 --- a/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java +++ b/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java @@ -176,12 +176,16 @@ private static MilestoneStreamingTransitionProtocolSchedule createSchedule( new MilestoneStreamingProtocolSchedule( (DefaultProtocolSchedule) MainnetProtocolSchedule.fromConfig( - configOptions, MiningParameters.MINING_DISABLED, new BadBlockManager())); + configOptions, MiningParameters.MINING_DISABLED, new BadBlockManager(), false)); MilestoneStreamingProtocolSchedule postMergeProtocolSchedule = new MilestoneStreamingProtocolSchedule( (DefaultProtocolSchedule) MergeProtocolSchedule.create( - configOptions, false, MiningParameters.MINING_DISABLED, new BadBlockManager())); + configOptions, + false, + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false)); final MilestoneStreamingTransitionProtocolSchedule schedule = new MilestoneStreamingTransitionProtocolSchedule( preMergeProtocolSchedule, postMergeProtocolSchedule); diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java index 30a3967da9c..d231d69cb71 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java @@ -68,7 +68,8 @@ public void protocolSpecsAreCreatedAtBlockDefinedInJson() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); final ProtocolSpec homesteadSpec = protocolSchedule.getByBlockHeader(blockHeader(1)); final ProtocolSpec tangerineWhistleSpec = protocolSchedule.getByBlockHeader(blockHeader(2)); @@ -92,7 +93,8 @@ public void parametersAlignWithMainnetWithAdjustments() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .getByBlockHeader(blockHeader(0)); assertThat(homestead.getName()).isEqualTo("Frontier"); @@ -116,7 +118,8 @@ public void zeroEpochLengthThrowsException() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager())) + new BadBlockManager(), + false)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Epoch length in config must be greater than zero"); } @@ -136,7 +139,8 @@ public void negativeEpochLengthThrowsException() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager())) + new BadBlockManager(), + false)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Epoch length in config must be greater than zero"); } @@ -160,7 +164,8 @@ public void shouldValidateBaseFeeMarketTransition() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); BlockHeader emptyFrontierParent = headerBuilder diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java index 7dcbfa34bac..65a08a9ccc0 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java @@ -107,7 +107,8 @@ public void setup() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); final Address otherAddress = Util.publicKeyToAddress(otherKeyPair.getPublicKey()); validatorList.add(otherAddress); diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueMinerExecutorTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueMinerExecutorTest.java index bb69aaff483..2326068f0ec 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueMinerExecutorTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueMinerExecutorTest.java @@ -105,7 +105,8 @@ public void setup() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); cliqueEthContext = mock(EthContext.class, RETURNS_DEEP_STUBS); blockHeaderBuilder = new BlockHeaderTestFixture(); } diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleTest.java index 611399fd55b..d0f09c3187a 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleTest.java @@ -103,7 +103,8 @@ private BftProtocolSchedule createProtocolSchedule( bftExtraDataCodec, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); } private boolean validateHeader( diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java index 25c5c1d10b8..7d58e75189e 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java @@ -121,7 +121,8 @@ public BlockHeaderValidator.Builder createBlockHeaderRuleset( bftExtraDataEncoder, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); final ProtocolContext protContext = new ProtocolContext( blockchain, diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java index 68e0ee5efe5..efef5afded3 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java @@ -184,7 +184,8 @@ public void setup() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); ProtocolSchedule protocolSchedule = new BftProtocolSchedule( diff --git a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java index b1f7414e453..168b6078b27 100644 --- a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java +++ b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java @@ -48,7 +48,7 @@ public void protocolSpecsAreCreatedAtBlockDefinedInJson() { final GenesisConfigOptions config = GenesisConfigFile.fromConfig(jsonInput).getConfigOptions(); final ProtocolSchedule protocolSchedule = MergeProtocolSchedule.create( - config, false, MiningParameters.MINING_DISABLED, new BadBlockManager()); + config, false, MiningParameters.MINING_DISABLED, new BadBlockManager(), false); final ProtocolSpec homesteadSpec = protocolSchedule.getByBlockHeader(blockHeader(1)); final ProtocolSpec londonSpec = protocolSchedule.getByBlockHeader(blockHeader(1559)); @@ -64,7 +64,7 @@ public void mergeSpecificModificationsAreUnappliedForShanghai() { final GenesisConfigOptions config = GenesisConfigFile.mainnet().getConfigOptions(); final ProtocolSchedule protocolSchedule = MergeProtocolSchedule.create( - config, false, MiningParameters.MINING_DISABLED, new BadBlockManager()); + config, false, MiningParameters.MINING_DISABLED, new BadBlockManager(), false); final long lastParisBlockNumber = 17034869L; final ProtocolSpec parisSpec = @@ -100,7 +100,7 @@ public void mergeSpecificModificationsAreUnappliedForCancun_whenShanghaiNotConfi final GenesisConfigOptions config = GenesisConfigFile.fromConfig(jsonInput).getConfigOptions(); final ProtocolSchedule protocolSchedule = MergeProtocolSchedule.create( - config, false, MiningParameters.MINING_DISABLED, new BadBlockManager()); + config, false, MiningParameters.MINING_DISABLED, new BadBlockManager(), false); final ProtocolSpec parisSpec = protocolSchedule.getByBlockHeader( @@ -128,7 +128,7 @@ public void mergeSpecificModificationsAreUnappliedForAllMainnetForksAfterParis() final GenesisConfigOptions config = GenesisConfigFile.mainnet().getConfigOptions(); final ProtocolSchedule protocolSchedule = MergeProtocolSchedule.create( - config, false, MiningParameters.MINING_DISABLED, new BadBlockManager()); + config, false, MiningParameters.MINING_DISABLED, new BadBlockManager(), false); final long lastParisBlockNumber = 17034869L; final ProtocolSpec parisSpec = @@ -160,7 +160,8 @@ public void parametersAlignWithMainnetWithAdjustments() { GenesisConfigFile.DEFAULT.getConfigOptions(), false, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .getByBlockHeader(blockHeader(0)); assertThat(london.getName()).isEqualTo("Paris"); diff --git a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeGenesisConfigHelper.java b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeGenesisConfigHelper.java index 54099f868cb..9a08480b9c9 100644 --- a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeGenesisConfigHelper.java +++ b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeGenesisConfigHelper.java @@ -56,6 +56,7 @@ default ProtocolSchedule getMergeProtocolSchedule() { getPosGenesisConfigFile().getConfigOptions(), false, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); } } diff --git a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleTest.java b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleTest.java index bdcea4e692e..7ac33303415 100644 --- a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleTest.java +++ b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleTest.java @@ -138,7 +138,8 @@ private BftProtocolSchedule createProtocolSchedule( bftExtraDataCodec, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); } private boolean validateHeader( diff --git a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerTest.java b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerTest.java index a0479860845..d885fde3cf4 100644 --- a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerTest.java +++ b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerTest.java @@ -184,7 +184,8 @@ QbftContext.class, validators, new QbftExtraDataCodec()), false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); ProtocolSchedule protocolSchedule = new BftProtocolSchedule( diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java index f921b1cca13..6e216d46936 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java @@ -106,7 +106,6 @@ public final JsonRpcResponse response(final JsonRpcRequestContext request) { .addArgument(this.getName()) .addArgument(t.getMessage()) .log(); - t.printStackTrace(System.out); } return new JsonRpcErrorResponse( request.getRequest().getId(), RpcErrorType.INVALID_REQUEST); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceHostAllowlistTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceHostAllowlistTest.java index af5228dc06e..930bed2f1ce 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceHostAllowlistTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceHostAllowlistTest.java @@ -109,7 +109,8 @@ public void initServerAndClient() throws Exception { MainnetProtocolSchedule.fromConfig( new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), MiningParameters.MINING_DISABLED, - new BadBlockManager()), + new BadBlockManager(), + false), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceLoginTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceLoginTest.java index 6ae5d37a0fc..40fe3db420e 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceLoginTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceLoginTest.java @@ -138,7 +138,10 @@ public static void initServerAndClient() throws Exception { blockchainQueries, synchronizer, MainnetProtocolSchedule.fromConfig( - genesisConfigOptions, MiningParameters.MINING_DISABLED, new BadBlockManager()), + genesisConfigOptions, + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTestBase.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTestBase.java index f8c9dbc18fb..6be01fffa37 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTestBase.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTestBase.java @@ -118,7 +118,8 @@ public static void initServerAndClient() throws Exception { new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()), + new BadBlockManager(), + false), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsClientAuthTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsClientAuthTest.java index 2f62e490beb..1acdeae8b44 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsClientAuthTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsClientAuthTest.java @@ -123,7 +123,8 @@ public void initServer() throws Exception { MainnetProtocolSchedule.fromConfig( new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), MiningParameters.MINING_DISABLED, - new BadBlockManager()), + new BadBlockManager(), + false), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsMisconfigurationTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsMisconfigurationTest.java index 2ff0833bc69..4d0580318a8 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsMisconfigurationTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsMisconfigurationTest.java @@ -111,7 +111,8 @@ public void beforeEach() { MainnetProtocolSchedule.fromConfig( new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), MiningParameters.MINING_DISABLED, - new BadBlockManager()), + new BadBlockManager(), + false), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsTest.java index e650f9d490b..4f00336775a 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsTest.java @@ -112,7 +112,8 @@ public void initServer() throws Exception { MainnetProtocolSchedule.fromConfig( new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), MiningParameters.MINING_DISABLED, - new BadBlockManager()), + new BadBlockManager(), + false), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionReceiptTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionReceiptTest.java index 884cc504d8e..98754eaca96 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionReceiptTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionReceiptTest.java @@ -141,6 +141,7 @@ public class EthGetTransactionReceiptTest { BlockHeader::getCoinbase, null, false, + false, null, GasLimitCalculator.constant(), FeeMarket.legacy(), @@ -172,6 +173,7 @@ public class EthGetTransactionReceiptTest { BlockHeader::getCoinbase, null, false, + false, null, GasLimitCalculator.constant(), FeeMarket.legacy(), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/WebSocketServiceLoginTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/WebSocketServiceLoginTest.java index 5fa137e312c..3175f56b8d1 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/WebSocketServiceLoginTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/WebSocketServiceLoginTest.java @@ -176,7 +176,8 @@ public void before() throws URISyntaxException { MainnetProtocolSchedule.fromConfig( genesisConfigOptions, MiningParameters.MINING_DISABLED, - new BadBlockManager()), + new BadBlockManager(), + false), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), 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 68d13987bb3..a56115534c9 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 @@ -372,7 +372,8 @@ private AbstractBlockCreator createBlockCreator(final ProtocolSpecAdapters proto false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule()) .build(); diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java index 3b1ae938f7f..8d5b6351f5f 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java @@ -64,7 +64,8 @@ protected ProtocolSchedule createProtocolSchedule() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); } diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java index e9bfcfb762a..c983cd0f2cb 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java @@ -71,7 +71,8 @@ protected ProtocolSchedule createProtocolSchedule() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); } diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java index f7fd4486d1b..caffcec528f 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java @@ -94,7 +94,8 @@ void createMainnetBlock1() throws IOException { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule()) .build(); @@ -150,7 +151,8 @@ void createMainnetBlock1_fixedDifficulty1() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule()) .build(); @@ -196,7 +198,8 @@ void rewardBeneficiary_zeroReward_skipZeroRewardsFalse() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); @@ -265,7 +268,8 @@ void rewardBeneficiary_zeroReward_skipZeroRewardsTrue() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); 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 e5d6cd18d0f..2696bec9fcb 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 @@ -162,8 +162,7 @@ public BlockProcessingResult processBlock( if (isParallelTxEnabled && parallelizedConcurrentTransactionProcessor.isPresent()) { // applyParallelizedTransactionResult, if activated, fetch the results of transactions - // processed by - // background threads. + // processed by background threads. transactionProcessingResult = parallelizedConcurrentTransactionProcessor .get() diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java index 49657c6ec9e..e80967b4fdb 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java @@ -85,7 +85,7 @@ interface Unstable { boolean DEFAULT_BONSAI_FULL_FLAT_DB_ENABLED = true; boolean DEFAULT_BONSAI_CODE_USING_CODE_HASH_ENABLED = true; - boolean DEFAULT_PARALLEL_PRELOAD_TRX_ENABLED = false; + boolean DEFAULT_PARALLEL_TRX_ENABLED = false; DataStorageConfiguration.Unstable DEFAULT = ImmutableDataStorageConfiguration.Unstable.builder().build(); @@ -105,7 +105,7 @@ default boolean getBonsaiCodeStoredByCodeHashEnabled() { @Value.Default default boolean isParallelTxEnabled() { - return DEFAULT_PARALLEL_PRELOAD_TRX_ENABLED; + return DEFAULT_PARALLEL_TRX_ENABLED; } } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockBodiesMessageTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockBodiesMessageTest.java index ac3b8f2fc62..03a9322521b 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockBodiesMessageTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockBodiesMessageTest.java @@ -60,7 +60,8 @@ public void setup() { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); } @Test diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockHeadersMessageTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockHeadersMessageTest.java index 2b9105ed46d..b5929dc9fd9 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockHeadersMessageTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockHeadersMessageTest.java @@ -67,7 +67,8 @@ public void blockHeadersRoundTrip() throws IOException { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager())); + new BadBlockManager(), + false)); for (int i = 0; i < 50; ++i) { Assertions.assertThat(readHeaders.get(i)).isEqualTo(headers.get(i)); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java index b46a109c122..e19f288fd51 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java @@ -57,7 +57,8 @@ public class ChainHeadTrackerTest { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); private final TrailingPeerLimiter trailingPeerLimiter = mock(TrailingPeerLimiter.class); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncContextTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncContextTest.java index 9afba66ad3a..bfd21dac9c8 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncContextTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncContextTest.java @@ -93,7 +93,10 @@ public class BackwardSyncContextTest { @Spy private ProtocolSchedule protocolSchedule = MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions(), MiningParameters.MINING_DISABLED, new BadBlockManager()); + new StubGenesisConfigOptions(), + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false); @Spy private ProtocolSpec protocolSpec = diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncStepTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncStepTest.java index ecb72881ed4..4e6b5aa6d0e 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncStepTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncStepTest.java @@ -70,7 +70,10 @@ public class BackwardSyncStepTest { private final ProtocolSchedule protocolSchedule = MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions(), MiningParameters.MINING_DISABLED, new BadBlockManager()); + new StubGenesisConfigOptions(), + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false); private final DeterministicEthScheduler ethScheduler = new DeterministicEthScheduler(); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ForwardSyncStepTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ForwardSyncStepTest.java index 5fb47a557ac..d8007d153f8 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ForwardSyncStepTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ForwardSyncStepTest.java @@ -73,7 +73,10 @@ public class ForwardSyncStepTest { private final ProtocolSchedule protocolSchedule = MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions(), MiningParameters.MINING_DISABLED, new BadBlockManager()); + new StubGenesisConfigOptions(), + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false); private MutableBlockchain localBlockchain; GenericKeyValueStorageFacade headersStorage; GenericKeyValueStorageFacade blocksStorage; diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java index 39b47bf9dde..535732f1918 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java @@ -200,7 +200,8 @@ protected static ExecutionContextTestFixture createExecutionContextTestFixtureBa false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java index 8e9bda89c05..292667d7e26 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java @@ -123,7 +123,8 @@ public TestNode( false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()); + new BadBlockManager(), + false); final GenesisState genesisState = GenesisState.fromConfig(genesisConfigFile, protocolSchedule); final BlockHeaderFunctions blockHeaderFunctions = diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java index ef8d0701782..480bcc331fc 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java @@ -379,7 +379,8 @@ private void setupScheduleWith(final StubGenesisConfigOptions config) { false, EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, - new BadBlockManager()) + new BadBlockManager(), + false) .createProtocolSchedule(); protocolContext = mock(ProtocolContext.class); From 594b7ecf0017bd730a1240c27b4c3e1ccc20d9ea Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 10 Jul 2024 14:53:20 +0200 Subject: [PATCH 23/35] build again Signed-off-by: Karim Taam --- .../org/hyperledger/besu/controller/BesuControllerBuilder.java | 1 + 1 file changed, 1 insertion(+) diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java index 601e5c7057e..89b96da11c4 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -208,6 +208,7 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides private int numberOfBlocksToCache = 0; + /** whether parallel transaction processing is enabled or not */ protected boolean isParallelTxEnabled; /** Instantiates a new Besu controller builder. */ From 1fa67415320dfee0741ecb1c52fdb37970de2691 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 10 Jul 2024 15:41:26 +0200 Subject: [PATCH 24/35] fix unit tests Signed-off-by: Karim Taam --- .../besu/ethereum/BlockImportExceptionHandlingTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java index ef90eb6267b..cddcc517186 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java @@ -41,6 +41,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.blockhash.FrontierBlockHashProcessor; +import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator; import org.hyperledger.besu.ethereum.storage.StorageProvider; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.BonsaiWorldStateProvider; @@ -50,6 +51,7 @@ import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; import org.hyperledger.besu.ethereum.worldstate.WorldStateStorageCoordinator; +import org.hyperledger.besu.evm.gascalculator.GasCalculator; import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.plugin.services.exception.StorageException; @@ -81,6 +83,8 @@ class BlockImportExceptionHandlingTest { private final BlockBodyValidator blockBodyValidator = mock(BlockBodyValidator.class); private final ProtocolContext protocolContext = mock(ProtocolContext.class); private final ProtocolSpec protocolSpec = mock(ProtocolSpec.class); + private final GasCalculator gasCalculator = mock(GasCalculator.class); + private final FeeMarket feeMarket = mock(FeeMarket.class); protected final MutableBlockchain blockchain = mock(MutableBlockchain.class); private final StorageProvider storageProvider = new InMemoryKeyValueStorageProvider(); @@ -117,6 +121,8 @@ public void setup() { when(protocolSpec.getRequestsValidatorCoordinator()) .thenReturn(RequestsValidatorCoordinator.empty()); when(protocolSpec.getBlockHashProcessor()).thenReturn(new FrontierBlockHashProcessor()); + when(protocolSpec.getGasCalculator()).thenReturn(gasCalculator); + when(protocolSpec.getFeeMarket()).thenReturn(feeMarket); mainnetBlockValidator = new MainnetBlockValidator( blockHeaderValidator, blockBodyValidator, blockProcessor, badBlockManager); From 184aea7d8b554a01f67fe7d3dd096ebddaa09a5c Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Wed, 10 Jul 2024 17:29:44 +0200 Subject: [PATCH 25/35] Add two new metrics to evaluate the number of parallelized transactions and the number of conflicting transactions Signed-off-by: Ameziane H --- .../CliqueBesuControllerBuilder.java | 3 +- .../controller/IbftBesuControllerBuilder.java | 3 +- .../MainnetBesuControllerBuilder.java | 3 +- .../MergeBesuControllerBuilder.java | 3 +- .../controller/QbftBesuControllerBuilder.java | 3 +- .../besu/ForkIdsNetworkConfigTest.java | 10 +- .../clique/CliqueProtocolSchedule.java | 21 ++- .../clique/CliqueProtocolScheduleTest.java | 16 +- .../blockcreation/CliqueBlockCreatorTest.java | 3 +- .../CliqueMinerExecutorTest.java | 3 +- .../bft/BaseBftProtocolScheduleBuilder.java | 9 +- .../CombinedProtocolScheduleFactoryTest.java | 4 +- .../BaseBftProtocolScheduleBuilderTest.java | 4 +- .../ibft/support/TestContextBuilder.java | 3 +- .../ibft/IbftProtocolScheduleBuilder.java | 19 ++- .../ibft/IbftProtocolScheduleTest.java | 4 +- .../blockcreation/BftBlockCreatorTest.java | 3 +- .../IbftBlockHeightManagerTest.java | 4 +- .../merge/MergeProtocolSchedule.java | 13 +- .../merge/TransitionProtocolSchedule.java | 17 ++- .../merge/MergeProtocolScheduleTest.java | 32 +++- .../MergeGenesisConfigHelper.java | 4 +- .../qbft/support/TestContextBuilder.java | 3 +- .../qbft/QbftProtocolScheduleBuilder.java | 25 +++- .../qbft/QbftProtocolScheduleTest.java | 4 +- .../QbftBlockHeightManagerTest.java | 4 +- .../api/jsonrpc/BlockchainImporter.java | 4 +- .../JsonRpcHttpServiceHostAllowlistTest.java | 3 +- .../jsonrpc/JsonRpcHttpServiceLoginTest.java | 3 +- .../jsonrpc/JsonRpcHttpServiceTestBase.java | 3 +- .../JsonRpcHttpServiceTlsClientAuthTest.java | 3 +- ...RpcHttpServiceTlsMisconfigurationTest.java | 3 +- .../jsonrpc/JsonRpcHttpServiceTlsTest.java | 3 +- .../flat/RewardTraceGeneratorTest.java | 4 +- .../websocket/WebSocketServiceLoginTest.java | 3 +- .../AbstractBlockCreatorTest.java | 3 +- .../AbstractBlockTransactionSelectorTest.java | 3 +- ...FeeMarketBlockTransactionSelectorTest.java | 4 +- ...FeeMarketBlockTransactionSelectorTest.java | 4 +- .../blockcreation/PoWBlockCreatorTest.java | 12 +- .../FixedDifficultyProtocolSchedule.java | 19 ++- .../mainnet/AbstractBlockProcessor.java | 53 ++++++- .../mainnet/ClassicBlockProcessor.java | 7 +- .../mainnet/ClassicProtocolSpecs.java | 102 +++++++++---- .../mainnet/MainnetBlockProcessor.java | 21 +++ .../mainnet/MainnetProtocolSchedule.java | 31 ++-- .../mainnet/MainnetProtocolSpecFactory.java | 124 ++++++++++----- .../mainnet/MainnetProtocolSpecs.java | 141 ++++++++++++------ .../mainnet/ProtocolScheduleBuilder.java | 24 ++- .../ethereum/mainnet/ProtocolSpecBuilder.java | 13 +- ...lelizedConcurrentTransactionProcessor.java | 28 ++-- .../ethereum/core/BlockchainSetupUtil.java | 3 +- .../core/ExecutionContextTestFixture.java | 3 +- .../core/ProtocolScheduleFixture.java | 4 +- .../fixed/FixedProtocolScheduleTest.java | 4 +- .../mainnet/DefaultProtocolScheduleTest.java | 4 +- .../mainnet/MainnetProtocolScheduleTest.java | 10 +- .../mainnet/ProtocolScheduleBuilderTest.java | 7 +- ...zedConcurrentTransactionProcessorTest.java | 9 +- .../bonsai/AbstractIsolationTests.java | 3 +- .../eth/messages/BlockBodiesMessageTest.java | 4 +- .../eth/messages/BlockHeadersMessageTest.java | 4 +- .../eth/sync/ChainHeadTrackerTest.java | 3 +- .../backwardsync/BackwardSyncContextTest.java | 4 +- .../backwardsync/BackwardSyncStepTest.java | 4 +- .../backwardsync/ForwardSyncStepTest.java | 4 +- .../AbstractTransactionPoolTest.java | 3 +- .../ethereum/eth/transactions/TestNode.java | 3 +- .../TransactionPoolFactoryTest.java | 3 +- .../evmtool/MainnetGenesisFileModule.java | 7 +- .../ReferenceTestProtocolSchedules.java | 4 +- .../ethereum/retesteth/RetestethContext.java | 3 +- .../besu/metrics/BesuMetricCategory.java | 4 +- 73 files changed, 682 insertions(+), 253 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java index d9c6bdab7c8..dceff2b5ba3 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/CliqueBesuControllerBuilder.java @@ -137,7 +137,8 @@ protected ProtocolSchedule createProtocolSchedule() { evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java index c876939ad54..4ad853f8d58 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/IbftBesuControllerBuilder.java @@ -292,7 +292,8 @@ protected ProtocolSchedule createProtocolSchedule() { evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java index 38bac0df023..03a562b44a3 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MainnetBesuControllerBuilder.java @@ -100,7 +100,8 @@ protected ProtocolSchedule createProtocolSchedule() { evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java index c0dc1428159..b51b667ba54 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java @@ -178,7 +178,8 @@ protected ProtocolSchedule createProtocolSchedule() { isRevertReasonEnabled, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java index 5ae6f898b50..a5774ff76b3 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java @@ -336,7 +336,8 @@ protected ProtocolSchedule createProtocolSchedule() { evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } @Override diff --git a/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java b/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java index 6dc53dcfeb2..6493b340bc8 100644 --- a/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java +++ b/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java @@ -35,6 +35,7 @@ import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.DefaultProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.MainnetProtocolSchedule; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.util.Collection; import java.util.List; @@ -176,7 +177,11 @@ private static MilestoneStreamingTransitionProtocolSchedule createSchedule( new MilestoneStreamingProtocolSchedule( (DefaultProtocolSchedule) MainnetProtocolSchedule.fromConfig( - configOptions, MiningParameters.MINING_DISABLED, new BadBlockManager(), false)); + configOptions, + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false, + new NoOpMetricsSystem())); MilestoneStreamingProtocolSchedule postMergeProtocolSchedule = new MilestoneStreamingProtocolSchedule( (DefaultProtocolSchedule) @@ -185,7 +190,8 @@ private static MilestoneStreamingTransitionProtocolSchedule createSchedule( false, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false)); + false, + new NoOpMetricsSystem())); final MilestoneStreamingTransitionProtocolSchedule schedule = new MilestoneStreamingTransitionProtocolSchedule( preMergeProtocolSchedule, postMergeProtocolSchedule); diff --git a/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java b/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java index a90cd067a5e..86fd997416a 100644 --- a/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java +++ b/consensus/clique/src/main/java/org/hyperledger/besu/consensus/clique/CliqueProtocolSchedule.java @@ -36,6 +36,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.HashMap; @@ -64,7 +65,9 @@ public class CliqueProtocolSchedule { * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks - * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param isParallelTxEnabled indicates whether parallel transaction is enabled + * @param metricsSystem A metricSystem instance to be able to expose metrics in the underlying + * calls * @return the protocol schedule */ public static ProtocolSchedule create( @@ -76,7 +79,8 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { final CliqueConfigOptions cliqueConfig = config.getCliqueConfigOptions(); @@ -113,7 +117,8 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .createProtocolSchedule(); } @@ -127,7 +132,9 @@ public static ProtocolSchedule create( * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks - * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param isParallelTxEnabled indicates whether parallel transaction is enabled + * @param metricsSystem A metricSystem instance to be able to expose metrics in the underlying + * calls * @return the protocol schedule */ @VisibleForTesting @@ -139,7 +146,8 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return create( config, forksSchedule, @@ -149,7 +157,8 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } private static ProtocolSpecBuilder applyCliqueSpecificModifications( diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java index d231d69cb71..04fa2697bc2 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java @@ -37,6 +37,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.time.Instant; import java.util.List; @@ -69,7 +70,8 @@ public void protocolSpecsAreCreatedAtBlockDefinedInJson() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); final ProtocolSpec homesteadSpec = protocolSchedule.getByBlockHeader(blockHeader(1)); final ProtocolSpec tangerineWhistleSpec = protocolSchedule.getByBlockHeader(blockHeader(2)); @@ -94,7 +96,8 @@ public void parametersAlignWithMainnetWithAdjustments() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .getByBlockHeader(blockHeader(0)); assertThat(homestead.getName()).isEqualTo("Frontier"); @@ -119,7 +122,8 @@ public void zeroEpochLengthThrowsException() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false)) + false, + new NoOpMetricsSystem())) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Epoch length in config must be greater than zero"); } @@ -140,7 +144,8 @@ public void negativeEpochLengthThrowsException() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false)) + false, + new NoOpMetricsSystem())) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Epoch length in config must be greater than zero"); } @@ -165,7 +170,8 @@ public void shouldValidateBaseFeeMarketTransition() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); BlockHeader emptyFrontierParent = headerBuilder diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java index 65a08a9ccc0..13b013aba2e 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java @@ -108,7 +108,8 @@ public void setup() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); final Address otherAddress = Util.publicKeyToAddress(otherKeyPair.getPublicKey()); validatorList.add(otherAddress); diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueMinerExecutorTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueMinerExecutorTest.java index 2326068f0ec..9502d00a192 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueMinerExecutorTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueMinerExecutorTest.java @@ -106,7 +106,8 @@ public void setup() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); cliqueEthContext = mock(EthContext.class, RETURNS_DEEP_STUBS); blockHeaderBuilder = new BlockHeaderTestFixture(); } diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java index 2a69ed8af3d..4a3d1e1730e 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java @@ -33,6 +33,7 @@ import org.hyperledger.besu.ethereum.mainnet.WithdrawalsValidator; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.HashMap; @@ -59,6 +60,8 @@ protected BaseBftProtocolScheduleBuilder() {} * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param metricsSystem metricsSystem A metricSystem instance to be able to expose metrics in the + * underlying calls * @return the protocol schedule */ public BftProtocolSchedule createProtocolSchedule( @@ -70,7 +73,8 @@ public BftProtocolSchedule createProtocolSchedule( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { final Map> specMap = new HashMap<>(); forksSchedule @@ -93,7 +97,8 @@ public BftProtocolSchedule createProtocolSchedule( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .createProtocolSchedule(); return new BftProtocolSchedule((DefaultProtocolSchedule) protocolSchedule); } diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java index 175b63a038c..02689d52af1 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/CombinedProtocolScheduleFactoryTest.java @@ -28,6 +28,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; import java.util.List; @@ -178,7 +179,8 @@ private BftProtocolSchedule createProtocolSchedule( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); return new BftProtocolSchedule( (DefaultProtocolSchedule) protocolScheduleBuilder.createProtocolSchedule()); diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java index 9cc77f75dc9..e23664fd8d3 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java @@ -39,6 +39,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; import java.util.List; @@ -246,7 +247,8 @@ protected BlockHeaderValidator.Builder createBlockHeaderRuleset( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } private BftConfigOptions createBftConfig(final BigInteger blockReward) { diff --git a/consensus/ibft/src/integration-test/java/org/hyperledger/besu/consensus/ibft/support/TestContextBuilder.java b/consensus/ibft/src/integration-test/java/org/hyperledger/besu/consensus/ibft/support/TestContextBuilder.java index 557c5e23935..2d620c56321 100644 --- a/consensus/ibft/src/integration-test/java/org/hyperledger/besu/consensus/ibft/support/TestContextBuilder.java +++ b/consensus/ibft/src/integration-test/java/org/hyperledger/besu/consensus/ibft/support/TestContextBuilder.java @@ -334,7 +334,8 @@ private static ControllerAndState createControllerAndFinalState( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); ///////////////////////////////////////////////////////////////////////////////////// // From here down is BASICALLY taken from IbftBesuController diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java index f27ae074a88..af782dabba6 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java @@ -27,6 +27,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.Optional; @@ -46,7 +47,9 @@ protected IbftProtocolScheduleBuilder() {} * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks - * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param isParallelTxEnabled indicates whether parallel transaction is enabled + * @param metricsSystem A metricSystem instance to be able to expose metrics in the underlying + * calls * @return the protocol schedule */ public static BftProtocolSchedule create( @@ -58,7 +61,8 @@ public static BftProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return new IbftProtocolScheduleBuilder() .createProtocolSchedule( config, @@ -69,7 +73,8 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } /** @@ -82,6 +87,8 @@ public static BftProtocolSchedule create( * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param metricsSystem A metricSystem instance to be able to expose metrics in the underlying + * calls * @return the protocol schedule */ public static BftProtocolSchedule create( @@ -91,7 +98,8 @@ public static BftProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return create( config, forksSchedule, @@ -101,7 +109,8 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } @Override diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleTest.java index d0f09c3187a..e5551ff3f31 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleTest.java @@ -45,6 +45,7 @@ import org.hyperledger.besu.ethereum.core.Util; import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; import java.util.Collection; @@ -104,7 +105,8 @@ private BftProtocolSchedule createProtocolSchedule( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } private boolean validateHeader( diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java index 7d58e75189e..1b86896f36f 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java @@ -122,7 +122,8 @@ public BlockHeaderValidator.Builder createBlockHeaderRuleset( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); final ProtocolContext protContext = new ProtocolContext( blockchain, diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java index efef5afded3..b388b80a3f1 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftBlockHeightManagerTest.java @@ -79,6 +79,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.util.Subscribers; import java.math.BigInteger; @@ -185,7 +186,8 @@ public void setup() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); ProtocolSchedule protocolSchedule = new BftProtocolSchedule( diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java index 87798a34e68..cc2b9535b52 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeProtocolSchedule.java @@ -27,6 +27,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.HashMap; @@ -57,14 +58,16 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return create( config, PrivacyParameters.DEFAULT, isRevertReasonEnabled, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } /** @@ -84,7 +87,8 @@ public static ProtocolSchedule create( final boolean isRevertReasonEnabled, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { Map> postMergeModifications = new HashMap<>(); @@ -104,7 +108,8 @@ public static ProtocolSchedule create( EvmConfiguration.DEFAULT, miningParameters, badBlockManager, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .createProtocolSchedule(); } diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java index 34b21d9e498..9fd33435e8d 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java @@ -27,6 +27,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.ScheduledProtocolSpec; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.Optional; @@ -72,13 +73,23 @@ public static TransitionProtocolSchedule fromConfig( final GenesisConfigOptions genesisConfigOptions, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { ProtocolSchedule preMergeProtocolSchedule = MainnetProtocolSchedule.fromConfig( - genesisConfigOptions, miningParameters, badBlockManager, isParallelTxEnabled); + genesisConfigOptions, + miningParameters, + badBlockManager, + isParallelTxEnabled, + metricsSystem); ProtocolSchedule postMergeProtocolSchedule = MergeProtocolSchedule.create( - genesisConfigOptions, false, miningParameters, badBlockManager, isParallelTxEnabled); + genesisConfigOptions, + false, + miningParameters, + badBlockManager, + isParallelTxEnabled, + metricsSystem); return new TransitionProtocolSchedule( preMergeProtocolSchedule, postMergeProtocolSchedule, PostMergeContext.get()); } diff --git a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java index 168b6078b27..0d4aede3a14 100644 --- a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java +++ b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/MergeProtocolScheduleTest.java @@ -29,6 +29,7 @@ import org.hyperledger.besu.evm.operation.InvalidOperation; import org.hyperledger.besu.evm.operation.PrevRanDaoOperation; import org.hyperledger.besu.evm.operation.Push0Operation; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; @@ -48,7 +49,12 @@ public void protocolSpecsAreCreatedAtBlockDefinedInJson() { final GenesisConfigOptions config = GenesisConfigFile.fromConfig(jsonInput).getConfigOptions(); final ProtocolSchedule protocolSchedule = MergeProtocolSchedule.create( - config, false, MiningParameters.MINING_DISABLED, new BadBlockManager(), false); + config, + false, + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false, + new NoOpMetricsSystem()); final ProtocolSpec homesteadSpec = protocolSchedule.getByBlockHeader(blockHeader(1)); final ProtocolSpec londonSpec = protocolSchedule.getByBlockHeader(blockHeader(1559)); @@ -64,7 +70,12 @@ public void mergeSpecificModificationsAreUnappliedForShanghai() { final GenesisConfigOptions config = GenesisConfigFile.mainnet().getConfigOptions(); final ProtocolSchedule protocolSchedule = MergeProtocolSchedule.create( - config, false, MiningParameters.MINING_DISABLED, new BadBlockManager(), false); + config, + false, + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false, + new NoOpMetricsSystem()); final long lastParisBlockNumber = 17034869L; final ProtocolSpec parisSpec = @@ -100,7 +111,12 @@ public void mergeSpecificModificationsAreUnappliedForCancun_whenShanghaiNotConfi final GenesisConfigOptions config = GenesisConfigFile.fromConfig(jsonInput).getConfigOptions(); final ProtocolSchedule protocolSchedule = MergeProtocolSchedule.create( - config, false, MiningParameters.MINING_DISABLED, new BadBlockManager(), false); + config, + false, + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false, + new NoOpMetricsSystem()); final ProtocolSpec parisSpec = protocolSchedule.getByBlockHeader( @@ -128,7 +144,12 @@ public void mergeSpecificModificationsAreUnappliedForAllMainnetForksAfterParis() final GenesisConfigOptions config = GenesisConfigFile.mainnet().getConfigOptions(); final ProtocolSchedule protocolSchedule = MergeProtocolSchedule.create( - config, false, MiningParameters.MINING_DISABLED, new BadBlockManager(), false); + config, + false, + MiningParameters.MINING_DISABLED, + new BadBlockManager(), + false, + new NoOpMetricsSystem()); final long lastParisBlockNumber = 17034869L; final ProtocolSpec parisSpec = @@ -161,7 +182,8 @@ public void parametersAlignWithMainnetWithAdjustments() { false, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .getByBlockHeader(blockHeader(0)); assertThat(london.getName()).isEqualTo("Paris"); diff --git a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeGenesisConfigHelper.java b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeGenesisConfigHelper.java index 9a08480b9c9..dcfe5f98e34 100644 --- a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeGenesisConfigHelper.java +++ b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeGenesisConfigHelper.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.ethereum.chain.BadBlockManager; import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.io.IOException; import java.net.URI; @@ -57,6 +58,7 @@ default ProtocolSchedule getMergeProtocolSchedule() { false, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } } diff --git a/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java b/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java index 476fa3184ae..42a356fd5c9 100644 --- a/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java +++ b/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java @@ -439,7 +439,8 @@ private static ControllerAndState createControllerAndFinalState( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); final BftValidatorOverrides validatorOverrides = convertBftForks(qbftForks); final TransactionSimulator transactionSimulator = diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java index c334583c52a..34be5cfdaf2 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java @@ -31,6 +31,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.Optional; @@ -51,6 +52,8 @@ public class QbftProtocolScheduleBuilder extends BaseBftProtocolScheduleBuilder * @param miningParameters The mining parameters * @param badBlockManager the cache to use to keep invalid blocks * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param metricsSystem A metricSystem instance to be able to expose metrics in the underlying + * calls * @return the protocol schedule */ public static BftProtocolSchedule create( @@ -62,7 +65,8 @@ public static BftProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return new QbftProtocolScheduleBuilder() .createProtocolSchedule( config, @@ -73,7 +77,8 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } /** @@ -86,6 +91,8 @@ public static BftProtocolSchedule create( * @param miningParameters The mining parameters * @param badBlockManager the cache to use to keep invalid blocks * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param metricsSystem A metricSystem instance to be able to expose metrics in the underlying + * calls * @return the protocol schedule */ public static BftProtocolSchedule create( @@ -95,7 +102,8 @@ public static BftProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return create( config, qbftForksSchedule, @@ -105,7 +113,8 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } /** @@ -118,6 +127,8 @@ public static BftProtocolSchedule create( * @param miningParameters The mining parameters * @param badBlockManager the cache to use to keep invalid blocks * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param metricsSystem A metricSystem instance to be able to expose metrics in the underlying + * calls * @return the protocol schedule */ public static ProtocolSchedule create( @@ -127,7 +138,8 @@ public static ProtocolSchedule create( final BftExtraDataCodec bftExtraDataCodec, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return create( config, qbftForksSchedule, @@ -137,7 +149,8 @@ public static ProtocolSchedule create( EvmConfiguration.DEFAULT, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } @Override diff --git a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleTest.java b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleTest.java index 7ac33303415..16e8f7ceb26 100644 --- a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleTest.java +++ b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleTest.java @@ -40,6 +40,7 @@ import org.hyperledger.besu.ethereum.core.Util; import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; import java.util.Collection; @@ -139,7 +140,8 @@ private BftProtocolSchedule createProtocolSchedule( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } private boolean validateHeader( diff --git a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerTest.java b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerTest.java index d885fde3cf4..f00bec14d7e 100644 --- a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerTest.java +++ b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerTest.java @@ -78,6 +78,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.util.Subscribers; import java.math.BigInteger; @@ -185,7 +186,8 @@ QbftContext.class, validators, new QbftExtraDataCodec()), EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); ProtocolSchedule protocolSchedule = new BftProtocolSchedule( diff --git a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/BlockchainImporter.java b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/BlockchainImporter.java index d4ebe5e0f1c..3e261abf6d7 100644 --- a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/BlockchainImporter.java +++ b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/BlockchainImporter.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions; import org.hyperledger.besu.ethereum.util.RawBlockIterator; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.net.URL; import java.nio.file.Paths; @@ -47,7 +48,8 @@ public BlockchainImporter(final URL blocksUrl, final String genesisJson) throws GenesisConfigFile.fromConfig(genesisJson).getConfigOptions(), MiningParameters.newDefault(), new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); final BlockHeaderFunctions blockHeaderFunctions = ScheduleBasedBlockHeaderFunctions.create(protocolSchedule); blocks = new ArrayList<>(); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceHostAllowlistTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceHostAllowlistTest.java index 930bed2f1ce..80626ef2fc6 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceHostAllowlistTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceHostAllowlistTest.java @@ -110,7 +110,8 @@ public void initServerAndClient() throws Exception { new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), MiningParameters.MINING_DISABLED, new BadBlockManager(), - false), + false, + new NoOpMetricsSystem()), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceLoginTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceLoginTest.java index 40fe3db420e..0fb55fdf344 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceLoginTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceLoginTest.java @@ -141,7 +141,8 @@ public static void initServerAndClient() throws Exception { genesisConfigOptions, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false), + false, + new NoOpMetricsSystem()), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTestBase.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTestBase.java index 6be01fffa37..a2a856333ea 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTestBase.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTestBase.java @@ -119,7 +119,8 @@ public static void initServerAndClient() throws Exception { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false), + false, + new NoOpMetricsSystem()), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsClientAuthTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsClientAuthTest.java index 1acdeae8b44..1d3a3a087a7 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsClientAuthTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsClientAuthTest.java @@ -124,7 +124,8 @@ public void initServer() throws Exception { new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), MiningParameters.MINING_DISABLED, new BadBlockManager(), - false), + false, + new NoOpMetricsSystem()), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsMisconfigurationTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsMisconfigurationTest.java index 4d0580318a8..684f843d2fb 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsMisconfigurationTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsMisconfigurationTest.java @@ -112,7 +112,8 @@ public void beforeEach() { new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), MiningParameters.MINING_DISABLED, new BadBlockManager(), - false), + false, + new NoOpMetricsSystem()), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsTest.java index 4f00336775a..b6d7fa67f81 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceTlsTest.java @@ -113,7 +113,8 @@ public void initServer() throws Exception { new StubGenesisConfigOptions().constantinopleBlock(0).chainId(CHAIN_ID), MiningParameters.MINING_DISABLED, new BadBlockManager(), - false), + false, + new NoOpMetricsSystem()), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java index 18a9ff0af4d..aee8bd8cc27 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java @@ -32,6 +32,7 @@ import org.hyperledger.besu.ethereum.mainnet.MiningBeneficiaryCalculator; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.util.Collections; import java.util.List; @@ -153,7 +154,8 @@ public void assertThatTraceGeneratorReturnValidRewardsForClassicBlockProcessor() true, false, eraRounds, - protocolSchedule); + protocolSchedule, + new NoOpMetricsSystem()); when(protocolSpec.getBlockProcessor()).thenReturn(blockProcessor); final Stream traceStream = diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/WebSocketServiceLoginTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/WebSocketServiceLoginTest.java index 3175f56b8d1..75927c45130 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/WebSocketServiceLoginTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/WebSocketServiceLoginTest.java @@ -177,7 +177,8 @@ public void before() throws URISyntaxException { genesisConfigOptions, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false), + false, + new NoOpMetricsSystem()), mock(ProtocolContext.class), mock(FilterManager.class), mock(TransactionPool.class), 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 a56115534c9..d51e56fd4ce 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 @@ -373,7 +373,8 @@ private AbstractBlockCreator createBlockCreator(final ProtocolSpecAdapters proto EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule()) .build(); diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java index 6fc263c3265..c6ee454241a 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java @@ -224,7 +224,8 @@ public void emptyPendingTransactionsResultsInEmptyVettingResult() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); final MainnetTransactionProcessor mainnetTransactionProcessor = protocolSchedule.getByBlockHeader(blockHeader(0)).getTransactionProcessor(); diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java index 8d5b6351f5f..f33424183a6 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java @@ -36,6 +36,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.testutil.TestClock; import org.hyperledger.besu.util.number.Fraction; @@ -65,7 +66,8 @@ protected ProtocolSchedule createProtocolSchedule() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); } diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java index c983cd0f2cb..a59841d4f4f 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LondonFeeMarketBlockTransactionSelectorTest.java @@ -43,6 +43,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.ethereum.mainnet.ValidationResult; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.plugin.data.TransactionSelectionResult; import org.hyperledger.besu.testutil.TestClock; import org.hyperledger.besu.util.number.Fraction; @@ -72,7 +73,8 @@ protected ProtocolSchedule createProtocolSchedule() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); } diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java index caffcec528f..e90d1499dd7 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java @@ -95,7 +95,8 @@ void createMainnetBlock1() throws IOException { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule()) .build(); @@ -152,7 +153,8 @@ void createMainnetBlock1_fixedDifficulty1() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule()) .build(); @@ -199,7 +201,8 @@ void rewardBeneficiary_zeroReward_skipZeroRewardsFalse() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); @@ -269,7 +272,8 @@ void rewardBeneficiary_zeroReward_skipZeroRewardsTrue() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java index 9a95bb33b63..9e66ac7c06a 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedDifficultyProtocolSchedule.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; /** A ProtocolSchedule which behaves similarly to MainNet, but with a much reduced difficulty. */ public class FixedDifficultyProtocolSchedule { @@ -33,7 +34,8 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return new ProtocolScheduleBuilder( config, ProtocolSpecAdapters.create( @@ -45,7 +47,8 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .createProtocolSchedule(); } @@ -55,7 +58,8 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return create( config, PrivacyParameters.DEFAULT, @@ -63,7 +67,8 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public static ProtocolSchedule create( @@ -71,7 +76,8 @@ public static ProtocolSchedule create( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return create( config, PrivacyParameters.DEFAULT, @@ -79,6 +85,7 @@ public static ProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } } 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 2696bec9fcb..c06a4963e20 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 @@ -43,6 +43,9 @@ import org.hyperledger.besu.evm.tracing.OperationTracer; import org.hyperledger.besu.evm.worldstate.WorldState; import org.hyperledger.besu.evm.worldstate.WorldUpdater; +import org.hyperledger.besu.metrics.BesuMetricCategory; +import org.hyperledger.besu.plugin.services.MetricsSystem; +import org.hyperledger.besu.plugin.services.metrics.Counter; import java.text.MessageFormat; import java.util.ArrayList; @@ -77,6 +80,9 @@ TransactionReceipt create( protected final boolean skipZeroBlockRewards; private final ProtocolSchedule protocolSchedule; + private final Optional metricsSystem; + private final Optional confirmedParallelizedTransactionCounter; + private final Optional conflictingButCachedTransactionCounter; protected final MiningBeneficiaryCalculator miningBeneficiaryCalculator; @@ -95,6 +101,45 @@ protected AbstractBlockProcessor( this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; this.skipZeroBlockRewards = skipZeroBlockRewards; this.protocolSchedule = protocolSchedule; + this.metricsSystem = Optional.empty(); + this.confirmedParallelizedTransactionCounter = Optional.empty(); + this.conflictingButCachedTransactionCounter = Optional.empty(); + } + + protected AbstractBlockProcessor( + final MainnetTransactionProcessor transactionProcessor, + final TransactionReceiptFactory transactionReceiptFactory, + final Wei blockReward, + final MiningBeneficiaryCalculator miningBeneficiaryCalculator, + final boolean skipZeroBlockRewards, + final boolean isParallelTxEnabled, + final ProtocolSchedule protocolSchedule, + final MetricsSystem metricsSystem) { + this.transactionProcessor = transactionProcessor; + this.isParallelTxEnabled = isParallelTxEnabled; + this.transactionReceiptFactory = transactionReceiptFactory; + this.blockReward = blockReward; + this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; + this.skipZeroBlockRewards = skipZeroBlockRewards; + this.protocolSchedule = protocolSchedule; + this.metricsSystem = Optional.of(metricsSystem); + this.confirmedParallelizedTransactionCounter = + Optional.of( + this.metricsSystem + .get() + .createCounter( + BesuMetricCategory.BLOCK_PROCESSING, + "parallelized_transactions_counter", + "Counter for the number of parallelized transactions during block processing")); + + this.conflictingButCachedTransactionCounter = + Optional.of( + this.metricsSystem + .get() + .createCounter( + BesuMetricCategory.BLOCK_PROCESSING, + "conflicted_transactions_counter", + "Counter for the number of conflicted transactions during block processing")); } @Override @@ -166,7 +211,13 @@ public BlockProcessingResult processBlock( transactionProcessingResult = parallelizedConcurrentTransactionProcessor .get() - .applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, i) + .applyParallelizedTransactionResult( + worldState, + miningBeneficiary, + transaction, + i, + confirmedParallelizedTransactionCounter, + conflictingButCachedTransactionCounter) .orElse(null); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java index c14877e20ac..c2e96fd7ba8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java @@ -19,6 +19,7 @@ import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.worldstate.WorldUpdater; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.List; @@ -43,7 +44,8 @@ public ClassicBlockProcessor( final boolean skipZeroBlockRewards, final boolean isParallelTxEnabled, final OptionalLong eraLen, - final ProtocolSchedule protocolSchedule) { + final ProtocolSchedule protocolSchedule, + final MetricsSystem metricsSystem) { super( transactionProcessor, transactionReceiptFactory, @@ -51,7 +53,8 @@ public ClassicBlockProcessor( miningBeneficiaryCalculator, skipZeroBlockRewards, isParallelTxEnabled, - protocolSchedule); + protocolSchedule, + metricsSystem); eraLength = eraLen.orElse(DEFAULT_ERA_LENGTH); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java index 03092ab7fee..a5961f5aced 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java @@ -38,6 +38,7 @@ import org.hyperledger.besu.evm.processor.ContractCreationProcessor; import org.hyperledger.besu.evm.processor.MessageCallProcessor; import org.hyperledger.besu.evm.worldstate.WorldState; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.Collections; @@ -54,8 +55,11 @@ private ClassicProtocolSpecs() { } public static ProtocolSpecBuilder classicRecoveryInitDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelTxEnabled) + final EvmConfiguration evmConfiguration, + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return MainnetProtocolSpecs.homesteadDefinition( + evmConfiguration, isParallelTxEnabled, metricsSystem) .blockHeaderValidatorBuilder( feeMarket -> MainnetBlockHeaderValidator.createClassicValidator()) .name("ClassicRecoveryInit"); @@ -64,8 +68,10 @@ public static ProtocolSpecBuilder classicRecoveryInitDefinition( public static ProtocolSpecBuilder tangerineWhistleDefinition( final Optional chainId, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return MainnetProtocolSpecs.homesteadDefinition( + evmConfiguration, isParallelTxEnabled, metricsSystem) .isReplayProtectionSupported(true) .gasCalculator(TangerineWhistleGasCalculator::new) .transactionValidatorFactoryBuilder( @@ -78,8 +84,9 @@ public static ProtocolSpecBuilder tangerineWhistleDefinition( public static ProtocolSpecBuilder dieHardDefinition( final Optional chainId, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return tangerineWhistleDefinition(chainId, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return tangerineWhistleDefinition(chainId, evmConfiguration, isParallelTxEnabled, metricsSystem) .gasCalculator(DieHardGasCalculator::new) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_PAUSED) .name("DieHard"); @@ -89,8 +96,9 @@ public static ProtocolSpecBuilder gothamDefinition( final Optional chainId, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return dieHardDefinition(chainId, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return dieHardDefinition(chainId, evmConfiguration, isParallelTxEnabled, metricsSystem) .blockReward(MAX_BLOCK_REWARD) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_DELAYED) .blockProcessorBuilder( @@ -100,7 +108,8 @@ public static ProtocolSpecBuilder gothamDefinition( miningBeneficiaryCalculator, skipZeroBlockRewards, parallelTxEnabled, - protocolSchedule) -> + protocolSchedule, + localMetricsSystem) -> new ClassicBlockProcessor( transactionProcessor, transactionReceiptFactory, @@ -109,7 +118,8 @@ public static ProtocolSpecBuilder gothamDefinition( skipZeroBlockRewards, parallelTxEnabled, ecip1017EraRounds, - protocolSchedule)) + protocolSchedule, + localMetricsSystem)) .name("Gotham"); } @@ -117,8 +127,10 @@ public static ProtocolSpecBuilder defuseDifficultyBombDefinition( final Optional chainId, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return gothamDefinition( + chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled, metricsSystem) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_REMOVED) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -132,8 +144,10 @@ public static ProtocolSpecBuilder atlantisDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return gothamDefinition( + chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled, metricsSystem) .evmBuilder(MainnetEVMs::byzantium) .evmConfiguration(evmConfiguration) .gasCalculator(SpuriousDragonGasCalculator::new) @@ -173,9 +187,15 @@ public static ProtocolSpecBuilder aghartaDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return atlantisDefinition( - chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem) .evmBuilder(MainnetEVMs::constantinople) .gasCalculator(PetersburgGasCalculator::new) .evmBuilder(MainnetEVMs::constantinople) @@ -188,9 +208,15 @@ public static ProtocolSpecBuilder phoenixDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return aghartaDefinition( - chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem) .gasCalculator(IstanbulGasCalculator::new) .evmBuilder( (gasCalculator, evmConfig) -> @@ -205,9 +231,15 @@ public static ProtocolSpecBuilder thanosDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return phoenixDefinition( - chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem) .blockHeaderValidatorBuilder( feeMarket -> MainnetBlockHeaderValidator.createPgaBlockHeaderValidator( @@ -244,9 +276,15 @@ public static ProtocolSpecBuilder magnetoDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return thanosDefinition( - chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem) .gasCalculator(BerlinGasCalculator::new) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -268,9 +306,15 @@ public static ProtocolSpecBuilder mystiqueDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return magnetoDefinition( - chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem) .gasCalculator(LondonGasCalculator::new) .contractCreationProcessorBuilder( evm -> @@ -284,9 +328,15 @@ public static ProtocolSpecBuilder spiralDefinition( final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return mystiqueDefinition( - chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled) + chainId, + enableRevertReason, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem) // EIP-3860 .gasCalculator(ShanghaiGasCalculator::new) // EIP-3855 diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java index 603ca089b08..669100101c7 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java @@ -20,6 +20,7 @@ import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.worldstate.WorldUpdater; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.List; @@ -48,6 +49,26 @@ public MainnetBlockProcessor( protocolSchedule); } + public MainnetBlockProcessor( + final MainnetTransactionProcessor transactionProcessor, + final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory, + final Wei blockReward, + final MiningBeneficiaryCalculator miningBeneficiaryCalculator, + final boolean skipZeroBlockRewards, + final boolean isParallelTxEnabled, + final ProtocolSchedule protocolSchedule, + final MetricsSystem metricsSystem) { + super( + transactionProcessor, + transactionReceiptFactory, + blockReward, + miningBeneficiaryCalculator, + skipZeroBlockRewards, + isParallelTxEnabled, + protocolSchedule, + metricsSystem); + } + @Override protected boolean rewardCoinbase( final MutableWorldState worldState, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java index 38990eaca9e..843c6b3f831 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.ethereum.difficulty.fixed.FixedDifficultyCalculators; import org.hyperledger.besu.ethereum.difficulty.fixed.FixedDifficultyProtocolSchedule; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.function.Function; @@ -40,7 +41,8 @@ public class MainnetProtocolSchedule { * @param evmConfiguration how to configure the EVMs jumpdest cache * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks - * @param isParallelTxEnabled indicates whether parallel transaction is enabled. + * @param isParallelTxEnabled indicates whether parallel transaction is enabled + * @param metricsSystem A metricSystem instance to expose metrics in the underlying calls * @return A configured mainnet protocol schedule */ public static ProtocolSchedule fromConfig( @@ -50,7 +52,8 @@ public static ProtocolSchedule fromConfig( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { if (FixedDifficultyCalculators.isFixedDifficultyInConfig(config)) { return FixedDifficultyProtocolSchedule.create( config, @@ -59,7 +62,8 @@ public static ProtocolSchedule fromConfig( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } return new ProtocolScheduleBuilder( config, @@ -70,7 +74,8 @@ public static ProtocolSchedule fromConfig( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .createProtocolSchedule(); } @@ -92,7 +97,8 @@ public static ProtocolSchedule fromConfig( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return fromConfig( config, PrivacyParameters.DEFAULT, @@ -100,7 +106,8 @@ public static ProtocolSchedule fromConfig( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } /** @@ -119,7 +126,8 @@ public static ProtocolSchedule fromConfig( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return fromConfig( config, PrivacyParameters.DEFAULT, @@ -127,7 +135,8 @@ public static ProtocolSchedule fromConfig( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } /** @@ -144,7 +153,8 @@ public static ProtocolSchedule fromConfig( final GenesisConfigOptions config, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return fromConfig( config, PrivacyParameters.DEFAULT, @@ -152,6 +162,7 @@ public static ProtocolSchedule fromConfig( EvmConfiguration.DEFAULT, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java index d86fcbee921..1f682dda753 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java @@ -17,6 +17,7 @@ import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.Optional; @@ -29,8 +30,8 @@ public class MainnetProtocolSpecFactory { private final OptionalLong ecip1017EraRounds; private final EvmConfiguration evmConfiguration; private final MiningParameters miningParameters; - private final boolean isParallelTxEnabled; + private final MetricsSystem metricsSystem; public MainnetProtocolSpecFactory( final Optional chainId, @@ -38,69 +39,75 @@ public MainnetProtocolSpecFactory( final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { this.chainId = chainId; this.isRevertReasonEnabled = isRevertReasonEnabled; this.ecip1017EraRounds = ecip1017EraRounds; this.evmConfiguration = evmConfiguration; this.miningParameters = miningParameters; this.isParallelTxEnabled = isParallelTxEnabled; + this.metricsSystem = metricsSystem; } public ProtocolSpecBuilder frontierDefinition() { - return MainnetProtocolSpecs.frontierDefinition(evmConfiguration, isParallelTxEnabled); + return MainnetProtocolSpecs.frontierDefinition( + evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder homesteadDefinition() { - return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration, isParallelTxEnabled); + return MainnetProtocolSpecs.homesteadDefinition( + evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder daoRecoveryInitDefinition() { - return MainnetProtocolSpecs.daoRecoveryInitDefinition(evmConfiguration, isParallelTxEnabled); + return MainnetProtocolSpecs.daoRecoveryInitDefinition( + evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder daoRecoveryTransitionDefinition() { return MainnetProtocolSpecs.daoRecoveryTransitionDefinition( - evmConfiguration, isParallelTxEnabled); + evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder tangerineWhistleDefinition() { - return MainnetProtocolSpecs.tangerineWhistleDefinition(evmConfiguration, isParallelTxEnabled); + return MainnetProtocolSpecs.tangerineWhistleDefinition( + evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder spuriousDragonDefinition() { return MainnetProtocolSpecs.spuriousDragonDefinition( - chainId, evmConfiguration, isParallelTxEnabled); + chainId, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder byzantiumDefinition() { return MainnetProtocolSpecs.byzantiumDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder constantinopleDefinition() { return MainnetProtocolSpecs.constantinopleDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder petersburgDefinition() { return MainnetProtocolSpecs.petersburgDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder istanbulDefinition() { return MainnetProtocolSpecs.istanbulDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder muirGlacierDefinition() { return MainnetProtocolSpecs.muirGlacierDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder berlinDefinition() { return MainnetProtocolSpecs.berlinDefinition( - chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled); + chainId, isRevertReasonEnabled, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder londonDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -110,7 +117,8 @@ public ProtocolSpecBuilder londonDefinition(final GenesisConfigOptions genesisCo genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder arrowGlacierDefinition( @@ -121,7 +129,8 @@ public ProtocolSpecBuilder arrowGlacierDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder grayGlacierDefinition( @@ -132,7 +141,8 @@ public ProtocolSpecBuilder grayGlacierDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder parisDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -142,7 +152,8 @@ public ProtocolSpecBuilder parisDefinition(final GenesisConfigOptions genesisCon genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder shanghaiDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -152,7 +163,8 @@ public ProtocolSpecBuilder shanghaiDefinition(final GenesisConfigOptions genesis genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder cancunDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -162,7 +174,8 @@ public ProtocolSpecBuilder cancunDefinition(final GenesisConfigOptions genesisCo genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder cancunEOFDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -172,7 +185,8 @@ public ProtocolSpecBuilder cancunEOFDefinition(final GenesisConfigOptions genesi genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder pragueDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -182,7 +196,8 @@ public ProtocolSpecBuilder pragueDefinition(final GenesisConfigOptions genesisCo genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder pragueEOFDefinition(final GenesisConfigOptions genesisConfigOptions) { @@ -192,7 +207,8 @@ public ProtocolSpecBuilder pragueEOFDefinition(final GenesisConfigOptions genesi genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } /** @@ -213,7 +229,8 @@ public ProtocolSpecBuilder futureEipsDefinition(final GenesisConfigOptions genes genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } /** @@ -234,58 +251,95 @@ public ProtocolSpecBuilder experimentalEipsDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// // Classic Protocol Specs public ProtocolSpecBuilder dieHardDefinition() { - return ClassicProtocolSpecs.dieHardDefinition(chainId, evmConfiguration, isParallelTxEnabled); + return ClassicProtocolSpecs.dieHardDefinition( + chainId, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder gothamDefinition() { return ClassicProtocolSpecs.gothamDefinition( - chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder defuseDifficultyBombDefinition() { return ClassicProtocolSpecs.defuseDifficultyBombDefinition( - chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled, metricsSystem); } public ProtocolSpecBuilder atlantisDefinition() { return ClassicProtocolSpecs.atlantisDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder aghartaDefinition() { return ClassicProtocolSpecs.aghartaDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder phoenixDefinition() { return ClassicProtocolSpecs.phoenixDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder thanosDefinition() { return ClassicProtocolSpecs.thanosDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder magnetoDefinition() { return ClassicProtocolSpecs.magnetoDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder mystiqueDefinition() { return ClassicProtocolSpecs.mystiqueDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem); } public ProtocolSpecBuilder spiralDefinition() { return ClassicProtocolSpecs.spiralDefinition( - chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration, isParallelTxEnabled); + chainId, + isRevertReasonEnabled, + ecip1017EraRounds, + evmConfiguration, + isParallelTxEnabled, + metricsSystem); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index f44ef21a7fe..f25430999ce 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -67,6 +67,7 @@ import org.hyperledger.besu.evm.processor.MessageCallProcessor; import org.hyperledger.besu.evm.worldstate.WorldState; import org.hyperledger.besu.evm.worldstate.WorldUpdater; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.io.IOException; import java.math.BigInteger; @@ -102,7 +103,9 @@ public abstract class MainnetProtocolSpecs { private MainnetProtocolSpecs() {} public static ProtocolSpecBuilder frontierDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { + final EvmConfiguration evmConfiguration, + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return new ProtocolSpecBuilder() .gasCalculator(FrontierGasCalculator::new) .gasLimitCalculatorBuilder(feeMarket -> new FrontierTargetingGasLimitCalculator()) @@ -154,6 +157,7 @@ public static ProtocolSpecBuilder frontierDefinition( .blockReward(FRONTIER_BLOCK_REWARD) .skipZeroBlockRewards(false) .isParallelTxEnabled(isParallelTxEnabled) + .metricsSystem(metricsSystem) .blockProcessorBuilder(MainnetBlockProcessor::new) .blockValidatorBuilder(MainnetProtocolSpecs.blockValidatorBuilder()) .blockImporterBuilder(MainnetBlockImporter::new) @@ -176,8 +180,10 @@ public static BlockValidatorBuilder blockValidatorBuilder() { } public static ProtocolSpecBuilder homesteadDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { - return frontierDefinition(evmConfiguration, isParallelTxEnabled) + final EvmConfiguration evmConfiguration, + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return frontierDefinition(evmConfiguration, isParallelTxEnabled, metricsSystem) .gasCalculator(HomesteadGasCalculator::new) .evmBuilder(MainnetEVMs::homestead) .contractCreationProcessorBuilder( @@ -193,8 +199,10 @@ public static ProtocolSpecBuilder homesteadDefinition( } public static ProtocolSpecBuilder daoRecoveryInitDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { - return homesteadDefinition(evmConfiguration, isParallelTxEnabled) + final EvmConfiguration evmConfiguration, + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return homesteadDefinition(evmConfiguration, isParallelTxEnabled, metricsSystem) .blockHeaderValidatorBuilder(feeMarket -> MainnetBlockHeaderValidator.createDaoValidator()) .blockProcessorBuilder( (transactionProcessor, @@ -203,7 +211,8 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( miningBeneficiaryCalculator, skipZeroBlockRewards, parallelTxEnabled, - protocolSchedule) -> + protocolSchedule, + localMetricsSystem) -> new DaoBlockProcessor( new MainnetBlockProcessor( transactionProcessor, @@ -212,20 +221,25 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( miningBeneficiaryCalculator, skipZeroBlockRewards, parallelTxEnabled, - protocolSchedule))) + protocolSchedule, + localMetricsSystem))) .name("DaoRecoveryInit"); } public static ProtocolSpecBuilder daoRecoveryTransitionDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { - return daoRecoveryInitDefinition(evmConfiguration, isParallelTxEnabled) + final EvmConfiguration evmConfiguration, + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return daoRecoveryInitDefinition(evmConfiguration, isParallelTxEnabled, metricsSystem) .blockProcessorBuilder(MainnetBlockProcessor::new) .name("DaoRecoveryTransition"); } public static ProtocolSpecBuilder tangerineWhistleDefinition( - final EvmConfiguration evmConfiguration, final boolean isParallelTxEnabled) { - return homesteadDefinition(evmConfiguration, isParallelTxEnabled) + final EvmConfiguration evmConfiguration, + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return homesteadDefinition(evmConfiguration, isParallelTxEnabled, metricsSystem) .gasCalculator(TangerineWhistleGasCalculator::new) .name("TangerineWhistle"); } @@ -233,8 +247,9 @@ public static ProtocolSpecBuilder tangerineWhistleDefinition( public static ProtocolSpecBuilder spuriousDragonDefinition( final Optional chainId, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return tangerineWhistleDefinition(evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return tangerineWhistleDefinition(evmConfiguration, isParallelTxEnabled, metricsSystem) .isReplayProtectionSupported(true) .gasCalculator(SpuriousDragonGasCalculator::new) .skipZeroBlockRewards(true) @@ -279,8 +294,9 @@ public static ProtocolSpecBuilder byzantiumDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return spuriousDragonDefinition(chainId, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return spuriousDragonDefinition(chainId, evmConfiguration, isParallelTxEnabled, metricsSystem) .gasCalculator(ByzantiumGasCalculator::new) .evmBuilder(MainnetEVMs::byzantium) .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::byzantium) @@ -310,8 +326,10 @@ public static ProtocolSpecBuilder constantinopleDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return byzantiumDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return byzantiumDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled, metricsSystem) .difficultyCalculator(MainnetDifficultyCalculators.CONSTANTINOPLE) .gasCalculator(ConstantinopleGasCalculator::new) .evmBuilder(MainnetEVMs::constantinople) @@ -323,9 +341,10 @@ public static ProtocolSpecBuilder petersburgDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return constantinopleDefinition( - chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) + chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled, metricsSystem) .gasCalculator(PetersburgGasCalculator::new) .name("Petersburg"); } @@ -334,8 +353,10 @@ public static ProtocolSpecBuilder istanbulDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return petersburgDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return petersburgDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled, metricsSystem) .gasCalculator(IstanbulGasCalculator::new) .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -357,8 +378,10 @@ static ProtocolSpecBuilder muirGlacierDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return istanbulDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return istanbulDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled, metricsSystem) .difficultyCalculator(MainnetDifficultyCalculators.MUIR_GLACIER) .name("MuirGlacier"); } @@ -367,8 +390,10 @@ static ProtocolSpecBuilder berlinDefinition( final Optional chainId, final boolean enableRevertReason, final EvmConfiguration evmConfiguration, - final boolean isParallelTxEnabled) { - return muirGlacierDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { + return muirGlacierDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled, metricsSystem) .gasCalculator(BerlinGasCalculator::new) .transactionValidatorFactoryBuilder( (evm, gasLimitCalculator, feeMarket) -> @@ -391,7 +416,8 @@ static ProtocolSpecBuilder londonDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(Long.MAX_VALUE); final BaseFeeMarket londonFeeMarket; @@ -405,7 +431,8 @@ static ProtocolSpecBuilder londonDefinition( londonFeeMarket = FeeMarket.london(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); } - return berlinDefinition(chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled) + return berlinDefinition( + chainId, enableRevertReason, evmConfiguration, isParallelTxEnabled, metricsSystem) .feeMarket(londonFeeMarket) .gasCalculator(LondonGasCalculator::new) .gasLimitCalculatorBuilder( @@ -471,14 +498,16 @@ static ProtocolSpecBuilder arrowGlacierDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return londonDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .difficultyCalculator(MainnetDifficultyCalculators.ARROW_GLACIER) .name("ArrowGlacier"); } @@ -489,14 +518,16 @@ static ProtocolSpecBuilder grayGlacierDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return arrowGlacierDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .difficultyCalculator(MainnetDifficultyCalculators.GRAY_GLACIER) .name("GrayGlacier"); } @@ -507,7 +538,8 @@ static ProtocolSpecBuilder parisDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return grayGlacierDefinition( chainId, @@ -515,7 +547,8 @@ static ProtocolSpecBuilder parisDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.paris(gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) @@ -533,14 +566,16 @@ static ProtocolSpecBuilder shanghaiDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return parisDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) // gas calculator has new code to support EIP-3860 limit and meter initcode .gasCalculator(ShanghaiGasCalculator::new) // EVM has a new operation for EIP-3855 PUSH0 instruction @@ -590,7 +625,8 @@ static ProtocolSpecBuilder cancunDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(0L); final BaseFeeMarket cancunFeeMarket; if (genesisConfigOptions.isZeroBaseFee()) { @@ -610,7 +646,8 @@ static ProtocolSpecBuilder cancunDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .feeMarket(cancunFeeMarket) // gas calculator for EIP-4844 blob gas .gasCalculator(CancunGasCalculator::new) @@ -668,7 +705,8 @@ static ProtocolSpecBuilder cancunEOFDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { ProtocolSpecBuilder protocolSpecBuilder = cancunDefinition( @@ -677,7 +715,8 @@ static ProtocolSpecBuilder cancunEOFDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); return addEOF(chainId, evmConfiguration, protocolSpecBuilder).name("CancunEOF"); } @@ -687,7 +726,8 @@ static ProtocolSpecBuilder pragueDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { final Address depositContractAddress = genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS); @@ -698,7 +738,8 @@ static ProtocolSpecBuilder pragueDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) // EIP-3074 AUTH and AUTCALL gas .gasCalculator(PragueGasCalculator::new) // EIP-3074 AUTH and AUTCALL @@ -726,7 +767,8 @@ static ProtocolSpecBuilder pragueEOFDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { ProtocolSpecBuilder protocolSpecBuilder = pragueDefinition( @@ -735,7 +777,8 @@ static ProtocolSpecBuilder pragueEOFDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); return addEOF(chainId, evmConfiguration, protocolSpecBuilder).name("PragueEOF"); } @@ -768,14 +811,16 @@ static ProtocolSpecBuilder futureEipsDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return pragueEOFDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) // Use Future EIP configured EVM .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -801,7 +846,8 @@ static ProtocolSpecBuilder experimentalEipsDefinition( final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { return futureEipsDefinition( chainId, @@ -809,7 +855,8 @@ static ProtocolSpecBuilder experimentalEipsDefinition( genesisConfigOptions, evmConfiguration, miningParameters, - isParallelTxEnabled) + isParallelTxEnabled, + metricsSystem) .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.experimentalEips( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java index 6147cf332af..8c06ce12196 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java @@ -20,6 +20,7 @@ import org.hyperledger.besu.ethereum.core.PrivacyParameters; import org.hyperledger.besu.ethereum.privacy.PrivateTransactionValidator; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.NavigableMap; @@ -45,8 +46,8 @@ public class ProtocolScheduleBuilder { private final EvmConfiguration evmConfiguration; private final MiningParameters miningParameters; private final BadBlockManager badBlockManager; - private final boolean isParallelTxEnabled; + private final MetricsSystem metricsSystem; public ProtocolScheduleBuilder( final GenesisConfigOptions config, @@ -57,7 +58,8 @@ public ProtocolScheduleBuilder( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { this( config, Optional.of(defaultChainId), @@ -67,7 +69,8 @@ public ProtocolScheduleBuilder( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } public ProtocolScheduleBuilder( @@ -78,7 +81,8 @@ public ProtocolScheduleBuilder( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { this( config, Optional.empty(), @@ -88,7 +92,8 @@ public ProtocolScheduleBuilder( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); } private ProtocolScheduleBuilder( @@ -100,7 +105,8 @@ private ProtocolScheduleBuilder( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled) { + final boolean isParallelTxEnabled, + final MetricsSystem metricsSystem) { this.config = config; this.protocolSpecAdapters = protocolSpecAdapters; this.privacyParameters = privacyParameters; @@ -110,6 +116,7 @@ private ProtocolScheduleBuilder( this.miningParameters = miningParameters; this.badBlockManager = badBlockManager; this.isParallelTxEnabled = isParallelTxEnabled; + this.metricsSystem = metricsSystem; } public ProtocolSchedule createProtocolSchedule() { @@ -130,7 +137,8 @@ private void initSchedule( evmConfiguration.overrides( config.getContractSizeLimit(), OptionalInt.empty(), config.getEvmStackSize()), miningParameters, - isParallelTxEnabled); + isParallelTxEnabled, + metricsSystem); validateForkOrdering(); @@ -213,7 +221,7 @@ private void initSchedule( BuilderMapEntry.MilestoneType.BLOCK_NUMBER, classicBlockNumber, ClassicProtocolSpecs.classicRecoveryInitDefinition( - evmConfiguration, isParallelTxEnabled), + evmConfiguration, isParallelTxEnabled, metricsSystem), Function.identity()); protocolSchedule.putBlockNumberMilestone( classicBlockNumber + 1, originalProtocolSpec); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index cb94ae53adc..6dc29f52129 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -40,6 +40,7 @@ import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.precompile.PrecompileContractRegistry; import org.hyperledger.besu.evm.processor.AbstractMessageProcessor; +import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.Optional; import java.util.function.BiFunction; @@ -90,6 +91,7 @@ public class ProtocolSpecBuilder { private PoWHasher powHasher = PoWHasher.ETHASH_LIGHT; private boolean isPoS = false; private boolean isReplayProtectionSupported = false; + private MetricsSystem metricsSystem; public ProtocolSpecBuilder gasCalculator(final Supplier gasCalculatorBuilder) { this.gasCalculatorBuilder = gasCalculatorBuilder; @@ -301,6 +303,11 @@ public ProtocolSpecBuilder isReplayProtectionSupported( return this; } + public ProtocolSpecBuilder metricsSystem(final MetricsSystem metricsSystem) { + this.metricsSystem = metricsSystem; + return this; + } + public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { checkNotNull(gasCalculatorBuilder, "Missing gasCalculator"); checkNotNull(gasLimitCalculatorBuilder, "Missing gasLimitCalculatorBuilder"); @@ -461,7 +468,8 @@ private BlockProcessor createBlockProcessor( miningBeneficiaryCalculator, skipZeroBlockRewards, isParallelTxEnabled, - protocolSchedule); + protocolSchedule, + metricsSystem); } private BlockHeaderValidator createBlockHeaderValidator( @@ -501,7 +509,8 @@ BlockProcessor apply( MiningBeneficiaryCalculator miningBeneficiaryCalculator, boolean skipZeroBlockRewards, final boolean isParallelTxEnabled, - ProtocolSchedule protocolSchedule); + ProtocolSchedule protocolSchedule, + MetricsSystem metricsSystem); } public interface BlockValidatorBuilder { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java index 55af102caed..85aa3a55b56 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java @@ -30,6 +30,7 @@ import org.hyperledger.besu.evm.operation.BlockHashOperation; import org.hyperledger.besu.evm.tracing.OperationTracer; import org.hyperledger.besu.evm.worldstate.WorldView; +import org.hyperledger.besu.plugin.services.metrics.Counter; import java.util.List; import java.util.Map; @@ -60,9 +61,6 @@ public class ParallelizedConcurrentTransactionProcessor { private final Map parallelizedTransactionContextByLocation = new ConcurrentHashMap<>(); - int confirmedParallelizedTransaction = 0; - int conflictingButCachedTransaction = 0; - /** * Constructs a PreloadConcurrentTransactionProcessor with a specified transaction processor. This * processor is responsible for the individual processing of transactions. @@ -107,8 +105,6 @@ public void runAsyncBlock( final BlockHashOperation.BlockHashLookup blockHashLookup, final Wei blobGasPrice, final PrivateMetadataUpdater privateMetadataUpdater) { - confirmedParallelizedTransaction = 0; - conflictingButCachedTransaction = 0; for (int i = 0; i < transactions.size(); i++) { final Transaction transaction = transactions.get(i); final int transactionLocation = i; @@ -216,6 +212,10 @@ public void traceTransactionBeforeMiningReward( * @param miningBeneficiary Address of the beneficiary for mining rewards. * @param transaction Transaction for which the result is to be applied. * @param transactionLocation Index of the transaction within the block. + * @param confirmedParallelizedTransactionCounter Metric counter for confirmed parallelized + * transactions + * @param conflictingButCachedTransactionCounter Metric counter for conflicting but cached + * transactions * @return Optional containing the transaction processing result if applied, or empty if the * transaction needs to be replayed due to a conflict. */ @@ -223,7 +223,9 @@ public Optional applyParallelizedTransactionResult( final MutableWorldState worldState, final Address miningBeneficiary, final Transaction transaction, - final int transactionLocation) { + final int transactionLocation, + final Optional confirmedParallelizedTransactionCounter, + final Optional conflictingButCachedTransactionCounter) { final DiffBasedWorldState diffBasedWorldState = (DiffBasedWorldState) worldState; final DiffBasedWorldStateUpdateAccumulator blockAccumulator = (DiffBasedWorldStateUpdateAccumulator) diffBasedWorldState.updater(); @@ -247,11 +249,13 @@ public Optional applyParallelizedTransactionResult( blockAccumulator.importStateChangesFromSource(transactionAccumulator); - confirmedParallelizedTransaction++; + if (confirmedParallelizedTransactionCounter.isPresent()) + confirmedParallelizedTransactionCounter.get().inc(); return Optional.of(transactionProcessingResult); } else { blockAccumulator.importPriorStateFromSource(transactionAccumulator); - conflictingButCachedTransaction++; + if (conflictingButCachedTransactionCounter.isPresent()) + conflictingButCachedTransactionCounter.get().inc(); // If there is a conflict, we return an empty result to signal the block processor to // re-execute the transaction. return Optional.empty(); @@ -259,12 +263,4 @@ public Optional applyParallelizedTransactionResult( } return Optional.empty(); } - - public int getConfirmedParallelizedTransaction() { - return confirmedParallelizedTransaction; - } - - public int getConflictingButCachedTransaction() { - return conflictingButCachedTransaction; - } } diff --git a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockchainSetupUtil.java b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockchainSetupUtil.java index 44bb5d10075..551f593e825 100644 --- a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockchainSetupUtil.java +++ b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockchainSetupUtil.java @@ -143,7 +143,8 @@ private static ProtocolSchedule mainnetProtocolScheduleProvider( EvmConfiguration.DEFAULT, MiningParameters.newDefault(), new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } private static ProtocolContext mainnetProtocolContextProvider( diff --git a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java index 0346ed74e04..935de0336d3 100644 --- a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java +++ b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java @@ -143,7 +143,8 @@ public ExecutionContextTestFixture build() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); } if (blockchainKeyValueStorage == null) { diff --git a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ProtocolScheduleFixture.java b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ProtocolScheduleFixture.java index d7f8089745c..e94c6b49fd0 100644 --- a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ProtocolScheduleFixture.java +++ b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ProtocolScheduleFixture.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.ethereum.mainnet.MainnetProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.io.IOException; @@ -40,7 +41,8 @@ public class ProtocolScheduleFixture { EvmConfiguration.DEFAULT, MiningParameters.newDefault(), new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); private static GenesisConfigOptions getMainnetConfigOptions() { // this method avoids reading all the alloc accounts when all we want is the "config" section diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedProtocolScheduleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedProtocolScheduleTest.java index 00e0d674845..7969ab6824a 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedProtocolScheduleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/difficulty/fixed/FixedProtocolScheduleTest.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.junit.jupiter.api.Test; @@ -37,7 +38,8 @@ public void reportedDifficultyForAllBlocksIsAFixedValue() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); final BlockHeaderTestFixture headerBuilder = new BlockHeaderTestFixture(); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolScheduleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolScheduleTest.java index db411523623..2d5dd2cee34 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolScheduleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DefaultProtocolScheduleTest.java @@ -25,6 +25,7 @@ import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.PrivacyParameters; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; import java.util.Optional; @@ -62,7 +63,8 @@ public void setup() { evmConfiguration, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } @Test diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolScheduleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolScheduleTest.java index b4b6f6539cc..c63a9b5ccbd 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolScheduleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolScheduleTest.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.ProtocolScheduleFixture; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -74,7 +75,8 @@ public void shouldOnlyUseFrontierWhenEmptyJsonConfigIsUsed() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); Assertions.assertThat(sched.getByBlockHeader(blockHeader(1L)).getName()).isEqualTo("Frontier"); Assertions.assertThat(sched.getByBlockHeader(blockHeader(Long.MAX_VALUE)).getName()) .isEqualTo("Frontier"); @@ -90,7 +92,8 @@ public void createFromConfigWithSettings() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); Assertions.assertThat(sched.getByBlockHeader(blockHeader(1)).getName()).isEqualTo("Frontier"); Assertions.assertThat(sched.getByBlockHeader(blockHeader(2)).getName()).isEqualTo("Homestead"); Assertions.assertThat(sched.getByBlockHeader(blockHeader(3)).getName()) @@ -123,7 +126,8 @@ public void outOfOrderConstantinoplesFail() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false)); + false, + new NoOpMetricsSystem())); } private BlockHeader blockHeader(final long number) { diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilderTest.java index e1fbd071180..0e1011de761 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilderTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilderTest.java @@ -29,6 +29,7 @@ import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.PrivacyParameters; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; import java.util.OptionalLong; @@ -62,7 +63,8 @@ public void setup() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } @Test @@ -218,7 +220,8 @@ private MilestoneStreamingProtocolSchedule createScheduleModifiedAt(final int bl EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); return new MilestoneStreamingProtocolSchedule( (DefaultProtocolSchedule) builder.createProtocolSchedule()); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessorTest.java index 8c154031b4f..bba91843568 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessorTest.java @@ -129,7 +129,8 @@ void testRunTransaction() { assertTrue( processor - .applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, 0) + .applyParallelizedTransactionResult( + worldState, miningBeneficiary, transaction, 0, Optional.empty(), Optional.empty()) .isPresent(), "Expected the transaction context to be stored"); } @@ -160,7 +161,8 @@ void testRunTransactionWithFailure() { privateMetadataUpdater); Optional result = - processor.applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, 0); + processor.applyParallelizedTransactionResult( + worldState, miningBeneficiary, transaction, 0, Optional.empty(), Optional.empty()); assertTrue(result.isEmpty(), "Expected the transaction result to indicate a failure"); } @@ -204,7 +206,8 @@ void testRunTransactionWithConflict() { when(transactionCollisionDetector.hasCollision(any(), any(), any(), any())).thenReturn(true); Optional result = - processor.applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, 0); + processor.applyParallelizedTransactionResult( + worldState, miningBeneficiary, transaction, 0, Optional.empty(), Optional.empty()); assertTrue(result.isEmpty(), "Expected no transaction result to be applied due to conflict"); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/AbstractIsolationTests.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/AbstractIsolationTests.java index 998df3a7f05..388a112699a 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/AbstractIsolationTests.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/AbstractIsolationTests.java @@ -106,7 +106,8 @@ public abstract class AbstractIsolationTests { GenesisConfigFile.fromResource("/dev.json").getConfigOptions(), MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); protected final GenesisState genesisState = GenesisState.fromConfig(GenesisConfigFile.fromResource("/dev.json"), protocolSchedule); protected final MutableBlockchain blockchain = createInMemoryBlockchain(genesisState.getBlock()); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockBodiesMessageTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockBodiesMessageTest.java index 03a9322521b..b11afeb4c56 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockBodiesMessageTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockBodiesMessageTest.java @@ -34,6 +34,7 @@ import org.hyperledger.besu.ethereum.rlp.RLPException; import org.hyperledger.besu.ethereum.rlp.RLPInput; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.io.IOException; import java.nio.ByteBuffer; @@ -61,7 +62,8 @@ public void setup() { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } @Test diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockHeadersMessageTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockHeadersMessageTest.java index b5929dc9fd9..72f089a53eb 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockHeadersMessageTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/messages/BlockHeadersMessageTest.java @@ -26,6 +26,7 @@ import org.hyperledger.besu.ethereum.rlp.RLP; import org.hyperledger.besu.ethereum.rlp.RLPInput; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.io.IOException; import java.nio.ByteBuffer; @@ -68,7 +69,8 @@ public void blockHeadersRoundTrip() throws IOException { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false)); + false, + new NoOpMetricsSystem())); for (int i = 0; i < 50; ++i) { Assertions.assertThat(readHeaders.get(i)).isEqualTo(headers.get(i)); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java index e19f288fd51..39b6c99f1b1 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java @@ -58,7 +58,8 @@ public class ChainHeadTrackerTest { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); private final TrailingPeerLimiter trailingPeerLimiter = mock(TrailingPeerLimiter.class); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncContextTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncContextTest.java index bfd21dac9c8..cfc9f9dc123 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncContextTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncContextTest.java @@ -48,6 +48,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.referencetests.ForestReferenceTestWorldState; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.plugin.services.MetricsSystem; import org.hyperledger.besu.services.kvstore.InMemoryKeyValueStorage; @@ -96,7 +97,8 @@ public class BackwardSyncContextTest { new StubGenesisConfigOptions(), MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); @Spy private ProtocolSpec protocolSpec = diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncStepTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncStepTest.java index 4e6b5aa6d0e..6dc69ea274e 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncStepTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/BackwardSyncStepTest.java @@ -39,6 +39,7 @@ import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions; import org.hyperledger.besu.ethereum.mainnet.MainnetProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.services.kvstore.InMemoryKeyValueStorage; import org.hyperledger.besu.testutil.DeterministicEthScheduler; @@ -73,7 +74,8 @@ public class BackwardSyncStepTest { new StubGenesisConfigOptions(), MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); private final DeterministicEthScheduler ethScheduler = new DeterministicEthScheduler(); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ForwardSyncStepTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ForwardSyncStepTest.java index d8007d153f8..a5d2cf61045 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ForwardSyncStepTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/backwardsync/ForwardSyncStepTest.java @@ -38,6 +38,7 @@ import org.hyperledger.besu.ethereum.mainnet.MainnetProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.referencetests.ForestReferenceTestWorldState; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.services.kvstore.InMemoryKeyValueStorage; import java.nio.charset.StandardCharsets; @@ -76,7 +77,8 @@ public class ForwardSyncStepTest { new StubGenesisConfigOptions(), MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); private MutableBlockchain localBlockchain; GenericKeyValueStorageFacade headersStorage; GenericKeyValueStorageFacade blocksStorage; diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java index 535732f1918..ffafeca91fb 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java @@ -201,7 +201,8 @@ protected static ExecutionContextTestFixture createExecutionContextTestFixtureBa EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java index 292667d7e26..c679183b0ff 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java @@ -124,7 +124,8 @@ public TestNode( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); final GenesisState genesisState = GenesisState.fromConfig(genesisConfigFile, protocolSchedule); final BlockHeaderFunctions blockHeaderFunctions = diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java index 480bcc331fc..5742637c3e8 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java @@ -380,7 +380,8 @@ private void setupScheduleWith(final StubGenesisConfigOptions config) { EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); protocolContext = mock(ProtocolContext.class); diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java index 02accb4cffc..4f10650273a 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java @@ -29,6 +29,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.evm.EvmSpecVersion; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; import java.util.Locale; @@ -84,7 +85,8 @@ ProtocolSchedule provideProtocolSchedule( evmConfiguration, MiningParameters.newDefault(), new BadBlockManager(), - false); + false, + new NoOpMetricsSystem()); } public static Map> createSchedules() { @@ -150,7 +152,8 @@ private static Supplier createSchedule(final GenesisConfigOpti EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); } } diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java index 4eca0033444..75c9744c516 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java @@ -27,6 +27,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.precompile.KZGPointEvalPrecompiledContract; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.math.BigInteger; import java.util.Arrays; @@ -126,7 +127,8 @@ private static ProtocolSchedule createSchedule(final GenesisConfigOptions option EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false) + false, + new NoOpMetricsSystem()) .createProtocolSchedule(); } diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java index 3209c08f1cf..32d4e0bab10 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java @@ -165,7 +165,8 @@ private boolean buildContext( EvmConfiguration.DEFAULT, miningParameters, badBlockManager, - false); + false, + new NoOpMetricsSystem()); if ("NoReward".equalsIgnoreCase(sealEngine)) { protocolSchedule = new NoRewardProtocolScheduleWrapper(protocolSchedule, badBlockManager); } diff --git a/metrics/core/src/main/java/org/hyperledger/besu/metrics/BesuMetricCategory.java b/metrics/core/src/main/java/org/hyperledger/besu/metrics/BesuMetricCategory.java index d419a6ac7c5..4151320177b 100644 --- a/metrics/core/src/main/java/org/hyperledger/besu/metrics/BesuMetricCategory.java +++ b/metrics/core/src/main/java/org/hyperledger/besu/metrics/BesuMetricCategory.java @@ -53,7 +53,9 @@ public enum BesuMetricCategory implements MetricCategory { /** Transaction pool besu metric category. */ TRANSACTION_POOL("transaction_pool"), /** Stratum besu metric category. */ - STRATUM("stratum"); + STRATUM("stratum"), + /** Block processing besu metric category. */ + BLOCK_PROCESSING("block_processing"); private static final Optional BESU_PREFIX = Optional.of("besu_"); From 18a12ac415dca0f3e2c1e29f68a2223bb1495b94 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Wed, 10 Jul 2024 17:37:27 +0200 Subject: [PATCH 26/35] fix flag Signed-off-by: Karim Taam --- .../besu/cli/options/stable/DataStorageOptions.java | 1 + .../controller/ConsensusScheduleBesuControllerBuilder.java | 6 ++++++ .../besu/controller/TransitionBesuControllerBuilder.java | 6 ++++++ .../java/org/hyperledger/besu/cli/CommandTestAbstract.java | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java index 788ddb1b8f6..fb38a8bebea 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java @@ -232,6 +232,7 @@ public DataStorageConfiguration toDomainObject() { ImmutableDataStorageConfiguration.Unstable.builder() .bonsaiFullFlatDbEnabled(unstableOptions.bonsaiFullFlatDbEnabled) .bonsaiCodeStoredByCodeHashEnabled(unstableOptions.bonsaiCodeUsingCodeHashEnabled) + .isParallelTxEnabled(unstableOptions.isParallelTxEnabled) .build()) .build(); } diff --git a/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java index af59a7625d3..a1698e94f4e 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java @@ -368,6 +368,12 @@ public BesuControllerBuilder isRevertReasonEnabled(final boolean isRevertReasonE return super.isRevertReasonEnabled(isRevertReasonEnabled); } + @Override + public BesuControllerBuilder isParallelTxEnabled(final boolean isParallelTxEnabled) { + besuControllerBuilderSchedule.values().forEach(b -> b.isParallelTxEnabled(isParallelTxEnabled)); + return super.isParallelTxEnabled(isParallelTxEnabled); + } + @Override public BesuControllerBuilder gasLimitCalculator(final GasLimitCalculator gasLimitCalculator) { besuControllerBuilderSchedule.values().forEach(b -> b.gasLimitCalculator(gasLimitCalculator)); diff --git a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java index 4f084f3c138..bc215f15ae9 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java @@ -382,6 +382,12 @@ public BesuControllerBuilder isRevertReasonEnabled(final boolean isRevertReasonE return propagateConfig(z -> z.isRevertReasonEnabled(isRevertReasonEnabled)); } + @Override + public BesuControllerBuilder isParallelTxEnabled(final boolean isParallelTxEnabled) { + super.isParallelTxEnabled(isParallelTxEnabled); + return propagateConfig(z -> z.isParallelTxEnabled(isParallelTxEnabled)); + } + @Override public BesuControllerBuilder gasLimitCalculator(final GasLimitCalculator gasLimitCalculator) { super.gasLimitCalculator(gasLimitCalculator); diff --git a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java index a45729b2bb2..c58a9431bbd 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java @@ -285,6 +285,7 @@ public void initMocks() throws Exception { .thenReturn(mockControllerBuilder); when(mockControllerBuilder.clock(any())).thenReturn(mockControllerBuilder); when(mockControllerBuilder.isRevertReasonEnabled(false)).thenReturn(mockControllerBuilder); + when(mockControllerBuilder.isParallelTxEnabled(false)).thenReturn(mockControllerBuilder); when(mockControllerBuilder.storageProvider(any())).thenReturn(mockControllerBuilder); when(mockControllerBuilder.gasLimitCalculator(any())).thenReturn(mockControllerBuilder); when(mockControllerBuilder.requiredBlocks(any())).thenReturn(mockControllerBuilder); @@ -303,7 +304,6 @@ public void initMocks() throws Exception { when(mockControllerBuilder.cacheLastBlocks(any())).thenReturn(mockControllerBuilder); when(mockControllerBuilder.genesisStateHashCacheEnabled(any())) .thenReturn(mockControllerBuilder); - when(mockControllerBuilder.isParallelTxEnabled(false)).thenReturn(mockControllerBuilder); // doReturn used because of generic BesuController doReturn(mockController).when(mockControllerBuilder).build(); From afec25348b838dac4d1db1ba3f606574031fa1cc Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Wed, 10 Jul 2024 18:01:11 +0200 Subject: [PATCH 27/35] Fix reference tests Signed-off-by: Ameziane H --- ethereum/referencetests/build.gradle | 1 + .../mainnet/DifficultyCalculatorTests.java | 30 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/ethereum/referencetests/build.gradle b/ethereum/referencetests/build.gradle index c023dcd699e..c71424e758b 100644 --- a/ethereum/referencetests/build.gradle +++ b/ethereum/referencetests/build.gradle @@ -186,6 +186,7 @@ dependencies { referenceTestImplementation project(path: ':config') referenceTestImplementation project(path: ':datatypes') referenceTestImplementation project(path: ':ethereum:core') + referenceTestImplementation project(path: ':metrics:core') referenceTestImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts') referenceTestImplementation project(path: ':ethereum:rlp') referenceTestImplementation project(path: ':ethereum:rlp', configuration: 'testSupportArtifacts') diff --git a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.java b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.java index 9ecc8526f66..00733de1f8e 100644 --- a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.java +++ b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import org.checkerframework.checker.units.qual.N; import org.hyperledger.besu.config.GenesisConfigFile; import org.hyperledger.besu.config.JsonUtil; import org.hyperledger.besu.config.StubGenesisConfigOptions; @@ -43,6 +44,7 @@ import com.google.common.io.Resources; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.units.bigints.UInt256; +import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -59,64 +61,64 @@ public static Stream getTestParametersForConfig() throws IOException MainnetProtocolSchedule.fromConfig( GenesisConfigFile.mainnet() .getConfigOptions(postMergeOverrides), - EvmConfiguration.DEFAULT, MiningParameters.newDefault(), new BadBlockManager(), false)), + EvmConfiguration.DEFAULT, MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem())), Arguments.of( "/DifficultyTests/dfGrayGlacier/difficultyGrayGlacierForkBlock.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false) + new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfGrayGlacier/difficultyGrayGlacierTimeDiff1.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false) + new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfGrayGlacier/difficultyGrayGlacierTimeDiff2.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false) + new StubGenesisConfigOptions().grayGlacierBlock(15050000), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfArrowGlacier/difficultyArrowGlacierForkBlock.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false) + new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfArrowGlacier/difficultyArrowGlacierTimeDiff1.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false) + new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfArrowGlacier/difficultyArrowGlacierTimeDiff2.json", MainnetProtocolSchedule.fromConfig( - new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false) + new StubGenesisConfigOptions().arrowGlacierBlock(13773000), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfByzantium/difficultyByzantium.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().byzantiumBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().byzantiumBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfConstantinople/difficultyConstantinople.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().constantinopleBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().constantinopleBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfEIP2384/difficultyEIP2384.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfEIP2384/difficultyEIP2384_random.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfEIP2384/difficultyEIP2384_random_to20M.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().muirGlacierBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfFrontier/difficultyFrontier.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions(), MiningParameters.newDefault(), new BadBlockManager(), false) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions(), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) ), Arguments.of( "/DifficultyTests/dfHomestead/difficultyHomestead.json", - MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().homesteadBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false) + MainnetProtocolSchedule.fromConfig(new StubGenesisConfigOptions().homesteadBlock(0), MiningParameters.newDefault(), new BadBlockManager(), false, new NoOpMetricsSystem()) )); } From 29dd4f590626592136eb378371e27b122b6d2ef0 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Wed, 10 Jul 2024 15:50:44 -0700 Subject: [PATCH 28/35] first stab at suggested refactor Signed-off-by: garyschulte --- .../mainnet/AbstractBlockProcessor.java | 100 +++----------- .../mainnet/ClassicBlockProcessor.java | 6 +- .../mainnet/MainnetBlockProcessor.java | 23 ---- .../mainnet/MainnetProtocolSpecs.java | 12 +- .../ethereum/mainnet/ProtocolSpecBuilder.java | 8 +- .../MainnetParallelBlockProcessor.java | 122 ++++++++++++++++++ 6 files changed, 148 insertions(+), 123 deletions(-) create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java 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 c06a4963e20..f6999f6b986 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 @@ -72,7 +72,6 @@ TransactionReceipt create( static final int MAX_GENERATION = 6; protected final MainnetTransactionProcessor transactionProcessor; - private final boolean isParallelTxEnabled; protected final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory; @@ -80,9 +79,6 @@ TransactionReceipt create( protected final boolean skipZeroBlockRewards; private final ProtocolSchedule protocolSchedule; - private final Optional metricsSystem; - private final Optional confirmedParallelizedTransactionCounter; - private final Optional conflictingButCachedTransactionCounter; protected final MiningBeneficiaryCalculator miningBeneficiaryCalculator; @@ -92,18 +88,13 @@ protected AbstractBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final boolean isParallelTxEnabled, final ProtocolSchedule protocolSchedule) { this.transactionProcessor = transactionProcessor; - this.isParallelTxEnabled = isParallelTxEnabled; this.transactionReceiptFactory = transactionReceiptFactory; this.blockReward = blockReward; this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; this.skipZeroBlockRewards = skipZeroBlockRewards; this.protocolSchedule = protocolSchedule; - this.metricsSystem = Optional.empty(); - this.confirmedParallelizedTransactionCounter = Optional.empty(); - this.conflictingButCachedTransactionCounter = Optional.empty(); } protected AbstractBlockProcessor( @@ -113,33 +104,13 @@ protected AbstractBlockProcessor( final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, final boolean isParallelTxEnabled, - final ProtocolSchedule protocolSchedule, - final MetricsSystem metricsSystem) { + final ProtocolSchedule protocolSchedule) { this.transactionProcessor = transactionProcessor; - this.isParallelTxEnabled = isParallelTxEnabled; this.transactionReceiptFactory = transactionReceiptFactory; this.blockReward = blockReward; this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; this.skipZeroBlockRewards = skipZeroBlockRewards; this.protocolSchedule = protocolSchedule; - this.metricsSystem = Optional.of(metricsSystem); - this.confirmedParallelizedTransactionCounter = - Optional.of( - this.metricsSystem - .get() - .createCounter( - BesuMetricCategory.BLOCK_PROCESSING, - "parallelized_transactions_counter", - "Counter for the number of parallelized transactions during block processing")); - - this.conflictingButCachedTransactionCounter = - Optional.of( - this.metricsSystem - .get() - .createCounter( - BesuMetricCategory.BLOCK_PROCESSING, - "conflicted_transactions_counter", - "Counter for the number of conflicted transactions during block processing")); } @Override @@ -175,27 +146,6 @@ public BlockProcessingResult processBlock( calculateExcessBlobGasForParent(protocolSpec, parentHeader))) .orElse(Wei.ZERO); - Optional - parallelizedConcurrentTransactionProcessor = Optional.empty(); - if (isParallelTxEnabled) { - if ((worldState instanceof DiffBasedWorldState)) { - parallelizedConcurrentTransactionProcessor = - Optional.of(new ParallelizedConcurrentTransactionProcessor(transactionProcessor)); - // runAsyncBlock, if activated, facilitates the non-blocking parallel execution of - // transactions in the background through an optimistic strategy. - parallelizedConcurrentTransactionProcessor - .get() - .runAsyncBlock( - worldState, - blockHeader, - transactions, - miningBeneficiary, - blockHashLookup, - blobGasPrice, - privateMetadataUpdater); - } - } - for (int i = 0; i < transactions.size(); i++) { final Transaction transaction = transactions.get(i); if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) { @@ -203,38 +153,9 @@ public BlockProcessingResult processBlock( } final WorldUpdater blockUpdater = worldState.updater(); - TransactionProcessingResult transactionProcessingResult = null; - - if (isParallelTxEnabled && parallelizedConcurrentTransactionProcessor.isPresent()) { - // applyParallelizedTransactionResult, if activated, fetch the results of transactions - // processed by background threads. - transactionProcessingResult = - parallelizedConcurrentTransactionProcessor - .get() - .applyParallelizedTransactionResult( - worldState, - miningBeneficiary, - transaction, - i, - confirmedParallelizedTransactionCounter, - conflictingButCachedTransactionCounter) - .orElse(null); - } - - if (transactionProcessingResult == null) { - transactionProcessingResult = - transactionProcessor.processTransaction( - blockUpdater, - blockHeader, - transaction, - miningBeneficiary, - OperationTracer.NO_TRACING, - blockHashLookup, - true, - TransactionValidationParams.processingBlock(), - privateMetadataUpdater, - blobGasPrice); - } + TransactionProcessingResult transactionProcessingResult = + getTransactionProcessingResult(worldState, blockHeader, privateMetadataUpdater, + miningBeneficiary, transaction, i, blockUpdater, blockHashLookup, blobGasPrice); if (transactionProcessingResult.isInvalid()) { String errorMessage = MessageFormat.format( @@ -326,6 +247,19 @@ public BlockProcessingResult processBlock( Optional.of(new BlockProcessingOutputs(worldState, receipts, maybeRequests))); } + protected TransactionProcessingResult getTransactionProcessingResult( + final MutableWorldState worldState, final BlockHeader blockHeader, + final PrivateMetadataUpdater privateMetadataUpdater, + final Address miningBeneficiary, + final Transaction transaction, final int i, final WorldUpdater blockUpdater, + final BlockHashLookup blockHashLookup, final Wei blobGasPrice) { + return transactionProcessor.processTransaction(blockUpdater, blockHeader, transaction, + miningBeneficiary, + OperationTracer.NO_TRACING, blockHashLookup, + true, + TransactionValidationParams.processingBlock(), privateMetadataUpdater, blobGasPrice); + } + protected boolean hasAvailableBlockBudget( final BlockHeader blockHeader, final Transaction transaction, final long currentGasUsed) { final long remainingGasBudget = blockHeader.getGasLimit() - currentGasUsed; diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java index c2e96fd7ba8..cc47f2ea0d6 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java @@ -44,8 +44,7 @@ public ClassicBlockProcessor( final boolean skipZeroBlockRewards, final boolean isParallelTxEnabled, final OptionalLong eraLen, - final ProtocolSchedule protocolSchedule, - final MetricsSystem metricsSystem) { + final ProtocolSchedule protocolSchedule) { super( transactionProcessor, transactionReceiptFactory, @@ -53,8 +52,7 @@ public ClassicBlockProcessor( miningBeneficiaryCalculator, skipZeroBlockRewards, isParallelTxEnabled, - protocolSchedule, - metricsSystem); + protocolSchedule); eraLength = eraLen.orElse(DEFAULT_ERA_LENGTH); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java index 669100101c7..9f2096f63d2 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java @@ -20,7 +20,6 @@ import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.worldstate.WorldUpdater; -import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.List; @@ -37,7 +36,6 @@ public MainnetBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final boolean isParallelTxEnabled, final ProtocolSchedule protocolSchedule) { super( transactionProcessor, @@ -45,30 +43,9 @@ public MainnetBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - isParallelTxEnabled, protocolSchedule); } - public MainnetBlockProcessor( - final MainnetTransactionProcessor transactionProcessor, - final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory, - final Wei blockReward, - final MiningBeneficiaryCalculator miningBeneficiaryCalculator, - final boolean skipZeroBlockRewards, - final boolean isParallelTxEnabled, - final ProtocolSchedule protocolSchedule, - final MetricsSystem metricsSystem) { - super( - transactionProcessor, - transactionReceiptFactory, - blockReward, - miningBeneficiaryCalculator, - skipZeroBlockRewards, - isParallelTxEnabled, - protocolSchedule, - metricsSystem); - } - @Override protected boolean rewardCoinbase( final MutableWorldState worldState, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index f25430999ce..d2c9e4f8c59 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -39,6 +39,7 @@ import org.hyperledger.besu.ethereum.mainnet.blockhash.PragueBlockHashProcessor; import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; +import org.hyperledger.besu.ethereum.mainnet.parallelization.MainnetParallelBlockProcessor; import org.hyperledger.besu.ethereum.privacy.PrivateTransactionProcessor; import org.hyperledger.besu.ethereum.privacy.PrivateTransactionValidator; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; @@ -158,7 +159,8 @@ public static ProtocolSpecBuilder frontierDefinition( .skipZeroBlockRewards(false) .isParallelTxEnabled(isParallelTxEnabled) .metricsSystem(metricsSystem) - .blockProcessorBuilder(MainnetBlockProcessor::new) + .blockProcessorBuilder(isParallelTxEnabled ? + new MainnetParallelBlockProcessor.ParallelBlockProcessorBuilder(metricsSystem) : MainnetBlockProcessor::new) .blockValidatorBuilder(MainnetProtocolSpecs.blockValidatorBuilder()) .blockImporterBuilder(MainnetBlockImporter::new) .blockHeaderFunctions(new MainnetBlockHeaderFunctions()) @@ -210,9 +212,7 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - parallelTxEnabled, - protocolSchedule, - localMetricsSystem) -> + protocolSchedule) -> new DaoBlockProcessor( new MainnetBlockProcessor( transactionProcessor, @@ -220,9 +220,7 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - parallelTxEnabled, - protocolSchedule, - localMetricsSystem))) + protocolSchedule))) .name("DaoRecoveryInit"); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index 6dc29f52129..1197d6e6fd2 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -467,9 +467,7 @@ private BlockProcessor createBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - isParallelTxEnabled, - protocolSchedule, - metricsSystem); + protocolSchedule); } private BlockHeaderValidator createBlockHeaderValidator( @@ -508,9 +506,7 @@ BlockProcessor apply( Wei blockReward, MiningBeneficiaryCalculator miningBeneficiaryCalculator, boolean skipZeroBlockRewards, - final boolean isParallelTxEnabled, - ProtocolSchedule protocolSchedule, - MetricsSystem metricsSystem); + ProtocolSchedule protocolSchedule); } public interface BlockValidatorBuilder { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java new file mode 100644 index 00000000000..36bbd41e529 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java @@ -0,0 +1,122 @@ +package org.hyperledger.besu.ethereum.mainnet.parallelization; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.MutableWorldState; +import org.hyperledger.besu.ethereum.core.Transaction; +import org.hyperledger.besu.ethereum.mainnet.BlockProcessor; +import org.hyperledger.besu.ethereum.mainnet.MainnetBlockProcessor; +import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor; +import org.hyperledger.besu.ethereum.mainnet.MiningBeneficiaryCalculator; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecBuilder; +import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; +import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; +import org.hyperledger.besu.evm.operation.BlockHashOperation; +import org.hyperledger.besu.evm.worldstate.WorldUpdater; +import org.hyperledger.besu.metrics.BesuMetricCategory; +import org.hyperledger.besu.plugin.services.MetricsSystem; +import org.hyperledger.besu.plugin.services.metrics.Counter; + +import java.util.Optional; + +public class MainnetParallelBlockProcessor extends MainnetBlockProcessor { + + private final ParallelizedConcurrentTransactionProcessor parallelTransactionProcessor; + private final Optional metricsSystem; + private final Optional confirmedParallelizedTransactionCounter; + private final Optional conflictingButCachedTransactionCounter; + + public MainnetParallelBlockProcessor( + final MainnetTransactionProcessor transactionProcessor, + final TransactionReceiptFactory transactionReceiptFactory, + final Wei blockReward, + final MiningBeneficiaryCalculator miningBeneficiaryCalculator, + final boolean skipZeroBlockRewards, + final ProtocolSchedule protocolSchedule, + final MetricsSystem metricsSystem) { + super(transactionProcessor, transactionReceiptFactory, blockReward, + miningBeneficiaryCalculator, skipZeroBlockRewards, protocolSchedule); + this.metricsSystem = Optional.of(metricsSystem); + this.parallelTransactionProcessor = + new ParallelizedConcurrentTransactionProcessor(transactionProcessor); + this.confirmedParallelizedTransactionCounter = + Optional.of( + this.metricsSystem + .get() + .createCounter( + BesuMetricCategory.BLOCK_PROCESSING, + "parallelized_transactions_counter", + "Counter for the number of parallelized transactions during block processing")); + + this.conflictingButCachedTransactionCounter = + Optional.of( + this.metricsSystem + .get() + .createCounter( + BesuMetricCategory.BLOCK_PROCESSING, + "conflicted_transactions_counter", + "Counter for the number of conflicted transactions during block processing")); + } + + @Override + protected TransactionProcessingResult getTransactionProcessingResult( + final MutableWorldState worldState, + final BlockHeader blockHeader, + final PrivateMetadataUpdater privateMetadataUpdater, + final Address miningBeneficiary, + final Transaction transaction, + final int blockTxNumber, + final WorldUpdater blockUpdater, + final BlockHashOperation.BlockHashLookup blockHashLookup, + final Wei blobGasPrice) { + + + TransactionProcessingResult transactionProcessingResult = null; + + if ((worldState instanceof DiffBasedWorldState)) { + transactionProcessingResult = parallelTransactionProcessor + .applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, + blockTxNumber, confirmedParallelizedTransactionCounter, conflictingButCachedTransactionCounter) + .orElse(null); + } + + if (transactionProcessingResult != null) { + return transactionProcessingResult; + } + return super.getTransactionProcessingResult( + worldState, blockHeader, privateMetadataUpdater, miningBeneficiary, transaction, + blockTxNumber, blockUpdater, blockHashLookup, blobGasPrice); + + } + + public static class ParallelBlockProcessorBuilder implements ProtocolSpecBuilder.BlockProcessorBuilder { + + final MetricsSystem metricsSystem; + + public ParallelBlockProcessorBuilder( + final MetricsSystem metricsSystem) { + this.metricsSystem = metricsSystem; + } + + @Override + public BlockProcessor apply( + final MainnetTransactionProcessor transactionProcessor, + final TransactionReceiptFactory transactionReceiptFactory, + final Wei blockReward, + final MiningBeneficiaryCalculator miningBeneficiaryCalculator, + final boolean skipZeroBlockRewards, + final ProtocolSchedule protocolSchedule) { + return new MainnetParallelBlockProcessor( + transactionProcessor, + transactionReceiptFactory, + blockReward, + miningBeneficiaryCalculator, + skipZeroBlockRewards, + protocolSchedule, + metricsSystem); + } + } +} From 5a1dae42055439725096fe929561fe03d3b107de Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 11 Jul 2024 13:34:14 +0200 Subject: [PATCH 29/35] update after Gary's comment Signed-off-by: Karim Taam --- .../bft/BaseBftProtocolScheduleBuilder.java | 2 - .../BaseBftProtocolScheduleBuilderTest.java | 1 - .../ibft/IbftProtocolScheduleBuilder.java | 1 - .../blockcreation/BftBlockCreatorTest.java | 1 - .../qbft/QbftProtocolScheduleBuilder.java | 1 - .../flat/RewardTraceGeneratorTest.java | 6 +- .../mainnet/AbstractBlockProcessor.java | 82 +++++++----- .../mainnet/ClassicBlockProcessor.java | 3 - .../mainnet/ClassicProtocolSpecs.java | 8 +- .../mainnet/MainnetProtocolSpecs.java | 35 +++-- .../besu/ethereum/mainnet/ProtocolSpec.java | 9 -- .../ethereum/mainnet/ProtocolSpecBuilder.java | 7 - .../MainnetParallelBlockProcessor.java | 121 ++++++++++++++---- .../ParallelizedTransactionContext.java | 80 +++++++++++- .../mainnet/AbstractBlockProcessorTest.java | 3 - 15 files changed, 254 insertions(+), 106 deletions(-) diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java index 4a3d1e1730e..d52896b1d1b 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java @@ -59,7 +59,6 @@ protected BaseBftProtocolScheduleBuilder() {} * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks - * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @param metricsSystem metricsSystem A metricSystem instance to be able to expose metrics in the * underlying calls * @return the protocol schedule @@ -73,7 +72,6 @@ public BftProtocolSchedule createProtocolSchedule( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, - final boolean isParallelTxEnabled, final MetricsSystem metricsSystem) { final Map> specMap = new HashMap<>(); diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java index e23664fd8d3..074099ea189 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java @@ -247,7 +247,6 @@ protected BlockHeaderValidator.Builder createBlockHeaderRuleset( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false, new NoOpMetricsSystem()); } diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java index af782dabba6..0fc0f3ad8e0 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java @@ -73,7 +73,6 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled, metricsSystem); } diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java index 1b86896f36f..a64eedfeb7c 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java @@ -122,7 +122,6 @@ public BlockHeaderValidator.Builder createBlockHeaderRuleset( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), - false, new NoOpMetricsSystem()); final ProtocolContext protContext = new ProtocolContext( diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java index 34be5cfdaf2..96d1a75ac92 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java @@ -77,7 +77,6 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, - isParallelTxEnabled, metricsSystem); } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java index aee8bd8cc27..f8275182051 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java @@ -32,7 +32,6 @@ import org.hyperledger.besu.ethereum.mainnet.MiningBeneficiaryCalculator; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; -import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import java.util.Collections; import java.util.List; @@ -92,7 +91,6 @@ public void assertThatTraceGeneratorReturnValidRewardsForMainnetBlockProcessor() blockReward, BlockHeader::getCoinbase, true, - false, protocolSchedule); when(protocolSpec.getBlockProcessor()).thenReturn(blockProcessor); @@ -152,10 +150,8 @@ public void assertThatTraceGeneratorReturnValidRewardsForClassicBlockProcessor() blockReward, BlockHeader::getCoinbase, true, - false, eraRounds, - protocolSchedule, - new NoOpMetricsSystem()); + protocolSchedule); when(protocolSpec.getBlockProcessor()).thenReturn(blockProcessor); final Stream traceStream = 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 f6999f6b986..480a1d8d7ab 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 @@ -29,7 +29,6 @@ import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.Withdrawal; -import org.hyperledger.besu.ethereum.mainnet.parallelization.ParallelizedConcurrentTransactionProcessor; import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; @@ -37,15 +36,12 @@ import org.hyperledger.besu.ethereum.trie.MerkleTrieException; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldStateUpdateAccumulator; -import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator; +import org.hyperledger.besu.evm.operation.BlockHashOperation; import org.hyperledger.besu.evm.tracing.OperationTracer; import org.hyperledger.besu.evm.worldstate.WorldState; import org.hyperledger.besu.evm.worldstate.WorldUpdater; -import org.hyperledger.besu.metrics.BesuMetricCategory; -import org.hyperledger.besu.plugin.services.MetricsSystem; -import org.hyperledger.besu.plugin.services.metrics.Counter; import java.text.MessageFormat; import java.util.ArrayList; @@ -97,22 +93,6 @@ protected AbstractBlockProcessor( this.protocolSchedule = protocolSchedule; } - protected AbstractBlockProcessor( - final MainnetTransactionProcessor transactionProcessor, - final TransactionReceiptFactory transactionReceiptFactory, - final Wei blockReward, - final MiningBeneficiaryCalculator miningBeneficiaryCalculator, - final boolean skipZeroBlockRewards, - final boolean isParallelTxEnabled, - final ProtocolSchedule protocolSchedule) { - this.transactionProcessor = transactionProcessor; - this.transactionReceiptFactory = transactionReceiptFactory; - this.blockReward = blockReward; - this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; - this.skipZeroBlockRewards = skipZeroBlockRewards; - this.protocolSchedule = protocolSchedule; - } - @Override public BlockProcessingResult processBlock( final Blockchain blockchain, @@ -146,6 +126,16 @@ public BlockProcessingResult processBlock( calculateExcessBlobGasForParent(protocolSpec, parentHeader))) .orElse(Wei.ZERO); + final Optional preProcessingContext = + runBlockPreProcessing( + worldState, + privateMetadataUpdater, + blockHeader, + transactions, + miningBeneficiary, + blockHashLookup, + blobGasPrice); + for (int i = 0; i < transactions.size(); i++) { final Transaction transaction = transactions.get(i); if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) { @@ -154,8 +144,17 @@ public BlockProcessingResult processBlock( final WorldUpdater blockUpdater = worldState.updater(); TransactionProcessingResult transactionProcessingResult = - getTransactionProcessingResult(worldState, blockHeader, privateMetadataUpdater, - miningBeneficiary, transaction, i, blockUpdater, blockHashLookup, blobGasPrice); + getTransactionProcessingResult( + preProcessingContext, + worldState, + blockUpdater, + privateMetadataUpdater, + blockHeader, + blobGasPrice, + miningBeneficiary, + transaction, + i, + blockHashLookup); if (transactionProcessingResult.isInvalid()) { String errorMessage = MessageFormat.format( @@ -247,17 +246,39 @@ public BlockProcessingResult processBlock( Optional.of(new BlockProcessingOutputs(worldState, receipts, maybeRequests))); } + protected Optional runBlockPreProcessing( + final MutableWorldState worldState, + final PrivateMetadataUpdater privateMetadataUpdater, + final BlockHeader blockHeader, + final List transactions, + final Address miningBeneficiary, + final BlockHashOperation.BlockHashLookup blockHashLookup, + final Wei blobGasPrice) { + return Optional.empty(); + } + protected TransactionProcessingResult getTransactionProcessingResult( - final MutableWorldState worldState, final BlockHeader blockHeader, + final Optional preProcessingContext, + final MutableWorldState worldState, + final WorldUpdater blockUpdater, final PrivateMetadataUpdater privateMetadataUpdater, + final BlockHeader blockHeader, + final Wei blobGasPrice, final Address miningBeneficiary, - final Transaction transaction, final int i, final WorldUpdater blockUpdater, - final BlockHashLookup blockHashLookup, final Wei blobGasPrice) { - return transactionProcessor.processTransaction(blockUpdater, blockHeader, transaction, + final Transaction transaction, + final int location, + final BlockHashLookup blockHashLookup) { + return transactionProcessor.processTransaction( + blockUpdater, + blockHeader, + transaction, miningBeneficiary, - OperationTracer.NO_TRACING, blockHashLookup, + OperationTracer.NO_TRACING, + blockHashLookup, true, - TransactionValidationParams.processingBlock(), privateMetadataUpdater, blobGasPrice); + TransactionValidationParams.processingBlock(), + privateMetadataUpdater, + blobGasPrice); } protected boolean hasAvailableBlockBudget( @@ -286,4 +307,7 @@ abstract boolean rewardCoinbase( final BlockHeader header, final List ommers, final boolean skipZeroBlockRewards); + + public interface PreprocessingContext {} + ; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java index cc47f2ea0d6..044017b8728 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java @@ -19,7 +19,6 @@ import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.worldstate.WorldUpdater; -import org.hyperledger.besu.plugin.services.MetricsSystem; import java.math.BigInteger; import java.util.List; @@ -42,7 +41,6 @@ public ClassicBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final boolean isParallelTxEnabled, final OptionalLong eraLen, final ProtocolSchedule protocolSchedule) { super( @@ -51,7 +49,6 @@ public ClassicBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - isParallelTxEnabled, protocolSchedule); eraLength = eraLen.orElse(DEFAULT_ERA_LENGTH); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java index a5961f5aced..1aa6e8862d1 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java @@ -107,19 +107,15 @@ public static ProtocolSpecBuilder gothamDefinition( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - parallelTxEnabled, - protocolSchedule, - localMetricsSystem) -> + protocolSchedule) -> new ClassicBlockProcessor( transactionProcessor, transactionReceiptFactory, blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - parallelTxEnabled, ecip1017EraRounds, - protocolSchedule, - localMetricsSystem)) + protocolSchedule)) .name("Gotham"); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index d2c9e4f8c59..fb43dc6aad7 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -157,10 +157,11 @@ public static ProtocolSpecBuilder frontierDefinition( .transactionReceiptFactory(MainnetProtocolSpecs::frontierTransactionReceiptFactory) .blockReward(FRONTIER_BLOCK_REWARD) .skipZeroBlockRewards(false) - .isParallelTxEnabled(isParallelTxEnabled) .metricsSystem(metricsSystem) - .blockProcessorBuilder(isParallelTxEnabled ? - new MainnetParallelBlockProcessor.ParallelBlockProcessorBuilder(metricsSystem) : MainnetBlockProcessor::new) + .blockProcessorBuilder( + isParallelTxEnabled + ? new MainnetParallelBlockProcessor.ParallelBlockProcessorBuilder(metricsSystem) + : MainnetBlockProcessor::new) .blockValidatorBuilder(MainnetProtocolSpecs.blockValidatorBuilder()) .blockImporterBuilder(MainnetBlockImporter::new) .blockHeaderFunctions(new MainnetBlockHeaderFunctions()) @@ -214,13 +215,22 @@ public static ProtocolSpecBuilder daoRecoveryInitDefinition( skipZeroBlockRewards, protocolSchedule) -> new DaoBlockProcessor( - new MainnetBlockProcessor( - transactionProcessor, - transactionReceiptFactory, - blockReward, - miningBeneficiaryCalculator, - skipZeroBlockRewards, - protocolSchedule))) + isParallelTxEnabled + ? new MainnetParallelBlockProcessor( + transactionProcessor, + transactionReceiptFactory, + blockReward, + miningBeneficiaryCalculator, + skipZeroBlockRewards, + protocolSchedule, + metricsSystem) + : new MainnetBlockProcessor( + transactionProcessor, + transactionReceiptFactory, + blockReward, + miningBeneficiaryCalculator, + skipZeroBlockRewards, + protocolSchedule))) .name("DaoRecoveryInit"); } @@ -229,7 +239,10 @@ public static ProtocolSpecBuilder daoRecoveryTransitionDefinition( final boolean isParallelTxEnabled, final MetricsSystem metricsSystem) { return daoRecoveryInitDefinition(evmConfiguration, isParallelTxEnabled, metricsSystem) - .blockProcessorBuilder(MainnetBlockProcessor::new) + .blockProcessorBuilder( + isParallelTxEnabled + ? new MainnetParallelBlockProcessor.ParallelBlockProcessorBuilder(metricsSystem) + : MainnetBlockProcessor::new) .name("DaoRecoveryTransition"); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java index 9f41fc96491..b364679aa8b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpec.java @@ -70,8 +70,6 @@ public class ProtocolSpec { private final boolean skipZeroBlockRewards; - private final boolean isParallelTxEnabled; - private final PrivateTransactionProcessor privateTransactionProcessor; private final FeeMarket feeMarket; @@ -107,7 +105,6 @@ public class ProtocolSpec { * @param miningBeneficiaryCalculator determines to whom mining proceeds are paid * @param precompileContractRegistry all the pre-compiled contracts added * @param skipZeroBlockRewards should rewards be skipped if it is zero - * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @param gasCalculator the gas calculator to use. * @param gasLimitCalculator the gas limit calculator to use. * @param feeMarket an {@link Optional} wrapping {@link FeeMarket} class if appropriate. @@ -139,7 +136,6 @@ public ProtocolSpec( final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final PrecompileContractRegistry precompileContractRegistry, final boolean skipZeroBlockRewards, - final boolean isParallelTxEnabled, final GasCalculator gasCalculator, final GasLimitCalculator gasLimitCalculator, final FeeMarket feeMarket, @@ -169,7 +165,6 @@ public ProtocolSpec( this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; this.precompileContractRegistry = precompileContractRegistry; this.skipZeroBlockRewards = skipZeroBlockRewards; - this.isParallelTxEnabled = isParallelTxEnabled; this.gasCalculator = gasCalculator; this.gasLimitCalculator = gasLimitCalculator; this.feeMarket = feeMarket; @@ -324,10 +319,6 @@ public boolean isSkipZeroBlockRewards() { return skipZeroBlockRewards; } - public boolean isParallelTxEnabled() { - return isParallelTxEnabled; - } - public MiningBeneficiaryCalculator getMiningBeneficiaryCalculator() { return miningBeneficiaryCalculator; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index 1197d6e6fd2..a0ce985fd25 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -73,7 +73,6 @@ public class ProtocolSpecBuilder { private BlockValidatorBuilder blockValidatorBuilder; private BlockImporterBuilder blockImporterBuilder; - private boolean isParallelTxEnabled = false; private String name; private MiningBeneficiaryCalculator miningBeneficiaryCalculator; private PrivacyParameters privacyParameters; @@ -148,11 +147,6 @@ public ProtocolSpecBuilder blockHeaderValidatorBuilder( return this; } - public ProtocolSpecBuilder isParallelTxEnabled(final boolean isParallelTxEnabled) { - this.isParallelTxEnabled = isParallelTxEnabled; - return this; - } - public ProtocolSpecBuilder ommerHeaderValidatorBuilder( final Function ommerHeaderValidatorBuilder) { this.ommerHeaderValidatorBuilder = ommerHeaderValidatorBuilder; @@ -409,7 +403,6 @@ public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { miningBeneficiaryCalculator, precompileContractRegistry, skipZeroBlockRewards, - isParallelTxEnabled, gasCalculator, gasLimitCalculator, feeMarket, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java index 36bbd41e529..d1f0d9c5127 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/MainnetParallelBlockProcessor.java @@ -1,3 +1,17 @@ +/* + * 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.parallelization; import org.hyperledger.besu.datatypes.Address; @@ -20,11 +34,11 @@ import org.hyperledger.besu.plugin.services.MetricsSystem; import org.hyperledger.besu.plugin.services.metrics.Counter; +import java.util.List; import java.util.Optional; public class MainnetParallelBlockProcessor extends MainnetBlockProcessor { - private final ParallelizedConcurrentTransactionProcessor parallelTransactionProcessor; private final Optional metricsSystem; private final Optional confirmedParallelizedTransactionCounter; private final Optional conflictingButCachedTransactionCounter; @@ -37,11 +51,14 @@ public MainnetParallelBlockProcessor( final boolean skipZeroBlockRewards, final ProtocolSchedule protocolSchedule, final MetricsSystem metricsSystem) { - super(transactionProcessor, transactionReceiptFactory, blockReward, - miningBeneficiaryCalculator, skipZeroBlockRewards, protocolSchedule); + super( + transactionProcessor, + transactionReceiptFactory, + blockReward, + miningBeneficiaryCalculator, + skipZeroBlockRewards, + protocolSchedule); this.metricsSystem = Optional.of(metricsSystem); - this.parallelTransactionProcessor = - new ParallelizedConcurrentTransactionProcessor(transactionProcessor); this.confirmedParallelizedTransactionCounter = Optional.of( this.metricsSystem @@ -62,42 +79,102 @@ public MainnetParallelBlockProcessor( } @Override - protected TransactionProcessingResult getTransactionProcessingResult( + protected Optional runBlockPreProcessing( final MutableWorldState worldState, - final BlockHeader blockHeader, final PrivateMetadataUpdater privateMetadataUpdater, + final BlockHeader blockHeader, + final List transactions, final Address miningBeneficiary, - final Transaction transaction, - final int blockTxNumber, - final WorldUpdater blockUpdater, final BlockHashOperation.BlockHashLookup blockHashLookup, final Wei blobGasPrice) { + if ((worldState instanceof DiffBasedWorldState)) { + ParallelizedConcurrentTransactionProcessor parallelizedConcurrentTransactionProcessor = + new ParallelizedConcurrentTransactionProcessor(transactionProcessor); + // runAsyncBlock, if activated, facilitates the non-blocking parallel execution of + // transactions in the background through an optimistic strategy. + parallelizedConcurrentTransactionProcessor.runAsyncBlock( + worldState, + blockHeader, + transactions, + miningBeneficiary, + blockHashLookup, + blobGasPrice, + privateMetadataUpdater); + return Optional.of( + new ParallelizedPreProcessingContext(parallelizedConcurrentTransactionProcessor)); + } + return Optional.empty(); + } + @Override + protected TransactionProcessingResult getTransactionProcessingResult( + final Optional preProcessingContext, + final MutableWorldState worldState, + final WorldUpdater blockUpdater, + final PrivateMetadataUpdater privateMetadataUpdater, + final BlockHeader blockHeader, + final Wei blobGasPrice, + final Address miningBeneficiary, + final Transaction transaction, + final int location, + final BlockHashOperation.BlockHashLookup blockHashLookup) { TransactionProcessingResult transactionProcessingResult = null; - if ((worldState instanceof DiffBasedWorldState)) { - transactionProcessingResult = parallelTransactionProcessor - .applyParallelizedTransactionResult(worldState, miningBeneficiary, transaction, - blockTxNumber, confirmedParallelizedTransactionCounter, conflictingButCachedTransactionCounter) - .orElse(null); + if (preProcessingContext.isPresent()) { + final ParallelizedPreProcessingContext parallelizedPreProcessingContext = + (ParallelizedPreProcessingContext) preProcessingContext.get(); + transactionProcessingResult = + parallelizedPreProcessingContext + .getParallelizedConcurrentTransactionProcessor() + .applyParallelizedTransactionResult( + worldState, + miningBeneficiary, + transaction, + location, + confirmedParallelizedTransactionCounter, + conflictingButCachedTransactionCounter) + .orElse(null); } - if (transactionProcessingResult != null) { + if (transactionProcessingResult == null) { + return super.getTransactionProcessingResult( + preProcessingContext, + worldState, + blockUpdater, + privateMetadataUpdater, + blockHeader, + blobGasPrice, + miningBeneficiary, + transaction, + location, + blockHashLookup); + } else { return transactionProcessingResult; } - return super.getTransactionProcessingResult( - worldState, blockHeader, privateMetadataUpdater, miningBeneficiary, transaction, - blockTxNumber, blockUpdater, blockHashLookup, blobGasPrice); + } + + static class ParallelizedPreProcessingContext implements PreprocessingContext { + final ParallelizedConcurrentTransactionProcessor parallelizedConcurrentTransactionProcessor; + public ParallelizedPreProcessingContext( + final ParallelizedConcurrentTransactionProcessor + parallelizedConcurrentTransactionProcessor) { + this.parallelizedConcurrentTransactionProcessor = parallelizedConcurrentTransactionProcessor; + } + + public ParallelizedConcurrentTransactionProcessor + getParallelizedConcurrentTransactionProcessor() { + return parallelizedConcurrentTransactionProcessor; + } } - public static class ParallelBlockProcessorBuilder implements ProtocolSpecBuilder.BlockProcessorBuilder { + public static class ParallelBlockProcessorBuilder + implements ProtocolSpecBuilder.BlockProcessorBuilder { final MetricsSystem metricsSystem; - public ParallelBlockProcessorBuilder( - final MetricsSystem metricsSystem) { + public ParallelBlockProcessorBuilder(final MetricsSystem metricsSystem) { this.metricsSystem = metricsSystem; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java index c9ff32bcb99..efde27fd3da 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java @@ -14,15 +14,85 @@ */ package org.hyperledger.besu.ethereum.mainnet.parallelization; +import static org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor.*; + import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; -public record ParallelizedTransactionContext( - DiffBasedWorldStateUpdateAccumulator transactionAccumulator, - TransactionProcessingResult transactionProcessingResult, - boolean isMiningBeneficiaryTouchedPreRewardByTransaction, - Wei miningBeneficiaryReward) { +import java.util.Objects; + +public final class ParallelizedTransactionContext { + private final DiffBasedWorldStateUpdateAccumulator transactionAccumulator; + private final TransactionProcessingResult transactionProcessingResult; + private final boolean isMiningBeneficiaryTouchedPreRewardByTransaction; + private final Wei miningBeneficiaryReward; + + public ParallelizedTransactionContext( + DiffBasedWorldStateUpdateAccumulator transactionAccumulator, + TransactionProcessingResult transactionProcessingResult, + boolean isMiningBeneficiaryTouchedPreRewardByTransaction, + Wei miningBeneficiaryReward) { + this.transactionAccumulator = transactionAccumulator; + this.transactionProcessingResult = transactionProcessingResult; + this.isMiningBeneficiaryTouchedPreRewardByTransaction = + isMiningBeneficiaryTouchedPreRewardByTransaction; + this.miningBeneficiaryReward = miningBeneficiaryReward; + } + + public DiffBasedWorldStateUpdateAccumulator transactionAccumulator() { + return transactionAccumulator; + } + + public TransactionProcessingResult transactionProcessingResult() { + return transactionProcessingResult; + } + + public boolean isMiningBeneficiaryTouchedPreRewardByTransaction() { + return isMiningBeneficiaryTouchedPreRewardByTransaction; + } + + public Wei miningBeneficiaryReward() { + return miningBeneficiaryReward; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (ParallelizedTransactionContext) obj; + return Objects.equals(this.transactionAccumulator, that.transactionAccumulator) + && Objects.equals(this.transactionProcessingResult, that.transactionProcessingResult) + && this.isMiningBeneficiaryTouchedPreRewardByTransaction + == that.isMiningBeneficiaryTouchedPreRewardByTransaction + && Objects.equals(this.miningBeneficiaryReward, that.miningBeneficiaryReward); + } + + @Override + public int hashCode() { + return Objects.hash( + transactionAccumulator, + transactionProcessingResult, + isMiningBeneficiaryTouchedPreRewardByTransaction, + miningBeneficiaryReward); + } + + @Override + public String toString() { + return "ParallelizedTransactionContext[" + + "transactionAccumulator=" + + transactionAccumulator + + ", " + + "transactionProcessingResult=" + + transactionProcessingResult + + ", " + + "isMiningBeneficiaryTouchedPreRewardByTransaction=" + + isMiningBeneficiaryTouchedPreRewardByTransaction + + ", " + + "miningBeneficiaryReward=" + + miningBeneficiaryReward + + ']'; + } public static class Builder { private DiffBasedWorldStateUpdateAccumulator transactionAccumulator; diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java index f8ed0352e04..2a66c6e1151 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java @@ -81,7 +81,6 @@ void baseSetup() { Wei.ZERO, BlockHeader::getCoinbase, true, - false, protocolSchedule); } @@ -142,7 +141,6 @@ protected TestBlockProcessor( final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final boolean isParallelTxEnabled, final ProtocolSchedule protocolSchedule) { super( transactionProcessor, @@ -150,7 +148,6 @@ protected TestBlockProcessor( blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - isParallelTxEnabled, protocolSchedule); } From 96d94283a6bf39151d671e272cbbfea7d22a11bd Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 11 Jul 2024 14:23:19 +0200 Subject: [PATCH 30/35] rename operation tracer method Signed-off-by: Karim Taam --- .../besu/ethereum/mainnet/MainnetTransactionProcessor.java | 3 +-- .../ParallelizedConcurrentTransactionProcessor.java | 2 +- .../java/org/hyperledger/besu/evm/tracing/OperationTracer.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java index bbb23f06d87..9fd17665ae0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java @@ -483,8 +483,7 @@ public TransactionProcessingResult processTransaction( final Wei coinbaseWeiDelta = coinbaseCalculator.price(usedGas, transactionGasPrice, blockHeader.getBaseFee()); - operationTracer.traceTransactionBeforeMiningReward( - worldUpdater, transaction, coinbaseWeiDelta); + operationTracer.traceBeforeRewardTransaction(worldUpdater, transaction, coinbaseWeiDelta); final var coinbase = worldState.getOrCreate(miningBeneficiary); coinbase.incrementBalance(coinbaseWeiDelta); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java index 85aa3a55b56..a0ccba7e26a 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java @@ -151,7 +151,7 @@ public void runTransaction( miningBeneficiary, new OperationTracer() { @Override - public void traceTransactionBeforeMiningReward( + public void traceBeforeRewardTransaction( final WorldView worldView, final org.hyperledger.besu.datatypes.Transaction tx, final Wei miningReward) { diff --git a/evm/src/main/java/org/hyperledger/besu/evm/tracing/OperationTracer.java b/evm/src/main/java/org/hyperledger/besu/evm/tracing/OperationTracer.java index a656fc30e00..f139386118a 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/tracing/OperationTracer.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/tracing/OperationTracer.java @@ -93,7 +93,7 @@ default void traceStartTransaction(final WorldView worldView, final Transaction * @param tx the transaction that just concluded * @param miningReward the reward that the mining beneficiary will receive. */ - default void traceTransactionBeforeMiningReward( + default void traceBeforeRewardTransaction( final WorldView worldView, final Transaction tx, final Wei miningReward) {} ; From 0143e7c6f982e78b10d93e990bb376e3db220738 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 11 Jul 2024 20:20:47 +0200 Subject: [PATCH 31/35] fix build Signed-off-by: Karim Taam --- .../common/bft/BaseBftProtocolScheduleBuilder.java | 1 + .../consensus/ibft/IbftProtocolScheduleBuilder.java | 1 + .../consensus/qbft/QbftProtocolScheduleBuilder.java | 1 + .../besu/ethereum/mainnet/MainnetProtocolSpecs.java | 1 - .../besu/ethereum/mainnet/ProtocolSpecBuilder.java | 7 ------- .../ParallelizedTransactionContext.java | 12 +++++------- .../retesteth/NoRewardProtocolScheduleWrapper.java | 2 -- 7 files changed, 8 insertions(+), 17 deletions(-) diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java index d52896b1d1b..b24b42c62f3 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java @@ -72,6 +72,7 @@ public BftProtocolSchedule createProtocolSchedule( final EvmConfiguration evmConfiguration, final MiningParameters miningParameters, final BadBlockManager badBlockManager, + final boolean isParallelTxEnabled, final MetricsSystem metricsSystem) { final Map> specMap = new HashMap<>(); diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java index 0fc0f3ad8e0..af782dabba6 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/IbftProtocolScheduleBuilder.java @@ -73,6 +73,7 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, + isParallelTxEnabled, metricsSystem); } diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java index 96d1a75ac92..34be5cfdaf2 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftProtocolScheduleBuilder.java @@ -77,6 +77,7 @@ public static BftProtocolSchedule create( evmConfiguration, miningParameters, badBlockManager, + isParallelTxEnabled, metricsSystem); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index fb43dc6aad7..08491619703 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -157,7 +157,6 @@ public static ProtocolSpecBuilder frontierDefinition( .transactionReceiptFactory(MainnetProtocolSpecs::frontierTransactionReceiptFactory) .blockReward(FRONTIER_BLOCK_REWARD) .skipZeroBlockRewards(false) - .metricsSystem(metricsSystem) .blockProcessorBuilder( isParallelTxEnabled ? new MainnetParallelBlockProcessor.ParallelBlockProcessorBuilder(metricsSystem) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index a0ce985fd25..0d792b7870c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -40,7 +40,6 @@ import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.precompile.PrecompileContractRegistry; import org.hyperledger.besu.evm.processor.AbstractMessageProcessor; -import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.Optional; import java.util.function.BiFunction; @@ -90,7 +89,6 @@ public class ProtocolSpecBuilder { private PoWHasher powHasher = PoWHasher.ETHASH_LIGHT; private boolean isPoS = false; private boolean isReplayProtectionSupported = false; - private MetricsSystem metricsSystem; public ProtocolSpecBuilder gasCalculator(final Supplier gasCalculatorBuilder) { this.gasCalculatorBuilder = gasCalculatorBuilder; @@ -297,11 +295,6 @@ public ProtocolSpecBuilder isReplayProtectionSupported( return this; } - public ProtocolSpecBuilder metricsSystem(final MetricsSystem metricsSystem) { - this.metricsSystem = metricsSystem; - return this; - } - public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { checkNotNull(gasCalculatorBuilder, "Missing gasCalculator"); checkNotNull(gasLimitCalculatorBuilder, "Missing gasLimitCalculatorBuilder"); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java index efde27fd3da..30305ce00b5 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedTransactionContext.java @@ -14,8 +14,6 @@ */ package org.hyperledger.besu.ethereum.mainnet.parallelization; -import static org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor.*; - import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.accumulator.DiffBasedWorldStateUpdateAccumulator; @@ -29,10 +27,10 @@ public final class ParallelizedTransactionContext { private final Wei miningBeneficiaryReward; public ParallelizedTransactionContext( - DiffBasedWorldStateUpdateAccumulator transactionAccumulator, - TransactionProcessingResult transactionProcessingResult, - boolean isMiningBeneficiaryTouchedPreRewardByTransaction, - Wei miningBeneficiaryReward) { + final DiffBasedWorldStateUpdateAccumulator transactionAccumulator, + final TransactionProcessingResult transactionProcessingResult, + final boolean isMiningBeneficiaryTouchedPreRewardByTransaction, + final Wei miningBeneficiaryReward) { this.transactionAccumulator = transactionAccumulator; this.transactionProcessingResult = transactionProcessingResult; this.isMiningBeneficiaryTouchedPreRewardByTransaction = @@ -57,7 +55,7 @@ public Wei miningBeneficiaryReward() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (obj == this) return true; if (obj == null || obj.getClass() != this.getClass()) return false; var that = (ParallelizedTransactionContext) obj; diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java index 760b7985245..99210f57d29 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java @@ -55,7 +55,6 @@ public ProtocolSpec getByBlockHeader(final ProcessableBlockHeader blockHeader) { Wei.ZERO, original.getMiningBeneficiaryCalculator(), original.isSkipZeroBlockRewards(), - original.isParallelTxEnabled(), delegate); final BlockValidator noRewardBlockValidator = new MainnetBlockValidator( @@ -83,7 +82,6 @@ public ProtocolSpec getByBlockHeader(final ProcessableBlockHeader blockHeader) { original.getMiningBeneficiaryCalculator(), original.getPrecompileContractRegistry(), original.isSkipZeroBlockRewards(), - original.isParallelTxEnabled(), original.getGasCalculator(), original.getGasLimitCalculator(), original.getFeeMarket(), From b8aebc61659bd9a8623dd0fe955a6d72b85ef9e8 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Thu, 11 Jul 2024 21:12:29 +0200 Subject: [PATCH 32/35] fix build Signed-off-by: Karim Taam --- .../consensus/common/bft/BaseBftProtocolScheduleBuilder.java | 1 + .../common/bft/BaseBftProtocolScheduleBuilderTest.java | 1 + .../besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java | 1 + .../jsonrpc/internal/methods/EthGetTransactionReceiptTest.java | 2 -- .../besu/ethereum/BlockImportExceptionHandlingTest.java | 1 - .../besu/ethereum/mainnet/MainnetBlockProcessorTest.java | 2 -- 6 files changed, 3 insertions(+), 5 deletions(-) diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java index b24b42c62f3..4a3d1e1730e 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilder.java @@ -59,6 +59,7 @@ protected BaseBftProtocolScheduleBuilder() {} * @param evmConfiguration the evm configuration * @param miningParameters the mining parameters * @param badBlockManager the cache to use to keep invalid blocks + * @param isParallelTxEnabled indicates whether parallel transaction is enabled. * @param metricsSystem metricsSystem A metricSystem instance to be able to expose metrics in the * underlying calls * @return the protocol schedule diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java index 074099ea189..e23664fd8d3 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BaseBftProtocolScheduleBuilderTest.java @@ -247,6 +247,7 @@ protected BlockHeaderValidator.Builder createBlockHeaderRuleset( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), + false, new NoOpMetricsSystem()); } diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java index a64eedfeb7c..1b86896f36f 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/blockcreation/BftBlockCreatorTest.java @@ -122,6 +122,7 @@ public BlockHeaderValidator.Builder createBlockHeaderRuleset( EvmConfiguration.DEFAULT, MiningParameters.MINING_DISABLED, new BadBlockManager(), + false, new NoOpMetricsSystem()); final ProtocolContext protContext = new ProtocolContext( diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionReceiptTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionReceiptTest.java index 98754eaca96..884cc504d8e 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionReceiptTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetTransactionReceiptTest.java @@ -141,7 +141,6 @@ public class EthGetTransactionReceiptTest { BlockHeader::getCoinbase, null, false, - false, null, GasLimitCalculator.constant(), FeeMarket.legacy(), @@ -173,7 +172,6 @@ public class EthGetTransactionReceiptTest { BlockHeader::getCoinbase, null, false, - false, null, GasLimitCalculator.constant(), FeeMarket.legacy(), diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java index cddcc517186..d3a261803fb 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java @@ -77,7 +77,6 @@ class BlockImportExceptionHandlingTest { Wei.ZERO, BlockHeader::getCoinbase, true, - false, protocolSchedule); private final BlockHeaderValidator blockHeaderValidator = mock(BlockHeaderValidator.class); private final BlockBodyValidator blockBodyValidator = mock(BlockBodyValidator.class); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java index ea5795daabf..a06aece37bd 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java @@ -65,7 +65,6 @@ public void noAccountCreatedWhenBlockRewardIsZeroAndSkipped() { Wei.ZERO, BlockHeader::getCoinbase, true, - false, protocolSchedule); final MutableWorldState worldState = ReferenceTestWorldState.create(emptyMap()); @@ -92,7 +91,6 @@ public void accountCreatedWhenBlockRewardIsZeroAndNotSkipped() { Wei.ZERO, BlockHeader::getCoinbase, false, - false, protocolSchedule); final MutableWorldState worldState = ReferenceTestWorldState.create(emptyMap()); From 1952cf014474c3c0894113d803ce9276a048fe49 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Fri, 12 Jul 2024 11:41:31 +0200 Subject: [PATCH 33/35] add a try-with-resouces on the roundWorldState to close automatically each instance. Signed-off-by: Ameziane H --- ...lelizedConcurrentTransactionProcessor.java | 107 +++++++++--------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java index a0ccba7e26a..2a57cf1b86d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java @@ -136,64 +136,65 @@ public void runTransaction( final BlockHashOperation.BlockHashLookup blockHashLookup, final Wei blobGasPrice, final PrivateMetadataUpdater privateMetadataUpdater) { - final DiffBasedWorldState roundWorldState = - new BonsaiWorldState((BonsaiWorldState) worldState, new NoopBonsaiCachedMerkleTrieLoader()); + try (final DiffBasedWorldState roundWorldState = + new BonsaiWorldState((BonsaiWorldState) worldState, new NoopBonsaiCachedMerkleTrieLoader());) { - final ParallelizedTransactionContext.Builder contextBuilder = - new ParallelizedTransactionContext.Builder(); - final DiffBasedWorldStateUpdateAccumulator roundWorldStateUpdater = - (DiffBasedWorldStateUpdateAccumulator) roundWorldState.updater(); - final TransactionProcessingResult result = - transactionProcessor.processTransaction( - roundWorldStateUpdater, - blockHeader, - transaction, - miningBeneficiary, - new OperationTracer() { - @Override - public void traceBeforeRewardTransaction( - final WorldView worldView, - final org.hyperledger.besu.datatypes.Transaction tx, - final Wei miningReward) { - /* - * This part checks if the mining beneficiary's account was accessed before increasing its balance for rewards. - * Indeed, if the transaction has interacted with the address to read or modify it, - * it means that the value is necessary for the proper execution of the transaction and will therefore be considered in collision detection. - * If this is not the case, we can ignore this address during conflict detection. - */ - if (transactionCollisionDetector - .getAddressesTouchedByTransaction( - transaction, Optional.of(roundWorldStateUpdater)) - .contains(miningBeneficiary)) { - contextBuilder.isMiningBeneficiaryTouchedPreRewardByTransaction(true); - } - contextBuilder.miningBeneficiaryReward(miningReward); - } - }, - blockHashLookup, - true, - TransactionValidationParams.processingBlock(), - privateMetadataUpdater, - blobGasPrice); + final ParallelizedTransactionContext.Builder contextBuilder = + new ParallelizedTransactionContext.Builder(); + final DiffBasedWorldStateUpdateAccumulator roundWorldStateUpdater = + (DiffBasedWorldStateUpdateAccumulator) roundWorldState.updater(); + final TransactionProcessingResult result = + transactionProcessor.processTransaction( + roundWorldStateUpdater, + blockHeader, + transaction, + miningBeneficiary, + new OperationTracer() { + @Override + public void traceBeforeRewardTransaction( + final WorldView worldView, + final org.hyperledger.besu.datatypes.Transaction tx, + final Wei miningReward) { + /* + * This part checks if the mining beneficiary's account was accessed before increasing its balance for rewards. + * Indeed, if the transaction has interacted with the address to read or modify it, + * it means that the value is necessary for the proper execution of the transaction and will therefore be considered in collision detection. + * If this is not the case, we can ignore this address during conflict detection. + */ + if (transactionCollisionDetector + .getAddressesTouchedByTransaction( + transaction, Optional.of(roundWorldStateUpdater)) + .contains(miningBeneficiary)) { + contextBuilder.isMiningBeneficiaryTouchedPreRewardByTransaction(true); + } + contextBuilder.miningBeneficiaryReward(miningReward); + } + }, + blockHashLookup, + true, + TransactionValidationParams.processingBlock(), + privateMetadataUpdater, + blobGasPrice); - // commit the accumulator in order to apply all the modifications - roundWorldState.getAccumulator().commit(); + // commit the accumulator in order to apply all the modifications + roundWorldState.getAccumulator().commit(); - contextBuilder - .transactionAccumulator(roundWorldState.getAccumulator()) - .transactionProcessingResult(result); + contextBuilder + .transactionAccumulator(roundWorldState.getAccumulator()) + .transactionProcessingResult(result); - final ParallelizedTransactionContext parallelizedTransactionContext = contextBuilder.build(); - if (!parallelizedTransactionContext.isMiningBeneficiaryTouchedPreRewardByTransaction()) { - /* - * If the address of the mining beneficiary has been touched only for adding rewards, - * we remove it from the accumulator to avoid a false positive collision. - * The balance will be increased during the sequential processing. - */ - roundWorldStateUpdater.getAccountsToUpdate().remove(miningBeneficiary); + final ParallelizedTransactionContext parallelizedTransactionContext = contextBuilder.build(); + if (!parallelizedTransactionContext.isMiningBeneficiaryTouchedPreRewardByTransaction()) { + /* + * If the address of the mining beneficiary has been touched only for adding rewards, + * we remove it from the accumulator to avoid a false positive collision. + * The balance will be increased during the sequential processing. + */ + roundWorldStateUpdater.getAccountsToUpdate().remove(miningBeneficiary); + } + parallelizedTransactionContextByLocation.put( + transactionLocation, parallelizedTransactionContext); } - parallelizedTransactionContextByLocation.put( - transactionLocation, parallelizedTransactionContext); } /** From ed0a683f82735c6639db8ae7f101de7e108f0c2c Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Fri, 12 Jul 2024 13:25:06 +0200 Subject: [PATCH 34/35] Close the worldstate in the parallel executions and ignore any exceptions as further checks are done Signed-off-by: Ameziane H --- .../ParallelizedConcurrentTransactionProcessor.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java index 2a57cf1b86d..2357a988a93 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java @@ -136,8 +136,9 @@ public void runTransaction( final BlockHashOperation.BlockHashLookup blockHashLookup, final Wei blobGasPrice, final PrivateMetadataUpdater privateMetadataUpdater) { - try (final DiffBasedWorldState roundWorldState = - new BonsaiWorldState((BonsaiWorldState) worldState, new NoopBonsaiCachedMerkleTrieLoader());) { + try { + final DiffBasedWorldState roundWorldState = + new BonsaiWorldState((BonsaiWorldState) worldState, new NoopBonsaiCachedMerkleTrieLoader()); final ParallelizedTransactionContext.Builder contextBuilder = new ParallelizedTransactionContext.Builder(); @@ -194,6 +195,9 @@ public void traceBeforeRewardTransaction( } parallelizedTransactionContextByLocation.put( transactionLocation, parallelizedTransactionContext); + roundWorldState.close(); + } catch (Exception exception) { + // no-op } } From b4f58e451502c6447870a7599797d96a40b39bb8 Mon Sep 17 00:00:00 2001 From: Karim Taam Date: Fri, 12 Jul 2024 16:27:21 +0200 Subject: [PATCH 35/35] close worldstate clone correctly Signed-off-by: Karim Taam --- .../ParallelizedConcurrentTransactionProcessor.java | 11 ++++------- .../diffbased/bonsai/worldview/BonsaiWorldState.java | 12 ------------ 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java index 2357a988a93..46d39be793d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/parallelization/ParallelizedConcurrentTransactionProcessor.java @@ -136,10 +136,10 @@ public void runTransaction( final BlockHashOperation.BlockHashLookup blockHashLookup, final Wei blobGasPrice, final PrivateMetadataUpdater privateMetadataUpdater) { - try { - final DiffBasedWorldState roundWorldState = - new BonsaiWorldState((BonsaiWorldState) worldState, new NoopBonsaiCachedMerkleTrieLoader()); - + try (final DiffBasedWorldState roundWorldState = + new BonsaiWorldState( + (BonsaiWorldState) worldState, new NoopBonsaiCachedMerkleTrieLoader())) { + roundWorldState.freeze(); // make the clone frozen final ParallelizedTransactionContext.Builder contextBuilder = new ParallelizedTransactionContext.Builder(); final DiffBasedWorldStateUpdateAccumulator roundWorldStateUpdater = @@ -195,9 +195,6 @@ public void traceBeforeRewardTransaction( } parallelizedTransactionContextByLocation.put( transactionLocation, parallelizedTransactionContext); - roundWorldState.close(); - } catch (Exception exception) { - // no-op } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java index c54fe50793c..b62805c1fda 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldState.java @@ -76,18 +76,6 @@ public BonsaiWorldState( diffBasedWorldStateConfig); } - public BonsaiWorldState( - final BonsaiWorldState worldState, - final DiffBasedWorldStateConfig diffBasedWorldStateConfig) { - this( - new BonsaiWorldStateLayerStorage(worldState.getWorldStateStorage()), - worldState.bonsaiCachedMerkleTrieLoader, - worldState.cachedWorldStorageManager, - worldState.trieLogManager, - worldState.accumulator.getEvmConfiguration(), - diffBasedWorldStateConfig); - } - public BonsaiWorldState( final BonsaiWorldState worldState, final BonsaiCachedMerkleTrieLoader cachedMerkleTrieLoader) {