From ebb883075fe832be6e55e1822731a6e5f8a6f930 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Wed, 22 May 2024 10:02:34 -0700 Subject: [PATCH 1/9] Feature/fleet mode rebase (#6641) * fleet mode squash commit rebase Signed-off-by: garyschulte --- .../dsl/node/ThreadBesuNodeRunner.java | 9 +- .../acceptance/dsl/privacy/PrivacyNode.java | 4 +- .../java/org/hyperledger/besu/Runner.java | 10 ++ .../org/hyperledger/besu/cli/BesuCommand.java | 48 ++++- .../options/stable/JsonRpcHttpOptions.java | 9 + .../options/unstable/ChainPruningOptions.java | 41 ++++- .../controller/BesuControllerBuilder.java | 20 +-- .../besu/services/BesuConfigurationImpl.java | 48 ++++- .../besu/services/BesuEventsImpl.java | 5 + .../besu/services/BesuPluginContextImpl.java | 19 ++ .../besu/services/BlockchainServiceImpl.java | 49 +++++- .../besu/services/P2PServiceImpl.java | 44 +++++ .../services/RlpConverterServiceImpl.java | 82 +++++++++ .../services/SynchronizationServiceImpl.java | 166 ++++++++++++++++++ .../services/TransactionPoolServiceImpl.java | 43 +++++ .../org/hyperledger/besu/PrivacyTest.java | 4 +- .../java/org/hyperledger/besu/RunnerTest.java | 4 +- .../besu/cli/CommandTestAbstract.java | 3 +- ...nsusScheduleBesuControllerBuilderTest.java | 3 +- .../services/RlpConverterServiceImplTest.java | 54 ++++++ .../MigratingMiningCoordinatorTest.java | 3 +- .../hyperledger/besu/datatypes/BlobGas.java | 4 +- .../chain/ChainPrunerConfiguration.java | 13 +- .../ethereum/chain/DefaultBlockchain.java | 3 +- .../ethereum/chain/MutableBlockchain.java | 2 + .../besu/ethereum/core/BlockHeader.java | 2 +- .../common/GenesisWorldStateProvider.java | 4 +- .../bonsai/BonsaiWorldStateProvider.java | 26 ++- .../BonsaiCachedWorldStorageManager.java | 11 +- .../NoOpBonsaiCachedWorldStorageManager.java | 3 +- ...nsaiSnapshotWorldStateKeyValueStorage.java | 9 + .../bonsai/worldview/BonsaiWorldState.java | 72 +++++--- .../common/DiffBasedWorldStateProvider.java | 17 ++ .../diffbased/common/StorageSubscriber.java | 2 + .../DiffBasedCachedWorldStorageManager.java | 22 ++- .../DiffBasedWorldStateKeyValueStorage.java | 5 + .../common/trielog/TrieLogManager.java | 40 ++++- .../common/worldview/DiffBasedWorldState.java | 52 ++++-- .../worldview/DiffBasedWorldStateConfig.java | 79 +++++++++ .../BlockImportExceptionHandlingTest.java | 4 +- .../ethereum/chain/ChainDataPrunerTest.java | 2 + .../bonsai/AbstractIsolationTests.java | 10 ++ .../diffbased/bonsai/LogRollingTests.java | 19 +- .../trie/diffbased/bonsai/RollingImport.java | 4 +- .../worldview/BonsaiWorldStateTest.java | 4 +- .../WorldStateDownloaderBenchmark.java | 4 +- .../eth/sync/AbstractSyncTargetManager.java | 14 ++ .../eth/sync/PipelineChainDownloader.java | 1 + .../evmtool/EvmToolCommandOptionsModule.java | 2 +- .../internal/PeerDiscoveryController.java | 1 + .../internal/RecursivePeerRefreshState.java | 20 +++ .../BonsaiReferenceTestWorldState.java | 7 +- .../besu/ethereum/trie/NoOpMerkleTrie.java | 123 +++++++++++++ plugin-api/build.gradle | 2 +- .../hyperledger/besu/plugin/BesuPlugin.java | 3 + .../plugin/services/BesuConfiguration.java | 15 ++ .../besu/plugin/services/BesuEvents.java | 8 + .../plugin/services/BlockchainService.java | 34 ++++ .../besu/plugin/services/TrieLogService.java | 3 +- .../besu/plugin/services/p2p/P2PService.java | 27 +++ .../services/rlp/RlpConverterService.java | 74 ++++++++ .../services/sync/SynchronizationService.java | 62 +++++++ .../sync/WorldStateConfiguration.java | 26 +++ .../TransactionPoolService.java | 26 +++ .../services/trielogs/TrieLogProvider.java | 27 +++ 65 files changed, 1425 insertions(+), 131 deletions(-) create mode 100644 besu/src/main/java/org/hyperledger/besu/services/P2PServiceImpl.java create mode 100644 besu/src/main/java/org/hyperledger/besu/services/RlpConverterServiceImpl.java create mode 100644 besu/src/main/java/org/hyperledger/besu/services/SynchronizationServiceImpl.java create mode 100644 besu/src/main/java/org/hyperledger/besu/services/TransactionPoolServiceImpl.java create mode 100644 besu/src/test/java/org/hyperledger/besu/services/RlpConverterServiceImplTest.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/DiffBasedWorldStateConfig.java create mode 100644 ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/NoOpMerkleTrie.java create mode 100644 plugin-api/src/main/java/org/hyperledger/besu/plugin/services/p2p/P2PService.java create mode 100644 plugin-api/src/main/java/org/hyperledger/besu/plugin/services/rlp/RlpConverterService.java create mode 100644 plugin-api/src/main/java/org/hyperledger/besu/plugin/services/sync/SynchronizationService.java create mode 100644 plugin-api/src/main/java/org/hyperledger/besu/plugin/services/sync/WorldStateConfiguration.java create mode 100644 plugin-api/src/main/java/org/hyperledger/besu/plugin/services/transactionpool/TransactionPoolService.java diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java index 073e0bd1d..0448d324e 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java @@ -180,11 +180,10 @@ public class ThreadBesuNodeRunner implements BesuNodeRunner { .from(node.getMiningParameters()) .transactionSelectionService(transactionSelectionServiceImpl) .build(); - commonPluginConfiguration.init( - dataDir, - dataDir.resolve(DATABASE_PATH), - node.getDataStorageConfiguration(), - miningParameters); + commonPluginConfiguration + .init(dataDir, dataDir.resolve(DATABASE_PATH), node.getDataStorageConfiguration()) + .withMiningParameters(miningParameters); + final BesuPluginContextImpl besuPluginContext = besuPluginContextMap.computeIfAbsent( node, diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/privacy/PrivacyNode.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/privacy/PrivacyNode.java index c9487ebcd..32a5a0fbf 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/privacy/PrivacyNode.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/privacy/PrivacyNode.java @@ -274,7 +274,9 @@ public class PrivacyNode implements AutoCloseable { private PrivacyStorageProvider createKeyValueStorageProvider( final Path dataLocation, final Path dbLocation) { final var besuConfiguration = new BesuConfigurationImpl(); - besuConfiguration.init(dataLocation, dbLocation, null, besuConfig.getMiningParameters()); + besuConfiguration + .init(dataLocation, dbLocation, null) + .withMiningParameters(besuConfig.getMiningParameters()); return new PrivacyKeyValueStorageProviderBuilder() .withStorageFactory( new RocksDBKeyValuePrivacyStorageFactory( diff --git a/besu/src/main/java/org/hyperledger/besu/Runner.java b/besu/src/main/java/org/hyperledger/besu/Runner.java index 32c4a46dd..4444f7acf 100644 --- a/besu/src/main/java/org/hyperledger/besu/Runner.java +++ b/besu/src/main/java/org/hyperledger/besu/Runner.java @@ -25,6 +25,7 @@ import org.hyperledger.besu.ethereum.api.query.cache.TransactionLogBloomCacher; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolEvictionService; import org.hyperledger.besu.ethereum.p2p.network.NetworkRunner; +import org.hyperledger.besu.ethereum.p2p.network.P2PNetwork; import org.hyperledger.besu.ethereum.stratum.StratumServer; import org.hyperledger.besu.ethstats.EthStatsService; import org.hyperledger.besu.metrics.MetricsService; @@ -422,6 +423,15 @@ public class Runner implements AutoCloseable { return networkRunner.getNetwork().getLocalEnode(); } + /** + * get P2PNetwork service. + * + * @return p2p network service. + */ + public P2PNetwork getP2PNetwork() { + return networkRunner.getNetwork(); + } + @FunctionalInterface private interface SynchronousShutdown { /** 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 ccbc619b5..bd47630fa 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -172,21 +172,29 @@ import org.hyperledger.besu.plugin.services.TransactionSimulationService; import org.hyperledger.besu.plugin.services.exception.StorageException; import org.hyperledger.besu.plugin.services.metrics.MetricCategory; import org.hyperledger.besu.plugin.services.metrics.MetricCategoryRegistry; +import org.hyperledger.besu.plugin.services.p2p.P2PService; +import org.hyperledger.besu.plugin.services.rlp.RlpConverterService; import org.hyperledger.besu.plugin.services.securitymodule.SecurityModule; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import org.hyperledger.besu.plugin.services.storage.PrivacyKeyValueStorageFactory; import org.hyperledger.besu.plugin.services.storage.rocksdb.RocksDBPlugin; +import org.hyperledger.besu.plugin.services.sync.SynchronizationService; +import org.hyperledger.besu.plugin.services.transactionpool.TransactionPoolService; import org.hyperledger.besu.services.BesuConfigurationImpl; import org.hyperledger.besu.services.BesuEventsImpl; import org.hyperledger.besu.services.BesuPluginContextImpl; import org.hyperledger.besu.services.BlockchainServiceImpl; +import org.hyperledger.besu.services.P2PServiceImpl; import org.hyperledger.besu.services.PermissioningServiceImpl; import org.hyperledger.besu.services.PicoCLIOptionsImpl; import org.hyperledger.besu.services.PrivacyPluginServiceImpl; +import org.hyperledger.besu.services.RlpConverterServiceImpl; import org.hyperledger.besu.services.RpcEndpointServiceImpl; import org.hyperledger.besu.services.SecurityModuleServiceImpl; import org.hyperledger.besu.services.StorageServiceImpl; +import org.hyperledger.besu.services.SynchronizationServiceImpl; import org.hyperledger.besu.services.TraceServiceImpl; +import org.hyperledger.besu.services.TransactionPoolServiceImpl; import org.hyperledger.besu.services.TransactionPoolValidatorServiceImpl; import org.hyperledger.besu.services.TransactionSelectionServiceImpl; import org.hyperledger.besu.services.TransactionSimulationServiceImpl; @@ -1161,12 +1169,15 @@ public class BesuCommand implements DefaultCommandValues, Runnable { final var runner = buildRunner(); runner.startExternalServices(); - startPlugins(); + startPlugins(runner); validatePluginOptions(); setReleaseMetrics(); preSynchronization(); runner.startEthereumMainLoop(); + + besuPluginContext.afterExternalServicesMainLoop(); + runner.awaitStop(); } catch (final Exception e) { @@ -1327,7 +1338,7 @@ public class BesuCommand implements DefaultCommandValues, Runnable { pidPath); } - private void startPlugins() { + private void startPlugins(final Runner runner) { blockchainServiceImpl.init( besuController.getProtocolContext(), besuController.getProtocolSchedule()); transactionSimulationServiceImpl.init( @@ -1348,6 +1359,26 @@ public class BesuCommand implements DefaultCommandValues, Runnable { besuController.getProtocolContext().getBadBlockManager())); besuPluginContext.addService(MetricsSystem.class, getMetricsSystem()); + besuPluginContext.addService(BlockchainService.class, blockchainServiceImpl); + + besuPluginContext.addService( + SynchronizationService.class, + new SynchronizationServiceImpl( + besuController.getProtocolContext(), + besuController.getProtocolSchedule(), + besuController.getSyncState(), + besuController.getProtocolContext().getWorldStateArchive())); + + besuPluginContext.addService(P2PService.class, new P2PServiceImpl(runner.getP2PNetwork())); + + besuPluginContext.addService( + TransactionPoolService.class, + new TransactionPoolServiceImpl(besuController.getTransactionPool())); + + besuPluginContext.addService( + RlpConverterService.class, + new RlpConverterServiceImpl(besuController.getProtocolSchedule())); + besuPluginContext.addService( TraceService.class, new TraceServiceImpl( @@ -1653,11 +1684,11 @@ public class BesuCommand implements DefaultCommandValues, Runnable { private void validateChainDataPruningParams() { if (unstableChainPruningOptions.getChainDataPruningEnabled() && unstableChainPruningOptions.getChainDataPruningBlocksRetained() - < ChainPruningOptions.DEFAULT_CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED) { + < unstableChainPruningOptions.getChainDataPruningBlocksRetainedLimit()) { throw new ParameterException( this.commandLine, "--Xchain-pruning-blocks-retained must be >= " - + ChainPruningOptions.DEFAULT_CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED); + + unstableChainPruningOptions.getChainDataPruningBlocksRetainedLimit()); } } @@ -1843,11 +1874,10 @@ public class BesuCommand implements DefaultCommandValues, Runnable { * @return instance of BesuControllerBuilder */ public BesuControllerBuilder getControllerBuilder() { - pluginCommonConfiguration.init( - dataDir(), - dataDir().resolve(DATABASE_PATH), - getDataStorageConfiguration(), - miningParametersSupplier.get()); + pluginCommonConfiguration + .init(dataDir(), dataDir().resolve(DATABASE_PATH), getDataStorageConfiguration()) + .withMiningParameters(getMiningParameters()) + .withJsonRpcHttpOptions(jsonRpcHttpOptions); final KeyValueStorageProvider storageProvider = keyValueStorageProvider(keyValueStorageName); return controllerBuilderFactory .fromEthNetworkConfig(updateNetworkConfig(network), getDefaultSyncModeIfNotSet()) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/JsonRpcHttpOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/JsonRpcHttpOptions.java index a47c5e9ce..026b83b55 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/JsonRpcHttpOptions.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/JsonRpcHttpOptions.java @@ -475,6 +475,15 @@ public class JsonRpcHttpOptions { return rpcHttpApis; } + /** + * Returns the host for RPC over HTTP. + * + * @return The port number + */ + public String getRpcHttpHost() { + return rpcHttpHost; + } + /** * Returns the port for RPC over HTTP. * diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/ChainPruningOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/ChainPruningOptions.java index 8eaed2d08..0a59ef9b0 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/ChainPruningOptions.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/ChainPruningOptions.java @@ -28,10 +28,17 @@ public class ChainPruningOptions implements CLIOptions private static final String CHAIN_PRUNING_ENABLED_FLAG = "--Xchain-pruning-enabled"; private static final String CHAIN_PRUNING_BLOCKS_RETAINED_FLAG = "--Xchain-pruning-blocks-retained"; + private static final String CHAIN_PRUNING_BLOCKS_RETAINED_LIMIT_FLAG = + "--Xchain-pruning-blocks-retained-limit"; private static final String CHAIN_PRUNING_FREQUENCY_FLAG = "--Xchain-pruning-frequency"; - /** The constant DEFAULT_CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED. */ - public static final long DEFAULT_CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED = 7200; + /** + * The "CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED_LIMIT" field sets the minimum limit for the + * "CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED" value. For most networks, the default value of this + * limit is the safest. Reducing this value requires careful consideration and understanding of + * the potential implications. Lowering this limit may have unintended side effects. + */ + public static final long CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED_LIMIT = 7200; /** The constant DEFAULT_CHAIN_DATA_PRUNING_FREQUENCY. */ public static final int DEFAULT_CHAIN_DATA_PRUNING_FREQUENCY = 256; @@ -47,11 +54,21 @@ public class ChainPruningOptions implements CLIOptions hidden = true, names = {CHAIN_PRUNING_BLOCKS_RETAINED_FLAG}, description = - "The number of recent blocks for which to keep the chain data. Must be >= " - + DEFAULT_CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED + "The number of recent blocks for which to keep the chain data. Should be >= " + + CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED_LIMIT + " (default: ${DEFAULT-VALUE})") - private final Long chainDataPruningBlocksRetained = - DEFAULT_CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED; + private final Long chainDataPruningBlocksRetained = CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED_LIMIT; + + @CommandLine.Option( + hidden = true, + names = {CHAIN_PRUNING_BLOCKS_RETAINED_LIMIT_FLAG}, + description = + "Allows setting the limit below which no more blocks can be pruned. This prevents setting a value lower than this for " + + CHAIN_PRUNING_BLOCKS_RETAINED_FLAG + + ". This flag should be used with caution as reducing the limit may have unintended side effects." + + " (default: ${DEFAULT-VALUE})") + private final Long chainDataPruningBlocksRetainedLimit = + CHAIN_DATA_PRUNING_MIN_BLOCKS_RETAINED_LIMIT; @CommandLine.Option( hidden = true, @@ -91,11 +108,21 @@ public class ChainPruningOptions implements CLIOptions return chainDataPruningBlocksRetained; } + /** + * Get the configured number of retained blocks for chain pruning. + * + * @return the number of retained blocks + */ + public Long getChainDataPruningBlocksRetainedLimit() { + return chainDataPruningBlocksRetainedLimit; + } + @Override public ChainPrunerConfiguration toDomainObject() { return new ChainPrunerConfiguration( chainDataPruningEnabled, chainDataPruningBlocksRetained, + chainDataPruningBlocksRetainedLimit, chainDataPruningBlocksFrequency.getValue()); } @@ -106,6 +133,8 @@ public class ChainPruningOptions implements CLIOptions chainDataPruningEnabled.toString(), CHAIN_PRUNING_BLOCKS_RETAINED_FLAG, chainDataPruningBlocksRetained.toString(), + CHAIN_PRUNING_BLOCKS_RETAINED_LIMIT_FLAG, + chainDataPruningBlocksRetainedLimit.toString(), CHAIN_PRUNING_FREQUENCY_FLAG, chainDataPruningBlocksFrequency.toString()); } 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 d801528cf..322f596e1 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -610,16 +610,6 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides blockchain, worldStateArchive, protocolSchedule, this::createConsensusContext); validateContext(protocolContext); - if (chainPrunerConfiguration.getChainPruningEnabled()) { - final ChainDataPruner chainDataPruner = createChainPruner(blockchainStorage); - blockchain.observeBlockAdded(chainDataPruner); - LOG.info( - "Chain data pruning enabled with recent blocks retained to be: " - + chainPrunerConfiguration.getChainPruningBlocksRetained() - + " and frequency to be: " - + chainPrunerConfiguration.getChainPruningBlocksFrequency()); - } - protocolSchedule.setPublicWorldStateArchiveForPrivacyBlockProcessor( protocolContext.getWorldStateArchive()); @@ -668,6 +658,16 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides final boolean fullSyncDisabled = !SyncMode.isFullSync(syncConfig.getSyncMode()); final SyncState syncState = new SyncState(blockchain, ethPeers, fullSyncDisabled, checkpoint); + if (chainPrunerConfiguration.getChainPruningEnabled()) { + final ChainDataPruner chainDataPruner = createChainPruner(blockchainStorage); + blockchain.observeBlockAdded(chainDataPruner); + LOG.info( + "Chain data pruning enabled with recent blocks retained to be: " + + chainPrunerConfiguration.getChainPruningBlocksRetained() + + " and frequency to be: " + + chainPrunerConfiguration.getChainPruningBlocksFrequency()); + } + final TransactionPool transactionPool = TransactionPoolFactory.createTransactionPool( protocolSchedule, diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuConfigurationImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuConfigurationImpl.java index 875929da3..0adbda23b 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuConfigurationImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuConfigurationImpl.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.services; +import org.hyperledger.besu.cli.options.stable.JsonRpcHttpOptions; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; @@ -21,13 +22,18 @@ import org.hyperledger.besu.plugin.services.BesuConfiguration; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import java.nio.file.Path; +import java.util.Optional; /** A concrete implementation of BesuConfiguration which is used in Besu plugin framework. */ public class BesuConfigurationImpl implements BesuConfiguration { private Path storagePath; private Path dataPath; private DataStorageConfiguration dataStorageConfiguration; - private MiningParameters miningParameters; + + // defaults + private MiningParameters miningParameters = MiningParameters.newDefault(); + private Optional rpcHttpHost = Optional.of("http://localhost"); + private Optional rpcHttpPort = Optional.of(8545); /** Default Constructor. */ public BesuConfigurationImpl() {} @@ -38,17 +44,49 @@ public class BesuConfigurationImpl implements BesuConfiguration { * @param dataPath The Path representing data folder * @param storagePath The path representing storage folder * @param dataStorageConfiguration The data storage configuration - * @param miningParameters The mining parameters + * @return BesuConfigurationImpl instance */ - public void init( + public BesuConfigurationImpl init( final Path dataPath, final Path storagePath, - final DataStorageConfiguration dataStorageConfiguration, - final MiningParameters miningParameters) { + final DataStorageConfiguration dataStorageConfiguration) { this.dataPath = dataPath; this.storagePath = storagePath; this.dataStorageConfiguration = dataStorageConfiguration; + return this; + } + + /** + * Set the mining parameters + * + * @param miningParameters configured mining parameters + * @return BesuConfigurationImpl instance + */ + public BesuConfigurationImpl withMiningParameters(final MiningParameters miningParameters) { this.miningParameters = miningParameters; + return this; + } + + /** + * Set the RPC http options + * + * @param rpcHttpOptions configured rpc http options + * @return BesuConfigurationImpl instance + */ + public BesuConfigurationImpl withJsonRpcHttpOptions(final JsonRpcHttpOptions rpcHttpOptions) { + this.rpcHttpHost = Optional.ofNullable(rpcHttpOptions.getRpcHttpHost()); + this.rpcHttpPort = Optional.ofNullable(rpcHttpOptions.getRpcHttpPort()); + return this; + } + + @Override + public Optional getRpcHttpHost() { + return rpcHttpHost; + } + + @Override + public Optional getRpcHttpPort() { + return rpcHttpPort; } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index 5e6a63df4..aeb702587 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -114,6 +114,11 @@ public class BesuEventsImpl implements BesuEvents { blockchain.removeObserver(listenerIdentifier); } + @Override + public long addInitialSyncCompletionListener(final InitialSyncCompletionListener listener) { + return syncState.subscribeCompletionReached(listener); + } + @Override public long addTransactionAddedListener(final TransactionAddedListener listener) { return transactionPool.subscribePendingTransactions(listener::onTransactionAdded); diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuPluginContextImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuPluginContextImpl.java index e7108a02d..6aa64ac51 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuPluginContextImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuPluginContextImpl.java @@ -262,6 +262,25 @@ public class BesuPluginContextImpl implements BesuContext, PluginVersionsProvide state = Lifecycle.BEFORE_MAIN_LOOP_FINISHED; } + /** Execute all plugin setup code after external services. */ + public void afterExternalServicesMainLoop() { + checkState( + state == Lifecycle.BEFORE_MAIN_LOOP_FINISHED, + "BesuContext should be in state %s but it was in %s", + Lifecycle.BEFORE_MAIN_LOOP_FINISHED, + state); + final Iterator pluginsIterator = registeredPlugins.iterator(); + + while (pluginsIterator.hasNext()) { + final BesuPlugin plugin = pluginsIterator.next(); + try { + plugin.afterExternalServicePostMainLoop(); + } finally { + pluginsIterator.remove(); + } + } + } + /** Stop plugins. */ public void stopPlugins() { checkState( diff --git a/besu/src/main/java/org/hyperledger/besu/services/BlockchainServiceImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BlockchainServiceImpl.java index c6d37ad6a..5005e5f7c 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BlockchainServiceImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BlockchainServiceImpl.java @@ -17,17 +17,22 @@ package org.hyperledger.besu.services; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.ProtocolContext; -import org.hyperledger.besu.ethereum.core.BlockBody; +import org.hyperledger.besu.ethereum.chain.MutableBlockchain; +import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.plugin.Unstable; +import org.hyperledger.besu.plugin.data.BlockBody; import org.hyperledger.besu.plugin.data.BlockContext; import org.hyperledger.besu.plugin.data.BlockHeader; +import org.hyperledger.besu.plugin.data.TransactionReceipt; import org.hyperledger.besu.plugin.services.BlockchainService; +import java.util.List; import java.util.Optional; import java.util.function.Supplier; +import java.util.stream.Collectors; /** The Blockchain service implementation. */ @Unstable @@ -35,9 +40,7 @@ public class BlockchainServiceImpl implements BlockchainService { private ProtocolContext protocolContext; private ProtocolSchedule protocolSchedule; - - /** Create a new instance */ - public BlockchainServiceImpl() {} + private MutableBlockchain blockchain; /** * Instantiates a new Blockchain service. @@ -48,6 +51,7 @@ public class BlockchainServiceImpl implements BlockchainService { public void init(final ProtocolContext protocolContext, final ProtocolSchedule protocolSchedule) { this.protocolContext = protocolContext; this.protocolSchedule = protocolSchedule; + this.blockchain = protocolContext.getBlockchain(); } /** @@ -91,6 +95,43 @@ public class BlockchainServiceImpl implements BlockchainService { feeMarket.targetGasUsed(chainHeadHeader))); } + @Override + public Optional> getReceiptsByBlockHash(final Hash blockHash) { + return blockchain + .getTxReceipts(blockHash) + .map( + list -> list.stream().map(TransactionReceipt.class::cast).collect(Collectors.toList())); + } + + @Override + public void storeBlock( + final BlockHeader blockHeader, + final BlockBody blockBody, + final List receipts) { + final org.hyperledger.besu.ethereum.core.BlockHeader coreHeader = + (org.hyperledger.besu.ethereum.core.BlockHeader) blockHeader; + final org.hyperledger.besu.ethereum.core.BlockBody coreBody = + (org.hyperledger.besu.ethereum.core.BlockBody) blockBody; + final List coreReceipts = + receipts.stream() + .map(org.hyperledger.besu.ethereum.core.TransactionReceipt.class::cast) + .toList(); + blockchain.unsafeImportBlock( + new Block(coreHeader, coreBody), + coreReceipts, + Optional.ofNullable(blockchain.calculateTotalDifficulty(coreHeader))); + } + + @Override + public Optional getSafeBlock() { + return blockchain.getSafeBlock(); + } + + @Override + public Optional getFinalizedBlock() { + return blockchain.getFinalized(); + } + private static BlockContext blockContext( final Supplier blockHeaderSupplier, final Supplier blockBodySupplier) { diff --git a/besu/src/main/java/org/hyperledger/besu/services/P2PServiceImpl.java b/besu/src/main/java/org/hyperledger/besu/services/P2PServiceImpl.java new file mode 100644 index 000000000..dc1fb0833 --- /dev/null +++ b/besu/src/main/java/org/hyperledger/besu/services/P2PServiceImpl.java @@ -0,0 +1,44 @@ +/* + * 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.services; + +import org.hyperledger.besu.ethereum.p2p.network.P2PNetwork; +import org.hyperledger.besu.plugin.services.p2p.P2PService; + +/** Service to enable and disable P2P discovery. */ +public class P2PServiceImpl implements P2PService { + + private final P2PNetwork p2PNetwork; + + /** + * Creates a new P2PServiceImpl. + * + * @param p2PNetwork the P2P network to enable and disable. + */ + public P2PServiceImpl(final P2PNetwork p2PNetwork) { + this.p2PNetwork = p2PNetwork; + } + + /** Enables P2P discovery. */ + @Override + public void enableDiscovery() { + p2PNetwork.start(); + } + + @Override + public void disableDiscovery() { + p2PNetwork.stop(); + } +} diff --git a/besu/src/main/java/org/hyperledger/besu/services/RlpConverterServiceImpl.java b/besu/src/main/java/org/hyperledger/besu/services/RlpConverterServiceImpl.java new file mode 100644 index 000000000..53b3541a5 --- /dev/null +++ b/besu/src/main/java/org/hyperledger/besu/services/RlpConverterServiceImpl.java @@ -0,0 +1,82 @@ +/* + * 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.services; + +import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions; +import org.hyperledger.besu.ethereum.rlp.RLP; +import org.hyperledger.besu.plugin.data.BlockBody; +import org.hyperledger.besu.plugin.data.BlockHeader; +import org.hyperledger.besu.plugin.data.TransactionReceipt; +import org.hyperledger.besu.plugin.services.rlp.RlpConverterService; + +import org.apache.tuweni.bytes.Bytes; + +/** RLP Serialiaztion/Deserialization service. */ +public class RlpConverterServiceImpl implements RlpConverterService { + + private final BlockHeaderFunctions blockHeaderFunctions; + + /** + * Constructor for RlpConverterServiceImpl. + * + * @param protocolSchedule the protocol schedule. + */ + public RlpConverterServiceImpl(final ProtocolSchedule protocolSchedule) { + this.blockHeaderFunctions = ScheduleBasedBlockHeaderFunctions.create(protocolSchedule); + } + + @Override + public BlockHeader buildHeaderFromRlp(final Bytes rlp) { + return org.hyperledger.besu.ethereum.core.BlockHeader.readFrom( + RLP.input(rlp), blockHeaderFunctions); + } + + @Override + public BlockBody buildBodyFromRlp(final Bytes rlp) { + return org.hyperledger.besu.ethereum.core.BlockBody.readWrappedBodyFrom( + RLP.input(rlp), blockHeaderFunctions); + } + + @Override + public TransactionReceipt buildReceiptFromRlp(final Bytes rlp) { + return org.hyperledger.besu.ethereum.core.TransactionReceipt.readFrom(RLP.input(rlp)); + } + + @Override + public Bytes buildRlpFromHeader(final BlockHeader blockHeader) { + return RLP.encode( + org.hyperledger.besu.ethereum.core.BlockHeader.convertPluginBlockHeader( + blockHeader, blockHeaderFunctions) + ::writeTo); + } + + @Override + public Bytes buildRlpFromBody(final BlockBody blockBody) { + return RLP.encode( + rlpOutput -> + ((org.hyperledger.besu.ethereum.core.BlockBody) blockBody) + .writeWrappedBodyTo(rlpOutput)); + } + + @Override + public Bytes buildRlpFromReceipt(final TransactionReceipt receipt) { + return RLP.encode( + rlpOutput -> + ((org.hyperledger.besu.ethereum.core.TransactionReceipt) receipt) + .writeToForNetwork(rlpOutput)); + } +} diff --git a/besu/src/main/java/org/hyperledger/besu/services/SynchronizationServiceImpl.java b/besu/src/main/java/org/hyperledger/besu/services/SynchronizationServiceImpl.java new file mode 100644 index 000000000..898ede5d0 --- /dev/null +++ b/besu/src/main/java/org/hyperledger/besu/services/SynchronizationServiceImpl.java @@ -0,0 +1,166 @@ +/* + * 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.services; + +import org.hyperledger.besu.consensus.merge.MergeContext; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.ethereum.ProtocolContext; +import org.hyperledger.besu.ethereum.chain.MutableBlockchain; +import org.hyperledger.besu.ethereum.core.Block; +import org.hyperledger.besu.ethereum.core.BlockImporter; +import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; +import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; +import org.hyperledger.besu.ethereum.trie.diffbased.common.DiffBasedWorldStateProvider; +import org.hyperledger.besu.ethereum.trie.diffbased.common.storage.DiffBasedWorldStateKeyValueStorage; +import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; +import org.hyperledger.besu.plugin.data.BlockBody; +import org.hyperledger.besu.plugin.data.BlockHeader; +import org.hyperledger.besu.plugin.services.sync.SynchronizationService; + +import java.util.Optional; + +import org.apache.tuweni.bytes.Bytes; +import org.apache.tuweni.bytes.Bytes32; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** Synchronization service. */ +public class SynchronizationServiceImpl implements SynchronizationService { + + private static final Logger LOG = LoggerFactory.getLogger(SynchronizationServiceImpl.class); + + private final ProtocolContext protocolContext; + private final ProtocolSchedule protocolSchedule; + + private final SyncState syncState; + private final Optional worldStateArchive; + + /** + * Constructor for SynchronizationServiceImpl. + * + * @param protocolContext protocol context + * @param protocolSchedule protocol schedule + * @param syncState sync state + * @param worldStateArchive world state archive + */ + public SynchronizationServiceImpl( + final ProtocolContext protocolContext, + final ProtocolSchedule protocolSchedule, + final SyncState syncState, + final WorldStateArchive worldStateArchive) { + this.protocolContext = protocolContext; + this.protocolSchedule = protocolSchedule; + this.syncState = syncState; + this.worldStateArchive = + Optional.ofNullable(worldStateArchive) + .filter(z -> z instanceof DiffBasedWorldStateProvider) + .map(DiffBasedWorldStateProvider.class::cast); + } + + @Override + public void fireNewUnverifiedForkchoiceEvent( + final Hash head, final Hash safeBlock, final Hash finalizedBlock) { + final MergeContext mergeContext = protocolContext.getConsensusContext(MergeContext.class); + if (mergeContext != null) { + mergeContext.fireNewUnverifiedForkchoiceEvent(head, safeBlock, finalizedBlock); + protocolContext.getBlockchain().setFinalized(finalizedBlock); + protocolContext.getBlockchain().setSafeBlock(safeBlock); + } else { + LOG.atWarn() + .setMessage( + "The merge context is unavailable, hence the fork choice event cannot be triggered") + .log(); + } + } + + @Override + public boolean setHead(final BlockHeader blockHeader, final BlockBody blockBody) { + final BlockImporter blockImporter = + protocolSchedule + .getByBlockHeader((org.hyperledger.besu.ethereum.core.BlockHeader) blockHeader) + .getBlockImporter(); + return blockImporter + .importBlock( + protocolContext, + new Block( + (org.hyperledger.besu.ethereum.core.BlockHeader) blockHeader, + (org.hyperledger.besu.ethereum.core.BlockBody) blockBody), + HeaderValidationMode.SKIP_DETACHED) + .isImported(); + } + + @Override + public boolean setHeadUnsafe(final BlockHeader blockHeader, final BlockBody blockBody) { + final org.hyperledger.besu.ethereum.core.BlockHeader coreHeader = + (org.hyperledger.besu.ethereum.core.BlockHeader) blockHeader; + + final MutableBlockchain blockchain = protocolContext.getBlockchain(); + + if (worldStateArchive.flatMap(archive -> archive.getMutable(coreHeader, true)).isPresent()) { + if (coreHeader.getParentHash().equals(blockchain.getChainHeadHash())) { + LOG.atDebug() + .setMessage( + "Forwarding chain head to the block {} saved from a previous newPayload invocation") + .addArgument(coreHeader::toLogString) + .log(); + return blockchain.forwardToBlock(coreHeader); + } else { + LOG.atDebug() + .setMessage("New head {} is a chain reorg, rewind chain head to it") + .addArgument(coreHeader::toLogString) + .log(); + return blockchain.rewindToBlock(coreHeader.getBlockHash()); + } + } else { + LOG.atWarn() + .setMessage("The world state is unavailable, setting of head cannot be performed.") + .log(); + } + return false; + } + + @Override + public boolean isInitialSyncPhaseDone() { + return syncState.isInitialSyncPhaseDone(); + } + + @Override + public void disableWorldStateTrie() { + // TODO maybe find a best way in the future to delete and disable trie + worldStateArchive.ifPresent( + archive -> { + archive.getDefaultWorldStateConfig().setTrieDisabled(true); + final DiffBasedWorldStateKeyValueStorage worldStateStorage = + archive.getWorldStateKeyValueStorage(); + final Optional worldStateBlockHash = worldStateStorage.getWorldStateBlockHash(); + final Optional worldStateRootHash = worldStateStorage.getWorldStateRootHash(); + if (worldStateRootHash.isPresent() && worldStateBlockHash.isPresent()) { + worldStateStorage.clearTrie(); + // keep root and block hash in the trie branch + final DiffBasedWorldStateKeyValueStorage.Updater updater = worldStateStorage.updater(); + updater.saveWorldState( + worldStateBlockHash.get(), Bytes32.wrap(worldStateRootHash.get()), Bytes.EMPTY); + updater.commit(); + + // currently only bonsai needs an explicit upgrade to full flat db + if (worldStateStorage instanceof BonsaiWorldStateKeyValueStorage bonsaiStorage) { + bonsaiStorage.upgradeToFullFlatDbMode(); + } + } + }); + } +} diff --git a/besu/src/main/java/org/hyperledger/besu/services/TransactionPoolServiceImpl.java b/besu/src/main/java/org/hyperledger/besu/services/TransactionPoolServiceImpl.java new file mode 100644 index 000000000..16d033ac9 --- /dev/null +++ b/besu/src/main/java/org/hyperledger/besu/services/TransactionPoolServiceImpl.java @@ -0,0 +1,43 @@ +/* + * 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.services; + +import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; +import org.hyperledger.besu.plugin.services.transactionpool.TransactionPoolService; + +/** Service to enable and disable the transaction pool. */ +public class TransactionPoolServiceImpl implements TransactionPoolService { + + private final TransactionPool transactionPool; + + /** + * Creates a new TransactionPoolServiceImpl. + * + * @param transactionPool the transaction pool to control + */ + public TransactionPoolServiceImpl(final TransactionPool transactionPool) { + this.transactionPool = transactionPool; + } + + @Override + public void disableTransactionPool() { + transactionPool.setDisabled(); + } + + @Override + public void enableTransactionPool() { + transactionPool.setEnabled(); + } +} diff --git a/besu/src/test/java/org/hyperledger/besu/PrivacyTest.java b/besu/src/test/java/org/hyperledger/besu/PrivacyTest.java index 7a4f05ad7..dc5b7003c 100644 --- a/besu/src/test/java/org/hyperledger/besu/PrivacyTest.java +++ b/besu/src/test/java/org/hyperledger/besu/PrivacyTest.java @@ -137,7 +137,9 @@ public class PrivacyTest { final DataStorageConfiguration dataStorageConfiguration, final MiningParameters miningParameters) { final var besuConfiguration = new BesuConfigurationImpl(); - besuConfiguration.init(dataDir, dbDir, dataStorageConfiguration, miningParameters); + besuConfiguration + .init(dataDir, dbDir, dataStorageConfiguration) + .withMiningParameters(miningParameters); return new PrivacyKeyValueStorageProviderBuilder() .withStorageFactory( new RocksDBKeyValuePrivacyStorageFactory( diff --git a/besu/src/test/java/org/hyperledger/besu/RunnerTest.java b/besu/src/test/java/org/hyperledger/besu/RunnerTest.java index f0125174d..f6c6aac5f 100644 --- a/besu/src/test/java/org/hyperledger/besu/RunnerTest.java +++ b/besu/src/test/java/org/hyperledger/besu/RunnerTest.java @@ -391,7 +391,9 @@ public final class RunnerTest { final DataStorageConfiguration dataStorageConfiguration, final MiningParameters miningParameters) { final var besuConfiguration = new BesuConfigurationImpl(); - besuConfiguration.init(dataDir, dbDir, dataStorageConfiguration, miningParameters); + besuConfiguration + .init(dataDir, dbDir, dataStorageConfiguration) + .withMiningParameters(miningParameters); return new KeyValueStorageProviderBuilder() .withStorageFactory( new RocksDBKeyValueStorageFactory( 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 5216db703..1dfb5f449 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java @@ -127,6 +127,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -214,7 +215,7 @@ public abstract class CommandTestAbstract { @Mock protected TransactionSelectionServiceImpl txSelectionService; @Mock protected SecurityModuleServiceImpl securityModuleService; @Mock protected SecurityModule securityModule; - @Mock protected BesuConfigurationImpl commonPluginConfiguration; + @Spy protected BesuConfigurationImpl commonPluginConfiguration = new BesuConfigurationImpl(); @Mock protected KeyValueStorageFactory rocksDBStorageFactory; @Mock protected PrivacyKeyValueStorageFactory rocksDBSPrivacyStorageFactory; @Mock protected PicoCLIOptions cliOptions; diff --git a/besu/src/test/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilderTest.java b/besu/src/test/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilderTest.java index 12f36c9f6..5efeed50b 100644 --- a/besu/src/test/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilderTest.java +++ b/besu/src/test/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilderTest.java @@ -30,7 +30,6 @@ import org.hyperledger.besu.consensus.common.bft.blockcreation.BftMiningCoordina import org.hyperledger.besu.ethereum.ConsensusContext; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator; -import org.hyperledger.besu.ethereum.blockcreation.NoopMiningCoordinator; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; import org.hyperledger.besu.ethereum.core.MiningParameters; @@ -68,7 +67,7 @@ public class ConsensusScheduleBesuControllerBuilderTest { private @Mock ProtocolSchedule protocolSchedule1; private @Mock ProtocolSchedule protocolSchedule2; private @Mock ProtocolSchedule protocolSchedule3; - private @Mock NoopMiningCoordinator miningCoordinator1; + private @Mock MiningCoordinator miningCoordinator1; private @Mock BftMiningCoordinator miningCoordinator2; @Test diff --git a/besu/src/test/java/org/hyperledger/besu/services/RlpConverterServiceImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/RlpConverterServiceImplTest.java new file mode 100644 index 000000000..7a3bdbbfe --- /dev/null +++ b/besu/src/test/java/org/hyperledger/besu/services/RlpConverterServiceImplTest.java @@ -0,0 +1,54 @@ +/* + * 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.services; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.hyperledger.besu.datatypes.BlobGas; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; +import org.hyperledger.besu.ethereum.core.ProtocolScheduleFixture; +import org.hyperledger.besu.plugin.data.BlockHeader; + +import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; + +public class RlpConverterServiceImplTest { + + @Test + public void testBuildRlpFromHeader() { + // Arrange + RlpConverterServiceImpl rlpConverterServiceImpl = + new RlpConverterServiceImpl(ProtocolScheduleFixture.MAINNET); + // header with cancun fields + BlockHeader header = + new BlockHeaderTestFixture() + .timestamp(1710338135 + 1) + .baseFeePerGas(Wei.of(1000)) + .requestsRoot(Hash.ZERO) + .withdrawalsRoot(Hash.ZERO) + .blobGasUsed(500L) + .excessBlobGas(BlobGas.of(500L)) + .buildHeader(); + + Bytes rlpBytes = rlpConverterServiceImpl.buildRlpFromHeader(header); + BlockHeader deserialized = rlpConverterServiceImpl.buildHeaderFromRlp(rlpBytes); + // Assert + assertThat(header).isEqualTo(deserialized); + assertThat(header.getBlobGasUsed()).isEqualTo(deserialized.getBlobGasUsed()); + assertThat(header.getExcessBlobGas()).isEqualTo(deserialized.getExcessBlobGas()); + } +} diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/MigratingMiningCoordinatorTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/MigratingMiningCoordinatorTest.java index 640691f0d..f3edea81e 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/MigratingMiningCoordinatorTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/MigratingMiningCoordinatorTest.java @@ -30,7 +30,6 @@ import org.hyperledger.besu.consensus.common.bft.blockcreation.BftBlockCreatorFa import org.hyperledger.besu.consensus.common.bft.blockcreation.BftMiningCoordinator; import org.hyperledger.besu.consensus.common.bft.statemachine.BftEventHandler; import org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator; -import org.hyperledger.besu.ethereum.blockcreation.NoopMiningCoordinator; import org.hyperledger.besu.ethereum.chain.BlockAddedEvent; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.Block; @@ -122,7 +121,7 @@ public class MigratingMiningCoordinatorTest { @Test public void onBlockAddedShouldNotDelegateWhenDelegateIsNoop() { - NoopMiningCoordinator mockNoopCoordinator = mock(NoopMiningCoordinator.class); + MiningCoordinator mockNoopCoordinator = mock(MiningCoordinator.class); coordinatorSchedule = createCoordinatorSchedule(mockNoopCoordinator, coordinator2); when(blockHeader.getNumber()).thenReturn(GENESIS_BLOCK_NUMBER); diff --git a/datatypes/src/main/java/org/hyperledger/besu/datatypes/BlobGas.java b/datatypes/src/main/java/org/hyperledger/besu/datatypes/BlobGas.java index a64e79b19..9ac72b6d8 100644 --- a/datatypes/src/main/java/org/hyperledger/besu/datatypes/BlobGas.java +++ b/datatypes/src/main/java/org/hyperledger/besu/datatypes/BlobGas.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.datatypes; import java.math.BigInteger; +import com.fasterxml.jackson.annotation.JsonValue; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.units.bigints.BaseUInt64Value; import org.apache.tuweni.units.bigints.UInt64; @@ -123,6 +124,7 @@ public final class BlobGas extends BaseUInt64Value implements Quantity return toBigInteger(); } + @JsonValue @Override public String toHexString() { return super.toHexString(); @@ -140,6 +142,6 @@ public final class BlobGas extends BaseUInt64Value implements Quantity * @return the blob gas */ public static BlobGas fromQuantity(final Quantity quantity) { - return BlobGas.wrap((Bytes) quantity); + return BlobGas.of(quantity.getAsBigInteger()); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/ChainPrunerConfiguration.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/ChainPrunerConfiguration.java index 19e2e37b3..67ad7f0a2 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/ChainPrunerConfiguration.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/ChainPrunerConfiguration.java @@ -16,15 +16,20 @@ package org.hyperledger.besu.ethereum.chain; public class ChainPrunerConfiguration { public static final ChainPrunerConfiguration DEFAULT = - new ChainPrunerConfiguration(false, 7200, 256); + new ChainPrunerConfiguration(false, 7200, 7200, 256); private final boolean enabled; private final long blocksRetained; private final long blocksFrequency; + private final long blocksRetainedLimit; public ChainPrunerConfiguration( - final boolean enabled, final long blocksRetained, final long blocksFrequency) { + final boolean enabled, + final long blocksRetained, + final long blocksRetainedLimit, + final long blocksFrequency) { this.enabled = enabled; this.blocksRetained = blocksRetained; + this.blocksRetainedLimit = blocksRetainedLimit; this.blocksFrequency = blocksFrequency; } @@ -32,6 +37,10 @@ public class ChainPrunerConfiguration { return blocksRetained; } + public long getBlocksRetainedLimit() { + return blocksRetainedLimit; + } + public boolean getChainPruningEnabled() { return enabled; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java index 0515deeb0..032ccb9f2 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java @@ -469,7 +469,8 @@ public class DefaultBlockchain implements MutableBlockchain { updater.commit(); } - private Difficulty calculateTotalDifficulty(final BlockHeader blockHeader) { + @Override + public Difficulty calculateTotalDifficulty(final BlockHeader blockHeader) { if (blockHeader.getNumber() == BlockHeader.GENESIS_BLOCK_NUMBER) { return blockHeader.getDifficulty(); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/MutableBlockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/MutableBlockchain.java index da42e25af..5213974be 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/MutableBlockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/MutableBlockchain.java @@ -56,6 +56,8 @@ public interface MutableBlockchain extends Blockchain { void unsafeSetChainHead(final BlockHeader blockHeader, final Difficulty totalDifficulty); + Difficulty calculateTotalDifficulty(final BlockHeader blockHeader); + /** * Rolls back the canonical chainhead to the specified block number. * 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 f12024e11..46d2f0847 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 @@ -309,7 +309,7 @@ public class BlockHeader extends SealableBlockHeader .map(h -> Hash.fromHexString(h.toHexString())) .orElse(null), pluginBlockHeader.getBlobGasUsed().map(Long::longValue).orElse(null), - pluginBlockHeader.getExcessBlobGas().map(BlobGas::fromQuantity).orElse(null), + pluginBlockHeader.getExcessBlobGas().map(BlobGas.class::cast).orElse(null), pluginBlockHeader.getParentBeaconBlockRoot().orElse(null), pluginBlockHeader .getRequestsRoot() diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/common/GenesisWorldStateProvider.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/common/GenesisWorldStateProvider.java index 79855c1e5..78bcb417e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/common/GenesisWorldStateProvider.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/common/GenesisWorldStateProvider.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.cache.NoOpBonsaiCache 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.forest.storage.ForestWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.trie.forest.worldview.ForestMutableWorldState; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; @@ -72,7 +73,8 @@ public class GenesisWorldStateProvider { bonsaiCachedMerkleTrieLoader, new NoOpBonsaiCachedWorldStorageManager(bonsaiWorldStateKeyValueStorage), new NoOpTrieLogManager(), - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); } /** diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/BonsaiWorldStateProvider.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/BonsaiWorldStateProvider.java index d08821ca2..e4b7ea991 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/BonsaiWorldStateProvider.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/BonsaiWorldStateProvider.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldSt import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.worldview.BonsaiWorldState; import org.hyperledger.besu.ethereum.trie.diffbased.common.DiffBasedWorldStateProvider; import org.hyperledger.besu.ethereum.trie.diffbased.common.trielog.TrieLogManager; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.ethereum.trie.patricia.StoredMerklePatriciaTrie; import org.hyperledger.besu.ethereum.worldstate.StateTrieAccountValue; import org.hyperledger.besu.evm.internal.EvmConfiguration; @@ -54,8 +55,11 @@ public class BonsaiWorldStateProvider extends DiffBasedWorldStateProvider { super(worldStateKeyValueStorage, blockchain, maxLayersToLoad, pluginContext); this.bonsaiCachedMerkleTrieLoader = bonsaiCachedMerkleTrieLoader; provideCachedWorldStorageManager( - new BonsaiCachedWorldStorageManager(this, worldStateKeyValueStorage)); - loadPersistedState(new BonsaiWorldState(this, worldStateKeyValueStorage, evmConfiguration)); + new BonsaiCachedWorldStorageManager( + this, worldStateKeyValueStorage, this::cloneBonsaiWorldStateConfig)); + loadPersistedState( + new BonsaiWorldState( + this, worldStateKeyValueStorage, evmConfiguration, defaultWorldStateConfig)); } @VisibleForTesting @@ -69,14 +73,16 @@ public class BonsaiWorldStateProvider extends DiffBasedWorldStateProvider { super(worldStateKeyValueStorage, blockchain, trieLogManager); this.bonsaiCachedMerkleTrieLoader = bonsaiCachedMerkleTrieLoader; provideCachedWorldStorageManager(bonsaiCachedWorldStorageManager); - loadPersistedState(new BonsaiWorldState(this, worldStateKeyValueStorage, evmConfiguration)); + loadPersistedState( + new BonsaiWorldState( + this, worldStateKeyValueStorage, evmConfiguration, defaultWorldStateConfig)); } public BonsaiCachedMerkleTrieLoader getCachedMerkleTrieLoader() { return bonsaiCachedMerkleTrieLoader; } - private BonsaiWorldStateKeyValueStorage getWorldStateKeyValueStorage() { + private BonsaiWorldStateKeyValueStorage getBonsaiWorldStateKeyValueStorage() { return (BonsaiWorldStateKeyValueStorage) worldStateKeyValueStorage; } @@ -89,13 +95,13 @@ public class BonsaiWorldStateProvider extends DiffBasedWorldStateProvider { public void prepareStateHealing(final Address address, final Bytes location) { final Set keysToDelete = new HashSet<>(); final BonsaiWorldStateKeyValueStorage.Updater updater = - getWorldStateKeyValueStorage().updater(); + getBonsaiWorldStateKeyValueStorage().updater(); final Hash accountHash = address.addressHash(); final StoredMerklePatriciaTrie accountTrie = new StoredMerklePatriciaTrie<>( (l, h) -> { final Optional node = - getWorldStateKeyValueStorage().getAccountStateTrieNode(l, h); + getBonsaiWorldStateKeyValueStorage().getAccountStateTrieNode(l, h); if (node.isPresent()) { keysToDelete.add(l); } @@ -115,7 +121,7 @@ public class BonsaiWorldStateProvider extends DiffBasedWorldStateProvider { new StoredMerklePatriciaTrie<>( (l, h) -> { Optional node = - getWorldStateKeyValueStorage() + getBonsaiWorldStateKeyValueStorage() .getAccountStorageTrieNode(accountHash, l, h); if (node.isPresent()) { keysToDelete.add(Bytes.concatenate(accountHash, l)); @@ -139,6 +145,10 @@ public class BonsaiWorldStateProvider extends DiffBasedWorldStateProvider { keysToDelete.forEach(updater::removeAccountStateTrieNode); updater.commit(); - getWorldStateKeyValueStorage().downgradeToPartialFlatDbMode(); + getBonsaiWorldStateKeyValueStorage().downgradeToPartialFlatDbMode(); + } + + private DiffBasedWorldStateConfig cloneBonsaiWorldStateConfig() { + return new DiffBasedWorldStateConfig(defaultWorldStateConfig); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/BonsaiCachedWorldStorageManager.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/BonsaiCachedWorldStorageManager.java index cb081ea87..60cf25e88 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/BonsaiCachedWorldStorageManager.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/BonsaiCachedWorldStorageManager.java @@ -23,14 +23,18 @@ import org.hyperledger.besu.ethereum.trie.diffbased.common.DiffBasedWorldStatePr import org.hyperledger.besu.ethereum.trie.diffbased.common.cache.DiffBasedCachedWorldStorageManager; import org.hyperledger.besu.ethereum.trie.diffbased.common.storage.DiffBasedWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.evm.internal.EvmConfiguration; +import java.util.function.Supplier; + public class BonsaiCachedWorldStorageManager extends DiffBasedCachedWorldStorageManager { public BonsaiCachedWorldStorageManager( final BonsaiWorldStateProvider archive, - final DiffBasedWorldStateKeyValueStorage worldStateKeyValueStorage) { - super(archive, worldStateKeyValueStorage); + final DiffBasedWorldStateKeyValueStorage worldStateKeyValueStorage, + final Supplier defaultBonsaiWorldStateConfigSupplier) { + super(archive, worldStateKeyValueStorage, defaultBonsaiWorldStateConfigSupplier); } @Override @@ -41,7 +45,8 @@ public class BonsaiCachedWorldStorageManager extends DiffBasedCachedWorldStorage return new BonsaiWorldState( (BonsaiWorldStateProvider) archive, (BonsaiWorldStateKeyValueStorage) worldStateKeyValueStorage, - evmConfiguration); + evmConfiguration, + defaultBonsaiWorldStateConfigSupplier.get()); } @Override diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/NoOpBonsaiCachedWorldStorageManager.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/NoOpBonsaiCachedWorldStorageManager.java index daecab0e4..a054b4370 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/NoOpBonsaiCachedWorldStorageManager.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/cache/NoOpBonsaiCachedWorldStorageManager.java @@ -18,6 +18,7 @@ import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import java.util.Optional; import java.util.function.Function; @@ -26,7 +27,7 @@ public class NoOpBonsaiCachedWorldStorageManager extends BonsaiCachedWorldStorag public NoOpBonsaiCachedWorldStorageManager( final BonsaiWorldStateKeyValueStorage bonsaiWorldStateKeyValueStorage) { - super(null, bonsaiWorldStateKeyValueStorage); + super(null, bonsaiWorldStateKeyValueStorage, DiffBasedWorldStateConfig::new); } @Override diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/storage/BonsaiSnapshotWorldStateKeyValueStorage.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/storage/BonsaiSnapshotWorldStateKeyValueStorage.java index 5934f88f2..2437118d6 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/storage/BonsaiSnapshotWorldStateKeyValueStorage.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/storage/BonsaiSnapshotWorldStateKeyValueStorage.java @@ -203,6 +203,15 @@ public class BonsaiSnapshotWorldStateKeyValueStorage extends BonsaiWorldStateKey } } + @Override + public void onClearTrie() { + try { + doClose(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + @Override protected synchronized void doClose() throws Exception { if (!isClosedGet()) { 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 30b3d8440..ad838aa52 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 @@ -23,6 +23,7 @@ import org.hyperledger.besu.datatypes.StorageSlotKey; import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.trie.MerkleTrie; import org.hyperledger.besu.ethereum.trie.MerkleTrieException; +import org.hyperledger.besu.ethereum.trie.NoOpMerkleTrie; import org.hyperledger.besu.ethereum.trie.NodeLoader; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.BonsaiAccount; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.BonsaiWorldStateProvider; @@ -34,6 +35,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.common.cache.DiffBasedCached import org.hyperledger.besu.ethereum.trie.diffbased.common.storage.DiffBasedWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.trie.diffbased.common.trielog.TrieLogManager; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; +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.trie.diffbased.common.worldview.accumulator.preload.StorageConsumingMap; import org.hyperledger.besu.ethereum.trie.patricia.StoredMerklePatriciaTrie; @@ -63,13 +65,15 @@ public class BonsaiWorldState extends DiffBasedWorldState { public BonsaiWorldState( final BonsaiWorldStateProvider archive, final BonsaiWorldStateKeyValueStorage worldStateKeyValueStorage, - final EvmConfiguration evmConfiguration) { + final EvmConfiguration evmConfiguration, + final DiffBasedWorldStateConfig diffBasedWorldStateConfig) { this( worldStateKeyValueStorage, archive.getCachedMerkleTrieLoader(), archive.getCachedWorldStorageManager(), archive.getTrieLogManager(), - evmConfiguration); + evmConfiguration, + diffBasedWorldStateConfig); } public BonsaiWorldState( @@ -77,21 +81,32 @@ public class BonsaiWorldState extends DiffBasedWorldState { final BonsaiCachedMerkleTrieLoader bonsaiCachedMerkleTrieLoader, final DiffBasedCachedWorldStorageManager cachedWorldStorageManager, final TrieLogManager trieLogManager, - final EvmConfiguration evmConfiguration) { - super(worldStateKeyValueStorage, cachedWorldStorageManager, trieLogManager); + final EvmConfiguration evmConfiguration, + final DiffBasedWorldStateConfig diffBasedWorldStateConfig) { + super( + worldStateKeyValueStorage, + cachedWorldStorageManager, + trieLogManager, + diffBasedWorldStateConfig); this.bonsaiCachedMerkleTrieLoader = bonsaiCachedMerkleTrieLoader; + this.worldStateKeyValueStorage = worldStateKeyValueStorage; this.setAccumulator( new BonsaiWorldStateUpdateAccumulator( this, (addr, value) -> bonsaiCachedMerkleTrieLoader.preLoadAccount( - worldStateKeyValueStorage, worldStateRootHash, addr), + getWorldStateStorage(), worldStateRootHash, addr), (addr, value) -> - bonsaiCachedMerkleTrieLoader.preLoadStorageSlot( + this.bonsaiCachedMerkleTrieLoader.preLoadStorageSlot( getWorldStateStorage(), addr, value), evmConfiguration)); } + @Override + public Optional getCode(@Nonnull final Address address, final Hash codeHash) { + return getWorldStateStorage().getCode(codeHash, address.addressHash()); + } + @Override public BonsaiWorldStateKeyValueStorage getWorldStateStorage() { return (BonsaiWorldStateKeyValueStorage) worldStateKeyValueStorage; @@ -129,7 +144,7 @@ public class BonsaiWorldState extends DiffBasedWorldState { updateCode(maybeStateUpdater, worldStateUpdater); // next walk the account trie - final StoredMerklePatriciaTrie accountTrie = + final MerkleTrie accountTrie = createTrie( (location, hash) -> bonsaiCachedMerkleTrieLoader.getAccountStateTrieNode( @@ -157,7 +172,7 @@ public class BonsaiWorldState extends DiffBasedWorldState { private void updateTheAccounts( final Optional maybeStateUpdater, final BonsaiWorldStateUpdateAccumulator worldStateUpdater, - final StoredMerklePatriciaTrie accountTrie) { + final MerkleTrie accountTrie) { for (final Map.Entry> accountUpdate : worldStateUpdater.getAccountsToUpdate().entrySet()) { final Bytes accountKey = accountUpdate.getKey(); @@ -234,7 +249,7 @@ public class BonsaiWorldState extends DiffBasedWorldState { || worldStateUpdater.getStorageToClear().contains(updatedAddress)) ? Hash.EMPTY_TRIE_HASH : accountOriginal.getStorageRoot(); - final StoredMerklePatriciaTrie storageTrie = + final MerkleTrie storageTrie = createTrie( (location, key) -> bonsaiCachedMerkleTrieLoader.getAccountStorageTrieNode( @@ -277,8 +292,11 @@ public class BonsaiWorldState extends DiffBasedWorldState { (location, key, value) -> writeStorageTrieNode( bonsaiUpdater, updatedAddressHash, location, key, value))); - final Hash newStorageRoot = Hash.wrap(storageTrie.getRootHash()); - accountUpdated.setStorageRoot(newStorageRoot); + // only use storage root of the trie when trie is enabled + if (!worldStateConfig.isTrieDisabled()) { + final Hash newStorageRoot = Hash.wrap(storageTrie.getRootHash()); + accountUpdated.setStorageRoot(newStorageRoot); + } } } // for manicured tries and composting, trim and compost here @@ -347,13 +365,6 @@ public class BonsaiWorldState extends DiffBasedWorldState { accumulator.copy()); } - @Override - public MutableWorldState freeze() { - this.isFrozen = true; - this.worldStateKeyValueStorage = new BonsaiWorldStateLayerStorage(getWorldStateStorage()); - return this; - } - @Override public Account get(final Address address) { return getWorldStateStorage() @@ -362,11 +373,6 @@ public class BonsaiWorldState extends DiffBasedWorldState { .orElse(null); } - @Override - public Optional getCode(@Nonnull final Address address, final Hash codeHash) { - return getWorldStateStorage().getCode(codeHash, address.addressHash()); - } - protected Optional getAccountStateTrieNode(final Bytes location, final Bytes32 nodeHash) { return getWorldStateStorage().getAccountStateTrieNode(location, nodeHash); } @@ -423,16 +429,26 @@ public class BonsaiWorldState extends DiffBasedWorldState { @Override public Map getAllAccountStorage(final Address address, final Hash rootHash) { - final StoredMerklePatriciaTrie storageTrie = + final MerkleTrie storageTrie = createTrie( (location, key) -> getStorageTrieNode(address.addressHash(), location, key), rootHash); return storageTrie.entriesFrom(Bytes32.ZERO, Integer.MAX_VALUE); } - private StoredMerklePatriciaTrie createTrie( - final NodeLoader nodeLoader, final Bytes32 rootHash) { - return new StoredMerklePatriciaTrie<>( - nodeLoader, rootHash, Function.identity(), Function.identity()); + @Override + public MutableWorldState freeze() { + this.worldStateConfig.setFrozen(true); + this.worldStateKeyValueStorage = new BonsaiWorldStateLayerStorage(getWorldStateStorage()); + return this; + } + + private MerkleTrie createTrie(final NodeLoader nodeLoader, final Bytes32 rootHash) { + if (worldStateConfig.isTrieDisabled()) { + return new NoOpMerkleTrie<>(); + } else { + return new StoredMerklePatriciaTrie<>( + nodeLoader, rootHash, Function.identity(), Function.identity()); + } } protected Hash hashAndSavePreImage(final Bytes value) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/DiffBasedWorldStateProvider.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/DiffBasedWorldStateProvider.java index ad7b06b14..857ec0b07 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/DiffBasedWorldStateProvider.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/DiffBasedWorldStateProvider.java @@ -26,6 +26,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.common.cache.DiffBasedCached import org.hyperledger.besu.ethereum.trie.diffbased.common.storage.DiffBasedWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.trie.diffbased.common.trielog.TrieLogManager; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; +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.WorldStateArchive; import org.hyperledger.besu.ethereum.worldstate.WorldStateStorageCoordinator; @@ -54,6 +55,7 @@ public abstract class DiffBasedWorldStateProvider implements WorldStateArchive { protected DiffBasedWorldState persistedState; protected final DiffBasedWorldStateKeyValueStorage worldStateKeyValueStorage; + protected final DiffBasedWorldStateConfig defaultWorldStateConfig; public DiffBasedWorldStateProvider( final DiffBasedWorldStateKeyValueStorage worldStateKeyValueStorage, @@ -70,6 +72,7 @@ public abstract class DiffBasedWorldStateProvider implements WorldStateArchive { maxLayersToLoad.orElse(DiffBasedCachedWorldStorageManager.RETAINED_LAYERS), pluginContext); this.blockchain = blockchain; + this.defaultWorldStateConfig = new DiffBasedWorldStateConfig(); } public DiffBasedWorldStateProvider( @@ -81,6 +84,7 @@ public abstract class DiffBasedWorldStateProvider implements WorldStateArchive { // TODO: de-dup constructors this.trieLogManager = trieLogManager; this.blockchain = blockchain; + this.defaultWorldStateConfig = new DiffBasedWorldStateConfig(); } protected void provideCachedWorldStorageManager( @@ -252,6 +256,19 @@ public abstract class DiffBasedWorldStateProvider implements WorldStateArchive { return persistedState; } + public DiffBasedWorldStateConfig getDefaultWorldStateConfig() { + return defaultWorldStateConfig; + } + + public void disableTrie() { + defaultWorldStateConfig.setTrieDisabled(true); + worldStateKeyValueStorage.clearTrie(); + } + + public DiffBasedWorldStateKeyValueStorage getWorldStateKeyValueStorage() { + return worldStateKeyValueStorage; + } + public TrieLogManager getTrieLogManager() { return trieLogManager; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/StorageSubscriber.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/StorageSubscriber.java index 51ab65bd1..258df5c5b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/StorageSubscriber.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/StorageSubscriber.java @@ -21,5 +21,7 @@ public interface StorageSubscriber { default void onClearTrieLog() {} + default void onClearTrie() {} + default void onCloseStorage() {} } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/cache/DiffBasedCachedWorldStorageManager.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/cache/DiffBasedCachedWorldStorageManager.java index 8ead22bf5..160c7ac1e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/cache/DiffBasedCachedWorldStorageManager.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/cache/DiffBasedCachedWorldStorageManager.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.common.StorageSubscriber; import org.hyperledger.besu.ethereum.trie.diffbased.common.storage.DiffBasedLayeredWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.trie.diffbased.common.storage.DiffBasedWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.evm.internal.EvmConfiguration; import java.util.ArrayList; @@ -33,6 +34,7 @@ import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.function.Function; +import java.util.function.Supplier; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; @@ -46,6 +48,7 @@ public abstract class DiffBasedCachedWorldStorageManager implements StorageSubsc LoggerFactory.getLogger(DiffBasedCachedWorldStorageManager.class); private final DiffBasedWorldStateProvider archive; private final EvmConfiguration evmConfiguration; + protected final Supplier defaultBonsaiWorldStateConfigSupplier; private final Cache stateRootToBlockHeaderCache = Caffeine.newBuilder() .maximumSize(RETAINED_LAYERS) @@ -59,18 +62,26 @@ public abstract class DiffBasedCachedWorldStorageManager implements StorageSubsc final DiffBasedWorldStateProvider archive, final DiffBasedWorldStateKeyValueStorage worldStateKeyValueStorage, final Map cachedWorldStatesByHash, - final EvmConfiguration evmConfiguration) { + final EvmConfiguration evmConfiguration, + final Supplier defaultBonsaiWorldStateConfigSupplier) { worldStateKeyValueStorage.subscribe(this); this.rootWorldStateStorage = worldStateKeyValueStorage; this.cachedWorldStatesByHash = cachedWorldStatesByHash; this.archive = archive; this.evmConfiguration = evmConfiguration; + this.defaultBonsaiWorldStateConfigSupplier = defaultBonsaiWorldStateConfigSupplier; } public DiffBasedCachedWorldStorageManager( final DiffBasedWorldStateProvider archive, - final DiffBasedWorldStateKeyValueStorage worldStateKeyValueStorage) { - this(archive, worldStateKeyValueStorage, new ConcurrentHashMap<>(), EvmConfiguration.DEFAULT); + final DiffBasedWorldStateKeyValueStorage worldStateKeyValueStorage, + final Supplier defaultBonsaiWorldStateConfigSupplier) { + this( + archive, + worldStateKeyValueStorage, + new ConcurrentHashMap<>(), + EvmConfiguration.DEFAULT, + defaultBonsaiWorldStateConfigSupplier); } public synchronized void addCachedLayer( @@ -263,6 +274,11 @@ public abstract class DiffBasedCachedWorldStorageManager implements StorageSubsc this.cachedWorldStatesByHash.clear(); } + @Override + public void onClearTrie() { + this.cachedWorldStatesByHash.clear(); + } + @Override public void onCloseStorage() { this.cachedWorldStatesByHash.clear(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/storage/DiffBasedWorldStateKeyValueStorage.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/storage/DiffBasedWorldStateKeyValueStorage.java index af5680354..84441ca05 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/storage/DiffBasedWorldStateKeyValueStorage.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/storage/DiffBasedWorldStateKeyValueStorage.java @@ -174,6 +174,11 @@ public abstract class DiffBasedWorldStateKeyValueStorage trieLogStorage.clear(); } + public void clearTrie() { + subscribers.forEach(StorageSubscriber::onClearTrie); + composedWorldStateStorage.clear(TRIE_BRANCH_STORAGE); + } + public void clearFlatDatabase() { subscribers.forEach(StorageSubscriber::onClearFlatDatabaseStorage); getFlatDbStrategy().resetOnResync(composedWorldStateStorage); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogManager.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogManager.java index 9ae6cb38f..70d45f546 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogManager.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogManager.java @@ -34,6 +34,7 @@ import java.util.Optional; import java.util.stream.LongStream; import java.util.stream.Stream; +import org.apache.tuweni.bytes.Bytes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -147,15 +148,46 @@ public class TrieLogManager { trieLogService.getObservers().forEach(trieLogObservers::subscribe); // return the TrieLogFactory implementation from the TrieLogService - return trieLogService.getTrieLogFactory(); - } else { - // Otherwise default to TrieLogFactoryImpl - return new TrieLogFactoryImpl(); + if (trieLogService.getTrieLogFactory().isPresent()) { + return trieLogService.getTrieLogFactory().get(); + } } + // Otherwise default to TrieLogFactoryImpl + return new TrieLogFactoryImpl(); } private TrieLogProvider getTrieLogProvider() { return new TrieLogProvider() { + @Override + public Optional getRawTrieLogLayer(final Hash blockHash) { + return rootWorldStateStorage.getTrieLog(blockHash).map(Bytes::wrap); + } + + @Override + public Optional getRawTrieLogLayer(final long blockNumber) { + return TrieLogManager.this + .blockchain + .getBlockHeader(blockNumber) + .map(BlockHeader::getHash) + .flatMap(this::getRawTrieLogLayer); + } + + @Override + public void saveRawTrieLogLayer( + final Hash blockHash, final long blockNumber, final Bytes trieLog) { + final DiffBasedWorldStateKeyValueStorage.Updater updater = rootWorldStateStorage.updater(); + updater + .getTrieLogStorageTransaction() + .put(blockHash.toArrayUnsafe(), trieLog.toArrayUnsafe()); + updater.commit(); + // TODO maybe find a way to have a clean and complete trielog for observers + trieLogObservers.forEach( + o -> + o.onTrieLogAdded( + new TrieLogAddedEvent( + new TrieLogLayer().setBlockHash(blockHash).setBlockNumber(blockNumber)))); + } + @Override public Optional getTrieLogLayer(final Hash blockHash) { return TrieLogManager.this.getTrieLogLayer(blockHash); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/DiffBasedWorldState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/DiffBasedWorldState.java index db536cbc7..76a8fbd63 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/DiffBasedWorldState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/DiffBasedWorldState.java @@ -60,12 +60,13 @@ public abstract class DiffBasedWorldState protected Hash worldStateRootHash; protected Hash worldStateBlockHash; - protected boolean isFrozen; + protected DiffBasedWorldStateConfig worldStateConfig; protected DiffBasedWorldState( final DiffBasedWorldStateKeyValueStorage worldStateKeyValueStorage, final DiffBasedCachedWorldStorageManager cachedWorldStorageManager, - final TrieLogManager trieLogManager) { + final TrieLogManager trieLogManager, + final DiffBasedWorldStateConfig diffBasedWorldStateConfig) { this.worldStateKeyValueStorage = worldStateKeyValueStorage; this.worldStateRootHash = Hash.wrap( @@ -76,11 +77,12 @@ public abstract class DiffBasedWorldState Bytes32.wrap(worldStateKeyValueStorage.getWorldStateBlockHash().orElse(Hash.ZERO))); this.cachedWorldStorageManager = cachedWorldStorageManager; this.trieLogManager = trieLogManager; + this.worldStateConfig = diffBasedWorldStateConfig; } /** * Having a protected method to override the accumulator solves the chicken-egg problem of needing - * a worldstate reference (this) when construction the Accumulator. + * a worldstate reference (this) when constructing the Accumulator. * * @param accumulator accumulator to use. */ @@ -134,6 +136,15 @@ public abstract class DiffBasedWorldState return accumulator; } + protected Hash unsafeRootHashUpdate( + final BlockHeader blockHeader, + final DiffBasedWorldStateKeyValueStorage.Updater stateUpdater) { + // calling calculateRootHash in order to update the state + calculateRootHash( + worldStateConfig.isFrozen() ? Optional.empty() : Optional.of(stateUpdater), accumulator); + return blockHeader.getStateRoot(); + } + @Override public void persist(final BlockHeader blockHeader) { final Optional maybeBlockHeader = Optional.ofNullable(blockHeader); @@ -151,19 +162,32 @@ public abstract class DiffBasedWorldState Runnable saveTrieLog = () -> {}; try { - final Hash newWorldStateRootHash = - calculateRootHash(isFrozen ? Optional.empty() : Optional.of(stateUpdater), accumulator); + final Hash calculatedRootHash; + + if (blockHeader == null || !worldStateConfig.isTrieDisabled()) { + calculatedRootHash = + calculateRootHash( + worldStateConfig.isFrozen() ? Optional.empty() : Optional.of(stateUpdater), + accumulator); + } else { + // if the trie is disabled, we cannot calculate the state root, so we directly use the root + // of the block. It's important to understand that in all networks, + // the state root must be validated independently and the block should not be trusted + // implicitly. This mode + // can be used in cases where Besu would just be a follower of another trusted client. + calculatedRootHash = unsafeRootHashUpdate(blockHeader, stateUpdater); + } // if we are persisted with a block header, and the prior state is the parent // then persist the TrieLog for that transition. // If specified but not a direct descendant simply store the new block hash. if (blockHeader != null) { - verifyWorldStateRoot(newWorldStateRootHash, blockHeader); + verifyWorldStateRoot(calculatedRootHash, blockHeader); saveTrieLog = () -> { - trieLogManager.saveTrieLog(localCopy, newWorldStateRootHash, blockHeader, this); + trieLogManager.saveTrieLog(localCopy, calculatedRootHash, blockHeader, this); // not save a frozen state in the cache - if (!isFrozen) { - cachedWorldStorageManager.addCachedLayer(blockHeader, newWorldStateRootHash, this); + if (!worldStateConfig.isFrozen()) { + cachedWorldStorageManager.addCachedLayer(blockHeader, calculatedRootHash, this); } }; @@ -178,8 +202,8 @@ public abstract class DiffBasedWorldState stateUpdater .getWorldStateTransaction() - .put(TRIE_BRANCH_STORAGE, WORLD_ROOT_HASH_KEY, newWorldStateRootHash.toArrayUnsafe()); - worldStateRootHash = newWorldStateRootHash; + .put(TRIE_BRANCH_STORAGE, WORLD_ROOT_HASH_KEY, calculatedRootHash.toArrayUnsafe()); + worldStateRootHash = calculatedRootHash; success = true; } finally { if (success) { @@ -194,7 +218,7 @@ public abstract class DiffBasedWorldState } protected void verifyWorldStateRoot(final Hash calculatedStateRoot, final BlockHeader header) { - if (!calculatedStateRoot.equals(header.getStateRoot())) { + if (!worldStateConfig.isTrieDisabled() && !calculatedStateRoot.equals(header.getStateRoot())) { throw new RuntimeException( "World State Root does not match expected value, header " + header.getStateRoot().toHexString() @@ -210,7 +234,7 @@ public abstract class DiffBasedWorldState @Override public Hash rootHash() { - if (isFrozen && accumulator.isAccumulatorStateChanged()) { + if (worldStateConfig.isFrozen() && accumulator.isAccumulatorStateChanged()) { worldStateRootHash = calculateRootHash(Optional.empty(), accumulator.copy()); accumulator.resetAccumulatorStateChanged(); } @@ -285,7 +309,7 @@ public abstract class DiffBasedWorldState try { if (!isPersisted()) { this.worldStateKeyValueStorage.close(); - if (isFrozen) { + if (worldStateConfig.isFrozen()) { closeFrozenStorage(); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/DiffBasedWorldStateConfig.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/DiffBasedWorldStateConfig.java new file mode 100644 index 000000000..cab7f3f87 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/worldview/DiffBasedWorldStateConfig.java @@ -0,0 +1,79 @@ +/* + * 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.common.worldview; + +public class DiffBasedWorldStateConfig { + + private boolean isFrozen; + + private boolean isTrieDisabled; + + public DiffBasedWorldStateConfig() { + this(false, false); + } + + public DiffBasedWorldStateConfig(final boolean isTrieDisabled) { + this(false, isTrieDisabled); + } + + public DiffBasedWorldStateConfig(final DiffBasedWorldStateConfig config) { + this(config.isFrozen(), config.isTrieDisabled()); + } + + public DiffBasedWorldStateConfig(final boolean isFrozen, final boolean isTrieDisabled) { + this.isFrozen = isFrozen; + this.isTrieDisabled = isTrieDisabled; + } + + /** + * Checks if the world state is frozen. When the world state is frozen, it cannot mutate. + * + * @return true if the world state is frozen, false otherwise. + */ + public boolean isFrozen() { + return isFrozen; + } + + /** + * Sets the frozen status of the world state. When the world state is frozen, it cannot mutate. + * + * @param frozen the new frozen status to set. + */ + public void setFrozen(final boolean frozen) { + isFrozen = frozen; + } + + /** + * Checks if the trie is disabled for the world state. When the trie is disabled, the world state + * will only work with the flat database and not the trie. In this mode, it's impossible to verify + * the state root. + * + * @return true if the trie is disabled, false otherwise. + */ + public boolean isTrieDisabled() { + return isTrieDisabled; + } + + /** + * Sets the disabled status of the trie for the world state. When the trie is disabled, the world + * state will only work with the flat database and not the trie. In this mode, it's impossible to + * verify the state root. + * + * @param trieDisabled the new disabled status to set for the trie. + */ + public void setTrieDisabled(final boolean trieDisabled) { + isTrieDisabled = trieDisabled; + } +} 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 6af78e599..6c84b29b4 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 @@ -46,6 +46,7 @@ import org.hyperledger.besu.ethereum.storage.StorageProvider; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.BonsaiWorldStateProvider; 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.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; import org.hyperledger.besu.ethereum.worldstate.WorldStateStorageCoordinator; @@ -100,7 +101,8 @@ class BlockImportExceptionHandlingTest { (BonsaiWorldStateProvider) worldStateArchive, (BonsaiWorldStateKeyValueStorage) worldStateStorageCoordinator.worldStateKeyValueStorage(), - EvmConfiguration.DEFAULT)); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig())); private final BadBlockManager badBlockManager = new BadBlockManager(); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/ChainDataPrunerTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/ChainDataPrunerTest.java index 78ab15eb6..556e4edef 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/ChainDataPrunerTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/ChainDataPrunerTest.java @@ -48,6 +48,7 @@ public class ChainDataPrunerTest { new ChainDataPrunerStorage(new InMemoryKeyValueStorage()), 512, 0, + // completed new BlockingExecutor()); Block genesisBlock = gen.genesisBlock(); final MutableBlockchain blockchain = @@ -87,6 +88,7 @@ public class ChainDataPrunerTest { new ChainDataPrunerStorage(new InMemoryKeyValueStorage()), 512, 0, + // completed new BlockingExecutor()); Block genesisBlock = gen.genesisBlock(); final MutableBlockchain blockchain = 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 0dee834f1..d9b9d5d19 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 @@ -199,6 +199,16 @@ public abstract class AbstractIsolationTests { .withCommonConfiguration( new BesuConfiguration() { + @Override + public Optional getRpcHttpHost() { + return Optional.empty(); + } + + @Override + public Optional getRpcHttpPort() { + return Optional.empty(); + } + @Override public Path getStoragePath() { return tempData.resolve("database"); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/LogRollingTests.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/LogRollingTests.java index 5c0dbbf72..e43d46447 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/LogRollingTests.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/LogRollingTests.java @@ -32,6 +32,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.trielog.TrieLogFactor 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.trielog.TrieLogLayer; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.internal.EvmConfiguration; @@ -162,7 +163,8 @@ class LogRollingTests { archive, new BonsaiWorldStateKeyValueStorage( provider, new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_BONSAI_CONFIG), - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); final WorldUpdater updater = worldState.updater(); final MutableAccount mutableAccount = updater.createAccount(addressOne, 1, Wei.of(1L)); @@ -178,7 +180,8 @@ class LogRollingTests { secondProvider, new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_BONSAI_CONFIG), - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); final BonsaiWorldStateUpdateAccumulator secondUpdater = (BonsaiWorldStateUpdateAccumulator) secondWorldState.updater(); @@ -210,7 +213,8 @@ class LogRollingTests { archive, new BonsaiWorldStateKeyValueStorage( provider, new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_BONSAI_CONFIG), - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); final WorldUpdater updater = worldState.updater(); final MutableAccount mutableAccount = updater.createAccount(addressOne, 1, Wei.of(1L)); @@ -234,7 +238,8 @@ class LogRollingTests { secondProvider, new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_BONSAI_CONFIG), - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); final BonsaiWorldStateUpdateAccumulator secondUpdater = (BonsaiWorldStateUpdateAccumulator) secondWorldState.updater(); @@ -267,7 +272,8 @@ class LogRollingTests { archive, new BonsaiWorldStateKeyValueStorage( provider, new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_BONSAI_CONFIG), - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); final WorldUpdater updater = worldState.updater(); final MutableAccount mutableAccount = updater.createAccount(addressOne, 1, Wei.of(1L)); @@ -298,7 +304,8 @@ class LogRollingTests { secondProvider, new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_BONSAI_CONFIG), - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); final WorldUpdater secondUpdater = secondWorldState.updater(); final MutableAccount secondMutableAccount = diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/RollingImport.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/RollingImport.java index 0c2c18989..09e21138f 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/RollingImport.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/RollingImport.java @@ -28,6 +28,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.trielog.TrieLogFactor 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.trielog.TrieLogLayer; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; @@ -57,7 +58,8 @@ public class RollingImport { archive, new BonsaiWorldStateKeyValueStorage( provider, new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_BONSAI_CONFIG), - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); final SegmentedInMemoryKeyValueStorage worldStateKeyValueStorage = (SegmentedInMemoryKeyValueStorage) provider.getStorageBySegmentIdentifiers( diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldStateTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldStateTest.java index 0757b40db..b342172b1 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldStateTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/trie/diffbased/bonsai/worldview/BonsaiWorldStateTest.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.trie.diffbased.common.DiffBasedValue; +import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldStateConfig; import org.hyperledger.besu.evm.internal.EvmConfiguration; import java.util.HashMap; @@ -61,7 +62,8 @@ class BonsaiWorldStateTest { new BonsaiWorldState( InMemoryKeyValueStorageProvider.createBonsaiInMemoryWorldStateArchive(blockchain), bonsaiWorldStateKeyValueStorage, - EvmConfiguration.DEFAULT); + EvmConfiguration.DEFAULT, + new DiffBasedWorldStateConfig()); } @ParameterizedTest diff --git a/ethereum/eth/src/jmh/java/org/hyperledger/besu/ethereum/eth/sync/worldstate/WorldStateDownloaderBenchmark.java b/ethereum/eth/src/jmh/java/org/hyperledger/besu/ethereum/eth/sync/worldstate/WorldStateDownloaderBenchmark.java index 1fc9046ec..04d4af81a 100644 --- a/ethereum/eth/src/jmh/java/org/hyperledger/besu/ethereum/eth/sync/worldstate/WorldStateDownloaderBenchmark.java +++ b/ethereum/eth/src/jmh/java/org/hyperledger/besu/ethereum/eth/sync/worldstate/WorldStateDownloaderBenchmark.java @@ -24,7 +24,6 @@ import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.core.BlockDataGenerator; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; -import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthProtocolManager; @@ -165,8 +164,7 @@ public class WorldStateDownloaderBenchmark { private StorageProvider createKeyValueStorageProvider(final Path dataDir, final Path dbDir) { final var besuConfiguration = new BesuConfigurationImpl(); - besuConfiguration.init( - dataDir, dbDir, DataStorageConfiguration.DEFAULT_CONFIG, MiningParameters.newDefault()); + besuConfiguration.init(dataDir, dbDir, DataStorageConfiguration.DEFAULT_CONFIG); return new KeyValueStorageProviderBuilder() .withStorageFactory( new RocksDBKeyValueStorageFactory( diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/AbstractSyncTargetManager.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/AbstractSyncTargetManager.java index 9c6b9327e..f5b5f978c 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/AbstractSyncTargetManager.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/AbstractSyncTargetManager.java @@ -28,6 +28,7 @@ import org.hyperledger.besu.plugin.services.MetricsSystem; import java.time.Duration; import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicBoolean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,6 +37,8 @@ public abstract class AbstractSyncTargetManager { private static final Logger LOG = LoggerFactory.getLogger(AbstractSyncTargetManager.class); + private final AtomicBoolean cancelled = new AtomicBoolean(false); + private final SynchronizerConfiguration config; private final ProtocolSchedule protocolSchedule; private final ProtocolContext protocolContext; @@ -56,6 +59,9 @@ public abstract class AbstractSyncTargetManager { } public CompletableFuture findSyncTarget() { + if (isCancelled()) { + return completedFuture(null); + } return selectBestAvailableSyncTarget() .thenCompose( maybeBestPeer -> { @@ -99,6 +105,10 @@ public abstract class AbstractSyncTargetManager { }); } + public synchronized void cancel() { + cancelled.set(true); + } + protected Optional finalizeSelectedSyncTarget(final SyncTarget syncTarget) { return Optional.of(syncTarget); } @@ -115,5 +125,9 @@ public abstract class AbstractSyncTargetManager { .timeout(WaitForPeerTask.create(ethContext, metricsSystem), Duration.ofSeconds(5)); } + private boolean isCancelled() { + return cancelled.get(); + } + public abstract boolean shouldContinueDownloading(); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/PipelineChainDownloader.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/PipelineChainDownloader.java index e40b28efa..bfec1435c 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/PipelineChainDownloader.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/PipelineChainDownloader.java @@ -85,6 +85,7 @@ public class PipelineChainDownloader implements ChainDownloader { @Override public synchronized void cancel() { cancelled.set(true); + syncTargetManager.cancel(); if (currentDownloadPipeline != null) { currentDownloadPipeline.abort(); } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java index 017320aca..fe229dc3c 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java @@ -87,7 +87,7 @@ public class EvmToolCommandOptionsModule { @Singleton BesuConfiguration provideBesuConfiguration() { final var besuConfiguration = new BesuConfigurationImpl(); - besuConfiguration.init(dataPath, dataPath.resolve(BesuController.DATABASE_PATH), null, null); + besuConfiguration.init(dataPath, dataPath.resolve(BesuController.DATABASE_PATH), null); return besuConfiguration; } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/PeerDiscoveryController.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/PeerDiscoveryController.java index 8eb07e433..5d0fee184 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/PeerDiscoveryController.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/PeerDiscoveryController.java @@ -260,6 +260,7 @@ public class PeerDiscoveryController { l.clear(); }); inflightInteractions.clear(); + recursivePeerRefreshState.cancel(); return CompletableFuture.completedFuture(null); } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/RecursivePeerRefreshState.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/RecursivePeerRefreshState.java index 0f3073dfd..3329dad4c 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/RecursivePeerRefreshState.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/RecursivePeerRefreshState.java @@ -105,6 +105,10 @@ public class RecursivePeerRefreshState { } private void bondingInitiateRound() { + if (!iterativeSearchInProgress) { + // cancelled so we can ignore + return; + } currentRoundTimeout.ifPresent(RoundTimeout::cancelTimeout); final List candidates = bondingRoundCandidates(); if (candidates.isEmpty()) { @@ -137,6 +141,10 @@ public class RecursivePeerRefreshState { } private void bondingCancelOutstandingRequests() { + if (!iterativeSearchInProgress) { + // cancelled so we can ignore + return; + } LOG.debug("Bonding round timed out"); for (final Map.Entry entry : oneTrueMap.entrySet()) { final MetadataPeer metadataPeer = entry.getValue(); @@ -149,6 +157,10 @@ public class RecursivePeerRefreshState { } private void neighboursInitiateRound() { + if (!iterativeSearchInProgress) { + // cancelled so we can ignore + return; + } currentRoundTimeout.ifPresent(RoundTimeout::cancelTimeout); final List candidates = neighboursRoundCandidates(); if (candidates.isEmpty() || reachedMaximumNumberOfRounds()) { @@ -172,6 +184,10 @@ public class RecursivePeerRefreshState { } private void neighboursCancelOutstandingRequests() { + if (!iterativeSearchInProgress) { + // cancelled so we can ignore + return; + } LOG.debug("Neighbours round timed out"); for (final Map.Entry entry : oneTrueMap.entrySet()) { final MetadataPeer metadataPeer = entry.getValue(); @@ -218,6 +234,10 @@ public class RecursivePeerRefreshState { } void onBondingComplete(final DiscoveryPeer peer) { + if (!iterativeSearchInProgress) { + // cancelled so we can ignore + return; + } final MetadataPeer iterationParticipant = oneTrueMap.get(peer.getId()); if (iterationParticipant == null) { return; diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/BonsaiReferenceTestWorldState.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/BonsaiReferenceTestWorldState.java index 8acdea117..e374f5c02 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/BonsaiReferenceTestWorldState.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/BonsaiReferenceTestWorldState.java @@ -29,6 +29,7 @@ import org.hyperledger.besu.ethereum.trie.diffbased.common.cache.DiffBasedCached import org.hyperledger.besu.ethereum.trie.diffbased.common.trielog.TrieLogAddedEvent; import org.hyperledger.besu.ethereum.trie.diffbased.common.trielog.TrieLogManager; import org.hyperledger.besu.ethereum.trie.diffbased.common.worldview.DiffBasedWorldState; +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; @@ -66,7 +67,8 @@ public class BonsaiReferenceTestWorldState extends BonsaiWorldState bonsaiCachedMerkleTrieLoader, cachedWorldStorageManager, trieLogManager, - evmConfiguration); + evmConfiguration, + new DiffBasedWorldStateConfig()); this.refTestStorage = worldStateKeyValueStorage; this.preImageProxy = preImageProxy; this.evmConfiguration = evmConfiguration; @@ -194,7 +196,8 @@ public class BonsaiReferenceTestWorldState extends BonsaiWorldState bonsaiCachedMerkleTrieLoader, cachedWorldStorageManager, trieLogManager, - evmConfiguration); + evmConfiguration, + new DiffBasedWorldStateConfig()); if (isFrozen) { bonsaiWorldState.freeze(); // freeze state } diff --git a/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/NoOpMerkleTrie.java b/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/NoOpMerkleTrie.java new file mode 100644 index 000000000..53d0ac5b5 --- /dev/null +++ b/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/NoOpMerkleTrie.java @@ -0,0 +1,123 @@ +/* + * 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; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.apache.tuweni.bytes.Bytes; +import org.apache.tuweni.bytes.Bytes32; + +/** + * A noop {@link MerkleTrie}. + * + * @param The type of values of this trie. + */ +public class NoOpMerkleTrie implements MerkleTrie { + + public NoOpMerkleTrie() {} + + @Override + public Optional get(final K key) { + return Optional.empty(); + } + + @Override + public Optional getPath(final K path) { + return Optional.empty(); + } + + @Override + public Proof getValueWithProof(final K key) { + return new Proof<>(Optional.empty(), new ArrayList<>()); + } + + @Override + public void put(final K key, final V value) { + // noop + } + + @Override + public void putPath(final K path, final V value) { + // noop + } + + @Override + public void put(final K key, final PathNodeVisitor putVisitor) { + // noop + } + + @Override + public void remove(final K key) { + // noop + } + + @Override + public void removePath(final K path, final PathNodeVisitor removeVisitor) { + // noop + } + + @Override + public Bytes32 getRootHash() { + return EMPTY_TRIE_NODE_HASH; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "[" + getRootHash() + "]"; + } + + @Override + public void commit(final NodeUpdater nodeUpdater) { + // Nothing to do here + } + + @Override + public void commit(final NodeUpdater nodeUpdater, final CommitVisitor commitVisitor) { + // Nothing to do here + } + + @Override + public Map entriesFrom(final Bytes32 startKeyHash, final int limit) { + return new HashMap<>(); + } + + @Override + public Map entriesFrom(final Function, Map> handler) { + return new HashMap<>(); + } + + @Override + public void visitAll(final Consumer> nodeConsumer) { + // noop + } + + @Override + public CompletableFuture visitAll( + final Consumer> nodeConsumer, final ExecutorService executorService) { + return CompletableFuture.completedFuture(null); + } + + @Override + public void visitLeafs(final TrieIterator.LeafHandler handler) { + // nopop + } +} diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index f61fe316b..e38237d7c 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -70,7 +70,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = 'xU0LMvStiFihBKBxkfNHB7oIg0PUHWkPuv2yt1GVC94=' + knownHash = 'wMhttXj2aWFgpN9msxHz/FwQVovpYRxNysnZEpwZYxg=' } check.dependsOn('checkAPIChanges') diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/BesuPlugin.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/BesuPlugin.java index 9c9dc44bf..952f1fb07 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/BesuPlugin.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/BesuPlugin.java @@ -63,6 +63,9 @@ public interface BesuPlugin { */ void start(); + /** Hook to execute plugin setup code after external services */ + default void afterExternalServicePostMainLoop() {} + /** * Called when the plugin is being reloaded. This method will be called through a dedicated JSON * RPC endpoint. If not overridden this method does nothing for convenience. The plugin should diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuConfiguration.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuConfiguration.java index ca92a1243..c10a69738 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuConfiguration.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuConfiguration.java @@ -20,10 +20,25 @@ import org.hyperledger.besu.plugin.services.storage.DataStorageConfiguration; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import java.nio.file.Path; +import java.util.Optional; /** Generally useful configuration provided by Besu. */ public interface BesuConfiguration extends BesuService { + /** + * Get the configured RPC http host. + * + * @return the configured RPC http host. + */ + Optional getRpcHttpHost(); + + /** + * Get the configured RPC http port. + * + * @return the configured RPC http port. + */ + Optional getRpcHttpPort(); + /** * Location of the working directory of the storage in the file system running the client. * diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java index 911eff3b5..ab9c4eb78 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java @@ -93,6 +93,14 @@ public interface BesuEvents extends BesuService { */ void removeBlockReorgListener(long listenerIdentifier); + /** + * Add an initial sync completion listener. + * + * @param listener to subscribe to initial sync completion events + * @return id of listener subscription + */ + long addInitialSyncCompletionListener(final InitialSyncCompletionListener listener); + /** * Add a listener watching new transactions added to the node. * diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BlockchainService.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BlockchainService.java index af6d14f54..69a2e6a82 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BlockchainService.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BlockchainService.java @@ -17,9 +17,12 @@ package org.hyperledger.besu.plugin.services; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.plugin.Unstable; +import org.hyperledger.besu.plugin.data.BlockBody; import org.hyperledger.besu.plugin.data.BlockContext; import org.hyperledger.besu.plugin.data.BlockHeader; +import org.hyperledger.besu.plugin.data.TransactionReceipt; +import java.util.List; import java.util.Optional; /** A service that plugins can use to query blocks by number */ @@ -40,6 +43,23 @@ public interface BlockchainService extends BesuService { */ Hash getChainHeadHash(); + /** + * Get the receipts for a block by block hash + * + * @param blockHash the block hash + * @return the transaction receipts + */ + Optional> getReceiptsByBlockHash(Hash blockHash); + + /** + * Store a block + * + * @param blockHeader the block header + * @param blockBody the block body + * @param receipts the transaction receipts + */ + void storeBlock(BlockHeader blockHeader, BlockBody blockBody, List receipts); + /** * Get the block header of the chain head * @@ -53,4 +73,18 @@ public interface BlockchainService extends BesuService { * @return base fee of the next block or empty if the fee market does not support base fee */ Optional getNextBlockBaseFee(); + + /** + * Get the block hash of the safe block + * + * @return the block hash of the safe block + */ + Optional getSafeBlock(); + + /** + * Get the block hash of the finalized block + * + * @return the block hash of the finalized block + */ + Optional getFinalizedBlock(); } diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/TrieLogService.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/TrieLogService.java index 2c5c38c54..5230d6a66 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/TrieLogService.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/TrieLogService.java @@ -19,6 +19,7 @@ import org.hyperledger.besu.plugin.services.trielogs.TrieLogFactory; import org.hyperledger.besu.plugin.services.trielogs.TrieLogProvider; import java.util.List; +import java.util.Optional; /** * A service interface for registering observers for trie log events. @@ -39,7 +40,7 @@ public interface TrieLogService extends BesuService { * * @return the TrieLogFactory implementation */ - TrieLogFactory getTrieLogFactory(); + Optional getTrieLogFactory(); /** * Configure a TrieLogProvider implementation to use for retrieving stored TrieLogs. diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/p2p/P2PService.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/p2p/P2PService.java new file mode 100644 index 000000000..0e9e46e79 --- /dev/null +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/p2p/P2PService.java @@ -0,0 +1,27 @@ +/* + * 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.plugin.services.p2p; + +import org.hyperledger.besu.plugin.services.BesuService; + +/** Service to enable and disable P2P service. */ +public interface P2PService extends BesuService { + + /** Enables P2P discovery. */ + void enableDiscovery(); + + /** Disables P2P discovery. */ + void disableDiscovery(); +} diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/rlp/RlpConverterService.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/rlp/RlpConverterService.java new file mode 100644 index 000000000..016fab7fa --- /dev/null +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/rlp/RlpConverterService.java @@ -0,0 +1,74 @@ +/* + * 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.plugin.services.rlp; + +import org.hyperledger.besu.plugin.data.BlockBody; +import org.hyperledger.besu.plugin.data.BlockHeader; +import org.hyperledger.besu.plugin.data.TransactionReceipt; +import org.hyperledger.besu.plugin.services.BesuService; + +import org.apache.tuweni.bytes.Bytes; + +/** RLP Serialiaztion/Deserialization service. */ +public interface RlpConverterService extends BesuService { + + /** + * Builds a block header from RLP. + * + * @param rlp the RLP to build the block header from. + * @return the block header. + */ + BlockHeader buildHeaderFromRlp(final Bytes rlp); + + /** + * Builds a block body from RLP. + * + * @param rlp the RLP to build the block body from. + * @return the block body. + */ + BlockBody buildBodyFromRlp(final Bytes rlp); + + /** + * Builds a transaction receipt from RLP. + * + * @param rlp the RLP to build the transaction receipt from. + * @return the transaction receipt. + */ + TransactionReceipt buildReceiptFromRlp(final Bytes rlp); + + /** + * RLP encodes a block header. + * + * @param blockHeader the block header to build RLP from. + * @return the RLP. + */ + Bytes buildRlpFromHeader(final BlockHeader blockHeader); + + /** + * RLP encodes a block body. + * + * @param blockBody the block body to build RLP from. + * @return the RLP. + */ + Bytes buildRlpFromBody(final BlockBody blockBody); + + /** + * RLP encodes a transaction receipt. + * + * @param receipt the transaction receipt to build RLP from. + * @return the RLP. + */ + Bytes buildRlpFromReceipt(final TransactionReceipt receipt); +} diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/sync/SynchronizationService.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/sync/SynchronizationService.java new file mode 100644 index 000000000..ad9682429 --- /dev/null +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/sync/SynchronizationService.java @@ -0,0 +1,62 @@ +/* + * 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.plugin.services.sync; + +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.plugin.data.BlockBody; +import org.hyperledger.besu.plugin.data.BlockHeader; +import org.hyperledger.besu.plugin.services.BesuService; + +/** Synchronization service wraps the sync state and sync event lifecycle. */ +public interface SynchronizationService extends BesuService { + + /** + * Enables P2P discovery. + * + * @param head the head of the chain. + * @param safeBlock the safe block. + * @param finalizedBlock the finalized block. + */ + void fireNewUnverifiedForkchoiceEvent(Hash head, Hash safeBlock, Hash finalizedBlock); + + /** + * Set the head of the chain. + * + * @param blockHeader the block header + * @param blockBody the block body + * @return true if the head was set, false otherwise. + */ + boolean setHead(final BlockHeader blockHeader, final BlockBody blockBody); + + /** + * Adds the block header and body to the head of the chain directly, without using a block + * importer or validation. + * + * @param blockHeader the block header + * @param blockBody the block body + * @return true if the head was set, false otherwise. + */ + boolean setHeadUnsafe(BlockHeader blockHeader, BlockBody blockBody); + + /** + * Returns whether the initial chain and worldstate sync is complete. + * + * @return true if the initial sync phase is done, false otherwise. + */ + boolean isInitialSyncPhaseDone(); + + /** Disables the worldstate trie for update. */ + void disableWorldStateTrie(); +} diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/sync/WorldStateConfiguration.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/sync/WorldStateConfiguration.java new file mode 100644 index 000000000..3f66ffb86 --- /dev/null +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/sync/WorldStateConfiguration.java @@ -0,0 +1,26 @@ +/* + * 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.plugin.services.sync; + +/** interface for worldstate configuration * */ +public interface WorldStateConfiguration { + + /** + * Returns whether the trie is disabled. + * + * @return true if the trie is disabled, false otherwise. + */ + boolean isTrieDisabled(); +} diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/transactionpool/TransactionPoolService.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/transactionpool/TransactionPoolService.java new file mode 100644 index 000000000..01b1f5768 --- /dev/null +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/transactionpool/TransactionPoolService.java @@ -0,0 +1,26 @@ +/* + * 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.plugin.services.transactionpool; + +import org.hyperledger.besu.plugin.services.BesuService; + +/** Service to enable and disable the transaction pool. */ +public interface TransactionPoolService extends BesuService { + /** Enables the transaction pool. */ + void disableTransactionPool(); + + /** Disables the transaction pool. */ + void enableTransactionPool(); +} diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/trielogs/TrieLogProvider.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/trielogs/TrieLogProvider.java index 86a9906cf..b20e73283 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/trielogs/TrieLogProvider.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/trielogs/TrieLogProvider.java @@ -19,8 +19,19 @@ import org.hyperledger.besu.datatypes.Hash; import java.util.List; import java.util.Optional; +import org.apache.tuweni.bytes.Bytes; + /** Trielog provider interface for a given block hash. */ public interface TrieLogProvider { + /** + * Saves the TrieLog layer for the given block hash. + * + * @param blockHash the block hash + * @param blockNumber the block number + * @param trieLog the associated TrieLog layer + */ + void saveRawTrieLogLayer(final Hash blockHash, final long blockNumber, final Bytes trieLog); + /** * Returns the TrieLog layer for the given block hash. * @@ -30,6 +41,14 @@ public interface TrieLogProvider { */ > Optional getTrieLogLayer(final Hash blockHash); + /** + * Get the raw TrieLog layer for the given block hash. + * + * @param blockHash the block hash + * @return the raw TrieLog layer bytes for the given block hash + */ + Optional getRawTrieLogLayer(final Hash blockHash); + /** * Returns the TrieLog layer for the given block number. * @@ -39,6 +58,14 @@ public interface TrieLogProvider { */ > Optional getTrieLogLayer(final long blockNumber); + /** + * Get the raw TrieLog layer for the given block number. + * + * @param blockNumber the block number + * @return the raw TrieLog layer bytes for the given block number + */ + Optional getRawTrieLogLayer(final long blockNumber); + /** * Returns the TrieLog layers for the given block number range. * From 5415463a33c3a662b118b19948a89fbb333da963 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Fri, 24 May 2024 04:55:51 +1000 Subject: [PATCH 2/9] Rename methods and variables to match json (#7134) Signed-off-by: Gabriel-Trintinalia --- .../parameters/WithdrawalRequestParameter.java | 4 ++-- .../besu/ethereum/core/WithdrawalRequest.java | 18 +++++++++--------- .../encoding/WithdrawalRequestEncoder.java | 2 +- .../WithdrawalRequestContractHelper.java | 4 ++-- .../WithdrawalRequestContractHelperTest.java | 5 +++-- plugin-api/build.gradle | 2 +- .../besu/plugin/data/WithdrawalRequest.java | 2 +- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/WithdrawalRequestParameter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/WithdrawalRequestParameter.java index d4786e180..79c0251e8 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/WithdrawalRequestParameter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/WithdrawalRequestParameter.java @@ -45,7 +45,7 @@ public class WithdrawalRequestParameter { final WithdrawalRequest withdrawalRequest) { return new WithdrawalRequestParameter( withdrawalRequest.getSourceAddress().toHexString(), - withdrawalRequest.getValidatorPubKey().toHexString(), + withdrawalRequest.getValidatorPublicKey().toHexString(), withdrawalRequest.getAmount().toShortHexString()); } @@ -92,7 +92,7 @@ public class WithdrawalRequestParameter { + "sourceAddress='" + sourceAddress + '\'' - + ", validatorPubKey='" + + ", validatorPublicKey='" + validatorPublicKey + '\'' + ", amount='" diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/WithdrawalRequest.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/WithdrawalRequest.java index c9dbd0df6..decdf22c7 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/WithdrawalRequest.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/WithdrawalRequest.java @@ -26,13 +26,13 @@ public class WithdrawalRequest extends Request implements org.hyperledger.besu.plugin.data.WithdrawalRequest { private final Address sourceAddress; - private final BLSPublicKey validatorPubKey; + private final BLSPublicKey validatorPublicKey; private final GWei amount; public WithdrawalRequest( - final Address sourceAddress, final BLSPublicKey validatorPubKey, final GWei amount) { + final Address sourceAddress, final BLSPublicKey validatorPublicKey, final GWei amount) { this.sourceAddress = sourceAddress; - this.validatorPubKey = validatorPubKey; + this.validatorPublicKey = validatorPublicKey; this.amount = amount; } @@ -47,8 +47,8 @@ public class WithdrawalRequest extends Request } @Override - public PublicKey getValidatorPubKey() { - return validatorPubKey; + public PublicKey getValidatorPublicKey() { + return validatorPublicKey; } @Override @@ -61,8 +61,8 @@ public class WithdrawalRequest extends Request return "WithdrawalRequest{" + "sourceAddress=" + sourceAddress - + " validatorPubKey=" - + validatorPubKey + + " validatorPublicKey=" + + validatorPublicKey + " amount=" + amount + '}'; @@ -78,12 +78,12 @@ public class WithdrawalRequest extends Request } final WithdrawalRequest that = (WithdrawalRequest) o; return Objects.equals(sourceAddress, that.sourceAddress) - && Objects.equals(validatorPubKey, that.validatorPubKey) + && Objects.equals(validatorPublicKey, that.validatorPublicKey) && Objects.equals(amount, that.amount); } @Override public int hashCode() { - return Objects.hash(sourceAddress, validatorPubKey, amount); + return Objects.hash(sourceAddress, validatorPublicKey, amount); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoder.java index 2a8fbb6ee..26be22d48 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoder.java @@ -48,7 +48,7 @@ public class WithdrawalRequestEncoder { final WithdrawalRequest withdrawalRequest, final RLPOutput rlpOutput) { rlpOutput.startList(); rlpOutput.writeBytes(withdrawalRequest.getSourceAddress()); - rlpOutput.writeBytes(withdrawalRequest.getValidatorPubKey()); + rlpOutput.writeBytes(withdrawalRequest.getValidatorPublicKey()); rlpOutput.writeUInt64Scalar(withdrawalRequest.getAmount()); rlpOutput.endList(); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java index 5ef0a6998..3cbe952d0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java @@ -150,7 +150,7 @@ public class WithdrawalRequestContractHelper { queueHeadIndex.plus(i).multiply(WITHDRAWAL_REQUEST_STORAGE_SLOT_SIZE)); final Address sourceAddress = Address.wrap(account.getStorageValue(queueStorageSlot).toBytes().slice(12, 20)); - final BLSPublicKey validatorPubKey = + final BLSPublicKey validatorPublicKey = BLSPublicKey.wrap( Bytes.concatenate( account @@ -162,7 +162,7 @@ public class WithdrawalRequestContractHelper { UInt64.fromBytes(account.getStorageValue(queueStorageSlot.plus(2)).slice(16, 8)); withdrawalRequests.add( - new WithdrawalRequest(sourceAddress, validatorPubKey, GWei.of(amount))); + new WithdrawalRequest(sourceAddress, validatorPublicKey, GWei.of(amount))); } return withdrawalRequests; diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java index 1c0485b59..6d21744e7 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java @@ -186,13 +186,14 @@ class WithdrawalRequestContractHelperTest { Bytes.fromHexString("0x000000000000000000000000"), request.getSourceAddress()))); // validator_pubkey contract.setStorageValue( - UInt256.valueOf(offset++), UInt256.fromBytes(request.getValidatorPubKey().slice(0, 32))); + UInt256.valueOf(offset++), + UInt256.fromBytes(request.getValidatorPublicKey().slice(0, 32))); contract.setStorageValue( // set public key to slot, with 16 bytes padding on the right UInt256.valueOf(offset++), UInt256.fromBytes( Bytes.concatenate( - request.getValidatorPubKey().slice(32, 16), + request.getValidatorPublicKey().slice(32, 16), request.getAmount().toBytes(), // 8 bytes for amount Bytes.fromHexString("0x0000000000000000")))); } diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index e38237d7c..a25774205 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -70,7 +70,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = 'wMhttXj2aWFgpN9msxHz/FwQVovpYRxNysnZEpwZYxg=' + knownHash = 'zgPAgf+ZxefbnCE9aYEQ5QoeBVsHySi3u+BlhHNHqn8=' } check.dependsOn('checkAPIChanges') diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/WithdrawalRequest.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/WithdrawalRequest.java index 7f9f5d15e..eeadd8041 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/WithdrawalRequest.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/WithdrawalRequest.java @@ -38,7 +38,7 @@ public interface WithdrawalRequest { * * @return public key of validator */ - PublicKey getValidatorPubKey(); + PublicKey getValidatorPublicKey(); /** * The amount for withdrawal From a31ffc9b032355c7fa1a31c28ea0a649bb64235f Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Fri, 24 May 2024 00:38:23 +0200 Subject: [PATCH 3/9] Update Gradle plugins (#7137) Signed-off-by: Fabio Di Fabio --- build.gradle | 10 +- gradle/verification-metadata.xml | 1103 +++--------------------------- 2 files changed, 116 insertions(+), 997 deletions(-) diff --git a/build.gradle b/build.gradle index 9b5e75d53..74c06e8fe 100644 --- a/build.gradle +++ b/build.gradle @@ -23,11 +23,11 @@ import java.text.SimpleDateFormat import java.util.regex.Pattern plugins { - id 'com.diffplug.spotless' version '6.23.3' - id 'com.github.ben-manes.versions' version '0.50.0' - id 'com.github.jk1.dependency-license-report' version '2.5' - id 'com.jfrog.artifactory' version '5.1.11' - id 'io.spring.dependency-management' version '1.1.4' + id 'com.diffplug.spotless' version '6.25.0' + id 'com.github.ben-manes.versions' version '0.51.0' + id 'com.github.jk1.dependency-license-report' version '2.7' + id 'com.jfrog.artifactory' version '5.2.0' + id 'io.spring.dependency-management' version '1.1.5' id 'me.champeau.jmh' version '0.7.2' apply false id 'net.ltgt.errorprone' version '3.1.0' id 'maven-publish' diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 1fd79baf6..7ad666233 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -49,41 +49,41 @@ - - - + + + - - + + - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + @@ -328,12 +328,12 @@ - - - + + + - - + + @@ -347,9 +347,9 @@ - - - + + + @@ -381,17 +381,17 @@ - - - + + + - - + + - - - + + + @@ -746,9 +746,6 @@ - - - @@ -834,20 +831,12 @@ - - - + + + - - - - - - - - - - + + @@ -866,14 +855,9 @@ - - - - - - - - + + + @@ -910,14 +894,6 @@ - - - - - - - - @@ -939,11 +915,6 @@ - - - - - @@ -1156,9 +1127,9 @@ - - - + + + @@ -1248,9 +1219,6 @@ - - - @@ -1274,6 +1242,11 @@ + + + + + @@ -1297,14 +1270,6 @@ - - - - - - - - @@ -1404,6 +1369,14 @@ + + + + + + + + @@ -1412,11 +1385,6 @@ - - - - - @@ -2522,17 +2490,17 @@ - - - + + + - - - + + + - - + + @@ -3598,9 +3566,6 @@ - - - @@ -3691,14 +3656,6 @@ - - - - - - - - @@ -3707,14 +3664,6 @@ - - - - - - - - @@ -3723,14 +3672,6 @@ - - - - - - - - @@ -3739,14 +3680,6 @@ - - - - - - - - @@ -3755,14 +3688,6 @@ - - - - - - - - @@ -3771,14 +3696,6 @@ - - - - - - - - @@ -3795,14 +3712,6 @@ - - - - - - - - @@ -4027,22 +3936,6 @@ - - - - - - - - - - - - - - - - @@ -4051,14 +3944,6 @@ - - - - - - - - @@ -4067,14 +3952,6 @@ - - - - - - - - @@ -4083,14 +3960,6 @@ - - - - - - - - @@ -4099,14 +3968,6 @@ - - - - - - - - @@ -4123,22 +3984,6 @@ - - - - - - - - - - - - - - - - @@ -4147,14 +3992,6 @@ - - - - - - - - @@ -4171,22 +4008,6 @@ - - - - - - - - - - - - - - - - @@ -4195,14 +4016,6 @@ - - - - - - - - @@ -4211,14 +4024,6 @@ - - - - - - - - @@ -4227,14 +4032,6 @@ - - - - - - - - @@ -4243,14 +4040,6 @@ - - - - - - - - @@ -4259,14 +4048,6 @@ - - - - - - - - @@ -4275,14 +4056,6 @@ - - - - - - - - @@ -4299,22 +4072,6 @@ - - - - - - - - - - - - - - - - @@ -4323,14 +4080,6 @@ - - - - - - - - @@ -4339,14 +4088,6 @@ - - - - - - - - @@ -4355,14 +4096,6 @@ - - - - - - - - @@ -4371,14 +4104,6 @@ - - - - - - - - @@ -4387,14 +4112,6 @@ - - - - - - - - @@ -4403,14 +4120,6 @@ - - - - - - - - @@ -4419,14 +4128,6 @@ - - - - - - - - @@ -4435,14 +4136,6 @@ - - - - - - - - @@ -4451,14 +4144,6 @@ - - - - - - - - @@ -4467,14 +4152,6 @@ - - - - - - - - @@ -4483,14 +4160,6 @@ - - - - - - - - @@ -4499,14 +4168,6 @@ - - - - - - - - @@ -4515,14 +4176,6 @@ - - - - - - - - @@ -4531,14 +4184,6 @@ - - - - - - - - @@ -4547,14 +4192,6 @@ - - - - - - - - @@ -4563,14 +4200,6 @@ - - - - - - - - @@ -4579,14 +4208,6 @@ - - - - - - - - @@ -4595,14 +4216,6 @@ - - - - - - - - @@ -4611,14 +4224,6 @@ - - - - - - - - @@ -4627,14 +4232,6 @@ - - - - - - - - @@ -4643,14 +4240,6 @@ - - - - - - - - @@ -4659,14 +4248,6 @@ - - - - - - - - @@ -4675,14 +4256,6 @@ - - - - - - - - @@ -4691,14 +4264,6 @@ - - - - - - - - @@ -4707,14 +4272,6 @@ - - - - - - - - @@ -4731,14 +4288,6 @@ - - - - - - - - @@ -4747,22 +4296,6 @@ - - - - - - - - - - - - - - - - @@ -4771,14 +4304,6 @@ - - - - - - - - @@ -4787,14 +4312,6 @@ - - - - - - - - @@ -4803,14 +4320,6 @@ - - - - - - - - @@ -4827,22 +4336,6 @@ - - - - - - - - - - - - - - - - @@ -4851,14 +4344,6 @@ - - - - - - - - @@ -4867,14 +4352,6 @@ - - - - - - - - @@ -4891,22 +4368,6 @@ - - - - - - - - - - - - - - - - @@ -4915,14 +4376,6 @@ - - - - - - - - @@ -4931,22 +4384,6 @@ - - - - - - - - - - - - - - - - @@ -4955,14 +4392,6 @@ - - - - - - - - @@ -4971,14 +4400,6 @@ - - - - - - - - @@ -4987,14 +4408,6 @@ - - - - - - - - @@ -5011,30 +4424,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -5051,14 +4440,6 @@ - - - - - - - - @@ -5067,14 +4448,6 @@ - - - - - - - - @@ -5083,14 +4456,6 @@ - - - - - - - - @@ -5099,14 +4464,6 @@ - - - - - - - - @@ -5115,14 +4472,6 @@ - - - - - - - - @@ -5131,14 +4480,6 @@ - - - - - - - - @@ -5147,14 +4488,6 @@ - - - - - - - - @@ -5171,14 +4504,6 @@ - - - - - - - - @@ -5187,22 +4512,6 @@ - - - - - - - - - - - - - - - - @@ -5211,14 +4520,6 @@ - - - - - - - - @@ -5227,14 +4528,6 @@ - - - - - - - - @@ -5243,14 +4536,6 @@ - - - - - - - - @@ -5259,14 +4544,6 @@ - - - - - - - - @@ -5275,14 +4552,6 @@ - - - - - - - - @@ -5291,14 +4560,6 @@ - - - - - - - - @@ -5307,14 +4568,6 @@ - - - - - - - - @@ -5323,14 +4576,6 @@ - - - - - - - - @@ -5347,22 +4592,6 @@ - - - - - - - - - - - - - - - - @@ -5371,14 +4600,6 @@ - - - - - - - - @@ -5387,14 +4608,6 @@ - - - - - - - - @@ -5511,14 +4724,6 @@ - - - - - - - - @@ -5535,14 +4740,6 @@ - - - - - - - - @@ -5551,14 +4748,6 @@ - - - - - - - - @@ -5567,14 +4756,6 @@ - - - - - - - - @@ -5583,14 +4764,6 @@ - - - - - - - - @@ -5599,14 +4772,6 @@ - - - - - - - - @@ -5781,6 +4946,11 @@ + + + + + @@ -5789,6 +4959,14 @@ + + + + + + + + @@ -5800,11 +4978,6 @@ - - - - - @@ -5829,6 +5002,9 @@ + + + @@ -5837,6 +5013,9 @@ + + + @@ -5862,16 +5041,6 @@ - - - - - - - - - - @@ -5975,44 +5144,36 @@ - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - - - - - - - - + + @@ -6783,14 +5944,6 @@ - - - - - - - - @@ -6818,7 +5971,7 @@ - + @@ -6851,11 +6004,6 @@ - - - - - @@ -6921,14 +6069,6 @@ - - - - - - - - @@ -6937,14 +6077,6 @@ - - - - - - - - @@ -6953,24 +6085,11 @@ - - - - - - - - - - - - - From bdcea2d20671c2957a662ad48e3c218c32fe468b Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Mon, 27 May 2024 23:18:06 +1000 Subject: [PATCH 4/9] 24.5.2 changelog (#7143) Signed-off-by: Sally MacFarlane --- CHANGELOG.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fe0cbbc3..176f56dec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,17 +4,36 @@ ### Breaking Changes +### Additions and Improvements + +### Bug fixes +- Make `eth_gasPrice` aware of the base fee market [#7102](https://github.com/hyperledger/besu/pull/7102) + +## 24.5.2 + +### Upcoming Breaking Changes +- Version 24.5.x will be the last series to support Java 17. Next release after versions 24.5.x will require Java 21 to build and run. +- Receipt compaction will be enabled by default in a future version of Besu. After this change it will not be possible to downgrade to the previous Besu version. +- PKI-backed QBFT will be removed in a future version of Besu. Other forms of QBFT will remain unchanged. + ### Additions and Improvements - Remove deprecated Goerli testnet [#7049](https://github.com/hyperledger/besu/pull/7049) - Default bonsai to use full-flat db and code-storage-by-code-hash [#6984](https://github.com/hyperledger/besu/pull/6894) - New RPC methods miner_setExtraData and miner_getExtraData [#7078](https://github.com/hyperledger/besu/pull/7078) - Disconnect peers that have multiple discovery ports since they give us bad neighbours [#7089](https://github.com/hyperledger/besu/pull/7089) +### Known Issues +- [Frequency: occasional < 10%] Chain download halt. Only affects new syncs (new nodes syncing from scratch). Symptom: Block import halts, despite having a full set of peers and world state downloading finishing. Generally restarting besu will resolve the issue. We are tracking this in [#6884](https://github.com/hyperledger/besu/pull/6884) + ### Bug fixes - Fix parsing `gasLimit` parameter when its value is > `Long.MAX_VALUE` [#7116](https://github.com/hyperledger/besu/pull/7116) -- Make `eth_gasPrice` aware of the base fee market [#7102](https://github.com/hyperledger/besu/pull/7102) - Skip validation of withdrawals when importing BFT blocks since withdrawals don't apply to BFT chains [#7115](https://github.com/hyperledger/besu/pull/7115) +### Download Links +https://github.com/hyperledger/besu/releases/tag/24.5.2 +https://github.com/hyperledger/besu/releases/download/24.5.2/besu-24.5.2.tar.gz / sha256 4049bf48022ae073065b46e27088399dfb22035e9134ed4ac2c86dd8c5b5fbe9 +https://github.com/hyperledger/besu/releases/download/24.5.2/besu-24.5.2.zip / sha256 23966b501a69e320e8f8f46a3d103ccca45b53f8fee35a6543bd9a260b5784ee + ## 24.5.1 ### Breaking Changes From 067164f7b55ed7fd44336bf3a0d204ef15668648 Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Tue, 28 May 2024 01:13:00 +0200 Subject: [PATCH 5/9] Update JUnit test reports on PR merged on main (#7141) Signed-off-by: Fabio Di Fabio --- .github/workflows/acceptance-tests.yml | 14 ++++++- .github/workflows/pre-review.yml | 12 +++++- .github/workflows/update-test-reports.yml | 51 +++++++++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/update-test-reports.yml diff --git a/.github/workflows/acceptance-tests.yml b/.github/workflows/acceptance-tests.yml index baca556b1..c05e4d5f4 100644 --- a/.github/workflows/acceptance-tests.yml +++ b/.github/workflows/acceptance-tests.yml @@ -45,14 +45,24 @@ jobs: run: ./gradlew acceptanceTestNotPrivacy --test-dry-run -Dorg.gradle.parallel=true -Dorg.gradle.caching=true - name: Extract current test list run: mkdir tmp; find . -type f -name TEST-*.xml | xargs -I{} bash -c "xmlstarlet sel -t -v '/testsuite/@name' '{}'; echo ' acceptanceTestNotPrivacy'" | tee tmp/currentTests.list - - name: get acceptance test reports + - name: Get acceptance test reports (Support transition) # can be removed after PR is merged uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d + continue-on-error: true with: branch: main name_is_regexp: true - name: 'acceptance-node-\d*\d-test-results' + name: 'acceptance-node-\d+-test-results' path: tmp/junit-xml-reports-downloaded if_no_artifact_found: true + - name: Get acceptance test reports + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d + continue-on-error: true + with: + branch: main + workflow: update-test-reports.yml + name: acceptance-test-results + path: tmp/junit-xml-reports-downloaded + if_no_artifact_found: ignore - name: Split tests run: .github/workflows/splitTestsByTime.sh tmp/junit-xml-reports-downloaded "tmp/junit-xml-reports-downloaded/acceptance-node-.*-test-results" "TEST-" ${{env.total-runners}} ${{ matrix.runner_index }} > testList.txt - name: format gradle args diff --git a/.github/workflows/pre-review.yml b/.github/workflows/pre-review.yml index ac3b3f3ce..034e0da2f 100644 --- a/.github/workflows/pre-review.yml +++ b/.github/workflows/pre-review.yml @@ -104,14 +104,24 @@ jobs: run: ./gradlew test --test-dry-run -Dorg.gradle.parallel=true -Dorg.gradle.caching=true - name: Extract current test list run: mkdir tmp; find . -type f -name TEST-*.xml | xargs -I{} bash -c "xmlstarlet sel -t -v '/testsuite/@name' '{}'; echo '{}' | sed 's#\./\(.*\)/build/test-results/.*# \1#'" | tee tmp/currentTests.list - - name: get unit test reports + - name: Get unit test reports (Support transition) # can be removed after PR is merged uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d + continue-on-error: true with: branch: main name_is_regexp: true name: 'unit-.*-test-results' path: tmp/junit-xml-reports-downloaded if_no_artifact_found: true + - name: Get unit test reports + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d + continue-on-error: true + with: + branch: main + workflow: update-test-reports.yml + name: unit-test-results + path: tmp/junit-xml-reports-downloaded + if_no_artifact_found: ignore - name: Split tests run: .github/workflows/splitTestsByTime.sh tmp/junit-xml-reports-downloaded "tmp/junit-xml-reports-downloaded/unit-.*-test-results" "build/test-results" ${{env.total-runners}} ${{ matrix.runner_index }} > testList.txt - name: Upload Timing diff --git a/.github/workflows/update-test-reports.yml b/.github/workflows/update-test-reports.yml new file mode 100644 index 000000000..cb57ac971 --- /dev/null +++ b/.github/workflows/update-test-reports.yml @@ -0,0 +1,51 @@ +name: update-test-reports + +on: + push: + branches: + - main + +jobs: + syncTestReports: + if: github.repository == 'hyperledger/besu' + runs-on: ubuntu-22.04 + steps: + - name: Get latest merge PR number + id: latest_merged_pr_number + run: echo "PULL_REQUEST_NUMBER=$(gh pr list --repo hyperledger/besu --base main --state merged --limit 1 --json number | jq '.[].number')" >> "$GITHUB_OUTPUT" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Get unit test reports from latest merged PR + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d + with: + workflow: pre-review.yml + workflow_conclusion: success + pr: ${{ env.LATEST_MERGED_PR_NUMBER }} + name_is_regexp: true + name: 'unit-\d+-test-results' + path: unit-test-results + if_no_artifact_found: fail + env: + LATEST_MERGED_PR_NUMBER: ${{ steps.latest_merged_pr_number.outputs.PULL_REQUEST_NUMBER }} + - name: Upload unit test results + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 + with: + name: unit-test-results + path: 'unit-test-results/**/test-results/**/TEST-*.xml' + - name: Get acceptance test reports from latest merged PR + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d + with: + workflow: acceptance-tests.yml + workflow_conclusion: success + pr: ${{ env.LATEST_MERGED_PR_NUMBER }} + name_is_regexp: true + name: 'acceptance-node-\d+-test-results' + path: acceptance-test-results + if_no_artifact_found: fail + env: + LATEST_MERGED_PR_NUMBER: ${{ steps.latest_merged_pr_number.outputs.PULL_REQUEST_NUMBER }} + - name: Upload acceptance test results + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 + with: + name: acceptance-test-results + path: 'acceptance-test-results/**/test-results/**/TEST-*.xml' From 7a5a3e0957f4c65c34359bad2245952c72322f9e Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 28 May 2024 17:55:38 +1000 Subject: [PATCH 6/9] Minor improvements to EIP-7685 (#7142) Signed-off-by: Gabriel-Trintinalia --- .../besu/datatypes/RequestType.java | 16 ++++----- .../engine/RequestValidatorProvider.java | 2 +- .../internal/results/BlockResultFactory.java | 22 +++--------- .../engine/AbstractEngineNewPayloadTest.java | 2 +- .../engine/EngineNewPayloadV4Test.java | 4 +-- .../AbstractBlockCreatorTest.java | 2 +- .../besu/ethereum/mainnet/BodyValidation.java | 2 +- .../ethereum/mainnet/ProtocolSpecBuilder.java | 2 +- .../requests/DepositRequestProcessor.java | 4 +-- .../mainnet/requests/DepositsValidator.java | 5 ++- .../mainnet/requests/RequestProcessor.java | 2 +- .../mainnet/requests/RequestUtil.java | 19 ++++++++++ .../RequestsValidatorCoordinator.java | 4 +++ .../requests/WithdrawalRequestProcessor.java | 4 +-- .../requests/WithdrawalRequestValidator.java | 7 ++-- .../BlockImportExceptionHandlingTest.java | 2 +- .../core/encoding/DepositEncoderTest.java | 35 ++++++++++++------- .../WithdrawalRequestEncoderTest.java | 27 +++++++++----- .../mainnet/AbstractBlockProcessorTest.java | 2 +- .../mainnet/MainnetBlockProcessorTest.java | 2 +- 20 files changed, 101 insertions(+), 64 deletions(-) diff --git a/datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java b/datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java index b1cddb440..628baa6d5 100644 --- a/datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java +++ b/datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java @@ -14,8 +14,6 @@ */ package org.hyperledger.besu.datatypes; -import java.util.Arrays; - /** Enum representing different types of requests with associated serialized type values. */ public enum RequestType { /** DEPOSITS */ @@ -47,12 +45,12 @@ public enum RequestType { * RequestType}. */ public static RequestType of(final int serializedTypeValue) { - return Arrays.stream(RequestType.values()) - .filter(requestType -> requestType.typeValue == serializedTypeValue) - .findFirst() - .orElseThrow( - () -> - new IllegalArgumentException( - String.format("Unsupported request type: 0x%02X", serializedTypeValue))); + return switch (serializedTypeValue) { + case 0x00 -> DEPOSIT; + case 0x01 -> WITHDRAWAL; + default -> + throw new IllegalArgumentException( + String.format("Unsupported request type: 0x%02X", serializedTypeValue)); + }; } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java index a86f4ca5e..505d36951 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java @@ -66,6 +66,6 @@ public class RequestValidatorProvider { final ProtocolSpec protocolSchedule) { return Optional.ofNullable(protocolSchedule) .map(ProtocolSpec::getRequestsValidatorCoordinator) - .orElseGet(() -> new RequestsValidatorCoordinator.Builder().build()); + .orElseGet(RequestsValidatorCoordinator::empty); } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java index 15b3a9c2c..aff5713af 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java @@ -14,6 +14,9 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.results; +import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getDepositRequests; +import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getWithdrawalRequests; + import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadBodiesResultV1.PayloadBody; @@ -24,12 +27,8 @@ import org.hyperledger.besu.ethereum.core.BlockBody; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockValueCalculator; import org.hyperledger.besu.ethereum.core.BlockWithReceipts; -import org.hyperledger.besu.ethereum.core.Deposit; -import org.hyperledger.besu.ethereum.core.Request; -import org.hyperledger.besu.ethereum.core.WithdrawalRequest; import org.hyperledger.besu.ethereum.core.encoding.EncodingContext; import org.hyperledger.besu.ethereum.core.encoding.TransactionEncoder; -import org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil; import java.util.ArrayList; import java.util.List; @@ -176,23 +175,12 @@ public class BlockResultFactory { blockWithReceipts.getHeader(), txs, blockWithReceipts.getBlock().getBody().getWithdrawals(), - getDepositRequest(blockWithReceipts.getBlock().getBody().getRequests()), - getWithdrawalRequest(blockWithReceipts.getBlock().getBody().getRequests()), + getDepositRequests(blockWithReceipts.getBlock().getBody().getRequests()), + getWithdrawalRequests(blockWithReceipts.getBlock().getBody().getRequests()), Quantity.create(blockValue), blobsBundleV1); } - private Optional> getDepositRequest(final Optional> requests) { - return requests.map( - requestList -> RequestUtil.filterRequestsOfType(requestList, Deposit.class)); - } - - private Optional> getWithdrawalRequest( - final Optional> requests) { - return requests.map( - requestList -> RequestUtil.filterRequestsOfType(requestList, WithdrawalRequest.class)); - } - public BlockResult transactionHash(final BlockWithMetadata blockWithMetadata) { return transactionHash(blockWithMetadata, false); } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java index dc40b164a..dba31f7f0 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java @@ -521,7 +521,7 @@ public abstract class AbstractEngineNewPayloadTest extends AbstractScheduledApiT } private void mockProhibitedRequestsValidator() { - var validator = new RequestsValidatorCoordinator.Builder().build(); + var validator = RequestsValidatorCoordinator.empty(); when(protocolSpec.getRequestsValidatorCoordinator()).thenReturn(validator); } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java index 679a274cb..276eaf6b6 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java @@ -158,7 +158,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { final List deposits = List.of(); lenient() .when(protocolSpec.getRequestsValidatorCoordinator()) - .thenReturn(new RequestsValidatorCoordinator.Builder().build()); + .thenReturn(RequestsValidatorCoordinator.empty()); var resp = resp( @@ -311,7 +311,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { } private void mockProhibitedRequestsValidator() { - var validator = new RequestsValidatorCoordinator.Builder().build(); + var validator = RequestsValidatorCoordinator.empty(); when(protocolSpec.getRequestsValidatorCoordinator()).thenReturn(validator); } 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 00576d493..103b8fdb6 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 @@ -134,7 +134,7 @@ abstract class AbstractBlockCreatorTest { UInt64.valueOf(539967)); final List expectedDeposits = List.of(expectedDeposit); - final Optional> depositsFromReceipts = + var depositsFromReceipts = new DepositRequestProcessor(DEFAULT_DEPOSIT_CONTRACT_ADDRESS).process(null, receipts); assertThat(depositsFromReceipts.get()).isEqualTo(expectedDeposits); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java index 86392b86d..15e8c3c80 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java @@ -89,7 +89,7 @@ public final class BodyValidation { } /** - * Generates the request root for a list of requests + * Generates the requests root for a list of requests * * @param requests list of request * @return the requests root 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 61fba7b1f..f79c6a874 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 @@ -78,7 +78,7 @@ public class ProtocolSpecBuilder { new WithdrawalsValidator.ProhibitedWithdrawals(); private WithdrawalsProcessor withdrawalsProcessor; private RequestsValidatorCoordinator requestsValidatorCoordinator = - new RequestsValidatorCoordinator.Builder().build(); + RequestsValidatorCoordinator.empty(); private RequestProcessorCoordinator requestProcessorCoordinator; protected BlockHashProcessor blockHashProcessor; private FeeMarket feeMarket = FeeMarket.legacy(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java index 16109946d..766ce1f94 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java @@ -39,13 +39,13 @@ public class DepositRequestProcessor implements RequestProcessor { } @Override - public Optional> process( + public Optional> process( final MutableWorldState ignored, final List transactionReceipts) { if (depositContractAddress.isEmpty()) { return Optional.empty(); } List deposits = findDepositsFromReceipts(transactionReceipts); - return Optional.of(deposits.stream().map(r -> (Request) r).toList()); + return Optional.of(deposits); } @VisibleForTesting diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositsValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositsValidator.java index 1c6c3ca21..6a2d3bdc5 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositsValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositsValidator.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.mainnet.requests; +import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getDepositRequests; + import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.Deposit; @@ -23,6 +25,7 @@ import org.hyperledger.besu.ethereum.core.encoding.DepositDecoder; import org.hyperledger.besu.evm.log.Log; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -75,7 +78,7 @@ public class DepositsValidator implements RequestValidator { @Override public boolean validate( final Block block, final List requests, final List receipts) { - var deposits = RequestUtil.filterRequestsOfType(requests, Deposit.class); + var deposits = getDepositRequests(Optional.of(requests)).orElse(Collections.emptyList()); return validateDeposits(block, deposits, receipts); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java index c365e0d75..d09b3c47d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Optional; public interface RequestProcessor { - Optional> process( + Optional> process( final MutableWorldState mutableWorldState, final List transactionReceipts); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java index 54478bfef..3d85fc48f 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java @@ -14,7 +14,9 @@ */ package org.hyperledger.besu.ethereum.mainnet.requests; +import org.hyperledger.besu.ethereum.core.Deposit; import org.hyperledger.besu.ethereum.core.Request; +import org.hyperledger.besu.ethereum.core.WithdrawalRequest; import java.util.ArrayList; import java.util.Collections; @@ -40,6 +42,23 @@ public class RequestUtil { return requests.stream().filter(requestType::isInstance).map(requestType::cast).toList(); } + public static Optional> getDepositRequests(final Optional> requests) { + return requests.map(r -> filterRequestsOfType(r, Deposit.class)); + } + + public static Optional> getWithdrawalRequests( + final Optional> requests) { + return requests.map(r -> filterRequestsOfType(r, WithdrawalRequest.class)); + } + + /** + * Combines two optional lists of requests into a single optional list. + * + * @param maybeDeposits Optional list of deposit requests. + * @param maybeWithdrawalRequest Optional list of withdrawal requests. + * @return An Optional containing the combined list of requests, or an empty Optional if both + * inputs are empty. + */ public static Optional> combine( final Optional> maybeDeposits, final Optional> maybeWithdrawalRequest) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestsValidatorCoordinator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestsValidatorCoordinator.java index f6800f95c..7b8f5cf49 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestsValidatorCoordinator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestsValidatorCoordinator.java @@ -41,6 +41,10 @@ public class RequestsValidatorCoordinator { private static final Logger LOG = LoggerFactory.getLogger(RequestsValidatorCoordinator.class); private final ImmutableSortedMap validators; + public static RequestsValidatorCoordinator empty() { + return new Builder().build(); + } + /** * Constructs a new RequestsDelegateValidator with a mapping of request types to their respective * validators. diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java index f9c029d51..9803f23f3 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java @@ -25,7 +25,7 @@ import java.util.Optional; public class WithdrawalRequestProcessor implements RequestProcessor { @Override - public Optional> process( + public Optional> process( final MutableWorldState mutableWorldState, final List transactionReceipts) { @@ -33,6 +33,6 @@ public class WithdrawalRequestProcessor implements RequestProcessor { WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(mutableWorldState).stream() .toList(); - return Optional.of(withdrawalRequests.stream().map(r -> (Request) r).toList()); + return Optional.of(withdrawalRequests); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java index b1fc88196..d5f04e6ef 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.mainnet.requests; +import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getWithdrawalRequests; + import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.Request; @@ -45,7 +47,7 @@ public class WithdrawalRequestValidator implements RequestValidator { block .getBody() .getRequests() - .map(requests -> RequestUtil.filterRequestsOfType(requests, WithdrawalRequest.class)) + .flatMap(requests -> getWithdrawalRequests(Optional.of(requests))) .orElse(Collections.emptyList()); // TODO Do we need to allow for customization? (e.g. if the value changes in the next fork) @@ -74,7 +76,8 @@ public class WithdrawalRequestValidator implements RequestValidator { @Override public boolean validate( final Block block, final List requests, final List receipts) { - var withdrawalRequests = RequestUtil.filterRequestsOfType(requests, WithdrawalRequest.class); + var withdrawalRequests = + getWithdrawalRequests(Optional.of(requests)).orElse(Collections.emptyList()); return validateWithdrawalRequestsInBlock(block, withdrawalRequests); } 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 6c84b29b4..d2d1fed8b 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 @@ -114,7 +114,7 @@ class BlockImportExceptionHandlingTest { when(protocolContext.getWorldStateArchive()).thenReturn(worldStateArchive); when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec); when(protocolSpec.getRequestsValidatorCoordinator()) - .thenReturn(new RequestsValidatorCoordinator.Builder().build()); + .thenReturn(RequestsValidatorCoordinator.empty()); when(protocolSpec.getBlockHashProcessor()).thenReturn(new FrontierBlockHashProcessor()); mainnetBlockValidator = new MainnetBlockValidator( diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoderTest.java index fc9027cdb..7b4052cff 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoderTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoderTest.java @@ -27,24 +27,35 @@ import org.apache.tuweni.units.bigints.UInt64; import org.junit.jupiter.api.Test; class DepositEncoderTest { + private final String expectedDepositEncodedBytes = + "f8bbb0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416ea00017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483850773594000b860a889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb501"; + + final Deposit deposit = + new Deposit( + BLSPublicKey.fromHexString( + "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), + Bytes32.fromHexString( + "0x0017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483"), + GWei.of(32000000000L), + BLSSignature.fromHexString( + "0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"), + UInt64.ONE); + @Test void shouldEncodeDeposit() { - final Deposit deposit = - new Deposit( - BLSPublicKey.fromHexString( - "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), - Bytes32.fromHexString( - "0x0017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483"), - GWei.of(32000000000L), - BLSSignature.fromHexString( - "0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"), - UInt64.ONE); - final Bytes encoded = DepositEncoder.encodeOpaqueBytes(deposit); + assertThat(encoded).isEqualTo(Bytes.fromHexString(expectedDepositEncodedBytes)); + } + @Test + void shouldEncodeDepositRequest() { + final Bytes encoded = RequestEncoder.encodeOpaqueBytes(deposit); + // Request encoding is Request = RequestType ++ RequestData assertThat(encoded) .isEqualTo( Bytes.fromHexString( - "0xf8bbb0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416ea00017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483850773594000b860a889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb501")); + String.format( + "0x%02X%s", + deposit.getType().getSerializedType(), expectedDepositEncodedBytes))); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoderTest.java index 3f9eb0e86..14c9cface 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoderTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoderTest.java @@ -25,20 +25,31 @@ import org.apache.tuweni.bytes.Bytes; import org.junit.jupiter.api.Test; class WithdrawalRequestEncoderTest { + + private final String expectedEncodedBytes = + "f84794763c396673f9c391dce3361a9a71c8e161388000b0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e05"; + + final WithdrawalRequest withdrawalRequest = + new WithdrawalRequest( + Address.fromHexString("0x763c396673F9c391DCe3361A9A71C8E161388000"), + BLSPublicKey.fromHexString( + "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), + GWei.of(5)); + @Test void shouldEncodeWithdrawalRequest() { - final WithdrawalRequest withdrawalRequest = - new WithdrawalRequest( - Address.fromHexString("0x763c396673F9c391DCe3361A9A71C8E161388000"), - BLSPublicKey.fromHexString( - "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), - GWei.of(5)); - final Bytes encoded = WithdrawalRequestEncoder.encodeOpaqueBytes(withdrawalRequest); + assertThat(encoded).isEqualTo(Bytes.fromHexString(expectedEncodedBytes)); + } + @Test + void shouldEncodeRequest() { + final Bytes encoded = RequestEncoder.encodeOpaqueBytes(withdrawalRequest); assertThat(encoded) .isEqualTo( Bytes.fromHexString( - "0xf84794763c396673f9c391dce3361a9a71c8e161388000b0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e05")); + String.format( + "0x%02X%s", + withdrawalRequest.getType().getSerializedType(), expectedEncodedBytes))); } } 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 2db101ab6..2a66c6e11 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 @@ -70,7 +70,7 @@ abstract class AbstractBlockProcessorTest { lenient().when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec); lenient() .when(protocolSpec.getRequestsValidatorCoordinator()) - .thenReturn(new RequestsValidatorCoordinator.Builder().build()); + .thenReturn(RequestsValidatorCoordinator.empty()); lenient() .when(protocolSpec.getBlockHashProcessor()) .thenReturn(new FrontierBlockHashProcessor()); 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 9f2092ea8..a06aece37 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 @@ -51,7 +51,7 @@ public class MainnetBlockProcessorTest extends AbstractBlockProcessorTest { public void setup() { when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec); when(protocolSpec.getRequestsValidatorCoordinator()) - .thenReturn(new RequestsValidatorCoordinator.Builder().build()); + .thenReturn(RequestsValidatorCoordinator.empty()); when(protocolSpec.getBlockHashProcessor()).thenReturn(new FrontierBlockHashProcessor()); } From 3c57ca28218122fe0efe9ee6cf628d1133729214 Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Tue, 28 May 2024 17:03:34 +0200 Subject: [PATCH 7/9] Fix acceptance reports path and how to get the latest merged PR (#7147) Signed-off-by: Fabio Di Fabio --- .github/workflows/acceptance-tests.yml | 2 ++ .github/workflows/pre-review.yml | 2 ++ .github/workflows/splitTestsByTime.sh | 6 ++++++ .github/workflows/update-test-reports.yml | 4 ++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/acceptance-tests.yml b/.github/workflows/acceptance-tests.yml index c05e4d5f4..c188c9564 100644 --- a/.github/workflows/acceptance-tests.yml +++ b/.github/workflows/acceptance-tests.yml @@ -87,6 +87,8 @@ jobs: path: '*.txt' - name: run acceptance tests run: ./gradlew acceptanceTestNotPrivacy `cat gradleArgs.txt` -Dorg.gradle.parallel=true -Dorg.gradle.caching=true + - name: Remove downloaded test results + run: rm -rf tmp/junit-xml-reports-downloaded - name: Upload Acceptance Test Results uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 with: diff --git a/.github/workflows/pre-review.yml b/.github/workflows/pre-review.yml index 034e0da2f..0628d2ee6 100644 --- a/.github/workflows/pre-review.yml +++ b/.github/workflows/pre-review.yml @@ -143,6 +143,8 @@ jobs: path: testList.txt - name: run unit tests run: cat testList.txt | xargs -P 1 ./gradlew -Dorg.gradle.parallel=true -Dorg.gradle.caching=true + - name: Remove downloaded test results + run: rm -rf tmp/junit-xml-reports-downloaded - name: Upload Unit Test Results uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 with: diff --git a/.github/workflows/splitTestsByTime.sh b/.github/workflows/splitTestsByTime.sh index 0e3948444..3ef075d6b 100755 --- a/.github/workflows/splitTestsByTime.sh +++ b/.github/workflows/splitTestsByTime.sh @@ -46,6 +46,12 @@ for line in "${sorted[@]}"; do module_dir=${line_parts[2]} test_with_module="$test_name $module_dir" + # temp deduplication during the transition phase + if grep -F -q --line-regexp "$test_with_module" tmp/processedTests.list + then + continue + fi + # Does the test still exists? if grep -F -q --line-regexp "$test_with_module" tmp/currentTests.list then diff --git a/.github/workflows/update-test-reports.yml b/.github/workflows/update-test-reports.yml index cb57ac971..fd0266dd5 100644 --- a/.github/workflows/update-test-reports.yml +++ b/.github/workflows/update-test-reports.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Get latest merge PR number id: latest_merged_pr_number - run: echo "PULL_REQUEST_NUMBER=$(gh pr list --repo hyperledger/besu --base main --state merged --limit 1 --json number | jq '.[].number')" >> "$GITHUB_OUTPUT" + run: echo "PULL_REQUEST_NUMBER=$(gh pr list --repo hyperledger/besu --base main --state merged --json "number,mergedAt" --search "sort:updated-desc" --jq 'max_by(.mergedAt)|.number')" >> "$GITHUB_OUTPUT" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Get unit test reports from latest merged PR @@ -48,4 +48,4 @@ jobs: uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 with: name: acceptance-test-results - path: 'acceptance-test-results/**/test-results/**/TEST-*.xml' + path: 'acceptance-test-results/**/TEST-*.xml' From fb25f180b0cbccb0a813a85d295db79fc03b357d Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Tue, 28 May 2024 20:16:04 -0600 Subject: [PATCH 8/9] Pectra devnet 0 EEST support (#7123) * Pectra devnet 0 EEST support Add the required fields to the t8n responses to enable ethereum execution spec tests to fill tests using Besu. Signed-off-by: Danno Ferrin * tests Signed-off-by: Danno Ferrin * spotless Signed-off-by: Danno Ferrin * fix issue with warm state crossing transaciton boundaries in t8n tool Signed-off-by: Danno Ferrin * test results change when bugs a re fixed Signed-off-by: Danno Ferrin * fix changed method name Signed-off-by: Danno Ferrin --------- Signed-off-by: Danno Ferrin --- .../WithdrawalRequestContractHelper.java | 5 +- .../hyperledger/besu/evmtool/T8nExecutor.java | 105 ++++-- .../besu/evmtool/t8n/prague-deposit.json | 281 +++++++++++++++ .../besu/evmtool/t8n/prague-withdrawal.json | 336 ++++++++++++++++++ 4 files changed, 698 insertions(+), 29 deletions(-) create mode 100644 ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json create mode 100644 ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java index 3cbe952d0..6bb0e81a7 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java @@ -44,6 +44,9 @@ public class WithdrawalRequestContractHelper { public static final Address WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS = Address.fromHexString("0x00A3ca265EBcb825B45F985A16CEFB49958cE017"); + /** private constructor to prevent instantiations */ + private WithdrawalRequestContractHelper() {} + @VisibleForTesting // Storage slot to store the difference between number of withdrawal requests since last block and // target withdrawal requests @@ -82,7 +85,7 @@ public class WithdrawalRequestContractHelper { final MutableWorldState mutableWorldState) { final WorldUpdater worldUpdater = mutableWorldState.updater(); final MutableAccount account = worldUpdater.getAccount(WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS); - if (Hash.EMPTY.equals(account.getCodeHash())) { + if (account == null || Hash.EMPTY.equals(account.getCodeHash())) { return List.of(); } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index e5d3e2c0b..ee84eba4d 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -32,13 +32,17 @@ import org.hyperledger.besu.datatypes.VersionedHash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.Deposit; +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.WithdrawalRequest; import org.hyperledger.besu.ethereum.mainnet.BodyValidation; import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; +import org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.referencetests.BonsaiReferenceTestWorldState; import org.hyperledger.besu.ethereum.referencetests.ReferenceTestEnv; @@ -63,10 +67,11 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; import java.util.Spliterator; import java.util.Spliterators; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; import java.util.stream.StreamSupport; import com.fasterxml.jackson.databind.JsonNode; @@ -160,7 +165,8 @@ public class T8nExecutor { false) .map(JsonNode::textValue) .toList(); - var accessListEntry = AccessListEntry.createAccessListEntry(address, storageKeys); + AccessListEntry accessListEntry = + AccessListEntry.createAccessListEntry(address, storageKeys); entries.add(accessListEntry); } builder.accessList(entries); @@ -260,15 +266,17 @@ public class T8nExecutor { .getBlockHashProcessor() .processBlockHashes(blockchain, worldState, referenceTestEnv); - final WorldUpdater worldStateUpdater = worldState.updater(); + final WorldUpdater rootWorldStateUpdater = worldState.updater(); List receipts = new ArrayList<>(); List invalidTransactions = new ArrayList<>(rejections); List validTransactions = new ArrayList<>(); ArrayNode receiptsArray = objectMapper.createArrayNode(); long gasUsed = 0; long blobGasUsed = 0; - for (int i = 0; i < transactions.size(); i++) { - Transaction transaction = transactions.get(i); + final WorldUpdater worldStateUpdater = rootWorldStateUpdater.updater(); + for (int transactionIndex = 0; transactionIndex < transactions.size(); transactionIndex++) { + worldStateUpdater.markTransactionBoundary(); + Transaction transaction = transactions.get(transactionIndex); final Stopwatch timer = Stopwatch.createStarted(); GasCalculator gasCalculator = protocolSpec.getGasCalculator(); @@ -277,7 +285,7 @@ public class T8nExecutor { if (blobGasUsed > blobGasLimit) { invalidTransactions.add( new RejectedTransaction( - i, + transactionIndex, String.format( "blob gas (%d) would exceed block maximum %d", blobGasUsed, blobGasLimit))); continue; @@ -286,7 +294,7 @@ public class T8nExecutor { final TransactionProcessingResult result; try { - tracer = tracerManager.getManagedTracer(i, transaction.getHash()); + tracer = tracerManager.getManagedTracer(transactionIndex, transaction.getHash()); tracer.tracePrepareTransaction(worldStateUpdater, transaction); tracer.traceStartTransaction(worldStateUpdater, transaction); result = @@ -318,7 +326,8 @@ public class T8nExecutor { } if (result.isInvalid()) { invalidTransactions.add( - new RejectedTransaction(i, result.getValidationResult().getErrorMessage())); + new RejectedTransaction( + transactionIndex, result.getValidationResult().getErrorMessage())); continue; } validTransactions.add(transaction); @@ -354,8 +363,20 @@ public class T8nExecutor { receiptObject.putNull("logs"); } else { ArrayNode logsArray = receiptObject.putArray("logs"); - for (Log log : result.getLogs()) { - logsArray.addPOJO(log); + List logs = result.getLogs(); + for (int logIndex = 0; logIndex < logs.size(); logIndex++) { + Log log = logs.get(logIndex); + var obj = logsArray.addObject(); + obj.put("address", log.getLogger().toHexString()); + var topics = obj.putArray("topics"); + log.getTopics().forEach(topic -> topics.add(topic.toHexString())); + obj.put("data", log.getData().toHexString()); + obj.put("blockNumber", blockHeader.getNumber()); + obj.put("transactionHash", transaction.getHash().toHexString()); + obj.put("transactionIndex", String.format("0x%x", transactionIndex)); + obj.put("blockHash", blockHeader.getHash().toHexString()); + obj.put("logIndex", String.format("0x%x", logIndex)); + obj.put("removed", "false"); } } receiptObject.put("transactionHash", transaction.getHash().toHexString()); @@ -363,7 +384,9 @@ public class T8nExecutor { "contractAddress", transaction.contractAddress().orElse(Address.ZERO).toHexString()); receiptObject.put("gasUsed", gasUsedInTransaction.toQuantityHexString()); receiptObject.put("blockHash", Hash.ZERO.toHexString()); - receiptObject.put("transactionIndex", Bytes.ofUnsignedLong(i).toQuantityHexString()); + receiptObject.put( + "transactionIndex", Bytes.ofUnsignedLong(transactionIndex).toQuantityHexString()); + worldStateUpdater.commit(); } final ObjectNode resultObject = objectMapper.createObjectNode(); @@ -375,12 +398,12 @@ public class T8nExecutor { (rewardString == null) ? protocolSpec.getBlockReward() : Wei.of(Long.decode(rewardString)); - worldStateUpdater + rootWorldStateUpdater .getOrCreateSenderAccount(blockHeader.getCoinbase()) .incrementBalance(reward); } - worldStateUpdater.commit(); + rootWorldStateUpdater.commit(); // Invoke the withdrawal processor to handle CL withdrawals. if (!referenceTestEnv.getWithdrawals().isEmpty()) { try { @@ -425,19 +448,45 @@ public class T8nExecutor { blockHeader .getWithdrawalsRoot() .ifPresent(wr -> resultObject.put("withdrawalsRoot", wr.toHexString())); - AtomicLong bgHolder = new AtomicLong(blobGasUsed); - blockHeader - .getExcessBlobGas() - .ifPresent( - ebg -> { - resultObject.put( - "currentExcessBlobGas", - calculateExcessBlobGasForParent(protocolSpec, blockHeader) - .toBytes() - .toQuantityHexString()); - resultObject.put( - "blobGasUsed", Bytes.ofUnsignedLong(bgHolder.longValue()).toQuantityHexString()); - }); + var maybeExcessBlobGas = blockHeader.getExcessBlobGas(); + if (maybeExcessBlobGas.isPresent()) { + resultObject.put( + "currentExcessBlobGas", + calculateExcessBlobGasForParent(protocolSpec, blockHeader) + .toBytes() + .toQuantityHexString()); + resultObject.put("blobGasUsed", Bytes.ofUnsignedLong(blobGasUsed).toQuantityHexString()); + } + + var requestProcessorCoordinator = protocolSpec.getRequestProcessorCoordinator(); + if (requestProcessorCoordinator.isPresent()) { + var rpc = requestProcessorCoordinator.get(); + Optional> maybeRequests = rpc.process(worldState, receipts); + Hash requestRoot = BodyValidation.requestsRoot(maybeRequests.orElse(List.of())); + + resultObject.put("requestsRoot", requestRoot.toHexString()); + var deposits = resultObject.putArray("depositRequests"); + RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), Deposit.class) + .forEach( + deposit -> { + var obj = deposits.addObject(); + obj.put("pubkey", deposit.getPubkey().toHexString()); + obj.put("withdrawalCredentials", deposit.getWithdrawalCredentials().toHexString()); + obj.put("amount", deposit.getAmount().toHexString()); + obj.put("signature", deposit.getSignature().toHexString()); + obj.put("index", deposit.getIndex().toHexString()); + }); + + var withdrawlRequests = resultObject.putArray("withdrawalRequests"); + RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), WithdrawalRequest.class) + .forEach( + wr -> { + var obj = withdrawlRequests.addObject(); + obj.put("sourceAddress", wr.getSourceAddress().toHexString()); + obj.put("validatorPublicKey", wr.getValidatorPublicKey().toHexString()); + obj.put("amount", wr.getAmount().toHexString()); + }); + } ObjectNode allocObject = objectMapper.createObjectNode(); worldState @@ -445,12 +494,12 @@ public class T8nExecutor { .sorted(Comparator.comparing(o -> o.getAddress().get().toHexString())) .forEach( a -> { - var account = worldState.get(a.getAddress().get()); + Account account = worldState.get(a.getAddress().get()); ObjectNode accountObject = allocObject.putObject(account.getAddress().toHexString()); if (account.getCode() != null && !account.getCode().isEmpty()) { accountObject.put("code", account.getCode().toHexString()); } - var storageEntries = + List> storageEntries = account.storageEntriesFrom(Bytes32.ZERO, Integer.MAX_VALUE).values().stream() .map( e -> diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json new file mode 100644 index 000000000..80e415b3f --- /dev/null +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json @@ -0,0 +1,281 @@ +{ + "cli": [ + "t8n", + "--input.alloc=stdin", + "--input.txs=stdin", + "--input.env=stdin", + "--output.result=stdout", + "--output.alloc=stdout", + "--output.body=stdout", + "--state.fork=Prague", + "--state.chainid=1", + "--state.reward=0" + ], + "stdin": { + "alloc": { + "0x00000000219ab540356cbb839cbe05303d7705fa": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x22": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x23": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x24": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x25": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x26": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x27": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x28": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x29": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x2a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x2b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x2c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x2d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x2e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x2f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x30": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x31": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x32": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x33": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x34": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x35": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x36": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x37": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x38": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x39": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x3a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x3b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x3c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x3d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x3e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x3f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x40": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "storage": {} + }, + "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "storage": {} + }, + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "nonce": "0x00", + "balance": "0xad78ebc5ac62000000", + "code": "0x", + "storage": {} + } + }, + "txs": [ + { + "type": "0x0", + "chainId": "0x1", + "nonce": "0x0", + "gasPrice": "0x7", + "gas": "0xf4240", + "to": "0x00000000219ab540356cbb839cbe05303d7705fa", + "value": "0x1bc16d674ec800000", + "input": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000011085acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b050000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003", + "v": "0x25", + "r": "0xffeb1d6e7ef8e9ee9b64dcdc3b056f9a1d2b94c1572f1949954e712364604575", + "s": "0x3d0f42bad795205de84db8d4ab10b9abd0d081ffe560cbf45f6c281768112a69", + "sender": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" + }, + { + "type": "0x0", + "chainId": "0x1", + "nonce": "0x1", + "gasPrice": "0x7", + "gas": "0xf4240", + "to": "0x00000000219ab540356cbb839cbe05303d7705fa", + "value": "0x1bc16d674ec800000", + "input": "0x22895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000011085acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b050000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003", + "v": "0x26", + "r": "0x5bb08e348c9c4b0a2e15d04f4a89d1a210d013205de8d3d93e38e5c1b0c8d8ab", + "s": "0x4300c0f575d9908d2cbc3413ab82895678bb8f3ef356224dd1e7cb972f2c4855", + "sender": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" + } + ], + "env": { + "currentCoinbase": "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentGasLimit": "100000000000000000", + "currentNumber": "1", + "currentTimestamp": "12", + "currentRandom": "0", + "currentDifficulty": "0", + "parentDifficulty": "0", + "parentTimestamp": "0", + "parentBaseFee": "7", + "parentGasUsed": "0", + "parentGasLimit": "100000000000000000", + "parentUncleHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "parentBlobGasUsed": "0", + "parentExcessBlobGas": "0", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockHashes": { + "0": "0xe4fb5d47f70d54b4f36777ea4c882cf767f93d8f8170285d97a1b8275dfe4dbb" + }, + "ommers": [], + "withdrawals": [], + "parentHash": "0xe4fb5d47f70d54b4f36777ea4c882cf767f93d8f8170285d97a1b8275dfe4dbb" + } + }, + "stdout": { + "alloc": { + "0x00000000219ab540356cbb839cbe05303d7705fa": { + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x85acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b05", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x2f93f18b1befc457f659e486ce25bbe413fe3943ee7634d2afbe83dc512c3d7a", + "0x0000000000000000000000000000000000000000000000000000000000000020": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + }, + "balance": "0x3782dace9d9000000", + "nonce": "0x1" + }, + "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "storage": { + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x000000000000000000000000000000000000000000000000000000000000000c" + }, + "balance": "0x0", + "nonce": "0x1" + }, + "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "balance": "0x0", + "nonce": "0x1" + }, + "0x25a219378dad9b3503c8268c9ca836a52427a4fb": { + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0xe4fb5d47f70d54b4f36777ea4c882cf767f93d8f8170285d97a1b8275dfe4dbb" + }, + "balance": "0x0" + }, + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0xaa00be18c288efd690", + "nonce": "0x2" + } + }, + "body": "0xf90404f901ff8007830f42409400000000219ab540356cbb839cbe05303d7705fa8901bc16d674ec800000b9019422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000011085acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b05000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000325a0ffeb1d6e7ef8e9ee9b64dcdc3b056f9a1d2b94c1572f1949954e712364604575a03d0f42bad795205de84db8d4ab10b9abd0d081ffe560cbf45f6c281768112a69f901ff0107830f42409400000000219ab540356cbb839cbe05303d7705fa8901bc16d674ec800000b9019422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000011085acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b05000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000326a05bb08e348c9c4b0a2e15d04f4a89d1a210d013205de8d3d93e38e5c1b0c8d8aba04300c0f575d9908d2cbc3413ab82895678bb8f3ef356224dd1e7cb972f2c4855", + "result": { + "stateRoot": "0x0dd3e32e0081ff7ca5a0236b257676f277999ec2b8da5b31e19400715de907f1", + "txRoot": "0x2b790bf82ef7259a0e4513d1b89a77d81e99672ba68758ef2ba3fde32851d023", + "receiptsRoot": "0x9c8d7a917ecb3ff2566f264abbf39131e51b08b07eb2b69cb46989d79d985593", + "logsHash": "0x43e31613bfefc1f55d8b3ca2b61f933f3838d523dc11cb5d7ffdd2ecf0ab5d49", + "logsBloom": "0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000020000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000", + "receipts": [ + { + "root": "0x", + "status": "0x1", + "cumulativeGasUsed": "0x1431e", + "logsBloom": "0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000020000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000", + "logs": [ + { + "address": "0x00000000219ab540356cbb839cbe05303d7705fa", + "topics": [ + "0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080040597307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": 1, + "transactionHash": "0x1fe5fcd93d503a72e93ef0a4249e6d9c983cecf33474684f62ece959fc3e8212", + "transactionIndex": "0x0", + "blockHash": "0xb7b43f46d6ee34eaaad5ab38807b451e0e85bacbe59893afc625550aa7c65262", + "logIndex": "0x0", + "removed": "false" + } + ], + "transactionHash": "0x1fe5fcd93d503a72e93ef0a4249e6d9c983cecf33474684f62ece959fc3e8212", + "contractAddress": "0x0000000000000000000000000000000000000000", + "gasUsed": "0x1431e", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "transactionIndex": "0x0" + }, + { + "root": "0x", + "status": "0x1", + "cumulativeGasUsed": "0x24f10", + "logsBloom": "0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000020000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000", + "logs": [ + { + "address": "0x00000000219ab540356cbb839cbe05303d7705fa", + "topics": [ + "0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080040597307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000", + "blockNumber": 1, + "transactionHash": "0x3059d7dbc2df8a05442e50ea529419277c2f45582534f452d2d5676d93273c7d", + "transactionIndex": "0x1", + "blockHash": "0xb7b43f46d6ee34eaaad5ab38807b451e0e85bacbe59893afc625550aa7c65262", + "logIndex": "0x0", + "removed": "false" + } + ], + "transactionHash": "0x3059d7dbc2df8a05442e50ea529419277c2f45582534f452d2d5676d93273c7d", + "contractAddress": "0x0000000000000000000000000000000000000000", + "gasUsed": "0x10bf2", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "transactionIndex": "0x1" + } + ], + "currentDifficulty": null, + "gasUsed": "0x24f10", + "currentBaseFee": "0x7", + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "currentExcessBlobGas": "0x0", + "blobGasUsed": "0x0", + "requestsRoot": "0xfba41d6600776bec2258a06e4bc00a34f7a2a1bc0aa802976d038ef4e3379d29", + "depositRequests": [ + { + "pubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "withdrawalCredentials": "0x0000000000000000000000000000000000000000000000000000000000000002", + "amount": "0x0000000773594000", + "signature": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003", + "index": "0x0000000000000000" + }, + { + "pubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "withdrawalCredentials": "0x0000000000000000000000000000000000000000000000000000000000000002", + "amount": "0x0000000773594000", + "signature": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003", + "index": "0x0000000000000001" + } + ], + "withdrawalRequests": [] + } + } +} \ No newline at end of file diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json new file mode 100644 index 000000000..85ad0d7e9 --- /dev/null +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json @@ -0,0 +1,336 @@ +{ + "cli": [ + "t8n", + "--input.alloc=stdin", + "--input.txs=stdin", + "--input.env=stdin", + "--output.result=stdout", + "--output.alloc=stdout", + "--output.body=stdout", + "--state.fork=Prague", + "--state.chainid=1", + "--state.reward=0" + ], + "stdin": { + "alloc": { + "0x00000000219ab540356cbb839cbe05303d7705fa": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x22": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x23": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x24": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x25": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x26": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x27": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x28": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x29": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x2a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x2b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x2c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x2d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x2e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x2f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x30": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x31": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x32": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x33": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x34": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x35": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x36": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x37": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x38": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x39": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x3a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x3b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x3c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x3d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x3e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x3f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x40": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "storage": { + } + }, + "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "storage": {} + }, + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "nonce": "0x00", + "balance": "0xad78ebc5ac62000000", + "code": "0x", + "storage": {} + }, + "0x0000000000000000000000000000000000000200": { + "nonce": "0x01", + "balance": "0xad78ebc5ac62000000", + "code": "0x60386000600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386038600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386070600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f150603860a8600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f150603860e0600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610118600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610150600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610188600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386101c0600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386101f8600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610230600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610268600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386102a0600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386102d8600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610310600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610348600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f150", + "storage": {} + } + }, + "txs": [ + { + "type": "0x0", + "chainId": "0x1", + "nonce": "0x0", + "gasPrice": "0x7", + "gas": "0xf4240", + "to": "0x0000000000000000000000000000000000000200", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000", + "v": "0x26", + "r": "0x963cb6620fe5828cbc93bb7139d3f4501067d76275dff648bf48c3c100ca8dd4", + "s": "0x4ac396104a5be4643406718f59a6e74d62a32777f5f6135e55e805e87612013c", + "sender": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" + } + ], + "env": { + "currentCoinbase": "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentGasLimit": "100000000000000000", + "currentNumber": "1", + "currentTimestamp": "12", + "currentRandom": "0", + "currentDifficulty": "0", + "parentDifficulty": "0", + "parentTimestamp": "0", + "parentBaseFee": "7", + "parentGasUsed": "0", + "parentGasLimit": "100000000000000000", + "parentUncleHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "parentBlobGasUsed": "0", + "parentExcessBlobGas": "0", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockHashes": { + "0": "0x10715cfbefdb8a0cb2f7d7ca5ee6d1ea65515ecb41cff0a22d1e11716a9d27fb" + }, + "ommers": [], + "withdrawals": [], + "parentHash": "0x10715cfbefdb8a0cb2f7d7ca5ee6d1ea65515ecb41cff0a22d1e11716a9d27fb" + } + }, + "stdout": { + "alloc": { + "0x0000000000000000000000000000000000000200": { + "code": "0x60386000600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386038600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386070600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f150603860a8600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f150603860e0600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610118600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610150600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610188600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386101c0600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386101f8600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610230600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610268600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386102a0600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f15060386102d8600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610310600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f1506038610348600037600060006038600060017300a3ca265ebcb825b45f985a16cefb49958ce017620f4240f150", + "balance": "0xad78ebc5ac61fffff0", + "nonce": "0x1" + }, + "0x00000000219ab540356cbb839cbe05303d7705fa": { + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + }, + "balance": "0x0", + "nonce": "0x1" + }, + "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "storage": { + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x000000000000000000000000000000000000000000000000000000000000000c" + }, + "balance": "0x0", + "nonce": "0x1" + }, + "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x00000000000000000000000000000001fffffffffffffffe0000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x0000000000000000000000000000000200000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x00000000000000000000000000000003fffffffffffffffe0000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000000d": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x000000000000000000000000000000000000000000000000000000000000000f": "0x0000000000000000000000000000000400000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000010": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000012": "0x00000000000000000000000000000005fffffffffffffffe0000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000013": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000015": "0x0000000000000000000000000000000600000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000016": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000018": "0x00000000000000000000000000000007fffffffffffffffe0000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000019": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x000000000000000000000000000000000000000000000000000000000000001b": "0x0000000000000000000000000000000800000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000001c": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x000000000000000000000000000000000000000000000000000000000000001e": "0x00000000000000000000000000000009fffffffffffffffe0000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000001f": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000021": "0x0000000000000000000000000000000a00000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000022": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0x0000000000000000000000000000000bfffffffffffffffe0000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0x0000000000000000000000000000000c00000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x0000000000000000000000000000000dfffffffffffffffe0000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0x0000000000000000000000000000000e00000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0x0000000000000000000000000000000ffffffffffffffffe0000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x0000000000000000000000000000000000000000000000000000000000000200", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x0000000000000000000000000000001000000000000000000000000000000000" + }, + "balance": "0x10", + "nonce": "0x1" + }, + "0x25a219378dad9b3503c8268c9ca836a52427a4fb": { + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x10715cfbefdb8a0cb2f7d7ca5ee6d1ea65515ecb41cff0a22d1e11716a9d27fb" + }, + "balance": "0x0" + }, + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0xad78ebc5ac619bbcea", + "nonce": "0x1" + } + }, + "body": "0xf903e5f903e28007830f424094000000000000000000000000000000000000020080b90380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000026a0963cb6620fe5828cbc93bb7139d3f4501067d76275dff648bf48c3c100ca8dd4a04ac396104a5be4643406718f59a6e74d62a32777f5f6135e55e805e87612013c", + "result": { + "stateRoot": "0xf682e4f8f820f44fb43a20c3db274bc3c9fcb9e52cc1af3c3ea7cb21fdb2250b", + "txRoot": "0x8521df63211790726b6f1a437bb0fd4b27c00e13e7678d324c4cfddb8d834ad2", + "receiptsRoot": "0x4bd8bd5580caf4ed45f873794ad7ff9d6fd2363ae529269b17b891b68d349d75", + "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "receipts": [ + { + "root": "0x", + "status": "0x1", + "cumulativeGasUsed": "0xe52ba", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logs": null, + "transactionHash": "0x04a2d3f252dcc98edb684f7f15b572aaf980d0c2eea4c620a9f1ff1d275b2207", + "contractAddress": "0x0000000000000000000000000000000000000000", + "gasUsed": "0xe52ba", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "transactionIndex": "0x0" + } + ], + "currentDifficulty": null, + "gasUsed": "0xe52ba", + "currentBaseFee": "0x7", + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "currentExcessBlobGas": "0x0", + "blobGasUsed": "0x0", + "requestsRoot": "0x415d33e444f917658fd3bd6d3d8d88a1f501f9b83ace92ddacac823252c9fa47", + "depositRequests": [], + "withdrawalRequests": [ + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "amount": "0xfffffffffffffffe" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002", + "amount": "0x0000000000000000" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003", + "amount": "0xfffffffffffffffe" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004", + "amount": "0x0000000000000000" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005", + "amount": "0xfffffffffffffffe" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006", + "amount": "0x0000000000000000" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007", + "amount": "0xfffffffffffffffe" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008", + "amount": "0x0000000000000000" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", + "amount": "0xfffffffffffffffe" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a", + "amount": "0x0000000000000000" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b", + "amount": "0xfffffffffffffffe" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c", + "amount": "0x0000000000000000" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d", + "amount": "0xfffffffffffffffe" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e", + "amount": "0x0000000000000000" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f", + "amount": "0xfffffffffffffffe" + }, + { + "sourceAddress": "0x0000000000000000000000000000000000000200", + "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010", + "amount": "0x0000000000000000" + } + ] + } + } +} \ No newline at end of file From 2df721619a61e0eb2c9bedb8e72bbedc21b50c07 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Wed, 29 May 2024 13:39:44 +1000 Subject: [PATCH 9/9] [MINOR] Rename deposit to depositRequest (#7145) Signed-off-by: Gabriel-Trintinalia --- .../engine/AbstractEngineNewPayload.java | 12 ++-- .../methods/engine/EngineNewPayloadV4.java | 2 +- ...eter.java => DepositRequestParameter.java} | 28 ++++---- .../parameters/EnginePayloadParameter.java | 12 ++-- .../results/EngineGetPayloadResultV4.java | 25 +++---- .../engine/AbstractEngineGetPayloadTest.java | 6 +- .../engine/AbstractEngineNewPayloadTest.java | 22 +++---- .../engine/EngineGetPayloadV4Test.java | 4 +- .../engine/EngineNewPayloadV3Test.java | 4 +- .../engine/EngineNewPayloadV4Test.java | 52 ++++++++------- .../DepositParameterTestFixture.java | 8 +-- ...> DepositRequestRequestParameterTest.java} | 14 ++-- .../AbstractBlockCreatorTest.java | 40 ++++++------ .../besu/ethereum/core/BlockBody.java | 2 +- .../{Deposit.java => DepositRequest.java} | 7 +- ...ecoder.java => DepositRequestDecoder.java} | 14 ++-- ...ncoder.java => DepositRequestEncoder.java} | 16 ++--- .../core/encoding/RequestDecoder.java | 2 +- .../core/encoding/RequestEncoder.java | 2 +- .../requests/DepositRequestProcessor.java | 13 ++-- ...ator.java => DepositRequestValidator.java} | 34 +++++----- .../requests/MainnetRequestsValidator.java | 2 +- .../mainnet/requests/RequestUtil.java | 15 +++-- ... => DepositRequestRequestDecoderTest.java} | 22 +++---- ... => DepositRequestRequestEncoderTest.java} | 14 ++-- ....java => DepositRequestValidatorTest.java} | 65 ++++++++++--------- .../MainnetBlockBodyValidatorTest.java | 8 ++- .../task/GetBodiesFromPeerTaskTest.java | 6 +- .../hyperledger/besu/evmtool/T8nExecutor.java | 4 +- plugin-api/build.gradle | 2 +- .../{Deposit.java => DepositRequest.java} | 2 +- 31 files changed, 237 insertions(+), 222 deletions(-) rename ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/{DepositParameter.java => DepositRequestParameter.java} (83%) rename ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/{DepositParameterTest.java => DepositRequestRequestParameterTest.java} (88%) rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/{Deposit.java => DepositRequest.java} (94%) rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/{DepositDecoder.java => DepositRequestDecoder.java} (86%) rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/{DepositEncoder.java => DepositRequestEncoder.java} (73%) rename ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/{DepositsValidator.java => DepositRequestValidator.java} (68%) rename ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/{DepositDecoderTest.java => DepositRequestRequestDecoderTest.java} (88%) rename ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/{DepositEncoderTest.java => DepositRequestRequestEncoderTest.java} (87%) rename ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/{DepositsValidatorTest.java => DepositRequestValidatorTest.java} (83%) rename plugin-api/src/main/java/org/hyperledger/besu/plugin/data/{Deposit.java => DepositRequest.java} (98%) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index d2faf8e7d..e8134fdb1 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -35,7 +35,7 @@ import org.hyperledger.besu.ethereum.BlockProcessingResult; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositParameter; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.EnginePayloadParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalRequestParameter; @@ -161,12 +161,12 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet reqId, new JsonRpcError(INVALID_PARAMS, "Invalid withdrawals")); } - final Optional> maybeDeposits = - Optional.ofNullable(blockParam.getDeposits()) - .map(ds -> ds.stream().map(DepositParameter::toDeposit).collect(toList())); + final Optional> maybeDepositRequests = + Optional.ofNullable(blockParam.getDepositRequests()) + .map(ds -> ds.stream().map(DepositRequestParameter::toDeposit).collect(toList())); if (!getDepositRequestValidator( protocolSchedule.get(), blockParam.getTimestamp(), blockParam.getBlockNumber()) - .validateParameter(maybeDeposits)) { + .validateParameter(maybeDepositRequests)) { return new JsonRpcErrorResponse( reqId, new JsonRpcError(INVALID_PARAMS, "Invalid deposit request")); } @@ -186,7 +186,7 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet } Optional> maybeRequests = - RequestUtil.combine(maybeDeposits, maybeWithdrawalRequests); + RequestUtil.combine(maybeDepositRequests, maybeWithdrawalRequests); if (mergeContext.get().isSyncing()) { LOG.debug("We are syncing"); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4.java index 83d406106..93060821f 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4.java @@ -63,7 +63,7 @@ public class EngineNewPayloadV4 extends AbstractEngineNewPayload { } else if (maybeBeaconBlockRootParam.isEmpty()) { return ValidationResult.invalid( RpcErrorType.INVALID_PARAMS, "Missing parent beacon block root field"); - } else if (payloadParameter.getDeposits() == null) { + } else if (payloadParameter.getDepositRequests() == null) { return ValidationResult.invalid(RpcErrorType.INVALID_PARAMS, "Missing deposit field"); } else { return ValidationResult.valid(); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositRequestParameter.java similarity index 83% rename from ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameter.java rename to ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositRequestParameter.java index e2a3a4d20..39d6476ca 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositRequestParameter.java @@ -17,7 +17,7 @@ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters; import org.hyperledger.besu.datatypes.BLSPublicKey; import org.hyperledger.besu.datatypes.BLSSignature; import org.hyperledger.besu.datatypes.GWei; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import java.util.Objects; @@ -28,7 +28,7 @@ import io.vertx.core.json.JsonObject; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; -public class DepositParameter { +public class DepositRequestParameter { private final String pubkey; @@ -39,7 +39,7 @@ public class DepositParameter { private final String index; @JsonCreator - public DepositParameter( + public DepositRequestParameter( @JsonProperty("pubkey") final String pubkey, @JsonProperty("withdrawalCredentials") final String withdrawalCredentials, @JsonProperty("amount") final String amount, @@ -52,17 +52,17 @@ public class DepositParameter { this.index = index; } - public static DepositParameter fromDeposit(final Deposit deposit) { - return new DepositParameter( - deposit.getPubkey().toString(), - deposit.getWithdrawalCredentials().toString(), - deposit.getAmount().toShortHexString(), - deposit.getSignature().toString(), - deposit.getIndex().toBytes().toQuantityHexString()); + public static DepositRequestParameter fromDeposit(final DepositRequest depositRequest) { + return new DepositRequestParameter( + depositRequest.getPubkey().toString(), + depositRequest.getWithdrawalCredentials().toString(), + depositRequest.getAmount().toShortHexString(), + depositRequest.getSignature().toString(), + depositRequest.getIndex().toBytes().toQuantityHexString()); } - public Deposit toDeposit() { - return new Deposit( + public DepositRequest toDeposit() { + return new DepositRequest( BLSPublicKey.fromHexString(pubkey), Bytes32.fromHexString(withdrawalCredentials), GWei.fromHexString(amount), @@ -108,7 +108,7 @@ public class DepositParameter { public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - final DepositParameter that = (DepositParameter) o; + final DepositRequestParameter that = (DepositRequestParameter) o; return Objects.equals(pubkey, that.pubkey) && Objects.equals(withdrawalCredentials, that.withdrawalCredentials) && Objects.equals(amount, that.amount) @@ -123,7 +123,7 @@ public class DepositParameter { @Override public String toString() { - return "DepositParameter{" + return "DepositRequestParameter{" + "pubKey='" + pubkey + '\'' diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java index a264c60ed..4fd24e15a 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java @@ -43,7 +43,7 @@ public class EnginePayloadParameter { private final List withdrawals; private final Long blobGasUsed; private final String excessBlobGas; - private final List deposits; + private final List depositRequests; private final List withdrawalRequests; /** @@ -66,7 +66,7 @@ public class EnginePayloadParameter { * @param withdrawals Array of Withdrawal * @param blobGasUsed QUANTITY, 64 Bits * @param excessBlobGas QUANTITY, 64 Bits - * @param deposits List of deposit parameters. + * @param depositRequests List of deposit parameters. * @param withdrawalRequestParameters List of withdrawal requests parameters. */ @JsonCreator @@ -88,7 +88,7 @@ public class EnginePayloadParameter { @JsonProperty("withdrawals") final List withdrawals, @JsonProperty("blobGasUsed") final UnsignedLongParameter blobGasUsed, @JsonProperty("excessBlobGas") final String excessBlobGas, - @JsonProperty("depositRequests") final List deposits, + @JsonProperty("depositRequests") final List depositRequests, @JsonProperty("withdrawalRequests") final List withdrawalRequestParameters) { this.blockHash = blockHash; @@ -108,7 +108,7 @@ public class EnginePayloadParameter { this.withdrawals = withdrawals; this.blobGasUsed = blobGasUsed == null ? null : blobGasUsed.getValue(); this.excessBlobGas = excessBlobGas; - this.deposits = deposits; + this.depositRequests = depositRequests; this.withdrawalRequests = withdrawalRequestParameters; } @@ -180,8 +180,8 @@ public class EnginePayloadParameter { return excessBlobGas; } - public List getDeposits() { - return deposits; + public List getDepositRequests() { + return depositRequests; } public List getWithdrawalRequests() { diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV4.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV4.java index 03a5082da..133fbabe6 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV4.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV4.java @@ -14,11 +14,11 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.results; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositParameter; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalRequestParameter; import org.hyperledger.besu.ethereum.core.BlockHeader; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Withdrawal; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; @@ -42,12 +42,12 @@ public class EngineGetPayloadResultV4 { final BlockHeader header, final List transactions, final Optional> withdrawals, - final Optional> deposits, + final Optional> depositRequests, final Optional> withdrawalRequests, final String blockValue, final BlobsBundleV1 blobsBundle) { this.executionPayload = - new PayloadResult(header, transactions, withdrawals, deposits, withdrawalRequests); + new PayloadResult(header, transactions, withdrawals, depositRequests, withdrawalRequests); this.blockValue = blockValue; this.blobsBundle = blobsBundle; this.shouldOverrideBuilder = false; @@ -94,14 +94,14 @@ public class EngineGetPayloadResultV4 { protected final List transactions; private final List withdrawals; - private final List deposits; + private final List depositRequests; private final List withdrawalRequests; public PayloadResult( final BlockHeader header, final List transactions, final Optional> withdrawals, - final Optional> deposits, + final Optional> depositRequests, final Optional> withdrawalRequests) { this.blockNumber = Quantity.create(header.getNumber()); this.blockHash = header.getHash().toString(); @@ -125,10 +125,13 @@ public class EngineGetPayloadResultV4 { .map(WithdrawalParameter::fromWithdrawal) .collect(Collectors.toList())) .orElse(null); - this.deposits = - deposits + this.depositRequests = + depositRequests .map( - ds -> ds.stream().map(DepositParameter::fromDeposit).collect(Collectors.toList())) + ds -> + ds.stream() + .map(DepositRequestParameter::fromDeposit) + .collect(Collectors.toList())) .orElse(null); this.withdrawalRequests = withdrawalRequests @@ -216,8 +219,8 @@ public class EngineGetPayloadResultV4 { } @JsonGetter(value = "depositRequests") - public List getDeposits() { - return deposits; + public List getDepositRequests() { + return depositRequests; } @JsonGetter(value = "withdrawalRequests") diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java index f0479bd7d..77952f6dc 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java @@ -105,7 +105,7 @@ public abstract class AbstractEngineGetPayloadTest extends AbstractScheduledApiT Collections.emptyList(), Optional.of(Collections.emptyList()), Optional.empty())); - private static final Block mockBlockWithDeposits = + private static final Block mockBlockWithDepositRequests = new Block( mockHeader, new BlockBody( @@ -116,8 +116,8 @@ public abstract class AbstractEngineGetPayloadTest extends AbstractScheduledApiT protected static final BlockWithReceipts mockBlockWithReceiptsAndWithdrawals = new BlockWithReceipts(mockBlockWithWithdrawals, Collections.emptyList()); - protected static final BlockWithReceipts mockBlockWithReceiptsAndDeposits = - new BlockWithReceipts(mockBlockWithDeposits, Collections.emptyList()); + protected static final BlockWithReceipts mockBlockWithReceiptsAndDepositRequests = + new BlockWithReceipts(mockBlockWithDepositRequests, Collections.emptyList()); @Mock protected ProtocolContext protocolContext; diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java index dba31f7f0..26d0dad95 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java @@ -38,7 +38,7 @@ import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositParameter; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.EnginePayloadParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.UnsignedLongParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalParameter; @@ -54,7 +54,7 @@ import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockBody; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.Withdrawal; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; @@ -410,7 +410,7 @@ public abstract class AbstractEngineNewPayloadTest extends AbstractScheduledApiT final BlockHeader header, final List txs, final List withdrawals, - final List deposits, + final List depositRequests, final List withdrawalRequests) { return new EnginePayloadParameter( header.getHash(), @@ -430,18 +430,18 @@ public abstract class AbstractEngineNewPayloadTest extends AbstractScheduledApiT withdrawals, header.getBlobGasUsed().map(UnsignedLongParameter::new).orElse(null), header.getExcessBlobGas().map(BlobGas::toHexString).orElse(null), - deposits, + depositRequests, withdrawalRequests); } protected BlockHeader setupValidPayload( final BlockProcessingResult value, final Optional> maybeWithdrawals, - final Optional> maybeDeposits, + final Optional> maybeDepositRequests, final Optional> maybeWithdrawalRequests) { BlockHeader mockHeader = - createBlockHeader(maybeWithdrawals, maybeDeposits, maybeWithdrawalRequests); + createBlockHeader(maybeWithdrawals, maybeDepositRequests, maybeWithdrawalRequests); when(blockchain.getBlockByHash(mockHeader.getHash())).thenReturn(Optional.empty()); // when(blockchain.getBlockHeader(mockHeader.getParentHash())) // .thenReturn(Optional.of(mock(BlockHeader.class))); @@ -474,21 +474,21 @@ public abstract class AbstractEngineNewPayloadTest extends AbstractScheduledApiT protected BlockHeader createBlockHeader( final Optional> maybeWithdrawals, - final Optional> maybeDeposits, + final Optional> maybeDepositRequests, final Optional> maybeWithdrawalRequests) { - return createBlockHeaderFixture(maybeWithdrawals, maybeDeposits, maybeWithdrawalRequests) + return createBlockHeaderFixture(maybeWithdrawals, maybeDepositRequests, maybeWithdrawalRequests) .buildHeader(); } protected BlockHeaderTestFixture createBlockHeaderFixture( final Optional> maybeWithdrawals, - final Optional> maybeDeposits, + final Optional> maybeDepositRequests, final Optional> maybeWithdrawalRequests) { Optional> maybeRequests; - if (maybeDeposits.isPresent() || maybeWithdrawalRequests.isPresent()) { + if (maybeDepositRequests.isPresent() || maybeWithdrawalRequests.isPresent()) { List requests = new ArrayList<>(); - maybeDeposits.ifPresent(requests::addAll); + maybeDepositRequests.ifPresent(requests::addAll); maybeWithdrawalRequests.ifPresent(requests::addAll); maybeRequests = Optional.of(requests); } else { diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV4Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV4Test.java index 68828619c..e8e4e821a 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV4Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV4Test.java @@ -71,7 +71,7 @@ public class EngineGetPayloadV4Test extends AbstractEngineGetPayloadTest { super.before(); lenient() .when(mergeContext.retrieveBlockById(mockPid)) - .thenReturn(Optional.of(mockBlockWithReceiptsAndDeposits)); + .thenReturn(Optional.of(mockBlockWithReceiptsAndDepositRequests)); when(protocolContext.safeConsensusContext(Mockito.any())).thenReturn(Optional.of(mergeContext)); this.method = new EngineGetPayloadV4( @@ -146,7 +146,7 @@ public class EngineGetPayloadV4Test extends AbstractEngineGetPayloadTest { assertThat(r.getResult()).isInstanceOf(EngineGetPayloadResultV4.class); final EngineGetPayloadResultV4 res = (EngineGetPayloadResultV4) r.getResult(); assertThat(res.getExecutionPayload().getWithdrawals()).isNotNull(); - assertThat(res.getExecutionPayload().getDeposits()).isNotNull(); + assertThat(res.getExecutionPayload().getDepositRequests()).isNotNull(); assertThat(res.getExecutionPayload().getWithdrawalRequests()).isNotNull(); assertThat(res.getExecutionPayload().getHash()) .isEqualTo(header.getHash().toString()); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java index 4604c8487..98a71ebf3 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java @@ -44,7 +44,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EnginePayloadS import org.hyperledger.besu.ethereum.core.BlobTestFixture; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionTestFixture; import org.hyperledger.besu.ethereum.core.Withdrawal; @@ -150,7 +150,7 @@ public class EngineNewPayloadV3Test extends EngineNewPayloadV2Test { @Override protected BlockHeader createBlockHeader( final Optional> maybeWithdrawals, - final Optional> maybeDeposits, + final Optional> maybeDepositRequests, final Optional> maybeWithdrawalRequests) { BlockHeader parentBlockHeader = new BlockHeaderTestFixture() diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java index 276eaf6b6..86b096cf1 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java @@ -33,19 +33,19 @@ import org.hyperledger.besu.ethereum.BlockProcessingOutputs; import org.hyperledger.besu.ethereum.BlockProcessingResult; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositParameter; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.EnginePayloadParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.Withdrawal; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; import org.hyperledger.besu.ethereum.mainnet.BodyValidation; -import org.hyperledger.besu.ethereum.mainnet.requests.DepositsValidator; +import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestValidator; import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator; import org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestValidator; import org.hyperledger.besu.evm.gascalculator.PragueGasCalculator; @@ -92,8 +92,8 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { } @Test - public void shouldReturnValidIfDepositsIsNull_WhenDepositsProhibited() { - final List deposits = null; + public void shouldReturnValidIfDepositRequestsIsNull_WhenDepositRequestsProhibited() { + final List depositRequests = null; mockProhibitedRequestsValidator(); BlockHeader mockHeader = @@ -108,22 +108,23 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { when(mergeCoordinator.getLatestValidAncestor(mockHeader)) .thenReturn(Optional.of(mockHeader.getHash())); - var resp = resp(mockEnginePayload(mockHeader, Collections.emptyList(), null, deposits, null)); + var resp = + resp(mockEnginePayload(mockHeader, Collections.emptyList(), null, depositRequests, null)); assertValidResponse(mockHeader, resp); } @Test - public void shouldReturnInvalidIfDepositsIsNull_WhenDepositsAllowed() { - final List deposits = null; - mockAllowedDepositsRequestValidator(); + public void shouldReturnInvalidIfDepositRequestsIsNull_WhenDepositRequestsAllowed() { + final List depositRequests = null; + mockAllowedDepositRequestsRequestValidator(); var resp = resp( mockEnginePayload( createBlockHeader(Optional.empty(), Optional.empty(), Optional.empty()), Collections.emptyList(), null, - deposits, + depositRequests, null)); assertThat(fromErrorResp(resp).getCode()).isEqualTo(INVALID_PARAMS.getCode()); @@ -131,15 +132,16 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { } @Test - public void shouldReturnValidIfDepositsIsNotNull_WhenDepositsAllowed() { - final List depositsParam = List.of(DEPOSIT_PARAM_1); - final List deposits = List.of(DEPOSIT_PARAM_1.toDeposit()); + public void shouldReturnValidIfDepositRequestsIsNotNull_WhenDepositRequestsAllowed() { + final List depositRequestsParam = List.of(DEPOSIT_PARAM_1); + final List depositRequests = List.of(DEPOSIT_PARAM_1.toDeposit()); - mockAllowedDepositsRequestValidator(); + mockAllowedDepositRequestsRequestValidator(); BlockHeader mockHeader = setupValidPayload( new BlockProcessingResult( - Optional.of(new BlockProcessingOutputs(null, List.of(), Optional.of(deposits)))), + Optional.of( + new BlockProcessingOutputs(null, List.of(), Optional.of(depositRequests)))), Optional.empty(), Optional.of(List.of(DEPOSIT_PARAM_1.toDeposit())), Optional.empty()); @@ -148,14 +150,16 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { when(mergeCoordinator.getLatestValidAncestor(mockHeader)) .thenReturn(Optional.of(mockHeader.getHash())); var resp = - resp(mockEnginePayload(mockHeader, Collections.emptyList(), null, depositsParam, null)); + resp( + mockEnginePayload( + mockHeader, Collections.emptyList(), null, depositRequestsParam, null)); assertValidResponse(mockHeader, resp); } @Test - public void shouldReturnInvalidIfDepositsIsNotNull_WhenDepositsProhibited() { - final List deposits = List.of(); + public void shouldReturnInvalidIfDepositRequestsIsNotNull_WhenDepositRequestsProhibited() { + final List depositRequests = List.of(); lenient() .when(protocolSpec.getRequestsValidatorCoordinator()) .thenReturn(RequestsValidatorCoordinator.empty()); @@ -167,7 +171,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { Optional.empty(), Optional.of(Collections.emptyList()), Optional.empty()), Collections.emptyList(), null, - deposits, + depositRequests, null)); final JsonRpcError jsonRpcError = fromErrorResp(resp); @@ -264,7 +268,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { @Override protected BlockHeader createBlockHeader( final Optional> maybeWithdrawals, - final Optional> maybeDeposits, + final Optional> maybeDepositRequests, final Optional> maybeWithdrawalRequests) { BlockHeader parentBlockHeader = new BlockHeaderTestFixture() @@ -275,9 +279,9 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { .buildHeader(); Optional> maybeRequests; - if (maybeDeposits.isPresent() || maybeWithdrawalRequests.isPresent()) { + if (maybeDepositRequests.isPresent() || maybeWithdrawalRequests.isPresent()) { List requests = new ArrayList<>(); - maybeDeposits.ifPresent(requests::addAll); + maybeDepositRequests.ifPresent(requests::addAll); maybeWithdrawalRequests.ifPresent(requests::addAll); maybeRequests = Optional.of(requests); } else { @@ -315,10 +319,10 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { when(protocolSpec.getRequestsValidatorCoordinator()).thenReturn(validator); } - private void mockAllowedDepositsRequestValidator() { + private void mockAllowedDepositRequestsRequestValidator() { var validator = new RequestsValidatorCoordinator.Builder() - .addValidator(RequestType.DEPOSIT, new DepositsValidator(depositContractAddress)) + .addValidator(RequestType.DEPOSIT, new DepositRequestValidator(depositContractAddress)) .build(); when(protocolSpec.getRequestsValidatorCoordinator()).thenReturn(validator); } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameterTestFixture.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameterTestFixture.java index 575b73c73..f3f5f420b 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameterTestFixture.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameterTestFixture.java @@ -16,14 +16,14 @@ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters; public class DepositParameterTestFixture { - public static final DepositParameter DEPOSIT_PARAM_1 = + public static final DepositRequestParameter DEPOSIT_PARAM_1 = createDeposit( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e", "0x0017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483", "0x773594000", "0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5", "0x1"); - static final DepositParameter DEPOSIT_PARAM_2 = + static final DepositRequestParameter DEPOSIT_PARAM_2 = createDeposit( "0x8706d19a62f28a6a6549f96c5adaebac9124a61d44868ec94f6d2d707c6a2f82c9162071231dfeb40e24bfde4ffdf243", "0x006a8dc800c6d8dd6977ef53264e2d030350f0145a91bcd167b4f1c3ea21b271", @@ -31,12 +31,12 @@ public class DepositParameterTestFixture { "0x801b08ca107b623eca32ee9f9111b4e50eb9cfe19e38204b72de7dc04c5a5e00f61bab96f10842576f66020ce851083f1583dd9a6b73301bea6c245cf51f27cf96aeb018852c5f70bf485d16b957cfe49ca008913346b431e7653ae3ddb23b07", "0x3"); - private static DepositParameter createDeposit( + private static DepositRequestParameter createDeposit( final String pubKey, final String withdrawalCredentials, final String amount, final String signature, final String index) { - return new DepositParameter(pubKey, withdrawalCredentials, amount, signature, index); + return new DepositRequestParameter(pubKey, withdrawalCredentials, amount, signature, index); } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameterTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositRequestRequestParameterTest.java similarity index 88% rename from ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameterTest.java rename to ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositRequestRequestParameterTest.java index 56dfed3fd..ce5780641 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositParameterTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/DepositRequestRequestParameterTest.java @@ -20,18 +20,18 @@ import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.Depo import org.hyperledger.besu.datatypes.BLSPublicKey; import org.hyperledger.besu.datatypes.BLSSignature; import org.hyperledger.besu.datatypes.GWei; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; import org.junit.jupiter.api.Test; -public class DepositParameterTest { +public class DepositRequestRequestParameterTest { @Test public void toDeposit() { - Deposit expected = - new Deposit( + DepositRequest expected = + new DepositRequest( BLSPublicKey.fromHexString( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), Bytes32.fromHexString( @@ -45,8 +45,8 @@ public class DepositParameterTest { @Test public void fromDeposit() { - Deposit deposit = - new Deposit( + DepositRequest depositRequest = + new DepositRequest( BLSPublicKey.fromHexString( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), Bytes32.fromHexString( @@ -56,6 +56,6 @@ public class DepositParameterTest { "0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"), UInt64.ONE); - assertThat(DepositParameter.fromDeposit(deposit)).isEqualTo(DEPOSIT_PARAM_1); + assertThat(DepositRequestParameter.fromDeposit(depositRequest)).isEqualTo(DEPOSIT_PARAM_1); } } 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 103b8fdb6..856bf874b 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 @@ -47,7 +47,7 @@ import org.hyperledger.besu.ethereum.core.BlobTestFixture; import org.hyperledger.besu.ethereum.core.BlockDataGenerator; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockHeaderBuilder; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Difficulty; import org.hyperledger.besu.ethereum.core.ExecutionContextTestFixture; import org.hyperledger.besu.ethereum.core.ImmutableMiningParameters; @@ -76,7 +76,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor; import org.hyperledger.besu.ethereum.mainnet.feemarket.CancunFeeMarket; import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor; -import org.hyperledger.besu.ethereum.mainnet.requests.DepositsValidator; +import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestValidator; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator; import org.hyperledger.besu.evm.internal.EvmConfiguration; @@ -106,7 +106,7 @@ abstract class AbstractBlockCreatorTest { protected EthScheduler ethScheduler = new DeterministicEthScheduler(); @Test - void findDepositsFromReceipts() { + void findDepositRequestsFromReceipts() { BlockDataGenerator blockDataGenerator = new BlockDataGenerator(); TransactionReceipt receiptWithoutDeposit1 = blockDataGenerator.receipt(); TransactionReceipt receiptWithoutDeposit2 = blockDataGenerator.receipt(); @@ -122,8 +122,8 @@ abstract class AbstractBlockCreatorTest { List receipts = List.of(receiptWithoutDeposit1, receiptWithDeposit, receiptWithoutDeposit2); - Deposit expectedDeposit = - new Deposit( + DepositRequest expectedDepositRequest = + new DepositRequest( BLSPublicKey.fromHexString( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), Bytes32.fromHexString( @@ -132,17 +132,17 @@ abstract class AbstractBlockCreatorTest { BLSSignature.fromHexString( "0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"), UInt64.valueOf(539967)); - final List expectedDeposits = List.of(expectedDeposit); + final List expectedDepositRequests = List.of(expectedDepositRequest); - var depositsFromReceipts = + var depositRequestsFromReceipts = new DepositRequestProcessor(DEFAULT_DEPOSIT_CONTRACT_ADDRESS).process(null, receipts); - assertThat(depositsFromReceipts.get()).isEqualTo(expectedDeposits); + assertThat(depositRequestsFromReceipts.get()).isEqualTo(expectedDepositRequests); } @Test - void withAllowedDepositsAndContractAddress_DepositsAreParsed() { + void withAllowedDepositRequestsAndContractAddress_DepositRequestsAreParsed() { final AbstractBlockCreator blockCreator = - blockCreatorWithAllowedDeposits(DEFAULT_DEPOSIT_CONTRACT_ADDRESS); + blockCreatorWithAllowedDepositRequests(DEFAULT_DEPOSIT_CONTRACT_ADDRESS); final BlockCreationResult blockCreationResult = blockCreator.createBlock( @@ -154,15 +154,15 @@ abstract class AbstractBlockCreatorTest { 1L, false); - List deposits = emptyList(); - final Hash requestsRoot = BodyValidation.requestsRoot(deposits); + List depositRequests = emptyList(); + final Hash requestsRoot = BodyValidation.requestsRoot(depositRequests); assertThat(blockCreationResult.getBlock().getHeader().getRequestsRoot()).hasValue(requestsRoot); - assertThat(blockCreationResult.getBlock().getBody().getRequests()).hasValue(deposits); + assertThat(blockCreationResult.getBlock().getBody().getRequests()).hasValue(depositRequests); } @Test - void withAllowedDepositsAndNoContractAddress_DepositsAreNotParsed() { - final AbstractBlockCreator blockCreator = blockCreatorWithAllowedDeposits(null); + void withAllowedDepositRequestsAndNoContractAddress_DepositRequestsAreNotParsed() { + final AbstractBlockCreator blockCreator = blockCreatorWithAllowedDepositRequests(null); final BlockCreationResult blockCreationResult = blockCreator.createBlock( @@ -179,8 +179,8 @@ abstract class AbstractBlockCreatorTest { } @Test - void withProhibitedDeposits_DepositsAreNotParsed() { - final AbstractBlockCreator blockCreator = blockCreatorWithProhibitedDeposits(); + void withProhibitedDepositRequests_DepositRequestsAreNotParsed() { + final AbstractBlockCreator blockCreator = blockCreatorWithProhibitedDepositRequests(); final BlockCreationResult blockCreationResult = blockCreator.createBlock( @@ -196,7 +196,7 @@ abstract class AbstractBlockCreatorTest { assertThat(blockCreationResult.getBlock().getBody().getRequests()).isEmpty(); } - private AbstractBlockCreator blockCreatorWithAllowedDeposits( + private AbstractBlockCreator blockCreatorWithAllowedDepositRequests( final Address depositContractAddress) { final ProtocolSpecAdapters protocolSpecAdapters = ProtocolSpecAdapters.create( @@ -207,7 +207,7 @@ abstract class AbstractBlockCreatorTest { new RequestsValidatorCoordinator.Builder() .addValidator( RequestType.DEPOSIT, - new DepositsValidator((depositContractAddress))) + new DepositRequestValidator((depositContractAddress))) .build()) .requestProcessorCoordinator( new RequestProcessorCoordinator.Builder() @@ -218,7 +218,7 @@ abstract class AbstractBlockCreatorTest { return createBlockCreator(protocolSpecAdapters); } - private AbstractBlockCreator blockCreatorWithProhibitedDeposits() { + private AbstractBlockCreator blockCreatorWithProhibitedDepositRequests() { final ProtocolSpecAdapters protocolSpecAdapters = ProtocolSpecAdapters.create(0, specBuilder -> specBuilder); return createBlockCreator(protocolSpecAdapters); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockBody.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockBody.java index c14722edc..4b8ab9261 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockBody.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockBody.java @@ -147,7 +147,7 @@ public class BlockBody implements org.hyperledger.besu.plugin.data.BlockBody { /** * Read all fields from the block body expecting no list wrapping them. An example of a valid body - * would be: [txs],[ommers],[withdrawals],[deposits] this method is called directly when importing + * would be: [txs],[ommers],[withdrawals],[requests] this method is called directly when importing * a single block * * @param input The RLP-encoded input diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Deposit.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/DepositRequest.java similarity index 94% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Deposit.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/DepositRequest.java index 6a6476069..a005fa831 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Deposit.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/DepositRequest.java @@ -25,7 +25,8 @@ import java.util.Objects; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; -public class Deposit extends Request implements org.hyperledger.besu.plugin.data.Deposit { +public class DepositRequest extends Request + implements org.hyperledger.besu.plugin.data.DepositRequest { private final BLSPublicKey pubkey; private final Bytes32 depositWithdrawalCredentials; @@ -33,7 +34,7 @@ public class Deposit extends Request implements org.hyperledger.besu.plugin.data private final BLSSignature signature; private final UInt64 index; - public Deposit( + public DepositRequest( final BLSPublicKey pubkey, final Bytes32 depositWithdrawalCredentials, final GWei amount, @@ -96,7 +97,7 @@ public class Deposit extends Request implements org.hyperledger.besu.plugin.data public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - final Deposit that = (Deposit) o; + final DepositRequest that = (DepositRequest) o; return Objects.equals(pubkey, that.pubkey) && Objects.equals(depositWithdrawalCredentials, that.depositWithdrawalCredentials) && Objects.equals(amount, that.amount) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositDecoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestDecoder.java similarity index 86% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositDecoder.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestDecoder.java index 05fd5498e..85b56e1a5 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositDecoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestDecoder.java @@ -17,8 +17,8 @@ package org.hyperledger.besu.ethereum.core.encoding; import org.hyperledger.besu.datatypes.BLSPublicKey; import org.hyperledger.besu.datatypes.BLSSignature; import org.hyperledger.besu.datatypes.GWei; -import org.hyperledger.besu.ethereum.core.Deposit; import org.hyperledger.besu.ethereum.core.DepositContract; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.rlp.RLP; import org.hyperledger.besu.ethereum.rlp.RLPInput; import org.hyperledger.besu.evm.log.Log; @@ -30,9 +30,9 @@ import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; import org.web3j.tx.Contract; -public class DepositDecoder { +public class DepositRequestDecoder { - public static Deposit decode(final RLPInput rlpInput) { + public static DepositRequest decode(final RLPInput rlpInput) { rlpInput.enterList(); final BLSPublicKey publicKey = BLSPublicKey.readFrom(rlpInput); final Bytes32 depositWithdrawalCredential = Bytes32.wrap(rlpInput.readBytes()); @@ -41,10 +41,10 @@ public class DepositDecoder { final UInt64 index = UInt64.valueOf(rlpInput.readBigIntegerScalar()); rlpInput.leaveList(); - return new Deposit(publicKey, depositWithdrawalCredential, amount, signature, index); + return new DepositRequest(publicKey, depositWithdrawalCredential, amount, signature, index); } - public static Deposit decodeFromLog(final Log log) { + public static DepositRequest decodeFromLog(final Log log) { Contract.EventValuesWithLog eventValues = DepositContract.staticExtractDepositEventWithLog(log); final byte[] rawPublicKey = (byte[]) eventValues.getNonIndexedValues().get(0).getValue(); final byte[] rawWithdrawalCredential = @@ -53,7 +53,7 @@ public class DepositDecoder { final byte[] rawSignature = (byte[]) eventValues.getNonIndexedValues().get(3).getValue(); final byte[] rawIndex = (byte[]) eventValues.getNonIndexedValues().get(4).getValue(); - return new Deposit( + return new DepositRequest( BLSPublicKey.wrap(Bytes.wrap(rawPublicKey)), Bytes32.wrap(Bytes.wrap(rawWithdrawalCredential)), GWei.of( @@ -64,7 +64,7 @@ public class DepositDecoder { UInt64.valueOf(Bytes.wrap(rawIndex).reverse().toLong())); } - public static Deposit decodeOpaqueBytes(final Bytes input) { + public static DepositRequest decodeOpaqueBytes(final Bytes input) { return decode(RLP.input(input)); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestEncoder.java similarity index 73% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoder.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestEncoder.java index f40a28a63..a99b0b761 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestEncoder.java @@ -14,25 +14,25 @@ */ package org.hyperledger.besu.ethereum.core.encoding; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.rlp.RLP; import org.hyperledger.besu.ethereum.rlp.RLPOutput; import org.apache.tuweni.bytes.Bytes; -public class DepositEncoder { +public class DepositRequestEncoder { public static void encode(final Request request, final RLPOutput rlpOutput) { - if (!(request instanceof Deposit deposit)) { + if (!(request instanceof DepositRequest depositRequest)) { throw new IllegalArgumentException("The provided request is not of type deposit."); } rlpOutput.startList(); - rlpOutput.writeBytes(deposit.getPubkey()); - rlpOutput.writeBytes(deposit.getWithdrawalCredentials()); - rlpOutput.writeUInt64Scalar(deposit.getAmount()); - rlpOutput.writeBytes(deposit.getSignature()); - rlpOutput.writeUInt64Scalar(deposit.getIndex()); + rlpOutput.writeBytes(depositRequest.getPubkey()); + rlpOutput.writeBytes(depositRequest.getWithdrawalCredentials()); + rlpOutput.writeUInt64Scalar(depositRequest.getAmount()); + rlpOutput.writeBytes(depositRequest.getSignature()); + rlpOutput.writeUInt64Scalar(depositRequest.getIndex()); rlpOutput.endList(); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestDecoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestDecoder.java index 1eb85cc4a..4953cbb84 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestDecoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestDecoder.java @@ -41,7 +41,7 @@ public class RequestDecoder { RequestType.WITHDRAWAL, WithdrawalRequestDecoder::decode, RequestType.DEPOSIT, - DepositDecoder::decode); + DepositRequestDecoder::decode); /** * Decodes a request from its RLP encoded bytes. diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestEncoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestEncoder.java index d62d924a3..4f79da453 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestEncoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestEncoder.java @@ -38,7 +38,7 @@ public class RequestEncoder { RequestType.WITHDRAWAL, WithdrawalRequestEncoder::encode, RequestType.DEPOSIT, - DepositEncoder::encode); + DepositRequestEncoder::encode); /** * Encodes a Request into the provided RLPOutput. diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java index 766ce1f94..ce3ed6a5f 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java @@ -15,11 +15,11 @@ package org.hyperledger.besu.ethereum.mainnet.requests; import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.TransactionReceipt; -import org.hyperledger.besu.ethereum.core.encoding.DepositDecoder; +import org.hyperledger.besu.ethereum.core.encoding.DepositRequestDecoder; import java.util.Collections; import java.util.List; @@ -44,19 +44,20 @@ public class DepositRequestProcessor implements RequestProcessor { if (depositContractAddress.isEmpty()) { return Optional.empty(); } - List deposits = findDepositsFromReceipts(transactionReceipts); - return Optional.of(deposits); + List depositRequests = findDepositRequestsFromReceipts(transactionReceipts); + return Optional.of(depositRequests); } @VisibleForTesting - List findDepositsFromReceipts(final List transactionReceipts) { + List findDepositRequestsFromReceipts( + final List transactionReceipts) { return depositContractAddress .map( address -> transactionReceipts.stream() .flatMap(receipt -> receipt.getLogsList().stream()) .filter(log -> address.equals(log.getLogger())) - .map(DepositDecoder::decodeFromLog) + .map(DepositRequestDecoder::decodeFromLog) .toList()) .orElse(Collections.emptyList()); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositsValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestValidator.java similarity index 68% rename from ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositsValidator.java rename to ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestValidator.java index 6a2d3bdc5..6c9eedf30 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositsValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestValidator.java @@ -18,10 +18,10 @@ import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getDepo import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.ethereum.core.Block; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.TransactionReceipt; -import org.hyperledger.besu.ethereum.core.encoding.DepositDecoder; +import org.hyperledger.besu.ethereum.core.encoding.DepositRequestDecoder; import org.hyperledger.besu.evm.log.Log; import java.util.ArrayList; @@ -32,44 +32,46 @@ import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class DepositsValidator implements RequestValidator { +public class DepositRequestValidator implements RequestValidator { - private static final Logger LOG = LoggerFactory.getLogger(DepositsValidator.class); + private static final Logger LOG = LoggerFactory.getLogger(DepositRequestValidator.class); private final Address depositContractAddress; - public DepositsValidator(final Address depositContractAddress) { + public DepositRequestValidator(final Address depositContractAddress) { this.depositContractAddress = depositContractAddress; } @Override - public boolean validateParameter(final Optional> deposits) { - return deposits.isPresent(); + public boolean validateParameter(final Optional> depositRequests) { + return depositRequests.isPresent(); } - public boolean validateDeposits( + public boolean validateDepositRequests( final Block block, - final List actualDeposits, + final List actualDepositRequests, final List receipts) { - List expectedDeposits = new ArrayList<>(); + List expectedDepositRequests = new ArrayList<>(); for (TransactionReceipt receipt : receipts) { for (Log log : receipt.getLogsList()) { if (depositContractAddress.equals(log.getLogger())) { - Deposit deposit = DepositDecoder.decodeFromLog(log); - expectedDeposits.add(deposit); + DepositRequest depositRequest = DepositRequestDecoder.decodeFromLog(log); + expectedDepositRequests.add(depositRequest); } } } - boolean isValid = actualDeposits.equals(expectedDeposits); + boolean isValid = actualDepositRequests.equals(expectedDepositRequests); if (!isValid) { LOG.warn( "Deposits validation failed. Deposits from block body do not match deposits from logs. Block hash: {}", block.getHash()); LOG.debug( - "Deposits from logs: {}, deposits from block body: {}", expectedDeposits, actualDeposits); + "Deposits from logs: {}, deposits from block body: {}", + expectedDepositRequests, + actualDepositRequests); } return isValid; @@ -78,7 +80,7 @@ public class DepositsValidator implements RequestValidator { @Override public boolean validate( final Block block, final List requests, final List receipts) { - var deposits = getDepositRequests(Optional.of(requests)).orElse(Collections.emptyList()); - return validateDeposits(block, deposits, receipts); + var depositRequests = getDepositRequests(Optional.of(requests)).orElse(Collections.emptyList()); + return validateDepositRequests(block, depositRequests, receipts); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java index 9f9b4539d..56e47aea5 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java @@ -22,7 +22,7 @@ public class MainnetRequestsValidator { final Address depositContractAddress) { return new RequestsValidatorCoordinator.Builder() .addValidator(RequestType.WITHDRAWAL, new WithdrawalRequestValidator()) - .addValidator(RequestType.DEPOSIT, new DepositsValidator(depositContractAddress)) + .addValidator(RequestType.DEPOSIT, new DepositRequestValidator(depositContractAddress)) .build(); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java index 3d85fc48f..459fdbe11 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.ethereum.mainnet.requests; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; @@ -42,8 +42,9 @@ public class RequestUtil { return requests.stream().filter(requestType::isInstance).map(requestType::cast).toList(); } - public static Optional> getDepositRequests(final Optional> requests) { - return requests.map(r -> filterRequestsOfType(r, Deposit.class)); + public static Optional> getDepositRequests( + final Optional> requests) { + return requests.map(r -> filterRequestsOfType(r, DepositRequest.class)); } public static Optional> getWithdrawalRequests( @@ -54,19 +55,19 @@ public class RequestUtil { /** * Combines two optional lists of requests into a single optional list. * - * @param maybeDeposits Optional list of deposit requests. + * @param maybeDepositRequests Optional list of deposit requests. * @param maybeWithdrawalRequest Optional list of withdrawal requests. * @return An Optional containing the combined list of requests, or an empty Optional if both * inputs are empty. */ public static Optional> combine( - final Optional> maybeDeposits, + final Optional> maybeDepositRequests, final Optional> maybeWithdrawalRequest) { - if (maybeDeposits.isEmpty() && maybeWithdrawalRequest.isEmpty()) { + if (maybeDepositRequests.isEmpty() && maybeWithdrawalRequest.isEmpty()) { return Optional.empty(); } List requests = new ArrayList<>(); - maybeDeposits.ifPresent(requests::addAll); + maybeDepositRequests.ifPresent(requests::addAll); maybeWithdrawalRequest.ifPresent(requests::addAll); return Optional.of(requests); } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositDecoderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestDecoderTest.java similarity index 88% rename from ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositDecoderTest.java rename to ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestDecoderTest.java index 131cd0899..0a6cee956 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositDecoderTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestDecoderTest.java @@ -20,7 +20,7 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.BLSPublicKey; import org.hyperledger.besu.datatypes.BLSSignature; import org.hyperledger.besu.datatypes.GWei; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.evm.log.Log; import org.hyperledger.besu.evm.log.LogTopic; @@ -31,11 +31,11 @@ import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; import org.junit.jupiter.api.Test; -class DepositDecoderTest { +class DepositRequestRequestDecoderTest { @Test void shouldDecodeDeposit() { - final Deposit expectedDeposit = - new Deposit( + final DepositRequest expectedDepositRequest = + new DepositRequest( BLSPublicKey.fromHexString( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), Bytes32.fromHexString( @@ -45,12 +45,12 @@ class DepositDecoderTest { "0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"), UInt64.ONE); - final Deposit deposit = - DepositDecoder.decodeOpaqueBytes( + final DepositRequest depositRequest = + DepositRequestDecoder.decodeOpaqueBytes( Bytes.fromHexString( "0xf8bbb0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416ea00017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483850773594000b860a889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb501")); - assertThat(deposit).isEqualTo(expectedDeposit); + assertThat(depositRequest).isEqualTo(expectedDepositRequest); } @Test @@ -65,10 +65,10 @@ class DepositDecoderTest { "0x00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483000000000000000000000000000000000000000000000000000000000000000800405973070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb500000000000000000000000000000000000000000000000000000000000000083f3d080000000000000000000000000000000000000000000000000000000000"); final Log log = new Log(address, data, topics); - final Deposit deposit = DepositDecoder.decodeFromLog(log); + final DepositRequest depositRequest = DepositRequestDecoder.decodeFromLog(log); - final Deposit expectedDeposit = - new Deposit( + final DepositRequest expectedDepositRequest = + new DepositRequest( BLSPublicKey.fromHexString( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), Bytes32.fromHexString( @@ -78,6 +78,6 @@ class DepositDecoderTest { "0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"), UInt64.valueOf(539967)); - assertThat(deposit).isEqualTo(expectedDeposit); + assertThat(depositRequest).isEqualTo(expectedDepositRequest); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestEncoderTest.java similarity index 87% rename from ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoderTest.java rename to ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestEncoderTest.java index 7b4052cff..8f0de595f 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoderTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestEncoderTest.java @@ -19,19 +19,19 @@ import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.datatypes.BLSPublicKey; import org.hyperledger.besu.datatypes.BLSSignature; import org.hyperledger.besu.datatypes.GWei; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; import org.junit.jupiter.api.Test; -class DepositEncoderTest { +class DepositRequestRequestEncoderTest { private final String expectedDepositEncodedBytes = "f8bbb0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416ea00017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483850773594000b860a889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb501"; - final Deposit deposit = - new Deposit( + final DepositRequest depositRequest = + new DepositRequest( BLSPublicKey.fromHexString( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), Bytes32.fromHexString( @@ -43,19 +43,19 @@ class DepositEncoderTest { @Test void shouldEncodeDeposit() { - final Bytes encoded = DepositEncoder.encodeOpaqueBytes(deposit); + final Bytes encoded = DepositRequestEncoder.encodeOpaqueBytes(depositRequest); assertThat(encoded).isEqualTo(Bytes.fromHexString(expectedDepositEncodedBytes)); } @Test void shouldEncodeDepositRequest() { - final Bytes encoded = RequestEncoder.encodeOpaqueBytes(deposit); + final Bytes encoded = RequestEncoder.encodeOpaqueBytes(depositRequest); // Request encoding is Request = RequestType ++ RequestData assertThat(encoded) .isEqualTo( Bytes.fromHexString( String.format( "0x%02X%s", - deposit.getType().getSerializedType(), expectedDepositEncodedBytes))); + depositRequest.getType().getSerializedType(), expectedDepositEncodedBytes))); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DepositsValidatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DepositRequestValidatorTest.java similarity index 83% rename from ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DepositsValidatorTest.java rename to ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DepositRequestValidatorTest.java index 99eae1437..036003238 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DepositsValidatorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/DepositRequestValidatorTest.java @@ -23,10 +23,10 @@ import org.hyperledger.besu.datatypes.GWei; import org.hyperledger.besu.datatypes.RequestType; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockDataGenerator; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.TransactionReceipt; -import org.hyperledger.besu.ethereum.mainnet.requests.DepositsValidator; +import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestValidator; import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator; import org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestValidator; import org.hyperledger.besu.evm.log.Log; @@ -41,20 +41,20 @@ import org.apache.tuweni.units.bigints.UInt64; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -public class DepositsValidatorTest { +public class DepositRequestValidatorTest { private final BlockDataGenerator blockDataGenerator = new BlockDataGenerator(); - private static Deposit DEPOSIT_1; - private static Deposit DEPOSIT_2; + private static DepositRequest depositRequest1; + private static DepositRequest depositRequest2; private static Log LOG_1; private static Log LOG_2; private static Address DEPOSIT_CONTRACT_ADDRESS; private static RequestsValidatorCoordinator requestsValidatorCoordinator; - private static DepositsValidator depositsValidator; + private static DepositRequestValidator depositRequestValidator; @BeforeAll public static void setup() { - DEPOSIT_1 = - new Deposit( + depositRequest1 = + new DepositRequest( BLSPublicKey.fromHexString( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), Bytes32.fromHexString( @@ -64,8 +64,8 @@ public class DepositsValidatorTest { "0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"), UInt64.valueOf(539967)); - DEPOSIT_2 = - new Deposit( + depositRequest2 = + new DepositRequest( BLSPublicKey.fromHexString( "0x8706d19a62f28a6a6549f96c5adaebac9124a61d44868ec94f6d2d707c6a2f82c9162071231dfeb40e24bfde4ffdf243"), Bytes32.fromHexString( @@ -97,8 +97,8 @@ public class DepositsValidatorTest { } @Test - public void validateAllowedDeposits() { - final List request = List.of(DEPOSIT_1, DEPOSIT_2); + public void validateAllowedDepositRequests() { + final List request = List.of(depositRequest1, depositRequest2); final BlockDataGenerator.BlockOptions blockOptions = BlockDataGenerator.BlockOptions.create() .setRequests(Optional.of(request)) @@ -113,9 +113,9 @@ public class DepositsValidatorTest { } @Test - public void validateAllowedDepositsSeparateReceipts() { + public void validateAllowedDepositRequestsSeparateReceipts() { - final List requests = List.of(DEPOSIT_1, DEPOSIT_2); + final List requests = List.of(depositRequest1, depositRequest2); final BlockDataGenerator.BlockOptions blockOptions = BlockDataGenerator.BlockOptions.create() @@ -135,9 +135,9 @@ public class DepositsValidatorTest { } @Test - public void invalidateAllowedDeposits() { + public void invalidateAllowedDepositRequests() { final BlockDataGenerator.BlockOptions blockOptions = - BlockDataGenerator.BlockOptions.create().setRequests(Optional.of(List.of(DEPOSIT_1))); + BlockDataGenerator.BlockOptions.create().setRequests(Optional.of(List.of(depositRequest1))); final Block block = blockDataGenerator.block(blockOptions); final TransactionReceipt receipt1 = @@ -149,10 +149,10 @@ public class DepositsValidatorTest { } @Test - public void invalidateAllowedDepositsMissingLogInReceipt() { + public void invalidateAllowedDepositRequestsMissingLogInReceipt() { final BlockDataGenerator.BlockOptions blockOptions = BlockDataGenerator.BlockOptions.create() - .setRequests(Optional.of(List.of(DEPOSIT_1, DEPOSIT_2))); + .setRequests(Optional.of(List.of(depositRequest1, depositRequest2))); final Block block = blockDataGenerator.block(blockOptions); final TransactionReceipt receipt1 = @@ -164,9 +164,9 @@ public class DepositsValidatorTest { } @Test - public void invalidateAllowedDepositsExtraLogInReceipt() { + public void invalidateAllowedDepositRequestsExtraLogInReceipt() { final BlockDataGenerator.BlockOptions blockOptions = - BlockDataGenerator.BlockOptions.create().setRequests(Optional.of(List.of(DEPOSIT_1))); + BlockDataGenerator.BlockOptions.create().setRequests(Optional.of(List.of(depositRequest1))); final Block block = blockDataGenerator.block(blockOptions); final TransactionReceipt receipt1 = @@ -178,10 +178,10 @@ public class DepositsValidatorTest { } @Test - public void invalidateAllowedDepositsWrongOrder() { + public void invalidateAllowedDepositRequestsWrongOrder() { final BlockDataGenerator.BlockOptions blockOptions = BlockDataGenerator.BlockOptions.create() - .setRequests(Optional.of(List.of(DEPOSIT_1, DEPOSIT_2))); + .setRequests(Optional.of(List.of(depositRequest1, depositRequest2))); final Block block = blockDataGenerator.block(blockOptions); final TransactionReceipt receipt1 = @@ -193,11 +193,11 @@ public class DepositsValidatorTest { } @Test - public void invalidateAllowedDepositsMismatchContractAddress() { + public void invalidateAllowedDepositRequestsMismatchContractAddress() { final BlockDataGenerator.BlockOptions blockOptions = BlockDataGenerator.BlockOptions.create() - .setRequests(Optional.of(List.of(DEPOSIT_1, DEPOSIT_2))); + .setRequests(Optional.of(List.of(depositRequest1, depositRequest2))); final Block block = blockDataGenerator.block(blockOptions); final TransactionReceipt receipt1 = @@ -210,24 +210,25 @@ public class DepositsValidatorTest { @Test public void validateAllowedDepositParams() { - final Optional> deposits = Optional.of(List.of(DEPOSIT_1, DEPOSIT_2)); - assertThat(depositsValidator.validateParameter(deposits)).isTrue(); + final Optional> depositRequests = + Optional.of(List.of(depositRequest1, depositRequest2)); + assertThat(depositRequestValidator.validateParameter(depositRequests)).isTrue(); - final Optional> emptyDeposits = Optional.of(List.of()); - assertThat(depositsValidator.validateParameter(emptyDeposits)).isTrue(); + final Optional> emptyDepositRequests = Optional.of(List.of()); + assertThat(depositRequestValidator.validateParameter(emptyDepositRequests)).isTrue(); } @Test public void invalidateAllowedDepositParams() { - final Optional> deposits = Optional.empty(); - assertThat(depositsValidator.validateParameter(deposits)).isFalse(); + final Optional> depositRequests = Optional.empty(); + assertThat(depositRequestValidator.validateParameter(depositRequests)).isFalse(); } static RequestsValidatorCoordinator createAllowDepositValidator() { - depositsValidator = new DepositsValidator(DEPOSIT_CONTRACT_ADDRESS); + depositRequestValidator = new DepositRequestValidator(DEPOSIT_CONTRACT_ADDRESS); return new RequestsValidatorCoordinator.Builder() .addValidator(RequestType.WITHDRAWAL, new WithdrawalRequestValidator()) - .addValidator(RequestType.DEPOSIT, depositsValidator) + .addValidator(RequestType.DEPOSIT, depositRequestValidator) .build(); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockBodyValidatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockBodyValidatorTest.java index dfc1f2d04..c116d545d 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockBodyValidatorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockBodyValidatorTest.java @@ -28,7 +28,7 @@ import org.hyperledger.besu.ethereum.core.BlockDataGenerator; import org.hyperledger.besu.ethereum.core.BlockDataGenerator.BlockOptions; import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil; import org.hyperledger.besu.ethereum.core.Withdrawal; -import org.hyperledger.besu.ethereum.mainnet.requests.DepositsValidator; +import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestValidator; import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator; import org.hyperledger.besu.evm.log.LogsBloomFilter; @@ -53,7 +53,7 @@ class MainnetBlockBodyValidatorTest { @Mock private ProtocolSchedule protocolSchedule; @Mock private ProtocolSpec protocolSpec; @Mock private WithdrawalsValidator withdrawalsValidator; - @Mock private DepositsValidator depositsValidator; + @Mock private DepositRequestValidator depositRequestValidator; @Mock private RequestsValidatorCoordinator requestValidator; @BeforeEach @@ -64,7 +64,9 @@ class MainnetBlockBodyValidatorTest { lenient().when(withdrawalsValidator.validateWithdrawals(any())).thenReturn(true); lenient().when(withdrawalsValidator.validateWithdrawalsRoot(any())).thenReturn(true); - lenient().when(depositsValidator.validateDeposits(any(), any(), any())).thenReturn(true); + lenient() + .when(depositRequestValidator.validateDepositRequests(any(), any(), any())) + .thenReturn(true); lenient().when(protocolSpec.getRequestsValidatorCoordinator()).thenReturn(requestValidator); lenient().when(requestValidator.validate(any(), any(), any())).thenReturn(true); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/task/GetBodiesFromPeerTaskTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/task/GetBodiesFromPeerTaskTest.java index b6c635551..b8546ad53 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/task/GetBodiesFromPeerTaskTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/task/GetBodiesFromPeerTaskTest.java @@ -24,7 +24,7 @@ import org.hyperledger.besu.datatypes.GWei; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockBody; import org.hyperledger.besu.ethereum.core.BlockHeader; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.Withdrawal; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; @@ -89,9 +89,9 @@ public class GetBodiesFromPeerTaskTest extends PeerMessageTaskTest> } @Test - public void assertBodyIdentifierUsesDepositsToGenerateBodyIdentifiers() { + public void assertBodyIdentifierUsesDepositRequestsToGenerateBodyIdentifiers() { final Request deposit = - new Deposit( + new DepositRequest( BLSPublicKey.fromHexString( "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), Bytes32.fromHexString( diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index ee84eba4d..6e48aaf82 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -32,7 +32,7 @@ import org.hyperledger.besu.datatypes.VersionedHash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.BlockHeader; -import org.hyperledger.besu.ethereum.core.Deposit; +import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; @@ -466,7 +466,7 @@ public class T8nExecutor { resultObject.put("requestsRoot", requestRoot.toHexString()); var deposits = resultObject.putArray("depositRequests"); - RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), Deposit.class) + RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), DepositRequest.class) .forEach( deposit -> { var obj = deposits.addObject(); diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index a25774205..fd7f3291b 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -70,7 +70,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = 'zgPAgf+ZxefbnCE9aYEQ5QoeBVsHySi3u+BlhHNHqn8=' + knownHash = 'p8jZoKgvi9o8JpVLXTlwh9HoIot4A62hKFHwSOaTF+k=' } check.dependsOn('checkAPIChanges') diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/Deposit.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/DepositRequest.java similarity index 98% rename from plugin-api/src/main/java/org/hyperledger/besu/plugin/data/Deposit.java rename to plugin-api/src/main/java/org/hyperledger/besu/plugin/data/DepositRequest.java index 6ad30217a..096554d3c 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/Deposit.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/DepositRequest.java @@ -27,7 +27,7 @@ import org.apache.tuweni.units.bigints.UInt64; * to beacon chain. */ @Unstable -public interface Deposit { +public interface DepositRequest { /** * Public key of the address that sends the deposit