Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions acceptance-tests/dsl/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need a tip on this part. ThreadBesuNodeRunner can only create a Besu instance that doesn't have persistence, meaning it's losing all the state after restart. In-memory KeyValueStorageProvider is provided by BesuControllerModule::provideKeyValueStorageProvider called by dagger. I wonder if there's a non invasive way to invert this dependency and provide a different key value storage, namely I'd like to set it to a persistent version for my testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jflo thoughts on dependency nuances here?

Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand All @@ -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)
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
2 changes: 2 additions & 0 deletions besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -1836,6 +1837,7 @@ public BesuControllerBuilder setupControllerBuilder() {
.cacheLastBlocks(numberOfblocksToCache)
.genesisStateHashCacheEnabled(genesisStateHashCacheEnabled)
.apiConfiguration(apiConfigurationSupplier.get())
.postMergeContext(new PostMergeContext())
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this can be simpler. There is no need to expose the PostMergeContext as a method in the BesuControllerBuilder as we are already building this in the createContext method

.besuComponent(besuComponent);
if (DataStorageFormat.BONSAI.equals(getDataStorageConfiguration().getDataStorageFormat())) {
final DiffBasedSubStorageConfiguration subStorageConfiguration =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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() {}

Expand Down Expand Up @@ -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.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<BlockHeader> 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
Expand Down Expand Up @@ -261,7 +258,7 @@ protected List<PeerValidator> createPeerValidators(
@Override
public BesuController build() {
final BesuController controller = super.build();
PostMergeContext.get().setSyncState(controller.getSyncState());
super.postMergeContext.setSyncState(controller.getSyncState());
return controller;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ protected MiningCoordinator createMiningCoordinator(
transitionMiningConfiguration,
syncState,
transitionBackwardsSyncContext,
ethProtocolManager.ethContext().getScheduler()));
ethProtocolManager.ethContext().getScheduler()),
preMergeBesuControllerBuilder.postMergeContext);
initTransitionWatcher(protocolContext, composedCoordinator);
return composedCoordinator;
}
Expand Down Expand Up @@ -185,7 +186,7 @@ protected ProtocolSchedule createProtocolSchedule() {
new TransitionProtocolSchedule(
preMergeBesuControllerBuilder.createProtocolSchedule(),
mergeBesuControllerBuilder.createProtocolSchedule(),
PostMergeContext.get());
postMergeContext);
return transitionProtocolSchedule;
}

Expand All @@ -205,6 +206,8 @@ protected ConsensusContext createConsensusContext(
final Blockchain blockchain,
final WorldStateArchive worldStateArchive,
final ProtocolSchedule protocolSchedule) {
preMergeBesuControllerBuilder.postMergeContext(postMergeContext);
mergeBesuControllerBuilder.postMergeContext(postMergeContext);
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please note this change. I couldn't find a better way to get around this and I wonder if there's a better way

return new TransitionContext(
preMergeBesuControllerBuilder.createConsensusContext(
blockchain, worldStateArchive, protocolSchedule),
Expand Down Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -164,6 +165,7 @@ BesuController provideBesuController(
.networkConfiguration(NetworkingConfiguration.create())
.besuComponent(context)
.apiConfiguration(ImmutableApiConfiguration.builder().build())
.postMergeContext(new PostMergeContext())
.build();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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<Long> streamMilestoneBlocks() {
Expand Down
2 changes: 2 additions & 0 deletions besu/src/test/java/org/hyperledger/besu/PrivacyTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -139,6 +140,7 @@ BesuController provideBesuController(
.networkConfiguration(NetworkingConfiguration.create())
.besuComponent(context)
.apiConfiguration(ImmutableApiConfiguration.builder().build())
.postMergeContext(new PostMergeContext())
.build();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}

Expand Down
Loading