Skip to content

Commit

Permalink
use fork id to filter out non matching peers (hyperledger#4459)
Browse files Browse the repository at this point in the history
* use fork id to filter out non matching peers

Signed-off-by: Stefan <stefan.pingel@consensys.net>
  • Loading branch information
pinges authored Nov 17, 2022
1 parent 7c35be3 commit e02cc04
Show file tree
Hide file tree
Showing 42 changed files with 835 additions and 357 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,6 @@ public void startNode(final BesuNode node) {
.besuPluginContext(new BesuPluginContextImpl())
.autoLogBloomCaching(false)
.storageProvider(storageProvider)
.forkIdSupplier(() -> besuController.getProtocolManager().getForkIdAsBytesList())
.rpcEndpointService(new RpcEndpointServiceImpl());
node.engineRpcConfiguration().ifPresent(runnerBuilder::engineJsonRpcConfiguration);

Expand Down
33 changes: 19 additions & 14 deletions besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,6 @@
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand Down Expand Up @@ -191,9 +190,9 @@ public class RunnerBuilder {
private boolean autoLogBloomCaching = true;
private boolean randomPeerPriority;
private StorageProvider storageProvider;
private Supplier<List<Bytes>> forkIdSupplier;
private RpcEndpointServiceImpl rpcEndpointServiceImpl;
private JsonRpcIpcConfiguration jsonRpcIpcConfiguration;
private boolean legacyForkIdEnabled;

public RunnerBuilder vertx(final Vertx vertx) {
this.vertx = vertx;
Expand Down Expand Up @@ -388,11 +387,6 @@ public RunnerBuilder storageProvider(final StorageProvider storageProvider) {
return this;
}

public RunnerBuilder forkIdSupplier(final Supplier<List<Bytes>> forkIdSupplier) {
this.forkIdSupplier = forkIdSupplier;
return this;
}

public RunnerBuilder rpcEndpointService(final RpcEndpointServiceImpl rpcEndpointService) {
this.rpcEndpointServiceImpl = rpcEndpointService;
return this;
Expand Down Expand Up @@ -424,6 +418,8 @@ public Runner build() {
discoveryConfiguration.setDnsDiscoveryURL(ethNetworkConfig.getDnsDiscoveryUrl());
discoveryConfiguration.setDiscoveryV5Enabled(
networkingConfiguration.getDiscovery().isDiscoveryV5Enabled());
discoveryConfiguration.setFilterOnEnrForkId(
networkingConfiguration.getDiscovery().isFilterOnEnrForkIdEnabled());
} else {
discoveryConfiguration.setActive(false);
}
Expand Down Expand Up @@ -487,14 +483,16 @@ public Runner build() {
.vertx(vertx)
.nodeKey(nodeKey)
.config(networkingConfiguration)
.legacyForkIdEnabled(legacyForkIdEnabled)
.peerPermissions(peerPermissions)
.metricsSystem(metricsSystem)
.supportedCapabilities(caps)
.natService(natService)
.randomPeerPriority(randomPeerPriority)
.storageProvider(storageProvider)
.forkIdSupplier(forkIdSupplier)
.p2pTLSConfiguration(p2pTLSConfiguration)
.blockchain(context.getBlockchain())
.forks(besuController.getGenesisConfigOptions().getForks())
.build();

final NetworkRunner networkRunner =
Expand Down Expand Up @@ -663,7 +661,7 @@ public Runner build() {
dataDir,
rpcEndpointServiceImpl);

Optional<AuthenticationService> authToUse =
final Optional<AuthenticationService> authToUse =
engineJsonRpcConfiguration.get().isAuthenticationEnabled()
? Optional.of(
new EngineAuthService(
Expand All @@ -673,7 +671,7 @@ public Runner build() {
dataDir))
: Optional.empty();

WebSocketConfiguration engineSocketConfig =
final WebSocketConfiguration engineSocketConfig =
webSocketConfiguration.isEnabled()
? webSocketConfiguration
: WebSocketConfiguration.createEngineDefault();
Expand Down Expand Up @@ -784,7 +782,8 @@ public Runner build() {
createPrivateTransactionObserver(subscriptionManager, privacyParameters);
}

Optional<MetricsService> metricsService = createMetricsService(vertx, metricsConfiguration);
final Optional<MetricsService> metricsService =
createMetricsService(vertx, metricsConfiguration);

final Optional<EthStatsService> ethStatsService;
if (!Strings.isNullOrEmpty(ethstatsUrl)) {
Expand All @@ -807,7 +806,7 @@ public Runner build() {

final Optional<JsonRpcIpcService> jsonRpcIpcService;
if (jsonRpcIpcConfiguration.isEnabled()) {
Map<String, JsonRpcMethod> ipcMethods =
final Map<String, JsonRpcMethod> ipcMethods =
jsonRpcMethods(
protocolSchedule,
context,
Expand Down Expand Up @@ -1023,9 +1022,10 @@ private Map<String, JsonRpcMethod> jsonRpcMethods(
consensusEngineServer);
methods.putAll(besuController.getAdditionalJsonRpcMethods(jsonRpcApis));

var pluginMethods = rpcEndpointServiceImpl.getPluginMethods(jsonRpcConfiguration.getRpcApis());
final var pluginMethods =
rpcEndpointServiceImpl.getPluginMethods(jsonRpcConfiguration.getRpcApis());

var overriddenMethods =
final var overriddenMethods =
methods.keySet().stream().filter(pluginMethods::containsKey).collect(Collectors.toList());
if (overriddenMethods.size() > 0) {
throw new RuntimeException("You can not override built in methods " + overriddenMethods);
Expand Down Expand Up @@ -1176,4 +1176,9 @@ public RunnerBuilder minPeers(final int minPeers) {
this.minPeers = minPeers;
return this;
}

public RunnerBuilder legacyForkId(final boolean legacyEth64ForkIdEnabled) {
this.legacyForkIdEnabled = legacyEth64ForkIdEnabled;
return this;
}
}
32 changes: 16 additions & 16 deletions besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -1425,7 +1425,7 @@ public void run() {

besuPluginContext.beforeExternalServices();

var runner = buildRunner();
final var runner = buildRunner();
runner.startExternalServices();

startPlugins();
Expand Down Expand Up @@ -1469,7 +1469,7 @@ private void addSubCommands(final InputStream in) {
final String generateCompletionSubcommandName = "generate-completion";
commandLine.addSubcommand(
generateCompletionSubcommandName, AutoComplete.GenerateCompletion.class);
CommandLine generateCompletionSubcommand =
final CommandLine generateCompletionSubcommand =
commandLine.getSubcommands().get(generateCompletionSubcommandName);
generateCompletionSubcommand.getCommandSpec().usageMessage().hidden(true);
}
Expand Down Expand Up @@ -1849,7 +1849,7 @@ private void ensureValidPeerBoundParams() {
}

public void validateRpcOptionsParams() {
Predicate<String> configuredApis =
final Predicate<String> configuredApis =
apiName ->
Arrays.stream(RpcApis.values())
.anyMatch(builtInApi -> apiName.equals(builtInApi.name()))
Expand Down Expand Up @@ -2176,7 +2176,7 @@ private GraphQLConfiguration graphQLConfiguration() {

private JsonRpcConfiguration createEngineJsonRpcConfiguration(
final Integer listenPort, final List<String> allowCallsFrom) {
JsonRpcConfiguration engineConfig =
final JsonRpcConfiguration engineConfig =
jsonRpcConfiguration(listenPort, Arrays.asList("ENGINE", "ETH"), allowCallsFrom);
engineConfig.setEnabled(isEngineApiEnabled());
if (!engineRPCOptionGroup.isEngineAuthDisabled) {
Expand Down Expand Up @@ -2344,14 +2344,14 @@ private Optional<TlsConfiguration> rpcHttpTlsConfiguration() {
+ ")");
}

for (String cipherSuite : jsonRPCHttpOptionGroup.rpcHttpTlsCipherSuites) {
if (!getJDKEnabledCypherSuites().contains(cipherSuite)) {
for (final String cipherSuite : jsonRPCHttpOptionGroup.rpcHttpTlsCipherSuites) {
if (!getJDKEnabledCipherSuites().contains(cipherSuite)) {
throw new ParameterException(
commandLine, "Invalid TLS cipher suite specified " + cipherSuite);
}
}

jsonRPCHttpOptionGroup.rpcHttpTlsCipherSuites.retainAll(getJDKEnabledCypherSuites());
jsonRPCHttpOptionGroup.rpcHttpTlsCipherSuites.retainAll(getJDKEnabledCipherSuites());

return Optional.of(
TlsConfiguration.Builder.aTlsConfiguration()
Expand Down Expand Up @@ -2864,6 +2864,7 @@ private Runner synchronize(
.getValue())
.randomPeerPriority(p2PDiscoveryOptionGroup.randomPeerPriority)
.networkingConfiguration(unstableNetworkingOptions.toDomainObject())
.legacyForkId(unstableEthProtocolOptions.toDomainObject().isLegacyEth64ForkIdEnabled())
.graphQLConfiguration(graphQLConfiguration)
.jsonRpcConfiguration(jsonRpcConfiguration)
.engineJsonRpcConfiguration(engineJsonRpcConfiguration)
Expand All @@ -2883,7 +2884,6 @@ private Runner synchronize(
.ethstatsUrl(ethstatsOptions.getEthstatsUrl())
.ethstatsContact(ethstatsOptions.getEthstatsContact())
.storageProvider(keyValueStorageProvider(keyValueStorageName))
.forkIdSupplier(() -> besuController.getProtocolManager().getForkIdAsBytesList())
.rpcEndpointService(rpcEndpointServiceImpl)
.build();

Expand Down Expand Up @@ -3013,7 +3013,7 @@ private static String genesisConfig(final NetworkName networkName) {
try (final InputStream genesisFileInputStream =
EthNetworkConfig.class.getResourceAsStream(networkName.getGenesisFile())) {
return new String(genesisFileInputStream.readAllBytes(), UTF_8);
} catch (IOException | NullPointerException e) {
} catch (final IOException | NullPointerException e) {
throw new IllegalStateException(e);
}
}
Expand Down Expand Up @@ -3300,24 +3300,24 @@ private boolean isEngineApiEnabled() {
return engineRPCOptionGroup.overrideEngineRpcEnabled || isMergeEnabled();
}

public static List<String> getJDKEnabledCypherSuites() {
public static List<String> getJDKEnabledCipherSuites() {
try {
SSLContext context = SSLContext.getInstance("TLS");
final SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
SSLEngine engine = context.createSSLEngine();
final SSLEngine engine = context.createSSLEngine();
return Arrays.asList(engine.getEnabledCipherSuites());
} catch (KeyManagementException | NoSuchAlgorithmException e) {
} catch (final KeyManagementException | NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}

public static List<String> getJDKEnabledProtocols() {
try {
SSLContext context = SSLContext.getInstance("TLS");
final SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
SSLEngine engine = context.createSSLEngine();
final SSLEngine engine = context.createSSLEngine();
return Arrays.asList(engine.getEnabledProtocols());
} catch (KeyManagementException | NoSuchAlgorithmException e) {
} catch (final KeyManagementException | NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public class NetworkingOptions implements CLIOptions<NetworkingConfiguration> {
private final String DNS_DISCOVERY_SERVER_OVERRIDE_FLAG = "--Xp2p-dns-discovery-server";
private final String DISCOVERY_PROTOCOL_V5_ENABLED = "--Xv5-discovery-enabled";
private final String P2P_PEER_LOWER_BOUND_FLAG = "--Xp2p-peer-lower-bound";
public static final String FILTER_ON_ENR_FORK_ID = "--Xfilter-on-enr-fork-id";

@CommandLine.Option(
names = INITIATE_CONNECTIONS_FREQUENCY_FLAG,
Expand Down Expand Up @@ -68,6 +69,13 @@ public class NetworkingOptions implements CLIOptions<NetworkingConfiguration> {
description = "Whether to enable P2P Discovery Protocol v5 (default: ${DEFAULT-VALUE})")
private final Boolean isPeerDiscoveryV5Enabled = false;

@CommandLine.Option(
names = FILTER_ON_ENR_FORK_ID,
hidden = true,
defaultValue = "false",
description = "Whether to enable filtering of peers based on the ENR field ForkId)")
private final Boolean filterOnEnrForkId = false;

@CommandLine.Option(
hidden = true,
names = {P2P_PEER_LOWER_BOUND_FLAG},
Expand Down Expand Up @@ -99,6 +107,7 @@ public NetworkingConfiguration toDomainObject() {
config.setInitiateConnectionsFrequency(initiateConnectionsFrequencySec);
config.setDnsDiscoveryServerOverride(dnsDiscoveryServerOverride);
config.getDiscovery().setDiscoveryV5Enabled(isPeerDiscoveryV5Enabled);
config.getDiscovery().setFilterOnEnrForkId(filterOnEnrForkId);
config.getRlpx().setPeerLowerBound(peerLowerBound);
return config;
}
Expand Down
Loading

0 comments on commit e02cc04

Please sign in to comment.