Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,6 @@ public class BalConfigurationOptions {
/** Default constructor. */
public BalConfigurationOptions() {}

@CommandLine.Option(
names = {"--Xbal-optimization-enabled"},
hidden = true,
description = "Allows disabling BAL-based optimizations.")
boolean balOptimizationEnabled = true;
Comment thread
macfarla marked this conversation as resolved.

@CommandLine.Option(
names = {"--Xbal-perfect-parallelization-enabled"},
hidden = true,
Expand Down Expand Up @@ -79,7 +73,6 @@ public BalConfigurationOptions() {}
*/
public BalConfiguration toDomainObject() {
return ImmutableBalConfiguration.builder()
.isBalOptimisationEnabled(balOptimizationEnabled)
.isPerfectParallelizationEnabled(balPerfectParallelizationEnabled)
.shouldLogBalsOnMismatch(balLogBalsOnMismatch)
.isBalLenientOnStateRootMismatch(balLenientOnStateRootMismatch)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
import org.hyperledger.besu.ethereum.mainnet.blockhash.FrontierPreExecutionProcessor;
import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.StateRootCommitterFactoryDefault;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.DefaultStateRootCommitterFactory;
import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive;
import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator;

Expand Down Expand Up @@ -178,7 +178,7 @@ public String description() {
true,
Optional.empty(),
Optional.empty(),
new StateRootCommitterFactoryDefault(),
new DefaultStateRootCommitterFactory(),
BlockGasAccountingStrategy.FRONTIER,
BlockGasUsedValidator.FRONTIER);
private final ProtocolSpec statusTransactionTypeSpec =
Expand Down Expand Up @@ -214,7 +214,7 @@ public String description() {
true,
Optional.empty(),
Optional.empty(),
new StateRootCommitterFactoryDefault(),
new DefaultStateRootCommitterFactory(),
BlockGasAccountingStrategy.FRONTIER,
BlockGasUsedValidator.FRONTIER);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,8 @@ private TestContext createTestContext(final boolean withBAL) {
new BadBlockManager(),
false,
ImmutableBalConfiguration.builder()
.isBalOptimisationEnabled(withBAL)
.isBalStateRootTrusted(withBAL)
.isPerfectParallelizationEnabled(withBAL)
.build(),
new NoOpMetricsSystem())
.createProtocolSchedule())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,7 @@
*/
package org.hyperledger.besu.ethereum.core;

import org.hyperledger.besu.datatypes.Hash;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.StateRootCommitter;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.StateRootCommitterImplSync;
import org.hyperledger.besu.ethereum.trie.pathbased.common.worldview.WorldStateConfig;
import org.hyperledger.besu.ethereum.worldstate.WorldStateKeyValueStorage;
import org.hyperledger.besu.evm.worldstate.MutableWorldView;
import org.hyperledger.besu.evm.worldstate.WorldState;
import org.hyperledger.besu.plugin.data.BlockHeader;
Expand All @@ -37,14 +33,7 @@ public interface MutableWorldState extends WorldState, MutableWorldView {
void persist(BlockHeader blockHeader, StateRootCommitter committer);

default void persist(final BlockHeader blockHeader) {
persist(blockHeader, new StateRootCommitterImplSync());
}

default Hash calculateOrReadRootHash(
final WorldStateKeyValueStorage.Updater stateUpdater,
final BlockHeader blockHeader,
final WorldStateConfig cfg) {
throw new UnsupportedOperationException("calculateOrReadRootHash is not supported");
persist(blockHeader, StateRootCommitter.SYNCHRONOUS);
}

default MutableWorldState freezeStorage() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,10 +239,10 @@ public BlockProcessingResult processBlock(
blockTracer.traceStartBlock(worldState, blockHeader, miningBeneficiary);

final StateRootCommitter stateRootCommitter =
blockProcessingMetrics.wrapStateRootCommitter(
protocolSpec
.getStateRootCommitterFactory()
.forBlock(protocolContext, blockHeader, blockAccessList));
protocolSpec
.getStateRootCommitterFactory()
.forBlock(protocolContext, blockHeader, blockAccessList)
.timed(blockProcessingMetrics.stateRootCalculationTimer());

final Optional<BlockAccessListBuilder> blockAccessListBuilder =
protocolSpec
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,6 @@ public interface BalConfiguration {

BalConfiguration DEFAULT = ImmutableBalConfiguration.builder().build();

/** Returns whether BAL-based optimisations should be disabled entirely. */
@Value.Default
default boolean isBalOptimisationEnabled() {
return true;
}

/** Returns whether the BAL-computed state root should be trusted without verification. */
@Value.Default
default boolean isBalStateRootTrusted() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,9 @@
*/
package org.hyperledger.besu.ethereum.mainnet;

import org.hyperledger.besu.datatypes.Hash;
import org.hyperledger.besu.ethereum.core.MutableWorldState;
import org.hyperledger.besu.ethereum.mainnet.block.access.list.BlockAccessList;
import org.hyperledger.besu.ethereum.mainnet.block.access.list.BlockAccessList.AccountChanges;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.StateRootCommitter;
import org.hyperledger.besu.ethereum.trie.pathbased.common.worldview.WorldStateConfig;
import org.hyperledger.besu.ethereum.worldstate.WorldStateKeyValueStorage;
import org.hyperledger.besu.metrics.BesuMetricCategory;
import org.hyperledger.besu.plugin.data.BlockHeader;
import org.hyperledger.besu.plugin.services.MetricsSystem;
import org.hyperledger.besu.plugin.services.metrics.Counter;
import org.hyperledger.besu.plugin.services.metrics.OperationTimer;
Expand Down Expand Up @@ -76,8 +70,8 @@ public BlockProcessingMetrics(final MetricsSystem metricsSystem) {
"Time taken by state root calculation");
}

public StateRootCommitter wrapStateRootCommitter(final StateRootCommitter wrapped) {
return new TimedStateRootCommitter(wrapped, stateRootCalculationTimer);
public OperationTimer stateRootCalculationTimer() {
return stateRootCalculationTimer;
}

public void recordBlockAccessListMetrics(final BlockAccessList bal) {
Expand Down Expand Up @@ -114,36 +108,6 @@ private long countUpdatedStorageSlots(final BlockAccessList bal) {
}

private boolean hasAnyChange(final AccountChanges accountChanges) {
return !accountChanges.balanceChanges().isEmpty()
|| !accountChanges.nonceChanges().isEmpty()
|| !accountChanges.codeChanges().isEmpty()
|| !accountChanges.storageChanges().isEmpty();
}

private static class TimedStateRootCommitter implements StateRootCommitter {
private final StateRootCommitter wrapped;
private final OperationTimer operationTimer;

private TimedStateRootCommitter(
final StateRootCommitter wrapped, final OperationTimer operationTimer) {
this.wrapped = wrapped;
this.operationTimer = operationTimer;
}

@Override
public Hash computeRootAndCommit(
final MutableWorldState worldState,
final WorldStateKeyValueStorage.Updater stateUpdater,
final BlockHeader blockHeader,
final WorldStateConfig cfg) {
try (var timing = operationTimer.startTimer()) {
return wrapped.computeRootAndCommit(worldState, stateUpdater, blockHeader, cfg);
}
}

@Override
public void cancel() {
wrapped.cancel();
}
return accountChanges.hasAnyChange();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@
import org.hyperledger.besu.ethereum.mainnet.requests.MainnetRequestsValidator;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestContractAddresses;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.StateRootCommitterFactoryBal;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.BalStateRootCommitterFactory;
import org.hyperledger.besu.ethereum.mainnet.transactionpool.OsakaTransactionPoolPreProcessor;
import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult;
import org.hyperledger.besu.evm.MainnetEVMs;
Expand Down Expand Up @@ -1224,7 +1224,7 @@ static ProtocolSpecBuilder amsterdamDefinition(
.build())
.blockAccessListFactory(new BlockAccessListFactory())
.blockAccessListValidatorBuilder(MainnetBlockAccessListValidator::create)
.stateRootCommitterFactory(new StateRootCommitterFactoryBal(balConfiguration))
.stateRootCommitterFactory(new BalStateRootCommitterFactory(balConfiguration))
// EIP-8037: Disable validation-time TX_MAX_GAS_LIMIT cap (enforced at runtime on regular
// gas)
.gasLimitCalculatorBuilder(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
import org.hyperledger.besu.ethereum.mainnet.requests.ProhibitedRequestValidator;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidator;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.DefaultStateRootCommitterFactory;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.StateRootCommitterFactory;
import org.hyperledger.besu.ethereum.mainnet.staterootcommitter.StateRootCommitterFactoryDefault;
import org.hyperledger.besu.ethereum.mainnet.transactionpool.TransactionPoolPreProcessor;
import org.hyperledger.besu.evm.EVM;
import org.hyperledger.besu.evm.gascalculator.GasCalculator;
Expand Down Expand Up @@ -98,7 +98,7 @@ public class ProtocolSpecBuilder {
private TransactionPoolPreProcessor transactionPoolPreProcessor;
private BlockAccessListFactory blockAccessListFactory;
private StateRootCommitterFactory stateRootCommitterFactory =
new StateRootCommitterFactoryDefault();
new DefaultStateRootCommitterFactory();
private BalConfiguration balConfiguration = BalConfiguration.DEFAULT;
private BlockGasAccountingStrategy blockGasAccountingStrategy =
BlockGasAccountingStrategy.FRONTIER;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,14 @@ public record AccountChanges(
List<BalanceChange> balanceChanges,
List<NonceChange> nonceChanges,
List<CodeChange> codeChanges) {

public boolean hasAnyChange() {
return !balanceChanges.isEmpty()
|| !nonceChanges.isEmpty()
|| !codeChanges.isEmpty()
|| !storageChanges.isEmpty();
}

@Override
public String toString() {
return "AccountChanges{"
Expand Down
Loading
Loading