diff --git a/acceptance-tests/dsl/build.gradle b/acceptance-tests/dsl/build.gradle index 6602fda58b8..b2293b99a9c 100644 --- a/acceptance-tests/dsl/build.gradle +++ b/acceptance-tests/dsl/build.gradle @@ -3,6 +3,7 @@ dependencies { implementation project(':config') implementation project(':consensus:clique') implementation project(':consensus:common') + implementation project(':consensus:merge') implementation project(':consensus:ibft') implementation project(':consensus:qbft') implementation project(':crypto:services') diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/account/Account.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/account/Account.java index 6cdd53fbed6..1251d086464 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/account/Account.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/account/Account.java @@ -78,7 +78,7 @@ public static Account create(final EthTransactions eth, final String name) { return new Account(eth, name, SIGNATURE_ALGORITHM.get().generateKeyPair()); } - static Account fromPrivateKey( + public static Account fromPrivateKey( final EthTransactions eth, final String name, final String privateKey) { return new Account( eth, 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 b21ff884c79..5ecc977259a 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 @@ -26,6 +26,7 @@ import org.hyperledger.besu.cli.config.NetworkName; import org.hyperledger.besu.components.BesuComponent; import org.hyperledger.besu.config.GenesisConfig; +import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.controller.BesuController; import org.hyperledger.besu.controller.BesuControllerBuilder; import org.hyperledger.besu.crypto.KeyPairUtil; @@ -158,13 +159,15 @@ public void startNode(final BesuNode node) { .map(GenesisConfig::fromConfig) .ifPresent(networkConfigBuilder::setGenesisConfig); final EthNetworkConfig ethNetworkConfig = networkConfigBuilder.build(); - final BesuControllerBuilder builder = component.besuControllerBuilder(); - builder.isRevertReasonEnabled(node.isRevertReasonEnabled()); - builder.networkConfiguration(node.getNetworkingConfiguration()); - - builder.dataDirectory(dataDir); - builder.nodeKey(new NodeKey(new KeyPairSecurityModule(KeyPairUtil.loadKeyPair(dataDir)))); - builder.privacyParameters(node.getPrivacyParameters()); + final BesuControllerBuilder builder = + component + .besuControllerBuilder() + .dataDirectory(dataDir) + .isRevertReasonEnabled(node.isRevertReasonEnabled()) + .networkConfiguration(node.getNetworkingConfiguration()) + .nodeKey(new NodeKey(new KeyPairSecurityModule(KeyPairUtil.loadKeyPair(dataDir)))) + .privacyParameters(node.getPrivacyParameters()) + .postMergeContext(new PostMergeContext()); node.getGenesisConfig().map(GenesisConfig::fromConfig).ifPresent(builder::genesisConfig); @@ -176,10 +179,9 @@ public void startNode(final BesuNode node) { besuPluginContextMap.computeIfAbsent(node, n -> component.getBesuPluginContext()); final RunnerBuilder runnerBuilder = new RunnerBuilder(); - runnerBuilder.permissioningConfiguration(node.getPermissioningConfiguration()); - runnerBuilder.apiConfiguration(node.getApiConfiguration()); - runnerBuilder + .permissioningConfiguration(node.getPermissioningConfiguration()) + .apiConfiguration(node.getApiConfiguration()) .vertx(Vertx.vertx()) .besuController(besuController) .ethNetworkConfig(ethNetworkConfig) @@ -449,7 +451,8 @@ public BesuControllerBuilder provideBesuControllerBuilder( final BesuControllerBuilder builder = new BesuController.Builder() - .fromEthNetworkConfig(ethNetworkConfig, synchronizerConfiguration.getSyncMode()); + .fromEthNetworkConfig(ethNetworkConfig, synchronizerConfiguration.getSyncMode()) + .postMergeContext(new PostMergeContext()); builder.transactionPoolConfiguration(transactionPoolConfiguration); return builder; } diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/bootstrap/ClusterThreadNodeRunnerAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/bootstrap/ClusterThreadNodeRunnerAcceptanceTest.java index 39cc5ad26fc..ddced1a4bb5 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/bootstrap/ClusterThreadNodeRunnerAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/bootstrap/ClusterThreadNodeRunnerAcceptanceTest.java @@ -15,20 +15,21 @@ package org.hyperledger.besu.tests.acceptance.bootstrap; import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; +import org.hyperledger.besu.tests.acceptance.dsl.account.Account; +import org.hyperledger.besu.tests.acceptance.dsl.account.Accounts; import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNodeRunner; -import org.hyperledger.besu.tests.acceptance.dsl.node.Node; import org.hyperledger.besu.tests.acceptance.dsl.node.ThreadBesuNodeRunner; import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.Cluster; import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfiguration; import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfigurationBuilder; +import org.hyperledger.besu.tests.acceptance.dsl.transaction.account.AccountTransactions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class ClusterThreadNodeRunnerAcceptanceTest extends AcceptanceTestBase { - - private Node fullNode; + private BesuNode miner; private Cluster noDiscoveryCluster; @BeforeEach @@ -38,14 +39,30 @@ public void setUp() throws Exception { final BesuNodeRunner besuNodeRunner = new ThreadBesuNodeRunner(); noDiscoveryCluster = new Cluster(clusterConfiguration, net, besuNodeRunner); final BesuNode noDiscoveryNode = besu.createNodeWithNoDiscovery("noDiscovery"); - fullNode = besu.createArchiveNode("archive"); - noDiscoveryCluster.start(noDiscoveryNode, fullNode); + miner = besu.createMinerNode("miner"); + noDiscoveryCluster.start(noDiscoveryNode, miner); } @Test public void shouldVerifySomething() { // we don't care what verifies, just that it gets to the point something can verify - fullNode.verify(net.awaitPeerCount(0)); + miner.verify(net.awaitPeerCount(0)); + } + + @Test + void shouldMineTransactionsEvenAfterRestart() { + final Account recipient = accounts.createAccount("account1"); + miner.execute(accountTransactions.createTransfer(recipient, 2)); + miner.verify(recipient.balanceEquals(2)); + + noDiscoveryCluster.stop(); + noDiscoveryCluster.start(miner); + + // Can't use the previously created object, as whale's nonce became invalid after node's restart + final Accounts resetAccounts = new Accounts(ethTransactions); + // TODO: Add option for persistence with ThreadBesuNodeRunner + miner.execute(new AccountTransactions(resetAccounts).createTransfer(recipient, 2)); + miner.verify(recipient.balanceEquals(2)); } @Override 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 b628e420cf1..588969642e2 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -89,6 +89,7 @@ import org.hyperledger.besu.config.GenesisConfig; import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.config.MergeConfiguration; +import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.controller.BesuController; import org.hyperledger.besu.controller.BesuControllerBuilder; import org.hyperledger.besu.crypto.Blake2bfMessageDigest; @@ -1836,6 +1837,7 @@ public BesuControllerBuilder setupControllerBuilder() { .cacheLastBlocks(numberOfblocksToCache) .genesisStateHashCacheEnabled(genesisStateHashCacheEnabled) .apiConfiguration(apiConfigurationSupplier.get()) + .postMergeContext(new PostMergeContext()) .besuComponent(besuComponent); if (DataStorageFormat.BONSAI.equals(getDataStorageConfiguration().getDataStorageFormat())) { final DiffBasedSubStorageConfiguration subStorageConfiguration = 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 a7677829067..9d335e43bf0 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.config.GenesisConfig; import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.consensus.merge.MergeContext; +import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.consensus.merge.UnverifiedForkchoiceSupplier; import org.hyperledger.besu.consensus.qbft.BFTPivotSelectorFromPeers; import org.hyperledger.besu.cryptoservices.NodeKey; @@ -222,6 +223,9 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides /** When enabled, round changes on f+1 RC messages from higher rounds */ protected boolean isEarlyRoundChangeEnabled = false; + /** PostMergeContext, responsible for managing the switch from pre-merge to post merge */ + protected PostMergeContext postMergeContext; + /** Instantiates a new Besu controller builder. */ protected BesuControllerBuilder() {} @@ -567,6 +571,17 @@ public BesuControllerBuilder isEarlyRoundChangeEnabled(final boolean isEarlyRoun return this; } + /** + * sets the postMergeContext in the builder + * + * @param postMergeContext the post merge context + * @return the besu controller builder + */ + public BesuControllerBuilder postMergeContext(final PostMergeContext postMergeContext) { + this.postMergeContext = postMergeContext; + return this; + } + /** * Build besu controller. * diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java index 2352f9d3965..0b8a0c3d99f 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java @@ -16,7 +16,6 @@ import org.hyperledger.besu.consensus.merge.MergeContext; import org.hyperledger.besu.consensus.merge.MergeProtocolSchedule; -import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.consensus.merge.TransitionBestPeerComparator; import org.hyperledger.besu.consensus.merge.blockcreation.MergeCoordinator; import org.hyperledger.besu.datatypes.Address; @@ -196,38 +195,36 @@ protected MergeContext createConsensusContext( genesisConfigOptions.getTerminalTotalDifficulty().isPresent() && genesisConfigOptions.getTerminalTotalDifficulty().get().isZero() && blockchain.getGenesisBlockHeader().getDifficulty().isZero(); - - final MergeContext mergeContext = - PostMergeContext.get() - .setSyncState(syncState.get()) - .setTerminalTotalDifficulty( - genesisConfigOptions - .getTerminalTotalDifficulty() - .map(Difficulty::of) - .orElse(Difficulty.ZERO)) - .setPostMergeAtGenesis(isPostMergeAtGenesis); + postMergeContext + .setSyncState(syncState.get()) + .setTerminalTotalDifficulty( + genesisConfigOptions + .getTerminalTotalDifficulty() + .map(Difficulty::of) + .orElse(Difficulty.ZERO)) + .setPostMergeAtGenesis(isPostMergeAtGenesis); blockchain .getFinalized() .flatMap(blockchain::getBlockHeader) - .ifPresent(mergeContext::setFinalized); + .ifPresent(postMergeContext::setFinalized); blockchain .getSafeBlock() .flatMap(blockchain::getBlockHeader) - .ifPresent(mergeContext::setSafeBlock); + .ifPresent(postMergeContext::setSafeBlock); if (terminalBlockNumber.isPresent() && terminalBlockHash.isPresent()) { Optional termBlock = blockchain.getBlockHeader(terminalBlockNumber.getAsLong()); - mergeContext.setTerminalPoWBlock(termBlock); + postMergeContext.setTerminalPoWBlock(termBlock); } blockchain.observeBlockAdded( blockAddedEvent -> blockchain .getTotalDifficultyByHash(blockAddedEvent.getBlock().getHeader().getHash()) - .ifPresent(mergeContext::setIsPostMerge)); + .ifPresent(postMergeContext::setIsPostMerge)); - return mergeContext; + return postMergeContext; } @Override @@ -261,7 +258,7 @@ protected List createPeerValidators( @Override public BesuController build() { final BesuController controller = super.build(); - PostMergeContext.get().setSyncState(controller.getSyncState()); + super.postMergeContext.setSyncState(controller.getSyncState()); return controller; } } diff --git a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java index 9d37f594e8a..560384b163f 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java @@ -147,7 +147,8 @@ protected MiningCoordinator createMiningCoordinator( transitionMiningConfiguration, syncState, transitionBackwardsSyncContext, - ethProtocolManager.ethContext().getScheduler())); + ethProtocolManager.ethContext().getScheduler()), + preMergeBesuControllerBuilder.postMergeContext); initTransitionWatcher(protocolContext, composedCoordinator); return composedCoordinator; } @@ -185,7 +186,7 @@ protected ProtocolSchedule createProtocolSchedule() { new TransitionProtocolSchedule( preMergeBesuControllerBuilder.createProtocolSchedule(), mergeBesuControllerBuilder.createProtocolSchedule(), - PostMergeContext.get()); + postMergeContext); return transitionProtocolSchedule; } @@ -205,6 +206,8 @@ protected ConsensusContext createConsensusContext( final Blockchain blockchain, final WorldStateArchive worldStateArchive, final ProtocolSchedule protocolSchedule) { + preMergeBesuControllerBuilder.postMergeContext(postMergeContext); + mergeBesuControllerBuilder.postMergeContext(postMergeContext); return new TransitionContext( preMergeBesuControllerBuilder.createConsensusContext( blockchain, worldStateArchive, protocolSchedule), @@ -290,7 +293,7 @@ public BesuControllerBuilder storageProvider(final StorageProvider storageProvid @Override public BesuController build() { final BesuController controller = super.build(); - PostMergeContext.get().setSyncState(controller.getSyncState()); + super.postMergeContext.setSyncState(controller.getSyncState()); return controller; } diff --git a/besu/src/test/java/org/hyperledger/besu/FlexGroupPrivacyTest.java b/besu/src/test/java/org/hyperledger/besu/FlexGroupPrivacyTest.java index 5298633ff9b..e9cba729517 100644 --- a/besu/src/test/java/org/hyperledger/besu/FlexGroupPrivacyTest.java +++ b/besu/src/test/java/org/hyperledger/besu/FlexGroupPrivacyTest.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.components.NoOpMetricsSystemModule; import org.hyperledger.besu.components.PrivacyTestModule; import org.hyperledger.besu.config.GenesisConfig; +import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.controller.BesuController; import org.hyperledger.besu.cryptoservices.NodeKeyUtils; import org.hyperledger.besu.datatypes.Address; @@ -164,6 +165,7 @@ BesuController provideBesuController( .networkConfiguration(NetworkingConfiguration.create()) .besuComponent(context) .apiConfiguration(ImmutableApiConfiguration.builder().build()) + .postMergeContext(new PostMergeContext()) .build(); } } diff --git a/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java b/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java index 86ba6881220..fdcf3b66f46 100644 --- a/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java +++ b/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.cli.config.NetworkName; import org.hyperledger.besu.config.GenesisConfig; import org.hyperledger.besu.config.GenesisConfigOptions; +import org.hyperledger.besu.consensus.merge.MergeContext; import org.hyperledger.besu.consensus.merge.MergeProtocolSchedule; import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.consensus.merge.TransitionProtocolSchedule; @@ -189,10 +190,8 @@ private static MilestoneStreamingTransitionProtocolSchedule createSchedule( new BadBlockManager(), false, new NoOpMetricsSystem())); - final MilestoneStreamingTransitionProtocolSchedule schedule = - new MilestoneStreamingTransitionProtocolSchedule( - preMergeProtocolSchedule, postMergeProtocolSchedule); - return schedule; + return new MilestoneStreamingTransitionProtocolSchedule( + preMergeProtocolSchedule, postMergeProtocolSchedule, new PostMergeContext()); } public static class MilestoneStreamingTransitionProtocolSchedule @@ -202,11 +201,11 @@ public static class MilestoneStreamingTransitionProtocolSchedule public MilestoneStreamingTransitionProtocolSchedule( final MilestoneStreamingProtocolSchedule preMergeProtocolSchedule, - final MilestoneStreamingProtocolSchedule postMergeProtocolSchedule) { - super(preMergeProtocolSchedule, postMergeProtocolSchedule, PostMergeContext.get()); + final MilestoneStreamingProtocolSchedule postMergeProtocolSchedule, + final MergeContext mergeContext) { + super(preMergeProtocolSchedule, postMergeProtocolSchedule, mergeContext); transitionUtils = - new TransitionUtils<>( - preMergeProtocolSchedule, postMergeProtocolSchedule, PostMergeContext.get()); + new TransitionUtils<>(preMergeProtocolSchedule, postMergeProtocolSchedule, mergeContext); } public Stream streamMilestoneBlocks() { diff --git a/besu/src/test/java/org/hyperledger/besu/PrivacyTest.java b/besu/src/test/java/org/hyperledger/besu/PrivacyTest.java index 32f2b1f6176..03354ff5eeb 100644 --- a/besu/src/test/java/org/hyperledger/besu/PrivacyTest.java +++ b/besu/src/test/java/org/hyperledger/besu/PrivacyTest.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.components.PrivacyParametersModule; import org.hyperledger.besu.components.PrivacyTestModule; import org.hyperledger.besu.config.GenesisConfig; +import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.controller.BesuController; import org.hyperledger.besu.cryptoservices.NodeKeyUtils; import org.hyperledger.besu.datatypes.Address; @@ -139,6 +140,7 @@ BesuController provideBesuController( .networkConfiguration(NetworkingConfiguration.create()) .besuComponent(context) .apiConfiguration(ImmutableApiConfiguration.builder().build()) + .postMergeContext(new PostMergeContext()) .build(); } } diff --git a/besu/src/test/java/org/hyperledger/besu/chainexport/RlpBlockExporterTest.java b/besu/src/test/java/org/hyperledger/besu/chainexport/RlpBlockExporterTest.java index a0e596a0005..e7641ad46c9 100644 --- a/besu/src/test/java/org/hyperledger/besu/chainexport/RlpBlockExporterTest.java +++ b/besu/src/test/java/org/hyperledger/besu/chainexport/RlpBlockExporterTest.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.cli.config.EthNetworkConfig; import org.hyperledger.besu.cli.config.NetworkName; import org.hyperledger.besu.components.BesuComponent; +import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.controller.BesuController; import org.hyperledger.besu.cryptoservices.NodeKeyUtils; import org.hyperledger.besu.ethereum.GasLimitCalculator; @@ -107,6 +108,7 @@ private static BesuController createController(final @TempDir Path dataDir) thro .networkConfiguration(NetworkingConfiguration.create()) .besuComponent(mock(BesuComponent.class)) .apiConfiguration(ImmutableApiConfiguration.builder().build()) + .postMergeContext(new PostMergeContext()) .build(); } diff --git a/besu/src/test/java/org/hyperledger/besu/chainimport/RlpBlockImporterTest.java b/besu/src/test/java/org/hyperledger/besu/chainimport/RlpBlockImporterTest.java index 2f707edc6f4..f33c7a50f8a 100644 --- a/besu/src/test/java/org/hyperledger/besu/chainimport/RlpBlockImporterTest.java +++ b/besu/src/test/java/org/hyperledger/besu/chainimport/RlpBlockImporterTest.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.cli.config.NetworkName; import org.hyperledger.besu.components.BesuComponent; import org.hyperledger.besu.config.MergeConfiguration; +import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.controller.BesuController; import org.hyperledger.besu.cryptoservices.NodeKeyUtils; import org.hyperledger.besu.ethereum.GasLimitCalculator; @@ -82,6 +83,7 @@ public void blockImport() throws IOException { .networkConfiguration(NetworkingConfiguration.create()) .besuComponent(mock(BesuComponent.class)) .apiConfiguration(ImmutableApiConfiguration.builder().build()) + .postMergeContext(new PostMergeContext()) .build(); final RlpBlockImporter.ImportResult result = rlpBlockImporter.importBlockchain(source, targetController, false); @@ -117,6 +119,7 @@ public void blockImportRejectsBadPow() throws IOException { .networkConfiguration(NetworkingConfiguration.create()) .besuComponent(mock(BesuComponent.class)) .apiConfiguration(ImmutableApiConfiguration.builder().build()) + .postMergeContext(new PostMergeContext()) .build(); assertThatThrownBy( @@ -149,6 +152,7 @@ public void blockImportCanSkipPow() throws IOException { .networkConfiguration(NetworkingConfiguration.create()) .besuComponent(mock(BesuComponent.class)) .apiConfiguration(ImmutableApiConfiguration.builder().build()) + .postMergeContext(new PostMergeContext()) .build(); final RlpBlockImporter.ImportResult result = 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 dd2696aa0ba..c22d617865c 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java @@ -299,6 +299,7 @@ public void initMocks() throws Exception { when(mockControllerBuilder.genesisStateHashCacheEnabled(any())) .thenReturn(mockControllerBuilder); when(mockControllerBuilder.apiConfiguration(any())).thenReturn(mockControllerBuilder); + when(mockControllerBuilder.postMergeContext(any())).thenReturn(mockControllerBuilder); when(mockControllerBuilder.build()).thenReturn(mockController); lenient().when(mockController.getProtocolManager()).thenReturn(mockEthProtocolManager); diff --git a/besu/src/test/java/org/hyperledger/besu/controller/MergeBesuControllerBuilderTest.java b/besu/src/test/java/org/hyperledger/besu/controller/MergeBesuControllerBuilderTest.java index 4fe0735b022..032978f83d7 100644 --- a/besu/src/test/java/org/hyperledger/besu/controller/MergeBesuControllerBuilderTest.java +++ b/besu/src/test/java/org/hyperledger/besu/controller/MergeBesuControllerBuilderTest.java @@ -28,6 +28,7 @@ import org.hyperledger.besu.config.GenesisConfig; import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.consensus.merge.MergeContext; +import org.hyperledger.besu.consensus.merge.PostMergeContext; import org.hyperledger.besu.cryptoservices.NodeKey; import org.hyperledger.besu.cryptoservices.NodeKeyUtils; import org.hyperledger.besu.datatypes.Hash; @@ -193,7 +194,8 @@ MergeBesuControllerBuilder visitWithMockConfigs(final MergeBesuControllerBuilder .networkConfiguration(NetworkingConfiguration.create()) .besuComponent(mock(BesuComponent.class)) .networkId(networkId) - .apiConfiguration(ImmutableApiConfiguration.builder().build()); + .apiConfiguration(ImmutableApiConfiguration.builder().build()) + .postMergeContext(new PostMergeContext()); } @Test diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java index 1d7e4b76c62..fd44e9a6766 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java @@ -40,7 +40,6 @@ public class PostMergeContext implements MergeContext { /** The Max blocks in progress. */ static final int MAX_BLOCKS_IN_PROGRESS = 12; - private static final AtomicReference singleton = new AtomicReference<>(); private final AtomicReference syncState; private final AtomicReference terminalTotalDifficulty; // initial postMerge state is indeterminate until it is set: @@ -62,8 +61,7 @@ public class PostMergeContext implements MergeContext { private boolean isPostMergeAtGenesis; /** Instantiates a new Post merge context. */ - @VisibleForTesting - PostMergeContext() { + public PostMergeContext() { this(Difficulty.ZERO); } @@ -78,18 +76,6 @@ public class PostMergeContext implements MergeContext { this.syncState = new AtomicReference<>(); } - /** - * Get post merge context. - * - * @return the post merge context - */ - public static PostMergeContext get() { - if (singleton.get() == null) { - singleton.compareAndSet(null, new PostMergeContext()); - } - return singleton.get(); - } - @Override public C as(final Class klass) { return klass.cast(this); diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java index 44fd5f8edfc..ece7af3107d 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionProtocolSchedule.java @@ -60,41 +60,6 @@ public TransitionProtocolSchedule( new TransitionUtils<>(preMergeProtocolSchedule, postMergeProtocolSchedule, mergeContext); } - /** - * Create a Proof-of-Stake protocol schedule from a config object - * - * @param genesisConfigOptions {@link GenesisConfigOptions} containing the config options for the - * milestone starting points - * @param miningConfiguration the mining parameters - * @param badBlockManager the cache to use to keep invalid blocks - * @param isParallelTxProcessingEnabled indicates whether parallel transaction is enabled. - * @return an initialised TransitionProtocolSchedule using post-merge defaults - */ - public static TransitionProtocolSchedule fromConfig( - final GenesisConfigOptions genesisConfigOptions, - final MiningConfiguration miningConfiguration, - final BadBlockManager badBlockManager, - final boolean isParallelTxProcessingEnabled, - final MetricsSystem metricsSystem) { - ProtocolSchedule preMergeProtocolSchedule = - MainnetProtocolSchedule.fromConfig( - genesisConfigOptions, - miningConfiguration, - badBlockManager, - isParallelTxProcessingEnabled, - metricsSystem); - ProtocolSchedule postMergeProtocolSchedule = - MergeProtocolSchedule.create( - genesisConfigOptions, - false, - miningConfiguration, - badBlockManager, - isParallelTxProcessingEnabled, - metricsSystem); - return new TransitionProtocolSchedule( - preMergeProtocolSchedule, postMergeProtocolSchedule, PostMergeContext.get()); - } - /** * Gets pre merge schedule. * diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java index 681c6f334bc..9978dd536f6 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.consensus.merge.blockcreation; -import org.hyperledger.besu.consensus.merge.PostMergeContext; +import org.hyperledger.besu.consensus.merge.MergeContext; import org.hyperledger.besu.consensus.merge.TransitionUtils; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; @@ -47,10 +47,13 @@ public class TransitionCoordinator extends TransitionUtils * * @param miningCoordinator the mining coordinator * @param mergeCoordinator the merge coordinator + * @param mergeContext the merge context */ public TransitionCoordinator( - final MiningCoordinator miningCoordinator, final MiningCoordinator mergeCoordinator) { - super(miningCoordinator, mergeCoordinator, PostMergeContext.get()); + final MiningCoordinator miningCoordinator, + final MiningCoordinator mergeCoordinator, + final MergeContext mergeContext) { + super(miningCoordinator, mergeCoordinator, mergeContext); this.miningCoordinator = miningCoordinator; this.mergeCoordinator = (MergeMiningCoordinator) mergeCoordinator; } diff --git a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java index 250ba94348c..0feb2077e6c 100644 --- a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java +++ b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java @@ -67,7 +67,7 @@ public class MergeReorgTest implements MergeGenesisConfigHelper { private MergeCoordinator coordinator; - private final MergeContext mergeContext = PostMergeContext.get(); + private final MergeContext mergeContext = new PostMergeContext(); private final ProtocolSchedule mockProtocolSchedule = getMergeProtocolSchedule(); private final GenesisState genesisState = GenesisState.fromConfig(getPowGenesisConfig(), mockProtocolSchedule);