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 cc5bfaecbe8..41b41d2bb4f 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 @@ -68,7 +68,6 @@ import org.hyperledger.besu.metrics.ObservableMetricsSystem; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.plugin.services.BesuConfiguration; import org.hyperledger.besu.plugin.services.BesuEvents; import org.hyperledger.besu.plugin.services.BlockchainService; @@ -164,11 +163,11 @@ public void startNode(final BesuNode node) { GlobalOpenTelemetry.resetForTest(); final ObservableMetricsSystem metricsSystem = (ObservableMetricsSystem) component.getMetricsSystem(); - final List bootnodes = + final List bootnodes = node.getConfiguration().getBootnodes().stream().map(EnodeURLImpl::fromURI).toList(); final EthNetworkConfig.Builder networkConfigBuilder = component.ethNetworkConfigBuilder(); - networkConfigBuilder.setBootNodes(bootnodes); + networkConfigBuilder.setEnodeBootNodes(bootnodes); node.getConfiguration() .getGenesisConfig() .map(GenesisConfig::fromConfig) diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/permissioning/PermissionedNodeBuilder.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/permissioning/PermissionedNodeBuilder.java index fbb1c5a15eb..20a5c3b9a50 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/permissioning/PermissionedNodeBuilder.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/permissioning/PermissionedNodeBuilder.java @@ -183,7 +183,7 @@ private LocalPermissioningConfiguration localConfigPermissioningConfiguration() localConfigNodesPermissioningFile = createTemporaryPermissionsFile(); } - final List nodeAllowList = + final List nodeAllowList = localConfigPermittedNodes.stream() .map(EnodeURLImpl::fromURI) .collect(Collectors.toList()); diff --git a/app/src/main/java/org/hyperledger/besu/Runner.java b/app/src/main/java/org/hyperledger/besu/Runner.java index 34389f77bd7..2bfa137e66c 100644 --- a/app/src/main/java/org/hyperledger/besu/Runner.java +++ b/app/src/main/java/org/hyperledger/besu/Runner.java @@ -32,10 +32,10 @@ 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.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethstats.EthStatsService; import org.hyperledger.besu.metrics.MetricsService; import org.hyperledger.besu.nat.NatService; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.io.File; import java.io.FileOutputStream; @@ -542,7 +542,7 @@ public Map getInProcessRpcMethods() { * @return the local enode */ @VisibleForTesting - Optional getLocalEnode() { + Optional getLocalEnode() { return networkRunner.getNetwork().getLocalEnode(); } diff --git a/app/src/main/java/org/hyperledger/besu/RunnerBuilder.java b/app/src/main/java/org/hyperledger/besu/RunnerBuilder.java index fe3c643d3c2..7ac391cf95e 100644 --- a/app/src/main/java/org/hyperledger/besu/RunnerBuilder.java +++ b/app/src/main/java/org/hyperledger/besu/RunnerBuilder.java @@ -78,6 +78,7 @@ import org.hyperledger.besu.ethereum.p2p.config.SubProtocolConfiguration; import org.hyperledger.besu.ethereum.p2p.discovery.DefaultPeerDiscoveryAgentFactory; import org.hyperledger.besu.ethereum.p2p.discovery.DefaultRlpxAgentFactory; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.ethereum.p2p.discovery.PeerDiscoveryAgentFactory; import org.hyperledger.besu.ethereum.p2p.discovery.RlpxAgentFactory; import org.hyperledger.besu.ethereum.p2p.network.DefaultP2PNetwork; @@ -186,7 +187,7 @@ public class RunnerBuilder { private ObservableMetricsSystem metricsSystem; private PermissioningServiceImpl permissioningService; private Optional permissioningConfiguration = Optional.empty(); - private Collection staticNodes = Collections.emptyList(); + private Collection staticNodes = Collections.emptyList(); private Optional identityString = Optional.empty(); private BesuPluginContextImpl besuPluginContext; private boolean autoLogBloomCaching = true; @@ -520,7 +521,7 @@ public RunnerBuilder permissioningService(final PermissioningServiceImpl permiss * @param staticNodes the static nodes * @return the runner builder */ - public RunnerBuilder staticNodes(final Collection staticNodes) { + public RunnerBuilder staticNodes(final Collection staticNodes) { this.staticNodes = staticNodes; return this; } @@ -671,16 +672,24 @@ public Runner build() { }); discoveryConfiguration.setPreferIpv6Outbound(preferIpv6Outbound); if (discoveryEnabled) { - final List bootstrap; - if (ethNetworkConfig.bootNodes() == null) { - bootstrap = EthNetworkConfig.getNetworkConfig(NetworkDefinition.MAINNET).bootNodes(); + final List bootstrap; + if (ethNetworkConfig.enodeBootNodes() == null) { + bootstrap = EthNetworkConfig.getNetworkConfig(NetworkDefinition.MAINNET).enodeBootNodes(); } else { - bootstrap = ethNetworkConfig.bootNodes(); + bootstrap = ethNetworkConfig.enodeBootNodes(); } - discoveryConfiguration.setBootnodes(bootstrap); + discoveryConfiguration.setEnodeBootnodes(bootstrap); + discoveryConfiguration.setEnrBootnodes( + ethNetworkConfig.enrBootNodes() == null + ? EthNetworkConfig.getNetworkConfig(NetworkDefinition.MAINNET).enrBootNodes() + : ethNetworkConfig.enrBootNodes()); + discoveryConfiguration.setIncludeBootnodesOnPeerRefresh( besuController.getGenesisConfigOptions().isPoa() && poaDiscoveryRetryBootnodes); - LOG.info("Resolved {} bootnodes.", bootstrap.size()); + LOG.info( + "Resolved {} bootnodes.", + discoveryConfiguration.getEnodeBootnodes().size() + + discoveryConfiguration.getEnrBootnodes().size()); LOG.debug("Bootnodes = {}", bootstrap); discoveryConfiguration.setDnsDiscoveryURL(ethNetworkConfig.dnsDiscoveryUrl()); discoveryConfiguration.setDiscoveryV5Enabled( @@ -726,7 +735,8 @@ public Runner build() { final PeerPermissions defaultPeerPermissions = PeerPermissions.combine(peerPermissionSubnet, bannedNodes); - final List bootnodes = discoveryConfiguration.getBootnodes(); + final List bootnodes = + discoveryConfiguration.getBootnodeIdentifiers(); final Synchronizer synchronizer = besuController.getSynchronizer(); @@ -1180,8 +1190,8 @@ private boolean isEthStatsEnabled() { return ethstatsOptions != null && !Strings.isNullOrEmpty(ethstatsOptions.getEthstatsUrl()); } - private Stream sanitizePeers( - final P2PNetwork network, final Collection enodeURLS) { + private Stream sanitizePeers( + final P2PNetwork network, final Collection enodeURLS) { if (network.getLocalEnode().isEmpty()) { return enodeURLS.stream(); } @@ -1191,12 +1201,12 @@ private Stream sanitizePeers( } private Optional buildNodePermissioningController( - final List bootnodesAsEnodeURLs, + final List bootnodesIdentifiers, final Synchronizer synchronizer, final TransactionSimulator transactionSimulator, final Bytes localNodeId, final Blockchain blockchain) { - final Collection fixedNodes = getFixedNodes(bootnodesAsEnodeURLs, staticNodes); + final Collection fixedNodes = getFixedNodes(bootnodesIdentifiers, staticNodes); if (permissioningConfiguration.isPresent()) { final PermissioningConfiguration configuration = this.permissioningConfiguration.get(); @@ -1285,9 +1295,11 @@ private Optional buildNatManager(final NatMethod natMethod) { * @return the fixed and more nodes combined */ @VisibleForTesting - public static Collection getFixedNodes( - final Collection someFixedNodes, final Collection moreFixedNodes) { - final Collection fixedNodes = new ArrayList<>(someFixedNodes); + public static Collection getFixedNodes( + final Collection someFixedNodes, + final Collection moreFixedNodes) { + final Collection fixedNodes = new ArrayList<>(); + fixedNodes.addAll(someFixedNodes); fixedNodes.addAll(moreFixedNodes); return fixedNodes; } diff --git a/app/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/app/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index cef172ac724..1e28a020748 100644 --- a/app/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/app/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -127,7 +127,9 @@ import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration; import org.hyperledger.besu.ethereum.mainnet.BalConfiguration; import org.hyperledger.besu.ethereum.p2p.config.DiscoveryConfiguration; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.ethereum.p2p.discovery.P2PDiscoveryConfiguration; +import org.hyperledger.besu.ethereum.p2p.discovery.dns.EthereumNodeRecord; import org.hyperledger.besu.ethereum.p2p.peers.EnodeDnsConfiguration; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.StaticNodesParser; @@ -155,7 +157,6 @@ import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; import org.hyperledger.besu.metrics.vertx.VertxMetricsAdapterFactory; import org.hyperledger.besu.nat.NatMethod; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.plugin.services.BesuConfiguration; import org.hyperledger.besu.plugin.services.BesuEvents; import org.hyperledger.besu.plugin.services.BlockSimulationService; @@ -689,7 +690,7 @@ void setNetwork(final String inputNetwork) { private MetricsConfiguration metricsConfiguration; private Optional permissioningConfiguration; private DataStorageConfiguration dataStorageConfiguration; - private Collection staticNodes; + private Collection staticNodes; private BesuController besuController; private BesuConfigurationImpl pluginCommonConfiguration; @@ -2030,10 +2031,13 @@ private void configure() throws Exception { permissioningConfiguration = permissioningConfiguration(); staticNodes = loadStaticNodes(); - final List enodeURIs = ethNetworkConfig.bootNodes(); permissioningConfiguration .flatMap(PermissioningConfiguration::getLocalConfig) - .ifPresent(p -> ensureAllNodesAreInAllowlist(enodeURIs, p)); + .ifPresent(p -> ensureAllNodesAreInAllowlist(ethNetworkConfig.enodeBootNodes(), p)); + + permissioningConfiguration + .flatMap(PermissioningConfiguration::getLocalConfig) + .ifPresent(p -> ensureAllNodesAreInAllowlist(ethNetworkConfig.enrBootNodes(), p)); permissioningConfiguration .flatMap(PermissioningConfiguration::getLocalConfig) @@ -2081,11 +2085,11 @@ private JsonRpcIpcConfiguration jsonRpcIpcConfiguration( } private void ensureAllNodesAreInAllowlist( - final Collection enodeAddresses, + final Collection nodeIdentifiers, final LocalPermissioningConfiguration permissioningConfiguration) { try { PermissioningConfigurationValidator.areAllNodesInAllowlist( - enodeAddresses, permissioningConfiguration); + nodeIdentifiers, permissioningConfiguration); } catch (final Exception e) { throw new ParameterException(this.commandLine, e.getMessage()); } @@ -2403,7 +2407,7 @@ private Runner synchronize( final ApiConfiguration apiConfiguration, final MetricsConfiguration metricsConfiguration, final Optional permissioningConfiguration, - final Collection staticNodes, + final Collection staticNodes, final Path pidPath) { checkNotNull(runnerBuilder); @@ -2518,7 +2522,7 @@ private EthNetworkConfig updateNetworkConfig(final NetworkDefinition network) { } if (p2PDiscoveryOptions.bootNodes == null) { - builder.setBootNodes(new ArrayList<>()); + builder.setEnodeBootNodes(new ArrayList<>()); } builder.setDnsDiscoveryUrl(null); } @@ -2541,7 +2545,7 @@ private EthNetworkConfig updateNetworkConfig(final NetworkDefinition network) { discoveryDnsUrlFromGenesis.ifPresent(builder::setDnsDiscoveryUrl); } - List listBootNodes = null; + List listBootNodes = null; if (p2PDiscoveryOptions.bootNodes != null) { try { final List resolvedBootNodeArgs = @@ -2558,7 +2562,12 @@ private EthNetworkConfig updateNetworkConfig(final NetworkDefinition network) { final Optional> bootNodesFromGenesis = genesisConfigOptionsSupplier.get().getDiscoveryOptions().getBootNodes(); if (bootNodesFromGenesis.isPresent()) { - listBootNodes = buildEnodes(bootNodesFromGenesis.get(), getEnodeDnsConfiguration()); + if (bootNodesFromGenesis.get().getFirst().startsWith("enr:")) { + builder.setEnrBootNodes( + bootNodesFromGenesis.get().stream().map(EthereumNodeRecord::fromEnr).toList()); + } else { + listBootNodes = buildEnodes(bootNodesFromGenesis.get(), getEnodeDnsConfiguration()); + } } } if (listBootNodes != null) { @@ -2566,7 +2575,7 @@ private EthNetworkConfig updateNetworkConfig(final NetworkDefinition network) { logger.warn("Discovery disabled: bootnodes will be ignored."); } DiscoveryConfiguration.assertValidBootnodes(listBootNodes); - builder.setBootNodes(listBootNodes); + builder.setEnodeBootNodes(listBootNodes); } return builder.build(); } @@ -2601,7 +2610,7 @@ public MetricsSystem getMetricsSystem() { return besuComponent.getMetricsSystem(); } - private Set loadStaticNodes() throws IOException { + private Set loadStaticNodes() throws IOException { final Path staticNodesPath; if (staticNodesFile != null) { staticNodesPath = staticNodesFile.toAbsolutePath(); @@ -2614,14 +2623,14 @@ private Set loadStaticNodes() throws IOException { staticNodesPath = dataDir().resolve(staticNodesFilename); } logger.debug("Static Nodes file: {}", staticNodesPath); - final Set staticNodes = + final Set staticNodes = StaticNodesParser.fromPath(staticNodesPath, getEnodeDnsConfiguration()); logger.info("Connecting to {} static nodes.", staticNodes.size()); logger.debug("Static Nodes = {}", staticNodes); return staticNodes; } - private List buildEnodes( + private List buildEnodes( final List bootNodes, final EnodeDnsConfiguration enodeDnsConfiguration) { return bootNodes.stream() .filter(bootNode -> !bootNode.isEmpty()) diff --git a/app/src/main/java/org/hyperledger/besu/cli/config/EthNetworkConfig.java b/app/src/main/java/org/hyperledger/besu/cli/config/EthNetworkConfig.java index fca10426213..b1a22fc22c5 100644 --- a/app/src/main/java/org/hyperledger/besu/cli/config/EthNetworkConfig.java +++ b/app/src/main/java/org/hyperledger/besu/cli/config/EthNetworkConfig.java @@ -17,32 +17,33 @@ import org.hyperledger.besu.config.GenesisConfig; import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.config.NetworkDefinition; +import org.hyperledger.besu.ethereum.p2p.discovery.dns.EthereumNodeRecord; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.stream.Collectors; /** * The Eth network config. * * @param genesisConfig Genesis Config File * @param networkId Network Id - * @param bootNodes Boot Nodes + * @param enodeBootNodes Enode Boot Nodes + * @param enrBootNodes ENR Boot Nodes * @param dnsDiscoveryUrl DNS Discovery URL */ public record EthNetworkConfig( GenesisConfig genesisConfig, BigInteger networkId, - List bootNodes, + List enodeBootNodes, + List enrBootNodes, String dnsDiscoveryUrl) { /** @@ -50,14 +51,16 @@ public record EthNetworkConfig( * * @param genesisConfig the genesis config * @param networkId the network id - * @param bootNodes the boot nodes + * @param enodeBootNodes the Enode boot nodes + * @param enrBootNodes the ENR boot nodes * @param dnsDiscoveryUrl the dns discovery url */ @SuppressWarnings( "MethodInputParametersMustBeFinal") // needed since record constructors are not yet supported public EthNetworkConfig { Objects.requireNonNull(genesisConfig); - Objects.requireNonNull(bootNodes); + Objects.requireNonNull(enodeBootNodes); + Objects.requireNonNull(enrBootNodes); } /** @@ -72,17 +75,21 @@ public static EthNetworkConfig getNetworkConfig(final NetworkDefinition networkD final GenesisConfigOptions genesisConfigOptions = genesisConfig.getConfigOptions(); final Optional> rawBootNodes = genesisConfigOptions.getDiscoveryOptions().getBootNodes(); - final List bootNodes = - rawBootNodes - .map( - strings -> - strings.stream().map(EnodeURLImpl::fromString).collect(Collectors.toList())) - .orElse(Collections.emptyList()); + final List enodeBootNodes = new ArrayList<>(); + final List enrBootNodes = new ArrayList<>(); + if (rawBootNodes.isPresent()) { + if (rawBootNodes.get().getFirst().startsWith("enr:")) { + enrBootNodes.addAll(rawBootNodes.get().stream().map(EthereumNodeRecord::fromEnr).toList()); + } else { + enodeBootNodes.addAll(rawBootNodes.get().stream().map(EnodeURLImpl::fromString).toList()); + } + } return new EthNetworkConfig( genesisConfig, networkDefinition.getNetworkId(), - bootNodes, + enodeBootNodes, + enrBootNodes, genesisConfigOptions.getDiscoveryOptions().getDiscoveryDnsUrl().orElse(null)); } @@ -111,7 +118,8 @@ public static class Builder { private String dnsDiscoveryUrl; private GenesisConfig genesisConfig; private BigInteger networkId; - private List bootNodes; + private List enodeBootNodes; + private List enrBootNodes; /** * Instantiates a new Builder. @@ -121,7 +129,8 @@ public static class Builder { public Builder(final EthNetworkConfig ethNetworkConfig) { this.genesisConfig = ethNetworkConfig.genesisConfig; this.networkId = ethNetworkConfig.networkId; - this.bootNodes = ethNetworkConfig.bootNodes; + this.enodeBootNodes = ethNetworkConfig.enodeBootNodes; + this.enrBootNodes = ethNetworkConfig.enrBootNodes; this.dnsDiscoveryUrl = ethNetworkConfig.dnsDiscoveryUrl; } @@ -150,11 +159,22 @@ public Builder setNetworkId(final BigInteger networkId) { /** * Sets boot nodes. * - * @param bootNodes the boot nodes + * @param enodeBootNodes the boot nodes + * @return this builder + */ + public Builder setEnodeBootNodes(final List enodeBootNodes) { + this.enodeBootNodes = enodeBootNodes; + return this; + } + + /** + * Sets ENR boot nodes. + * + * @param enrBootNodes the boot nodes * @return this builder */ - public Builder setBootNodes(final List bootNodes) { - this.bootNodes = bootNodes; + public Builder setEnrBootNodes(final List enrBootNodes) { + this.enrBootNodes = enrBootNodes; return this; } @@ -175,7 +195,8 @@ public Builder setDnsDiscoveryUrl(final String dnsDiscoveryUrl) { * @return the eth network config */ public EthNetworkConfig build() { - return new EthNetworkConfig(genesisConfig, networkId, bootNodes, dnsDiscoveryUrl); + return new EthNetworkConfig( + genesisConfig, networkId, enodeBootNodes, enrBootNodes, dnsDiscoveryUrl); } } } diff --git a/app/src/main/java/org/hyperledger/besu/util/PermissioningConfigurationValidator.java b/app/src/main/java/org/hyperledger/besu/util/PermissioningConfigurationValidator.java index 6c5fa233644..c37f75fa850 100644 --- a/app/src/main/java/org/hyperledger/besu/util/PermissioningConfigurationValidator.java +++ b/app/src/main/java/org/hyperledger/besu/util/PermissioningConfigurationValidator.java @@ -14,12 +14,11 @@ */ package org.hyperledger.besu.util; -import static java.util.stream.Collectors.toList; - +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.permissioning.LocalPermissioningConfiguration; -import org.hyperledger.besu.plugin.data.EnodeURL; -import java.net.URI; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -32,35 +31,34 @@ public class PermissioningConfigurationValidator { /** * Check if all nodes are in allowlist. * - * @param nodeURIs the node URIs + * @param nodeIdentifiers the node URIs * @param permissioningConfiguration the permissioning configuration * @throws Exception In case of nodes are not in allow list */ public static void areAllNodesInAllowlist( - final Collection nodeURIs, + final Collection nodeIdentifiers, final LocalPermissioningConfiguration permissioningConfiguration) throws Exception { - if (permissioningConfiguration.isNodeAllowlistEnabled() && nodeURIs != null) { - final List allowlistNodesWithoutQueryParam = - permissioningConfiguration.getNodeAllowlist().stream() - .map(EnodeURL::toURIWithoutDiscoveryPort) - .collect(toList()); + if (permissioningConfiguration.isNodeAllowlistEnabled() && nodeIdentifiers != null) { + final List allowlistNodesWithoutQueryParam = + permissioningConfiguration.getNodeAllowlist(); - final List nodeURIsNotInAllowlist = - nodeURIs.stream() - .map(EnodeURL::toURIWithoutDiscoveryPort) - .filter(uri -> !allowlistNodesWithoutQueryParam.contains(uri)) - .collect(toList()); + final List nodesNotInAllowlist = new ArrayList<>(nodeIdentifiers); + nodesNotInAllowlist.removeIf( + (node) -> + allowlistNodesWithoutQueryParam.stream() + .anyMatch( + (allowedNode) -> NodeIdentifier.isSameListeningEndpoint(node, allowedNode))); - if (!nodeURIsNotInAllowlist.isEmpty()) { + if (!nodesNotInAllowlist.isEmpty()) { throw new Exception( - "Specified node(s) not in nodes-allowlist " + enodesAsStrings(nodeURIsNotInAllowlist)); + "Specified node(s) not in nodes-allowlist " + enodesAsStrings(nodesNotInAllowlist)); } } } - private static Collection enodesAsStrings(final List enodes) { - return enodes.parallelStream().map(URI::toASCIIString).collect(Collectors.toList()); + private static Collection enodesAsStrings(final List nodeIdentifiers) { + return nodeIdentifiers.parallelStream().map(Object::toString).collect(Collectors.toList()); } } diff --git a/app/src/test/java/org/hyperledger/besu/RunnerTest.java b/app/src/test/java/org/hyperledger/besu/RunnerTest.java index ecdffc96923..002cc84148d 100644 --- a/app/src/test/java/org/hyperledger/besu/RunnerTest.java +++ b/app/src/test/java/org/hyperledger/besu/RunnerTest.java @@ -56,6 +56,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.p2p.config.NetworkingConfiguration; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.storage.StorageProvider; import org.hyperledger.besu.ethereum.storage.keyvalue.KeyValueSegmentIdentifier; @@ -65,7 +66,6 @@ import org.hyperledger.besu.metrics.ObservableMetricsSystem; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.plugin.services.storage.rocksdb.RocksDBKeyValueStorageFactory; import org.hyperledger.besu.plugin.services.storage.rocksdb.RocksDBMetricsFactory; import org.hyperledger.besu.plugin.services.storage.rocksdb.configuration.RocksDBFactoryConfiguration; @@ -132,17 +132,18 @@ public void stopVertx() { @Test public void getFixedNodes() { - final EnodeURL staticNode = + final EnodeURLImpl staticNode = EnodeURLImpl.fromString( "enode://8f4b88336cc40ef2516d8b27df812e007fb2384a61e93635f1899051311344f3dcdbb49a4fe49a79f66d2f589a9f282e8cc4f1d7381e8ef7e4fcc6b0db578c77@127.0.0.1:30301"); - final EnodeURL bootnode = + final EnodeURLImpl bootnode = EnodeURLImpl.fromString( "enode://8f4b88336cc40ef2516d8b27df812e007fb2384a61e93635f1899051311344f3dcdbb49a4fe49a79f66d2f589a9f282e8cc4f1d7381e8ef7e4fcc6b0db578c77@127.0.0.1:30302"); - final List bootnodes = new ArrayList<>(); + final List bootnodes = new ArrayList<>(); bootnodes.add(bootnode); - final Collection staticNodes = new ArrayList<>(); + final Collection staticNodes = new ArrayList<>(); staticNodes.add(staticNode); - final Collection fixedNodes = RunnerBuilder.getFixedNodes(bootnodes, staticNodes); + final Collection fixedNodes = + RunnerBuilder.getFixedNodes(bootnodes, staticNodes); assertThat(fixedNodes).containsExactlyInAnyOrder(staticNode, bootnode); // bootnodes should be unchanged assertThat(bootnodes).containsExactly(bootnode); @@ -250,13 +251,14 @@ private void syncFromGenesis( noOpMetricsSystem, miningParameters); - final EnodeURL aheadEnode = runnerAhead.getLocalEnode().get(); + final EnodeURLImpl aheadEnode = runnerAhead.getLocalEnode().get(); final EthNetworkConfig behindEthNetworkConfiguration = new EthNetworkConfig( GenesisConfig.fromResource(DEV.getGenesisFile()), DEV.getNetworkId(), Collections.singletonList(aheadEnode), - null); + Collections.emptyList(), + ""); runnerBehind = runnerBuilder diff --git a/app/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java b/app/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java index 670b6229f13..f3ef47e99d6 100644 --- a/app/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java +++ b/app/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java @@ -251,7 +251,7 @@ public void testGenesisOverrideOptionsWithCustomGenesis() throws Exception { verify(mockControllerBuilder).build(); final EthNetworkConfig config = networkArg.getValue(); - assertThat(config.bootNodes()).isEmpty(); + assertThat(config.enodeBootNodes()).isEmpty(); assertThat(config.dnsDiscoveryUrl()).isNull(); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(3141592)); @@ -312,6 +312,7 @@ public void callingBesuCommandWithoutOptionsMustSyncWithDefaultValues() { GenesisConfig.fromResource(MAINNET.getGenesisFile()), MAINNET.getNetworkId(), MAINNET_BOOTSTRAP_NODES, + Collections.emptyList(), MAINNET_DISCOVERY_URL)); verify(mockRunnerBuilder).p2pAdvertisedHost(eq("127.0.0.1")); verify(mockRunnerBuilder).p2pListenPort(eq(30303)); @@ -344,7 +345,7 @@ public void callingBesuCommandWithoutOptionsMustSyncWithDefaultValues() { assertThat(miningArg.getValue().getExtraData()) .isEqualTo(BesuVersionUtils.versionForExtraData()); assertThat(ethNetworkArg.getValue().networkId()).isEqualTo(1); - assertThat(ethNetworkArg.getValue().bootNodes()).isEqualTo(MAINNET_BOOTSTRAP_NODES); + assertThat(ethNetworkArg.getValue().enodeBootNodes()).isEqualTo(MAINNET_BOOTSTRAP_NODES); } // Testing each option @@ -402,7 +403,7 @@ public void callingWithNoBootnodesConfig() throws Exception { parseCommand("--config-file", toml.toAbsolutePath().toString()); verify(mockRunnerBuilder).ethNetworkConfig(ethNetworkConfigArgumentCaptor.capture()); - assertThat(ethNetworkConfigArgumentCaptor.getValue().bootNodes()).isEmpty(); + assertThat(ethNetworkConfigArgumentCaptor.getValue().enodeBootNodes()).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandOutput.toString(UTF_8)).isEmpty(); @@ -537,7 +538,7 @@ public void testGenesisPathEthOptions() throws Exception { verify(mockControllerBuilder).build(); final EthNetworkConfig config = networkArg.getValue(); - assertThat(config.bootNodes()).isEmpty(); + assertThat(config.enodeBootNodes()).isEmpty(); assertThat(config.dnsDiscoveryUrl()).isNull(); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(3141592)); } @@ -556,7 +557,7 @@ public void testGenesisPathMainnetEthConfig() { verify(mockControllerBuilder).build(); final EthNetworkConfig config = networkArg.getValue(); - assertThat(config.bootNodes()).isEqualTo(MAINNET_BOOTSTRAP_NODES); + assertThat(config.enodeBootNodes()).isEqualTo(MAINNET_BOOTSTRAP_NODES); assertThat(config.dnsDiscoveryUrl()).isEqualTo(MAINNET_DISCOVERY_URL); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(1)); verify(mockLogger, never()).warn(contains("Mainnet is deprecated and will be shutdown")); @@ -573,7 +574,7 @@ public void testGenesisPathSepoliaEthConfig() { verify(mockControllerBuilder).build(); final EthNetworkConfig config = networkArg.getValue(); - assertThat(config.bootNodes()).isEqualTo(SEPOLIA_BOOTSTRAP_NODES); + assertThat(config.enodeBootNodes()).isEqualTo(SEPOLIA_BOOTSTRAP_NODES); assertThat(config.dnsDiscoveryUrl()).isEqualTo(SEPOLIA_DISCOVERY_URL); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(11155111)); } @@ -589,7 +590,7 @@ public void testGenesisPathHoodiEthConfig() { verify(mockControllerBuilder).build(); final EthNetworkConfig config = networkArg.getValue(); - assertThat(config.bootNodes()).isEqualTo(HOODI_BOOTSTRAP_NODES); + assertThat(config.enodeBootNodes()).isEqualTo(HOODI_BOOTSTRAP_NODES); assertThat(config.dnsDiscoveryUrl()).isEqualTo(HOODI_DISCOVERY_URL); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(560048)); } @@ -605,7 +606,7 @@ public void testGenesisPathFutureEipsEthConfig() { verify(mockControllerBuilder).build(); final EthNetworkConfig config = networkArg.getValue(); - assertThat(config.bootNodes()).isEmpty(); + assertThat(config.enodeBootNodes()).isEmpty(); assertThat(config.dnsDiscoveryUrl()).isNull(); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(2022)); } @@ -621,7 +622,7 @@ public void testGenesisPathExperimentalEipsEthConfig() { verify(mockControllerBuilder).build(); final EthNetworkConfig config = networkArg.getValue(); - assertThat(config.bootNodes()).isEmpty(); + assertThat(config.enodeBootNodes()).isEmpty(); assertThat(config.dnsDiscoveryUrl()).isNull(); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(2023)); } @@ -703,7 +704,7 @@ public void defaultNetworkIdAndBootnodesForCustomNetworkOptions() throws Excepti assertThat(networkArg.getValue().genesisConfig()) .isEqualTo(GenesisConfig.fromConfig(encodeJsonGenesis(GENESIS_VALID_JSON))); - assertThat(networkArg.getValue().bootNodes()).isEmpty(); + assertThat(networkArg.getValue().enodeBootNodes()).isEmpty(); assertThat(networkArg.getValue().networkId()).isEqualTo(GENESIS_CONFIG_TEST_CHAINID); assertThat(commandOutput.toString(UTF_8)).isEmpty(); @@ -883,7 +884,7 @@ public void loadDiscoveryOptionsFromGenesisFile() throws IOException { final EthNetworkConfig config = networkArg.getValue(); assertThat(config.dnsDiscoveryUrl()).isEqualTo(DNS_DISCOVERY_URL); - assertThat(config.bootNodes()) + assertThat(config.enodeBootNodes()) .extracting(bootnode -> bootnode.toURI().toString()) .containsExactly(VALID_ENODE_STRINGS); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); @@ -922,7 +923,7 @@ public void bootnodesUrlCliArgTakesPrecedenceOverGenesisFile() throws IOExceptio verify(mockControllerBuilder).build(); final EthNetworkConfig config = networkArg.getValue(); - assertThat(config.bootNodes()).extracting(EnodeURL::toURI).containsExactly(bootnode); + assertThat(config.enodeBootNodes()).extracting(EnodeURL::toURI).containsExactly(bootnode); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); } @@ -956,7 +957,7 @@ public void callingWithBootnodesOptionButNoValueMustPassEmptyBootnodeList() { verify(mockRunnerBuilder).ethNetworkConfig(ethNetworkConfigArgumentCaptor.capture()); verify(mockRunnerBuilder).build(); - assertThat(ethNetworkConfigArgumentCaptor.getValue().bootNodes()).isEmpty(); + assertThat(ethNetworkConfigArgumentCaptor.getValue().enodeBootNodes()).isEmpty(); assertThat(commandOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); @@ -1004,7 +1005,7 @@ public void callingWithBootnodeThatHasDiscoveryDisabledMustDisplayError() { parseCommand("--bootnodes", bootnodesValue); assertThat(commandOutput.toString(UTF_8)).isEmpty(); final String expectedErrorOutputStart = - "Bootnodes must have discovery enabled. Invalid bootnodes: " + invalidBootnode + "."; + "Bootnodes must have discovery enabled. Invalid enodeBootnodes: " + invalidBootnode + "."; assertThat(commandErrorOutput.toString(UTF_8)).startsWith(expectedErrorOutputStart); } @@ -1026,7 +1027,7 @@ public void bootnodesOptionMustBeUsed() { verify(mockRunnerBuilder).ethNetworkConfig(ethNetworkConfigArgumentCaptor.capture()); verify(mockRunnerBuilder).build(); - assertThat(ethNetworkConfigArgumentCaptor.getValue().bootNodes()) + assertThat(ethNetworkConfigArgumentCaptor.getValue().enodeBootNodes()) .isEqualTo( Stream.of(VALID_ENODE_STRINGS) .map(EnodeURLImpl::fromString) @@ -2027,7 +2028,7 @@ private void networkValuesCanBeOverridden(final String network) { verify(mockControllerBuilderFactory).fromEthNetworkConfig(networkArg.capture(), any()); verify(mockControllerBuilder).build(); - assertThat(networkArg.getValue().bootNodes()) + assertThat(networkArg.getValue().enodeBootNodes()) .isEqualTo( Stream.of(VALID_ENODE_STRINGS) .map(EnodeURLImpl::fromString) diff --git a/app/src/test/java/org/hyperledger/besu/cli/CascadingDefaultProviderTest.java b/app/src/test/java/org/hyperledger/besu/cli/CascadingDefaultProviderTest.java index 65c0eca96de..9fdeed43a37 100644 --- a/app/src/test/java/org/hyperledger/besu/cli/CascadingDefaultProviderTest.java +++ b/app/src/test/java/org/hyperledger/besu/cli/CascadingDefaultProviderTest.java @@ -38,7 +38,6 @@ import org.hyperledger.besu.ethereum.eth.sync.SynchronizerConfiguration; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.io.File; import java.io.IOException; @@ -121,18 +120,18 @@ public void overrideDefaultValuesIfKeyIsPresentInConfigFile(final @TempDir File verify(mockRunnerBuilder).metricsConfiguration(eq(metricsConfiguration)); verify(mockRunnerBuilder).build(); - final List nodes = + final List nodes = asList( EnodeURLImpl.fromString("enode://" + VALID_NODE_ID + "@192.168.0.1:4567"), EnodeURLImpl.fromString("enode://" + VALID_NODE_ID + "@192.168.0.1:4567"), EnodeURLImpl.fromString("enode://" + VALID_NODE_ID + "@192.168.0.1:4567")); - assertThat(ethNetworkConfigArgumentCaptor.getValue().bootNodes()).isEqualTo(nodes); + assertThat(ethNetworkConfigArgumentCaptor.getValue().enodeBootNodes()).isEqualTo(nodes); final EthNetworkConfig networkConfig = new EthNetworkConfig.Builder(EthNetworkConfig.getNetworkConfig(MAINNET)) .setNetworkId(BigInteger.valueOf(42)) .setGenesisConfig(GenesisConfig.fromConfig(encodeJsonGenesis(GENESIS_VALID_JSON))) - .setBootNodes(nodes) + .setEnodeBootNodes(nodes) .setDnsDiscoveryUrl(null) .build(); verify(mockControllerBuilder).dataDirectory(eq(dataFolder.toPath())); @@ -172,6 +171,7 @@ public void noOverrideDefaultValuesIfKeyIsNotPresentInConfigFile() { GenesisConfig.fromResource(MAINNET.getGenesisFile()), MAINNET.getNetworkId(), MAINNET_BOOTSTRAP_NODES, + Collections.emptyList(), MAINNET_DISCOVERY_URL)); verify(mockRunnerBuilder).p2pAdvertisedHost(eq("127.0.0.1")); verify(mockRunnerBuilder).p2pListenPort(eq(30303)); diff --git a/app/src/test/java/org/hyperledger/besu/cli/EphemeryTest.java b/app/src/test/java/org/hyperledger/besu/cli/EphemeryTest.java index 5a4eefe0af3..dab692d5d0e 100644 --- a/app/src/test/java/org/hyperledger/besu/cli/EphemeryTest.java +++ b/app/src/test/java/org/hyperledger/besu/cli/EphemeryTest.java @@ -58,7 +58,6 @@ import org.hyperledger.besu.metrics.ObservableMetricsSystem; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.services.BesuPluginContextImpl; import org.hyperledger.besu.services.PermissioningServiceImpl; import org.hyperledger.besu.services.RpcEndpointServiceImpl; @@ -112,7 +111,7 @@ public class EphemeryTest extends CommandTestAbstract { BigInteger initialCycleId; String ephemeryDataPathPrefix = "Ephemery-data-chain"; - public static final List EPHEMERY_BOOT_NODES = + public static final List EPHEMERY_BOOT_NODES = Collections.unmodifiableList( Stream.of( "enode://50a54ecbd2175497640bcf46a25bbe9bb4fae51d7cc2a29ef4947a7ee17496cf39a699b7fe6b703ed0feb9dbaae7e44fc3827fcb7435ca9ac6de4daa4d983b3d@137.74.203.240:30303", diff --git a/app/src/test/java/org/hyperledger/besu/cli/config/EthNetworkConfigTest.java b/app/src/test/java/org/hyperledger/besu/cli/config/EthNetworkConfigTest.java index fee5de46d77..79990d5df4d 100644 --- a/app/src/test/java/org/hyperledger/besu/cli/config/EthNetworkConfigTest.java +++ b/app/src/test/java/org/hyperledger/besu/cli/config/EthNetworkConfigTest.java @@ -39,7 +39,7 @@ public class EthNetworkConfigTest { public void testDefaultMainnetConfig() { EthNetworkConfig config = EthNetworkConfig.getNetworkConfig(NetworkDefinition.MAINNET); assertThat(config.dnsDiscoveryUrl()).isEqualTo(MAINNET_DISCOVERY_URL); - assertThat(config.bootNodes()).isEqualTo(MAINNET_BOOTSTRAP_NODES); + assertThat(config.enodeBootNodes()).isEqualTo(MAINNET_BOOTSTRAP_NODES); assertThat(config.networkId()).isEqualTo(BigInteger.ONE); } @@ -47,7 +47,7 @@ public void testDefaultMainnetConfig() { public void testDefaultSepoliaConfig() { EthNetworkConfig config = EthNetworkConfig.getNetworkConfig(NetworkDefinition.SEPOLIA); assertThat(config.dnsDiscoveryUrl()).isEqualTo(SEPOLIA_DISCOVERY_URL); - assertThat(config.bootNodes()).isEqualTo(SEPOLIA_BOOTSTRAP_NODES); + assertThat(config.enodeBootNodes()).isEqualTo(SEPOLIA_BOOTSTRAP_NODES); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(11155111)); } @@ -55,7 +55,7 @@ public void testDefaultSepoliaConfig() { public void testDefaultHoodiConfig() { EthNetworkConfig config = EthNetworkConfig.getNetworkConfig(NetworkDefinition.HOODI); assertThat(config.dnsDiscoveryUrl()).isEqualTo(HOODI_DISCOVERY_URL); - assertThat(config.bootNodes()).isEqualTo(HOODI_BOOTSTRAP_NODES); + assertThat(config.enodeBootNodes()).isEqualTo(HOODI_BOOTSTRAP_NODES); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(560048)); } @@ -63,7 +63,7 @@ public void testDefaultHoodiConfig() { public void testDefaultDevConfig() { EthNetworkConfig config = EthNetworkConfig.getNetworkConfig(NetworkDefinition.DEV); assertThat(config.dnsDiscoveryUrl()).isNull(); - assertThat(config.bootNodes()).isEmpty(); + assertThat(config.enodeBootNodes()).isEmpty(); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(2018)); } @@ -71,7 +71,7 @@ public void testDefaultDevConfig() { public void testDefaultFutureConfig() { EthNetworkConfig config = EthNetworkConfig.getNetworkConfig(NetworkDefinition.FUTURE_EIPS); assertThat(config.dnsDiscoveryUrl()).isNull(); - assertThat(config.bootNodes()).isEmpty(); + assertThat(config.enodeBootNodes()).isEmpty(); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(2022)); } @@ -80,7 +80,7 @@ public void testDefaultExperimentalConfig() { EthNetworkConfig config = EthNetworkConfig.getNetworkConfig(NetworkDefinition.EXPERIMENTAL_EIPS); assertThat(config.dnsDiscoveryUrl()).isNull(); - assertThat(config.bootNodes()).isEmpty(); + assertThat(config.enodeBootNodes()).isEmpty(); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(2023)); } @@ -102,7 +102,7 @@ public void testBuilderWithNetworkId() { assertThat(config.genesisConfig().getConfigOptions().getChainId()) .contains(BigInteger.valueOf(1234567)); assertThat(config.dnsDiscoveryUrl()).isNotNull(); - assertThat(config.bootNodes()).isNotEmpty(); + assertThat(config.enodeBootNodes()).isNotEmpty(); assertThat(config.networkId()).isEqualTo(BigInteger.valueOf(42)); } diff --git a/app/src/test/java/org/hyperledger/besu/cli/options/PermissionsOptionsTest.java b/app/src/test/java/org/hyperledger/besu/cli/options/PermissionsOptionsTest.java index 6d62b5693d9..21d0b430ca8 100644 --- a/app/src/test/java/org/hyperledger/besu/cli/options/PermissionsOptionsTest.java +++ b/app/src/test/java/org/hyperledger/besu/cli/options/PermissionsOptionsTest.java @@ -168,7 +168,7 @@ public void defaultPermissionsTomlFileWithNoPermissionsEnabledMustNotError() { @Test public void nodePermissioningTomlPathMustUseOption() throws IOException { - final List allowedNodes = + final List allowedNodes = Lists.newArrayList( EnodeURLImpl.fromString( "enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.9:4567"), diff --git a/app/src/test/java/org/hyperledger/besu/ethereum/p2p/config/DefaultDiscoveryConfiguration.java b/app/src/test/java/org/hyperledger/besu/ethereum/p2p/config/DefaultDiscoveryConfiguration.java index 78bc5635524..db973127052 100644 --- a/app/src/test/java/org/hyperledger/besu/ethereum/p2p/config/DefaultDiscoveryConfiguration.java +++ b/app/src/test/java/org/hyperledger/besu/ethereum/p2p/config/DefaultDiscoveryConfiguration.java @@ -31,7 +31,7 @@ public class DefaultDiscoveryConfiguration { public static final String MAINNET_DISCOVERY_URL = "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.mainnet.ethdisco.net"; - public static final List MAINNET_BOOTSTRAP_NODES = + public static final List MAINNET_BOOTSTRAP_NODES = Collections.unmodifiableList( Stream.of( // Ethereum Foundation Bootnodes diff --git a/app/src/test/java/org/hyperledger/besu/util/LocalPermissioningConfigurationValidatorTest.java b/app/src/test/java/org/hyperledger/besu/util/LocalPermissioningConfigurationValidatorTest.java index 448743b8a41..460998a2308 100644 --- a/app/src/test/java/org/hyperledger/besu/util/LocalPermissioningConfigurationValidatorTest.java +++ b/app/src/test/java/org/hyperledger/besu/util/LocalPermissioningConfigurationValidatorTest.java @@ -25,7 +25,6 @@ import org.hyperledger.besu.ethereum.p2p.peers.ImmutableEnodeDnsConfiguration; import org.hyperledger.besu.ethereum.permissioning.LocalPermissioningConfiguration; import org.hyperledger.besu.ethereum.permissioning.PermissioningConfigurationBuilder; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.net.URL; import java.nio.file.Files; @@ -68,7 +67,7 @@ public void sepoliaWithNodesAllowlistOptionWhichDoesIncludeRopstenBootnodesMustN true, toml.toAbsolutePath().toString()); - final List enodeURIs = ethNetworkConfig.bootNodes(); + final List enodeURIs = ethNetworkConfig.enodeBootNodes(); PermissioningConfigurationValidator.areAllNodesInAllowlist( enodeURIs, permissioningConfiguration); } @@ -93,7 +92,7 @@ public void nodesAllowlistOptionWhichDoesNotIncludeBootnodesMustError() throws E toml.toAbsolutePath().toString()); try { - final List enodeURIs = ethNetworkConfig.bootNodes(); + final List enodeURIs = ethNetworkConfig.enodeBootNodes(); PermissioningConfigurationValidator.areAllNodesInAllowlist( enodeURIs, permissioningConfiguration); fail("expected exception because sepolia bootnodes are not in node-allowlist"); @@ -133,7 +132,7 @@ public void nodeAllowlistCheckShouldIgnoreDiscoveryPortParam() throws Exception toml.toAbsolutePath().toString()); // This node is defined in the PERMISSIONING_CONFIG file without the discovery port - final EnodeURL enodeURL = + final EnodeURLImpl enodeURL = EnodeURLImpl.fromString( "enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.9:4567?discport=30303"); @@ -170,7 +169,7 @@ public void nodeAllowlistCheckShouldWorkWithHostnameIfDnsEnabled() throws Except toml.toAbsolutePath().toString()); // This node is defined in the PERMISSIONING_CONFIG_DNS file without the discovery port - final EnodeURL enodeURL = + final EnodeURLImpl enodeURL = EnodeURLImpl.fromString( "enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@localhost:4567?discport=30303", enodeDnsConfiguration); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminAddPeer.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminAddPeer.java index 643abce59f7..49fa2881257 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminAddPeer.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminAddPeer.java @@ -25,7 +25,6 @@ import org.hyperledger.besu.ethereum.p2p.peers.EnodeDnsConfiguration; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.Peer; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.Optional; @@ -53,7 +52,7 @@ protected JsonRpcResponse performOperation(final Object id, final String enode) return new JsonRpcErrorResponse(id, DISCOVERY_DISABLED); } LOG.debug("Adding ({}) to peers", enode); - final EnodeURL enodeURL = + final EnodeURLImpl enodeURL = this.enodeDnsConfiguration.isEmpty() ? EnodeURLImpl.fromString(enode) : EnodeURLImpl.fromString(enode, enodeDnsConfiguration.get()); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfo.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfo.java index a48adf51584..ca8c7b2d226 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfo.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfo.java @@ -25,6 +25,7 @@ import org.hyperledger.besu.ethereum.chain.ChainHead; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.p2p.network.P2PNetwork; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.nat.NatService; import org.hyperledger.besu.nat.core.domain.NatPortMapping; import org.hyperledger.besu.nat.core.domain.NatServiceType; @@ -81,7 +82,7 @@ public JsonRpcResponse response(final JsonRpcRequestContext requestContext) { return new JsonRpcErrorResponse( requestContext.getRequest().getId(), RpcErrorType.P2P_DISABLED); } - final Optional maybeEnode = peerNetwork.getLocalEnode(); + final Optional maybeEnode = peerNetwork.getLocalEnode(); if (maybeEnode.isEmpty()) { return new JsonRpcErrorResponse( requestContext.getRequest().getId(), RpcErrorType.P2P_NETWORK_NOT_RUNNING); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminRemovePeer.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminRemovePeer.java index 0cb654bb129..dfe3c3ba955 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminRemovePeer.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminRemovePeer.java @@ -21,7 +21,6 @@ import org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer; import org.hyperledger.besu.ethereum.p2p.peers.EnodeDnsConfiguration; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.Optional; @@ -45,7 +44,7 @@ public String getName() { @Override protected JsonRpcResponse performOperation(final Object id, final String enode) { LOG.debug("Remove ({}) from peer cache", enode); - final EnodeURL enodeURL = + final EnodeURLImpl enodeURL = this.enodeDnsConfiguration.isEmpty() ? EnodeURLImpl.fromString(enode) : EnodeURLImpl.fromString(enode, enodeDnsConfiguration.get()); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/NetEnode.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/NetEnode.java index 67ce3f83b0b..bd0dc7abf3e 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/NetEnode.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/NetEnode.java @@ -21,7 +21,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType; import org.hyperledger.besu.ethereum.p2p.network.P2PNetwork; -import org.hyperledger.besu.plugin.data.EnodeURL; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import java.util.Optional; @@ -44,7 +44,7 @@ public JsonRpcResponse response(final JsonRpcRequestContext requestContext) { return p2pDisabledResponse(requestContext); } - final Optional enodeURL = p2pNetwork.getLocalEnode(); + final Optional enodeURL = p2pNetwork.getLocalEnode(); if (!enodeURL.isPresent()) { return enodeUrlNotAvailable(requestContext); } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfoTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfoTest.java index fb5a5604db3..c2bf3066ea3 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfoTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AdminNodeInfoTest.java @@ -44,7 +44,6 @@ import org.hyperledger.besu.nat.core.domain.NatPortMapping; import org.hyperledger.besu.nat.core.domain.NatServiceType; import org.hyperledger.besu.nat.core.domain.NetworkProtocol; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.math.BigInteger; import java.util.Collections; @@ -206,7 +205,7 @@ public void shouldReturnCorrectResultWhenIsNatEnvironment() { @Test public void handlesLocalEnodeWithListeningAndDiscoveryDisabled() { - final EnodeURL localEnode = + final EnodeURLImpl localEnode = EnodeURLImpl.builder() .nodeId(nodeId) .ipAddress("1.2.3.4") @@ -252,7 +251,7 @@ public void handlesLocalEnodeWithListeningAndDiscoveryDisabled() { @Test public void handlesLocalEnodeWithListeningDisabled() { - final EnodeURL localEnode = + final EnodeURLImpl localEnode = EnodeURLImpl.builder() .nodeId(nodeId) .ipAddress("1.2.3.4") @@ -299,7 +298,7 @@ public void handlesLocalEnodeWithListeningDisabled() { @Test public void handlesLocalEnodeWithDiscoveryDisabled() { - final EnodeURL localEnode = + final EnodeURLImpl localEnode = EnodeURLImpl.builder() .nodeId(nodeId) .ipAddress("1.2.3.4") diff --git a/ethereum/ethstats/src/test/java/org/hyperledger/besu/ethstats/EthStatsServiceTest.java b/ethereum/ethstats/src/test/java/org/hyperledger/besu/ethstats/EthStatsServiceTest.java index 99b1c5dd6c9..928de3a343b 100644 --- a/ethereum/ethstats/src/test/java/org/hyperledger/besu/ethstats/EthStatsServiceTest.java +++ b/ethereum/ethstats/src/test/java/org/hyperledger/besu/ethstats/EthStatsServiceTest.java @@ -41,7 +41,6 @@ import org.hyperledger.besu.ethstats.request.EthStatsRequest; import org.hyperledger.besu.ethstats.util.EthStatsConnectOptions; import org.hyperledger.besu.ethstats.util.ImmutableEthStatsConnectOptions; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.math.BigInteger; import java.time.Duration; @@ -96,7 +95,7 @@ public class EthStatsServiceTest { .ethStatsReportInterval(5) .build(); - final EnodeURL node = + final EnodeURLImpl node = EnodeURLImpl.builder() .nodeId( "50203c6bfca6874370e71aecc8958529fd723feb05013dc1abca8fc1fff845c5259faba05852e9dfe5ce172a7d6e7c2a3a5eaa8b541c8af15ea5518bbff5f2fa") diff --git a/ethereum/mock-p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/testing/MockNetwork.java b/ethereum/mock-p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/testing/MockNetwork.java index 473be906181..50d7791155a 100644 --- a/ethereum/mock-p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/testing/MockNetwork.java +++ b/ethereum/mock-p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/testing/MockNetwork.java @@ -16,6 +16,7 @@ import org.hyperledger.besu.ethereum.p2p.discovery.discv4.internal.DiscoveryPeerV4; import org.hyperledger.besu.ethereum.p2p.network.P2PNetwork; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.rlpx.ConnectCallback; import org.hyperledger.besu.ethereum.p2p.rlpx.DisconnectCallback; @@ -28,7 +29,6 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.ShouldConnectCallback; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.util.Subscribers; import java.net.InetSocketAddress; @@ -230,7 +230,7 @@ public boolean isStopped() { } @Override - public Optional getLocalEnode() { + public Optional getLocalEnode() { return Optional.empty(); } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/config/DiscoveryConfiguration.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/config/DiscoveryConfiguration.java index 2899d19ed30..4b073239c54 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/config/DiscoveryConfiguration.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/config/DiscoveryConfiguration.java @@ -14,8 +14,9 @@ */ package org.hyperledger.besu.ethereum.p2p.config; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; +import org.hyperledger.besu.ethereum.p2p.discovery.dns.EthereumNodeRecord; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.util.NetworkUtility; import java.util.ArrayList; @@ -31,7 +32,8 @@ public class DiscoveryConfiguration { private int bindPort = 30303; private String advertisedHost = "127.0.0.1"; private int bucketSize = 16; - private List bootnodes = new ArrayList<>(); + private List enodeBootnodes = new ArrayList<>(); + private List enrBootnodes = new ArrayList<>(); private String dnsDiscoveryURL; private boolean discoveryV5Enabled = false; private boolean filterOnEnrForkId = NetworkingConfiguration.DEFAULT_FILTER_ON_ENR_FORK_ID; @@ -45,15 +47,17 @@ public static DiscoveryConfiguration create() { return new DiscoveryConfiguration(); } - public static void assertValidBootnodes(final List bootnodes) { - final List invalidEnodes = - bootnodes.stream().filter(e -> !e.isRunningDiscovery()).collect(Collectors.toList()); + public static void assertValidBootnodes(final List bootnodes) { + final List invalidEnodes = + bootnodes.stream().filter(e -> e.getUdpDiscoveryPort().isEmpty()).toList(); - if (invalidEnodes.size() > 0) { + if (!invalidEnodes.isEmpty()) { final String invalidBootnodes = - invalidEnodes.stream().map(EnodeURL::toString).collect(Collectors.joining(",")); + invalidEnodes.stream().map(NodeIdentifier::toString).collect(Collectors.joining(",")); final String errorMsg = - "Bootnodes must have discovery enabled. Invalid bootnodes: " + invalidBootnodes + "."; + "Bootnodes must have discovery enabled. Invalid enodeBootnodes: " + + invalidBootnodes + + "."; throw new IllegalArgumentException(errorMsg); } } @@ -85,16 +89,30 @@ public DiscoveryConfiguration setEnabled(final boolean enabled) { return this; } - public List getBootnodes() { - return bootnodes; + public List getEnodeBootnodes() { + return enodeBootnodes; } - public DiscoveryConfiguration setBootnodes(final List bootnodes) { - assertValidBootnodes(bootnodes); - this.bootnodes = bootnodes; + public DiscoveryConfiguration setEnodeBootnodes(final List enodeBootnodes) { + assertValidBootnodes(enodeBootnodes); + this.enodeBootnodes = enodeBootnodes; return this; } + public List getEnrBootnodes() { + return enrBootnodes; + } + + public DiscoveryConfiguration setEnrBootnodes(final List enrBootnodes) { + assertValidBootnodes(enrBootnodes); + this.enrBootnodes = enrBootnodes; + return this; + } + + public List getBootnodeIdentifiers() { + return enodeBootnodes.isEmpty() ? enrBootnodes : enodeBootnodes; + } + public boolean getIncludeBootnodesOnPeerRefresh() { return includeBootnodesOnPeerRefresh; } @@ -203,7 +221,8 @@ public boolean equals(final Object o) { && bindPortIpv6 == that.bindPortIpv6 && Objects.equals(bindHost, that.bindHost) && Objects.equals(advertisedHost, that.advertisedHost) - && Objects.equals(bootnodes, that.bootnodes) + && Objects.equals(enodeBootnodes, that.enodeBootnodes) + && Objects.equals(enrBootnodes, that.enrBootnodes) && Objects.equals(dnsDiscoveryURL, that.dnsDiscoveryURL) && Objects.equals(bindHostIpv6, that.bindHostIpv6) && Objects.equals(advertisedHostIpv6, that.advertisedHostIpv6) @@ -218,7 +237,8 @@ public int hashCode() { bindPort, advertisedHost, bucketSize, - bootnodes, + enodeBootnodes, + enrBootnodes, dnsDiscoveryURL, bindHostIpv6, bindPortIpv6, @@ -241,8 +261,10 @@ public String toString() { + '\'' + ", bucketSize=" + bucketSize - + ", bootnodes=" - + bootnodes + + ", enodeBootnodes=" + + enodeBootnodes + + ", enrBootnodes=" + + enrBootnodes + ", dnsDiscoveryURL=" + dnsDiscoveryURL + ", isDiscoveryV5Enabled=" diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/DiscoveryPeer.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/DiscoveryPeer.java index ad70f37a718..00eec4f4baf 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/DiscoveryPeer.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/DiscoveryPeer.java @@ -16,7 +16,7 @@ import org.hyperledger.besu.ethereum.forkid.ForkId; import org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer; -import org.hyperledger.besu.plugin.data.EnodeURL; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import java.util.Optional; @@ -27,7 +27,7 @@ public class DiscoveryPeer extends DefaultPeer { private NodeRecord nodeRecord; private Optional forkId = Optional.empty(); - protected DiscoveryPeer(final EnodeURL enodeURL) { + protected DiscoveryPeer(final EnodeURLImpl enodeURL) { super(enodeURL); } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/DiscoveryPeerFactory.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/DiscoveryPeerFactory.java index 9006b3c9afd..97efeeb1ceb 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/DiscoveryPeerFactory.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/DiscoveryPeerFactory.java @@ -17,7 +17,6 @@ import org.hyperledger.besu.ethereum.p2p.discovery.discv4.internal.DiscoveryPeerV4; import org.hyperledger.besu.ethereum.p2p.discovery.dns.EthereumNodeRecord; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.ethereum.beacon.discovery.schema.NodeRecord; @@ -27,7 +26,7 @@ private DiscoveryPeerFactory() { // utility class } - public static DiscoveryPeer fromEnode(final EnodeURL enode) { + public static DiscoveryPeer fromEnode(final EnodeURLImpl enode) { return DiscoveryPeerV4.fromEnode(enode); } @@ -48,7 +47,7 @@ public static DiscoveryPeer fromEthereumNodeRecord( return peer; } - private static EnodeURL buildEnodeUrl( + private static EnodeURLImpl buildEnodeUrl( final EthereumNodeRecord enr, final boolean preferIpv6Outbound) { final boolean hasIpv4 = enr.ip() != null; final boolean hasIpv6 = enr.ipv6().isPresent(); diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/NodeIdentifier.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/NodeIdentifier.java new file mode 100644 index 00000000000..249372ac46e --- /dev/null +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/NodeIdentifier.java @@ -0,0 +1,41 @@ +/* + * Copyright contributors to 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.p2p.discovery; + +import java.net.InetAddress; +import java.util.Optional; + +public interface NodeIdentifier { + InetAddress getIpV4Address(); + + Optional getTcpListeningPort(); + + Optional getUdpDiscoveryPort(); + + Optional getIpV6Address(); + + Optional getIpV6TcpListeningPort(); + + Optional getIpV6UdpDiscoveryPort(); + + static boolean isSameListeningEndpoint(final NodeIdentifier node1, final NodeIdentifier node2) { + return node1 != null + && node2 != null + && ((node1.getIpV4Address().equals(node2.getIpV4Address()) + && node1.getTcpListeningPort().equals(node2.getTcpListeningPort())) + || (node1.getIpV6Address().equals(node2.getIpV6Address()) + && node1.getIpV6TcpListeningPort().equals(node2.getTcpListeningPort()))); + } +} diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/Endpoint.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/Endpoint.java index 76051d382eb..abe626be450 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/Endpoint.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/Endpoint.java @@ -66,7 +66,7 @@ public static Endpoint fromEnode(final EnodeURL enode) { return new Endpoint(enode.getIp().getHostAddress(), discoveryPort.get(), listeningPort); } - public EnodeURL toEnode(final Bytes nodeId) { + public EnodeURLImpl toEnode(final Bytes nodeId) { return EnodeURLImpl.builder() .nodeId(nodeId) .ipAddress(host.orElse("")) diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryAgentV4.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryAgentV4.java index cff09842d24..ac0f7761f91 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryAgentV4.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryAgentV4.java @@ -102,7 +102,9 @@ protected PeerDiscoveryAgentV4( this.peerPermissions = peerPermissions; this.bootstrapPeers = - config.getBootnodes().stream().map(DiscoveryPeerV4::fromEnode).collect(Collectors.toList()); + config.getEnodeBootnodes().stream() + .map(DiscoveryPeerV4::fromEnode) + .collect(Collectors.toList()); this.config = config; this.nodeKey = nodeKey; @@ -324,7 +326,7 @@ private static void validateConfiguration(final DiscoveryConfiguration config) { checkArgument( config.getBindPort() == 0 || NetworkUtility.isValidPort(config.getBindPort()), "valid port number required"); - checkArgument(config.getBootnodes() != null, "bootstrapPeers cannot be null"); + checkArgument(config.getEnodeBootnodes() != null, "bootstrapPeers cannot be null"); checkArgument(config.getBucketSize() > 0, "bucket size cannot be negative nor zero"); } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/internal/DiscoveryPeerV4.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/internal/DiscoveryPeerV4.java index c8e9092b5df..c7e16e31e5e 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/internal/DiscoveryPeerV4.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/internal/DiscoveryPeerV4.java @@ -16,6 +16,7 @@ import org.hyperledger.besu.ethereum.p2p.discovery.DiscoveryPeer; import org.hyperledger.besu.ethereum.p2p.discovery.discv4.Endpoint; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.rlp.RLPInput; import org.hyperledger.besu.ethereum.rlp.RLPOutput; @@ -38,12 +39,12 @@ public class DiscoveryPeerV4 extends DiscoveryPeer { // Timestamps. private final AtomicLong firstDiscovered = new AtomicLong(0L); - private DiscoveryPeerV4(final EnodeURL enode, final Endpoint endpoint) { + private DiscoveryPeerV4(final EnodeURLImpl enode, final Endpoint endpoint) { super(enode); this.endpoint = endpoint; } - public static DiscoveryPeerV4 fromEnode(final EnodeURL enode) { + public static DiscoveryPeerV4 fromEnode(final EnodeURLImpl enode) { return new DiscoveryPeerV4(enode, Endpoint.fromEnode(enode)); } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv5/PeerDiscoveryAgentFactoryV5.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv5/PeerDiscoveryAgentFactoryV5.java index 5845b1f9382..7e211b2aba4 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv5/PeerDiscoveryAgentFactoryV5.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/discv5/PeerDiscoveryAgentFactoryV5.java @@ -26,6 +26,7 @@ import org.hyperledger.besu.ethereum.p2p.discovery.NodeRecordManager; import org.hyperledger.besu.ethereum.p2p.discovery.PeerDiscoveryAgent; import org.hyperledger.besu.ethereum.p2p.discovery.PeerDiscoveryAgentFactory; +import org.hyperledger.besu.ethereum.p2p.discovery.dns.EthereumNodeRecord; import org.hyperledger.besu.ethereum.p2p.rlpx.RlpxAgent; import org.hyperledger.besu.ethereum.storage.StorageProvider; import org.hyperledger.besu.nat.NatService; @@ -103,7 +104,11 @@ public PeerDiscoveryAgent create(final RlpxAgent rlpxAgent) { .localNodeRecordListener((previous, updated) -> nodeRecordManager.updateNodeRecord()) .newAddressHandler((nodeRecord, newAddress) -> Optional.of(nodeRecord)) // TODO Integrate address filtering based on peer permissions - .addressAccessPolicy(AddressAccessPolicy.ALLOW_ALL); + .addressAccessPolicy(AddressAccessPolicy.ALLOW_ALL) + .bootnodes( + config.discoveryConfiguration().getEnrBootnodes().stream() + .map(EthereumNodeRecord::nodeRecord) + .toList()); if (disc.isDualStackEnabled()) { final InetSocketAddress ipv4 = new InetSocketAddress(disc.getBindHost(), disc.getBindPort()); diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/dns/EthereumNodeRecord.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/dns/EthereumNodeRecord.java index 9882f729627..64ca20bf828 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/dns/EthereumNodeRecord.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/dns/EthereumNodeRecord.java @@ -17,6 +17,7 @@ package org.hyperledger.besu.ethereum.p2p.discovery.dns; import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import java.net.InetAddress; import java.util.Arrays; @@ -41,7 +42,8 @@ public record EthereumNodeRecord( Optional ipv6, Optional tcpV6, Optional udpV6, - NodeRecord nodeRecord) { + NodeRecord nodeRecord) + implements NodeIdentifier { /** * Creates an EthereumNodeRecord from an ENR string @@ -186,4 +188,34 @@ public boolean equals(final Object obj) { && Objects.equals(this.udpV6, other.udpV6) && Objects.equals(this.nodeRecord, other.nodeRecord); } + + @Override + public InetAddress getIpV4Address() { + return ip; + } + + @Override + public Optional getTcpListeningPort() { + return tcp; + } + + @Override + public Optional getUdpDiscoveryPort() { + return udp; + } + + @Override + public Optional getIpV6Address() { + return ipv6; + } + + @Override + public Optional getIpV6TcpListeningPort() { + return tcpV6; + } + + @Override + public Optional getIpV6UdpDiscoveryPort() { + return udpV6; + } } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetwork.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetwork.java index 787a5b61397..2632b40f646 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetwork.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetwork.java @@ -51,7 +51,6 @@ import org.hyperledger.besu.nat.core.domain.NatServiceType; import org.hyperledger.besu.nat.core.domain.NetworkProtocol; import org.hyperledger.besu.nat.upnp.UpnpNatManager; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.plugin.services.MetricsSystem; import java.time.Duration; @@ -461,7 +460,7 @@ public boolean isStopped() { } @Override - public Optional getLocalEnode() { + public Optional getLocalEnode() { if (!localNode.isReady()) { return Optional.empty(); } @@ -503,7 +502,7 @@ private void setLocalNode( // override advertised host if we detect an external IP address via NAT manager final String advertisedAddress = natService.queryExternalIPAddress(address); - final EnodeURL localEnode = + final EnodeURLImpl localEnode = EnodeURLImpl.builder() .nodeId(nodeId) .ipAddress(advertisedAddress) diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/NoopP2PNetwork.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/NoopP2PNetwork.java index 77fec07636d..8941fb346ea 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/NoopP2PNetwork.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/NoopP2PNetwork.java @@ -16,6 +16,7 @@ import org.hyperledger.besu.ethereum.p2p.discovery.DiscoveryPeer; import org.hyperledger.besu.ethereum.p2p.network.exceptions.P2PDisabledException; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.rlpx.ConnectCallback; import org.hyperledger.besu.ethereum.p2p.rlpx.DisconnectCallback; @@ -23,7 +24,6 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.ShouldConnectCallback; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.io.IOException; import java.util.Collection; @@ -103,7 +103,7 @@ public boolean isStopped() { } @Override - public Optional getLocalEnode() { + public Optional getLocalEnode() { return Optional.empty(); } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/P2PNetwork.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/P2PNetwork.java index acc3f1585ec..87fc473fa27 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/P2PNetwork.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/P2PNetwork.java @@ -15,6 +15,7 @@ package org.hyperledger.besu.ethereum.p2p.network; import org.hyperledger.besu.ethereum.p2p.discovery.DiscoveryPeer; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.rlpx.ConnectCallback; import org.hyperledger.besu.ethereum.p2p.rlpx.DisconnectCallback; @@ -24,7 +25,6 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Message; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.ShouldConnectCallback; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.io.Closeable; import java.util.Collection; @@ -160,7 +160,7 @@ default int getPeerCount() { * @return the enodeURL associated with this node if P2P has been enabled. Returns empty * otherwise. */ - Optional getLocalEnode(); + Optional getLocalEnode(); void updateNodeRecord(); diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultLocalNode.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultLocalNode.java index 5a0f4d6075e..8a3c71c9f77 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultLocalNode.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultLocalNode.java @@ -16,7 +16,6 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.List; import java.util.Optional; @@ -44,7 +43,7 @@ public static DefaultLocalNode create( } @Override - public void setEnode(final EnodeURL enode) throws NodeAlreadySetException { + public void setEnode(final EnodeURLImpl enode) throws NodeAlreadySetException { if (peer.isPresent()) { throw new NodeAlreadySetException("Attempt to set already initialized local node"); } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultPeer.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultPeer.java index 38d38a51ba2..88de93005e6 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultPeer.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultPeer.java @@ -15,7 +15,6 @@ package org.hyperledger.besu.ethereum.p2p.peers; import org.hyperledger.besu.ethereum.forkid.ForkId; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.net.URI; import java.util.Objects; @@ -24,15 +23,15 @@ /** The default, basic representation of an Ethereum {@link Peer}. */ public class DefaultPeer extends DefaultPeerId implements Peer { - private final EnodeURL enodeURL; + private final EnodeURLImpl enodeURL; private ForkId forkId; - protected DefaultPeer(final EnodeURL enodeURL) { + protected DefaultPeer(final EnodeURLImpl enodeURL) { super(enodeURL.getNodeId()); this.enodeURL = enodeURL; } - public static DefaultPeer fromEnodeURL(final EnodeURL enodeURL) { + public static DefaultPeer fromEnodeURL(final EnodeURLImpl enodeURL) { return new DefaultPeer(enodeURL); } @@ -59,7 +58,7 @@ public static DefaultPeer fromURI(final URI uri) { } @Override - public EnodeURL getEnodeURL() { + public EnodeURLImpl getEnodeURL() { return enodeURL; } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImpl.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImpl.java index c56f1aa0b6b..c992591d907 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImpl.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImpl.java @@ -17,6 +17,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.util.NetworkUtility; @@ -34,7 +35,7 @@ import com.google.common.primitives.Ints; import org.apache.tuweni.bytes.Bytes; -public class EnodeURLImpl implements EnodeURL { +public class EnodeURLImpl implements EnodeURL, NodeIdentifier { public static final int DEFAULT_LISTENING_PORT = 30303; public static final int DEFAULT_LISTENING_PORT_IPV6 = 30404; @@ -72,11 +73,11 @@ public static Builder builder() { return new Builder(); } - public static EnodeURL fromString(final String value) { + public static EnodeURLImpl fromString(final String value) { return fromString(value, EnodeDnsConfiguration.dnsDisabled()); } - public static EnodeURL fromString( + public static EnodeURLImpl fromString( final String value, final EnodeDnsConfiguration enodeDnsConfiguration) { try { checkStringArgumentNotEmpty(value, "Invalid empty value."); @@ -102,11 +103,12 @@ public static EnodeURL fromString( } } - public static EnodeURL fromURI(final URI uri) { + public static EnodeURLImpl fromURI(final URI uri) { return fromURI(uri, EnodeDnsConfiguration.dnsDisabled()); } - public static EnodeURL fromURI(final URI uri, final EnodeDnsConfiguration enodeDnsConfiguration) { + public static EnodeURLImpl fromURI( + final URI uri, final EnodeDnsConfiguration enodeDnsConfiguration) { checkArgument(uri != null, "URI cannot be null"); checkStringArgumentNotEmpty(uri.getScheme(), "Missing 'enode' scheme."); checkStringArgumentNotEmpty(uri.getHost(), "Missing or invalid host or ip address."); @@ -147,14 +149,13 @@ private static void checkStringArgumentNotEmpty(final String argument, final Str checkArgument(argument != null && !argument.trim().isEmpty(), message); } - public static boolean sameListeningEndpoint(final EnodeURL enodeA, final EnodeURL enodeB) { + public static boolean sameListeningEndpoint(final EnodeURL enodeA, final NodeIdentifier enodeB) { if (enodeA == null || enodeB == null) { return false; } - return Objects.equals(enodeA.getNodeId(), enodeB.getNodeId()) - && Objects.equals(enodeA.getIp(), enodeB.getIp()) - && Objects.equals(enodeA.getListeningPort(), enodeB.getListeningPort()); + return Objects.equals(enodeA.getIp(), enodeB.getIpV4Address()) + && Objects.equals(enodeA.getListeningPort(), enodeB.getTcpListeningPort()); } public static Bytes parseNodeId(final String nodeId) { @@ -329,6 +330,36 @@ public String toString() { return this.toURI().toString(); } + @Override + public InetAddress getIpV4Address() { + return getIp(); + } + + @Override + public Optional getTcpListeningPort() { + return getListeningPort(); + } + + @Override + public Optional getUdpDiscoveryPort() { + return getDiscoveryPort(); + } + + @Override + public Optional getIpV6Address() { + return Optional.empty(); + } + + @Override + public Optional getIpV6TcpListeningPort() { + return Optional.empty(); + } + + @Override + public Optional getIpV6UdpDiscoveryPort() { + return Optional.empty(); + } + public static class Builder { private Bytes nodeId; @@ -339,7 +370,7 @@ public static class Builder { private Builder() {} - public EnodeURL build() { + public EnodeURLImpl build() { validate(); return new EnodeURLImpl(nodeId, ip, maybeHostname, listeningPort, discoveryPort); } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/LocalNode.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/LocalNode.java index 5bd4cc90ac6..62357006279 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/LocalNode.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/LocalNode.java @@ -16,7 +16,6 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.List; @@ -31,7 +30,7 @@ static LocalNode create( final String clientId, final int p2pVersion, final List supportedCapabilities, - final EnodeURL enode) { + final EnodeURLImpl enode) { DefaultLocalNode localNode = DefaultLocalNode.create(clientId, p2pVersion, supportedCapabilities); localNode.setEnode(enode); diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/MutableLocalNode.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/MutableLocalNode.java index d95a7ca4f88..f25a4c3950d 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/MutableLocalNode.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/MutableLocalNode.java @@ -15,7 +15,6 @@ package org.hyperledger.besu.ethereum.p2p.peers; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.List; @@ -25,7 +24,7 @@ static MutableLocalNode create( return DefaultLocalNode.create(clientId, p2pVersion, supportedCapabilities); } - void setEnode(EnodeURL enode) throws NodeAlreadySetException; + void setEnode(EnodeURLImpl enode) throws NodeAlreadySetException; class NodeAlreadySetException extends RuntimeException { public NodeAlreadySetException(final String message) { diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/Peer.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/Peer.java index 9a3587ff5f6..094dbd3e57e 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/Peer.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/Peer.java @@ -16,7 +16,6 @@ import org.hyperledger.besu.crypto.SecureRandomProvider; import org.hyperledger.besu.ethereum.forkid.ForkId; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.Optional; @@ -31,7 +30,7 @@ public interface Peer extends org.hyperledger.besu.plugin.data.p2p.Peer, PeerId * @return The enode representing the location of this peer. */ @Override - EnodeURL getEnodeURL(); + EnodeURLImpl getEnodeURL(); /** * Generates a random peer ID in a secure manner. diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/StaticNodesParser.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/StaticNodesParser.java index b3a014bba15..dba248de9c7 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/StaticNodesParser.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/peers/StaticNodesParser.java @@ -18,8 +18,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.emptySet; -import org.hyperledger.besu.plugin.data.EnodeURL; - import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.AccessDeniedException; @@ -38,7 +36,7 @@ public class StaticNodesParser { private static final Logger LOG = LoggerFactory.getLogger(StaticNodesParser.class); - public static Set fromPath( + public static Set fromPath( final Path path, final EnodeDnsConfiguration enodeDnsConfiguration) throws IOException, IllegalArgumentException { @@ -64,7 +62,7 @@ public static Set fromPath( } } - private static Set readEnodesFromPath( + private static Set readEnodesFromPath( final Path path, final EnodeDnsConfiguration enodeDnsConfiguration) throws IOException { final byte[] staticNodesContent = Files.readAllBytes(path); if (staticNodesContent.length == 0) { @@ -77,10 +75,10 @@ private static Set readEnodesFromPath( .collect(Collectors.toSet()); } - private static EnodeURL decodeString( + private static EnodeURLImpl decodeString( final String input, final EnodeDnsConfiguration enodeDnsConfiguration) { try { - final EnodeURL enode = EnodeURLImpl.fromString(input, enodeDnsConfiguration); + final EnodeURLImpl enode = EnodeURLImpl.fromString(input, enodeDnsConfiguration); checkArgument( enode.isListening(), "Static node must be configured with a valid listening port."); return enode; diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/config/DiscoveryConfigurationTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/config/DiscoveryConfigurationTest.java index 24d35d33b13..9e3ae8a11ee 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/config/DiscoveryConfigurationTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/config/DiscoveryConfigurationTest.java @@ -18,7 +18,6 @@ import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.Peer; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.Collections; @@ -27,8 +26,8 @@ public class DiscoveryConfigurationTest { @Test - public void setBootnodes_withDiscoveryDisabled() { - final EnodeURL invalidBootnode = + public void setEnodeBootnodes_withDiscoveryDisabled() { + final EnodeURLImpl invalidBootnode = EnodeURLImpl.builder() .nodeId(Peer.randomId()) .ipAddress("127.0.0.1") @@ -38,15 +37,15 @@ public void setBootnodes_withDiscoveryDisabled() { DiscoveryConfiguration config = DiscoveryConfiguration.create(); - assertThatThrownBy(() -> config.setBootnodes(Collections.singletonList(invalidBootnode))) + assertThatThrownBy(() -> config.setEnodeBootnodes(Collections.singletonList(invalidBootnode))) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Invalid bootnodes") + .hasMessageContaining("Invalid enodeBootnodes") .hasMessageContaining("Bootnodes must have discovery enabled"); } @Test - public void setBootnodes_withListeningDisabled() { - final EnodeURL invalidBootnode = + public void setEnodeBootnodes_withListeningDisabled() { + final EnodeURLImpl invalidBootnode = EnodeURLImpl.builder() .nodeId(Peer.randomId()) .ipAddress("127.0.0.1") @@ -55,9 +54,9 @@ public void setBootnodes_withListeningDisabled() { DiscoveryConfiguration config = DiscoveryConfiguration.create(); - assertThatThrownBy(() -> config.setBootnodes(Collections.singletonList(invalidBootnode))) + assertThatThrownBy(() -> config.setEnodeBootnodes(Collections.singletonList(invalidBootnode))) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Invalid bootnodes") + .hasMessageContaining("Invalid enodeBootnodes") .hasMessageContaining("Bootnodes must have discovery enabled"); } } diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryAgentV4Test.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryAgentV4Test.java index 12563f7dc70..acf7eab2830 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryAgentV4Test.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryAgentV4Test.java @@ -80,7 +80,7 @@ public void beforeTest() { @Test public void createAgentWithInvalidBootnodes() { - final EnodeURL invalidBootnode = + final EnodeURLImpl invalidBootnode = EnodeURLImpl.builder() .nodeId(Peer.randomId()) .ipAddress("127.0.0.1") @@ -91,7 +91,7 @@ public void createAgentWithInvalidBootnodes() { assertThatThrownBy( () -> helper.createDiscoveryAgent(helper.agentBuilder().bootnodes(invalidBootnode))) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Invalid bootnodes") + .hasMessageContaining("Invalid enodeBootnodes") .hasMessageContaining("Bootnodes must have discovery enabled"); } @@ -300,7 +300,7 @@ public void shouldEvictPeerWhenPermissionsRevoked() { final MockPeerDiscoveryAgent peerDiscoveryAgent2 = helper.startDiscoveryAgent( helper.agentBuilder().peerPermissions(denylist).bootstrapPeers(peer)); - peerDiscoveryAgent2.start(BROADCAST_TCP_PORT).join(); + peerDiscoveryAgent2.start(BROADCAST_TCP_PORT + 1).join(); assertThat(peerDiscoveryAgent2.streamDiscoveredPeers().count()).isEqualTo(1); @@ -420,7 +420,7 @@ public void bond_peerWithDiscoveryDisabled() { final MockPeerDiscoveryAgent otherNode = helper.startDiscoveryAgent(); assertThat(otherNode.getAdvertisedPeer().isPresent()).isTrue(); final DiscoveryPeerV4 remotePeer = otherNode.getAdvertisedPeer().get(); - final EnodeURL enodeWithDiscoveryDisabled = + final EnodeURLImpl enodeWithDiscoveryDisabled = EnodeURLImpl.builder() .configureFromEnode(remotePeer.getEnodeURL()) .disableDiscovery() diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryTestHelper.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryTestHelper.java index c75ecc452da..b3c1db21faf 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryTestHelper.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/discv4/PeerDiscoveryTestHelper.java @@ -36,7 +36,6 @@ import org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissions; import org.hyperledger.besu.ethereum.p2p.rlpx.RlpxAgent; import org.hyperledger.besu.nat.NatService; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.Arrays; import java.util.Collections; @@ -234,7 +233,7 @@ public static class AgentBuilder { private final Map agents; private final AtomicInteger nextAvailablePort; - private List bootnodes = Collections.emptyList(); + private List bootnodes = Collections.emptyList(); private boolean enabled = true; private PeerPermissions peerPermissions = PeerPermissions.noop(); private String advertisedHost = "127.0.0.1"; @@ -258,12 +257,12 @@ public AgentBuilder bootstrapPeers(final DiscoveryPeerV4... peers) { return bootstrapPeers(asList(peers)); } - public AgentBuilder bootnodes(final EnodeURL... bootnodes) { + public AgentBuilder bootnodes(final EnodeURLImpl... bootnodes) { this.bootnodes = Arrays.asList(bootnodes); return this; } - private List asEnodes(final List peers) { + private List asEnodes(final List peers) { return peers.stream().map(Peer::getEnodeURL).collect(Collectors.toList()); } @@ -308,7 +307,7 @@ public MockPeerDiscoveryAgent build() { final int port = bindPort.orElseGet(nextAvailablePort::incrementAndGet); final DiscoveryConfiguration config = new DiscoveryConfiguration(); final NatService natService = new NatService(Optional.empty()); - config.setBootnodes(bootnodes); + config.setEnodeBootnodes(bootnodes); config.setAdvertisedHost(advertisedHost); config.setBindPort(port); config.setEnabled(enabled); diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetworkTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetworkTest.java index 75f01698750..9993108e59a 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetworkTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/DefaultP2PNetworkTest.java @@ -35,6 +35,7 @@ import org.hyperledger.besu.ethereum.p2p.config.RlpxConfiguration; import org.hyperledger.besu.ethereum.p2p.discovery.discv4.PeerDiscoveryAgentV4; import org.hyperledger.besu.ethereum.p2p.discovery.discv4.internal.DiscoveryPeerV4; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.MaintainedPeers; import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.peers.PeerTestHelper; @@ -47,7 +48,6 @@ import org.hyperledger.besu.nat.NatService; import org.hyperledger.besu.nat.core.domain.NetworkProtocol; import org.hyperledger.besu.nat.upnp.UpnpNatManager; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.ArrayList; import java.util.List; @@ -159,7 +159,7 @@ public void checkMaintainedConnectionPeers_doesNotConnectToSelf() { final DefaultP2PNetwork network = network(); network.start(); - final Optional maybeSelfEnode = network.getLocalEnode(); + final Optional maybeSelfEnode = network.getLocalEnode(); final Peer selfPeer = PeerTestHelper.createPeer(maybeSelfEnode.get()); maintainedPeers.add(selfPeer); diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/P2PNetworkTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/P2PNetworkTest.java index a9b82414625..dd44ac3f9af 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/P2PNetworkTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/P2PNetworkTest.java @@ -213,7 +213,7 @@ public void rejectIncomingConnectionFromDisallowedPeer() throws Exception { localNetwork.start(); remoteNetwork.start(); - final EnodeURL localEnode = localNetwork.getLocalEnode().get(); + final EnodeURLImpl localEnode = localNetwork.getLocalEnode().get(); final Peer localPeer = DefaultPeer.fromEnodeURL(localEnode); final Peer remotePeer = DefaultPeer.fromEnodeURL(remoteNetwork.getLocalEnode().get()); diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/P2PPlainNetworkTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/P2PPlainNetworkTest.java index 51c434b26b3..00a28823476 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/P2PPlainNetworkTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/P2PPlainNetworkTest.java @@ -266,7 +266,7 @@ public void rejectIncomingConnectionFromDisallowedPeer() throws Exception { localNetwork.start(); remoteNetwork.start(); - final EnodeURL localEnode = localNetwork.getLocalEnode().get(); + final EnodeURLImpl localEnode = localNetwork.getLocalEnode().get(); final Peer localPeer = DefaultPeer.fromEnodeURL(localEnode); final Peer remotePeer = DefaultPeer.fromEnodeURL(remoteNetwork.getLocalEnode().get()); diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/PeerDenylistManagerTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/PeerDenylistManagerTest.java index bef39a2a09b..51dc8620f38 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/PeerDenylistManagerTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/network/PeerDenylistManagerTest.java @@ -29,16 +29,22 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class PeerDenylistManagerTest { - private final Peer localNode = generatePeer(); - private final PeerDenylistManager peerDenylistManager; - private final PeerPermissionsDenylist denylist; - private final MaintainedPeers maintainedPeers = new MaintainedPeers(); - - public PeerDenylistManagerTest() { + private int ipModifier; + private Peer localNode; + private PeerDenylistManager peerDenylistManager; + private PeerPermissionsDenylist denylist; + private MaintainedPeers maintainedPeers; + + @BeforeEach + public void beforeTest() { + ipModifier = 1; + localNode = generatePeer(); denylist = PeerPermissionsDenylist.create(); + maintainedPeers = new MaintainedPeers(); peerDenylistManager = new PeerDenylistManager(denylist, maintainedPeers); } @@ -144,7 +150,7 @@ private Peer generatePeer() { return DefaultPeer.fromEnodeURL( EnodeURLImpl.builder() .nodeId(Peer.randomId()) - .ipAddress("10.9.8.7") + .ipAddress("10.9.8." + ipModifier++) .discoveryPort(65535) .listeningPort(65534) .build()); diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultLocalNodeTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultLocalNodeTest.java index 246f9c21b3d..4b75fe4c4b9 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultLocalNodeTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/DefaultLocalNodeTest.java @@ -20,7 +20,6 @@ import org.hyperledger.besu.ethereum.p2p.EthProtocolHelper; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.Arrays; import java.util.List; @@ -35,7 +34,7 @@ public class DefaultLocalNodeTest { private final List supportedCapabilities = Arrays.asList(EthProtocolHelper.LATEST); private final Bytes nodeId = Bytes.of(new byte[64]); private final int port = 30303; - private final EnodeURL enode = + private final EnodeURLImpl enode = EnodeURLImpl.builder() .ipAddress("127.0.0.1") .discoveryAndListeningPorts(port) diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImplTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImplTest.java index cf8fdd6cf00..3804df0fa4e 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImplTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImplTest.java @@ -816,14 +816,14 @@ public void builder_ipNotSpecified() { @Test public void sameListeningEndpoint_forMatchingEnodes() { - final EnodeURL enodeA = + final EnodeURLImpl enodeA = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) .listeningPort(P2P_PORT) .discoveryPort(DISCOVERY_PORT) .build(); - final EnodeURL enodeB = + final EnodeURLImpl enodeB = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) @@ -836,14 +836,14 @@ public void sameListeningEndpoint_forMatchingEnodes() { @Test public void sameListeningEndpoint_differentListeningPorts() { - final EnodeURL enodeA = + final EnodeURLImpl enodeA = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) .listeningPort(P2P_PORT) .discoveryPort(DISCOVERY_PORT) .build(); - final EnodeURL enodeB = + final EnodeURLImpl enodeB = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) @@ -856,14 +856,14 @@ public void sameListeningEndpoint_differentListeningPorts() { @Test public void sameListeningEndpoint_differentIps() { - final EnodeURL enodeA = + final EnodeURLImpl enodeA = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV6_COMPACT_ADDRESS) .listeningPort(P2P_PORT) .discoveryPort(DISCOVERY_PORT) .build(); - final EnodeURL enodeB = + final EnodeURLImpl enodeB = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) @@ -876,14 +876,14 @@ public void sameListeningEndpoint_differentIps() { @Test public void sameListeningEndpoint_listeningDisabledForOne() { - final EnodeURL enodeA = + final EnodeURLImpl enodeA = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) .disableListening() .discoveryPort(DISCOVERY_PORT) .build(); - final EnodeURL enodeB = + final EnodeURLImpl enodeB = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) @@ -896,14 +896,14 @@ public void sameListeningEndpoint_listeningDisabledForOne() { @Test public void sameListeningEndpoint_listeningDisabledForBoth() { - final EnodeURL enodeA = + final EnodeURLImpl enodeA = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) .disableListening() .discoveryPort(DISCOVERY_PORT) .build(); - final EnodeURL enodeB = + final EnodeURLImpl enodeB = EnodeURLImpl.builder() .nodeId(VALID_NODE_ID) .ipAddress(IPV4_ADDRESS) diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/PeerTestHelper.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/PeerTestHelper.java index 1f4da7eee5e..77404ed9b70 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/PeerTestHelper.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/PeerTestHelper.java @@ -15,7 +15,6 @@ package org.hyperledger.besu.ethereum.p2p.peers; import org.hyperledger.besu.ethereum.p2p.EthProtocolHelper; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.Arrays; @@ -27,7 +26,7 @@ public static Peer createPeer() { return DefaultPeer.fromEnodeURL(enode()); } - public static Peer createPeer(final EnodeURL enodeURL) { + public static Peer createPeer(final EnodeURLImpl enodeURL) { return DefaultPeer.fromEnodeURL(enodeURL); } @@ -35,7 +34,7 @@ public static Peer createPeer(final Bytes nodeId) { return DefaultPeer.fromEnodeURL(enodeBuilder().nodeId(nodeId).build()); } - public static EnodeURL enode() { + public static EnodeURLImpl enode() { return enodeBuilder().build(); } diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/StaticNodesParserTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/StaticNodesParserTest.java index 6764126222e..99576106039 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/StaticNodesParserTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/StaticNodesParserTest.java @@ -74,7 +74,7 @@ public class StaticNodesParserTest { public void validFileLoadsWithExpectedEnodes() throws IOException, URISyntaxException { final URL resource = StaticNodesParserTest.class.getResource("valid_static_nodes.json"); final File validFile = new File(resource.getFile()); - final Set enodes = + final Set enodes = StaticNodesParser.fromPath(validFile.toPath(), EnodeDnsConfiguration.DEFAULT_CONFIG); assertThat(enodes) @@ -89,7 +89,7 @@ public void validFileLoadsWithExpectedEnodesWhenDnsEnabled() final File validFile = new File(resource.getFile()); final EnodeDnsConfiguration enodeDnsConfiguration = ImmutableEnodeDnsConfiguration.builder().dnsEnabled(true).updateEnabled(false).build(); - final Set enodes = + final Set enodes = StaticNodesParser.fromPath(validFile.toPath(), enodeDnsConfiguration); assertThat(enodes) @@ -118,15 +118,15 @@ public void fileWithUnknownHostnameNotThrowsAnExceptionWhenDnsAndUpdateEnabled() final File validFile = new File(resource.getFile()); final EnodeDnsConfiguration enodeDnsConfiguration = ImmutableEnodeDnsConfiguration.builder().dnsEnabled(true).updateEnabled(true).build(); - final Set enodes = + final Set enodes = StaticNodesParser.fromPath(validFile.toPath(), enodeDnsConfiguration); assertThat(enodes) - .containsExactlyInAnyOrder(validFileItems.toArray(new EnodeURL[validFileItems.size()])); - final Set actual = + .containsExactlyInAnyOrder(validFileItems.toArray(new EnodeURLImpl[validFileItems.size()])); + final Set actual = StaticNodesParser.fromPath(validFile.toPath(), enodeDnsConfiguration); - final EnodeURL[] expected = validFileItems.toArray(new EnodeURLImpl[validFileItems.size()]); + final EnodeURLImpl[] expected = validFileItems.toArray(new EnodeURLImpl[validFileItems.size()]); assertThat(actual).containsExactlyInAnyOrder(expected); } @@ -185,7 +185,7 @@ public void nonJsonFileThrowsAnException() throws IOException { public void anEmptyCacheIsCreatedIfTheFileDoesNotExist() throws IOException { final Path path = Paths.get("./arbirtraryFilename.txt"); - final Set enodes = + final Set enodes = StaticNodesParser.fromPath(path, EnodeDnsConfiguration.DEFAULT_CONFIG); assertThat(enodes.size()).isZero(); } @@ -194,7 +194,7 @@ public void anEmptyCacheIsCreatedIfTheFileDoesNotExist() throws IOException { public void cacheIsCreatedIfFileExistsButIsEmpty() throws IOException { final Path tempFile = Files.createTempFile(testFolder, "file", "txt"); - final Set enodes = + final Set enodes = StaticNodesParser.fromPath(tempFile, EnodeDnsConfiguration.DEFAULT_CONFIG); assertThat(enodes.size()).isZero(); } diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/permissions/PeerPermissionsDenylistTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/permissions/PeerPermissionsDenylistTest.java index 2ef2c20a6ca..7e386d84561 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/permissions/PeerPermissionsDenylistTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/permissions/PeerPermissionsDenylistTest.java @@ -21,20 +21,32 @@ import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissions.Action; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class PeerPermissionsDenylistTest { private final Peer localNode = createPeer(); + public PeerPermissionsDenylistTest() throws UnknownHostException {} + + private int ipModifier = 1; + + @BeforeEach + public void beforeTest() { + ipModifier = 1; + } + @Test - public void add_peer() { + public void add_peer() throws UnknownHostException { PeerPermissionsDenylist denylist = PeerPermissionsDenylist.create(); Peer peer = createPeer(); @@ -53,7 +65,7 @@ public void add_peer() { } @Test - public void remove_peer() { + public void remove_peer() throws UnknownHostException { PeerPermissionsDenylist denylist = PeerPermissionsDenylist.create(); Peer peer = createPeer(); denylist.add(peer); @@ -73,7 +85,7 @@ public void remove_peer() { } @Test - public void add_id() { + public void add_id() throws UnknownHostException { PeerPermissionsDenylist denylist = PeerPermissionsDenylist.create(); Peer peer = createPeer(); @@ -92,7 +104,7 @@ public void add_id() { } @Test - public void remove_id() { + public void remove_id() throws UnknownHostException { PeerPermissionsDenylist denylist = PeerPermissionsDenylist.create(); Peer peer = createPeer(); denylist.add(peer); @@ -112,7 +124,7 @@ public void remove_id() { } @Test - public void trackedPeerIsNotPermitted() { + public void trackedPeerIsNotPermitted() throws UnknownHostException { PeerPermissionsDenylist denylist = PeerPermissionsDenylist.create(); Peer peer = createPeer(); @@ -133,7 +145,7 @@ public void selfPeerIsNotPermitted() { } @Test - public void subscribeUpdate() { + public void subscribeUpdate() throws UnknownHostException { PeerPermissionsDenylist denylist = PeerPermissionsDenylist.create(); final AtomicInteger callbackCount = new AtomicInteger(0); final AtomicInteger restrictedCallbackCount = new AtomicInteger(0); @@ -173,7 +185,7 @@ public void subscribeUpdate() { } @Test - public void createWithLimitedCapacity() { + public void createWithLimitedCapacity() throws UnknownHostException { final PeerPermissionsDenylist denylist = PeerPermissionsDenylist.create(2); Peer peerA = createPeer(); Peer peerB = createPeer(); @@ -216,7 +228,16 @@ public void createWithUnlimitedCapacity() { final PeerPermissionsDenylist denylist = PeerPermissionsDenylist.create(); final int peerCount = 200; final List peers = - Stream.generate(this::createPeer).limit(peerCount).collect(Collectors.toList()); + Stream.generate( + () -> { + try { + return createPeer(); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + }) + .limit(peerCount) + .collect(Collectors.toList()); peers.forEach(p -> checkPermissions(denylist, p, true)); peers.forEach(denylist::add); @@ -226,11 +247,11 @@ public void createWithUnlimitedCapacity() { peers.forEach(p -> checkPermissions(denylist, p, true)); } - private Peer createPeer() { + private Peer createPeer() throws UnknownHostException { return DefaultPeer.fromEnodeURL( EnodeURLImpl.builder() .nodeId(Peer.randomId()) - .ipAddress("127.0.0.1") + .ipAddress(InetAddress.getByName("10.0.0." + ipModifier)) .discoveryAndListeningPorts(EnodeURLImpl.DEFAULT_LISTENING_PORT) .build()); } diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/DeFramerTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/DeFramerTest.java index af638910888..c824fbb934a 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/DeFramerTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/DeFramerTest.java @@ -102,7 +102,7 @@ public class DeFramerTest { private final String clientId = "abc"; private final int port = 30303; private final List capabilities = Arrays.asList(EthProtocolHelper.LATEST); - private final EnodeURL localEnode = + private final EnodeURLImpl localEnode = EnodeURLImpl.builder() .ipAddress("127.0.0.1") .discoveryAndListeningPorts(port) diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/LocalPermissioningConfiguration.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/LocalPermissioningConfiguration.java index 690d65a4a05..16b04b0f25b 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/LocalPermissioningConfiguration.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/LocalPermissioningConfiguration.java @@ -15,14 +15,14 @@ package org.hyperledger.besu.ethereum.permissioning; import org.hyperledger.besu.ethereum.p2p.peers.EnodeDnsConfiguration; -import org.hyperledger.besu.plugin.data.EnodeURL; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class LocalPermissioningConfiguration { - private List nodeAllowlist; + private List nodeAllowlist; private List accountAllowlist; private boolean nodeAllowlistEnabled; private EnodeDnsConfiguration enodeDnsConfiguration = EnodeDnsConfiguration.dnsDisabled(); @@ -30,7 +30,7 @@ public class LocalPermissioningConfiguration { private boolean accountAllowlistEnabled; private String accountPermissioningConfigFilePath; - public List getNodeAllowlist() { + public List getNodeAllowlist() { return nodeAllowlist; } @@ -45,7 +45,7 @@ public void setEnodeDnsConfiguration(final EnodeDnsConfiguration enodeDnsConfigu this.enodeDnsConfiguration = enodeDnsConfiguration; } - public void setNodeAllowlist(final Collection nodeAllowlist) { + public void setNodeAllowlist(final Collection nodeAllowlist) { if (nodeAllowlist != null) { this.nodeAllowlist.addAll(nodeAllowlist); this.nodeAllowlistEnabled = true; diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/NodeLocalConfigPermissioningController.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/NodeLocalConfigPermissioningController.java index b5878d14de3..c494e1f309b 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/NodeLocalConfigPermissioningController.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/NodeLocalConfigPermissioningController.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.ethereum.permissioning; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.permissioning.AllowlistPersistor.ALLOWLIST_TYPE; import org.hyperledger.besu.ethereum.permissioning.node.NodeAllowlistUpdatedEvent; @@ -47,7 +48,7 @@ public class NodeLocalConfigPermissioningController implements NodeConnectionPer LoggerFactory.getLogger(NodeLocalConfigPermissioningController.class); private LocalPermissioningConfiguration configuration; - private final List fixedNodes; + private final List fixedNodes; private final Bytes localNodeId; private final List nodesAllowlist = new CopyOnWriteArrayList<>(); private final AllowlistPersistor allowlistPersistor; @@ -60,7 +61,7 @@ public class NodeLocalConfigPermissioningController implements NodeConnectionPer public NodeLocalConfigPermissioningController( final LocalPermissioningConfiguration permissioningConfiguration, - final List fixedNodes, + final List fixedNodes, final Bytes localNodeId, final MetricsSystem metricsSystem) { this( @@ -73,7 +74,7 @@ public NodeLocalConfigPermissioningController( public NodeLocalConfigPermissioningController( final LocalPermissioningConfiguration configuration, - final List fixedNodes, + final List fixedNodes, final Bytes localNodeId, final AllowlistPersistor allowlistPersistor, final MetricsSystem metricsSystem) { @@ -147,7 +148,7 @@ public NodesAllowlistResult removeNodes(final List enodeURLs) { if (inputValidationResult.result() != AllowlistOperationResult.SUCCESS) { return inputValidationResult; } - final List peers = + final List peers = enodeURLs.stream() .map(url -> EnodeURLImpl.fromString(url, configuration.getEnodeDnsConfiguration())) .collect(Collectors.toList()); @@ -237,7 +238,7 @@ public boolean isPermitted(final String enodeURL) { return isPermitted(EnodeURLImpl.fromString(enodeURL, configuration.getEnodeDnsConfiguration())); } - public boolean isPermitted(final EnodeURL node) { + public boolean isPermitted(final EnodeURLImpl node) { if (Objects.equals(localNodeId, node.getNodeId())) { return true; } @@ -332,7 +333,7 @@ public Optional message() { public boolean isConnectionPermitted( final EnodeURL sourceEnode, final EnodeURL destinationEnode) { this.checkCounter.inc(); - if (isPermitted(sourceEnode) && isPermitted(destinationEnode)) { + if (isPermitted((EnodeURLImpl) sourceEnode) && isPermitted((EnodeURLImpl) destinationEnode)) { this.checkCounterPermitted.inc(); return true; } else { diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/NodePermissioningControllerFactory.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/NodePermissioningControllerFactory.java index 2266ce0d661..5f4c6983c31 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/NodePermissioningControllerFactory.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/NodePermissioningControllerFactory.java @@ -16,9 +16,9 @@ import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.Synchronizer; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.ethereum.permissioning.node.NodePermissioningController; import org.hyperledger.besu.ethereum.transaction.TransactionSimulator; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.plugin.services.MetricsSystem; import org.hyperledger.besu.plugin.services.permissioning.NodeConnectionPermissioningProvider; @@ -34,7 +34,7 @@ public class NodePermissioningControllerFactory { public NodePermissioningController create( final PermissioningConfiguration permissioningConfiguration, final Synchronizer synchronizer, - final Collection fixedNodes, + final Collection fixedNodes, final Bytes localNodeId, final TransactionSimulator transactionSimulator, final MetricsSystem metricsSystem, diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/PermissioningConfigurationBuilder.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/PermissioningConfigurationBuilder.java index 75d0a635dce..c34d1d027d2 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/PermissioningConfigurationBuilder.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/PermissioningConfigurationBuilder.java @@ -16,7 +16,6 @@ import org.hyperledger.besu.ethereum.p2p.peers.EnodeDnsConfiguration; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.List; import java.util.stream.Collectors; @@ -64,7 +63,7 @@ private static LocalPermissioningConfiguration loadNodePermissioning( nodePermissioningConfigFilepath); if (nodeAllowlistTomlArray != null) { - List nodesAllowlistToml = + List nodesAllowlistToml = nodeAllowlistTomlArray.toList().parallelStream() .map(Object::toString) .map( diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/ContextualNodePermissioningProvider.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/ContextualNodePermissioningProvider.java index 415b97e2fc8..8e0fac7f925 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/ContextualNodePermissioningProvider.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/ContextualNodePermissioningProvider.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.ethereum.permissioning.node; -import org.hyperledger.besu.plugin.data.EnodeURL; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import java.util.Optional; @@ -29,7 +29,8 @@ public interface ContextualNodePermissioningProvider { * @return True if permitted, false if not, Empty if an answer is not possible under current * conditions */ - Optional isPermitted(final EnodeURL sourceEnode, final EnodeURL destinationEnode); + Optional isPermitted( + final NodeIdentifier sourceEnode, final NodeIdentifier destinationEnode); /** * Subscribe a callback that will be invoked whenever this provider has changed such that it would diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/InsufficientPeersPermissioningProvider.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/InsufficientPeersPermissioningProvider.java index 538b68d91f6..b6ebd94e123 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/InsufficientPeersPermissioningProvider.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/InsufficientPeersPermissioningProvider.java @@ -14,11 +14,11 @@ */ package org.hyperledger.besu.ethereum.permissioning.node; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.ethereum.p2p.network.P2PNetwork; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.util.Subscribers; import java.util.Collection; @@ -30,7 +30,7 @@ */ public class InsufficientPeersPermissioningProvider implements ContextualNodePermissioningProvider { private final P2PNetwork p2pNetwork; - private final Collection bootnodeEnodes; + private final Collection bootnodeIdentifiers; private long nonBootnodePeerConnections; private final Subscribers permissioningUpdateSubscribers = Subscribers.create(); @@ -38,19 +38,19 @@ public class InsufficientPeersPermissioningProvider implements ContextualNodePer * Creates the provider observing the provided p2p network * * @param p2pNetwork the p2p network to observe - * @param bootnodeEnodes the bootnodes that this node is configured to connect to + * @param bootnodeIdentifiers the bootnodes that this node is configured to connect to */ public InsufficientPeersPermissioningProvider( - final P2PNetwork p2pNetwork, final Collection bootnodeEnodes) { + final P2PNetwork p2pNetwork, final Collection bootnodeIdentifiers) { this.p2pNetwork = p2pNetwork; - this.bootnodeEnodes = bootnodeEnodes; + this.bootnodeIdentifiers = bootnodeIdentifiers; this.nonBootnodePeerConnections = countP2PNetworkNonBootnodeConnections(); p2pNetwork.subscribeConnect(this::handleConnect); p2pNetwork.subscribeDisconnect(this::handleDisconnect); } private boolean isNotABootnode(final PeerConnection peerConnection) { - return bootnodeEnodes.stream() + return bootnodeIdentifiers.stream() .noneMatch( (bootNode) -> EnodeURLImpl.sameListeningEndpoint(peerConnection.getRemoteEnode(), bootNode)); @@ -62,11 +62,11 @@ private long countP2PNetworkNonBootnodeConnections() { @Override public Optional isPermitted( - final EnodeURL sourceEnode, final EnodeURL destinationEnode) { - final Optional maybeSelfEnode = p2pNetwork.getLocalEnode(); + final NodeIdentifier sourceEnode, final NodeIdentifier destinationEnode) { + final Optional maybeSelfEnode = p2pNetwork.getLocalEnode(); if (nonBootnodePeerConnections > 0) { return Optional.empty(); - } else if (!maybeSelfEnode.isPresent()) { + } else if (maybeSelfEnode.isEmpty()) { // The local node is not yet ready, so we can't validate enodes yet return Optional.empty(); } else if (checkEnode(maybeSelfEnode.get(), sourceEnode) @@ -77,10 +77,10 @@ && checkEnode(maybeSelfEnode.get(), destinationEnode)) { } } - private boolean checkEnode(final EnodeURL localEnode, final EnodeURL enode) { - return (EnodeURLImpl.sameListeningEndpoint(localEnode, enode) - || bootnodeEnodes.stream() - .anyMatch(bootNode -> EnodeURLImpl.sameListeningEndpoint(bootNode, enode))); + private boolean checkEnode(final NodeIdentifier localEnode, final NodeIdentifier enode) { + return (NodeIdentifier.isSameListeningEndpoint(localEnode, enode) + || bootnodeIdentifiers.stream() + .anyMatch(bootNode -> NodeIdentifier.isSameListeningEndpoint(bootNode, enode))); } private void handleConnect(final PeerConnection peerConnection) { diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/NodeAllowlistUpdatedEvent.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/NodeAllowlistUpdatedEvent.java index 527d515dfe3..43918932f75 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/NodeAllowlistUpdatedEvent.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/NodeAllowlistUpdatedEvent.java @@ -23,10 +23,10 @@ public class NodeAllowlistUpdatedEvent { private final List addedNodes; - private final List removedNodes; + private final List removedNodes; public NodeAllowlistUpdatedEvent( - final List addedNodes, final List removedNodes) { + final List addedNodes, final List removedNodes) { this.addedNodes = addedNodes != null ? addedNodes : Collections.emptyList(); this.removedNodes = removedNodes != null ? removedNodes : Collections.emptyList(); } @@ -35,7 +35,7 @@ public List getAddedNodes() { return addedNodes; } - public List getRemovedNodes() { + public List getRemovedNodes() { return removedNodes; } diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningController.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningController.java index 7b486911635..5080f1e2036 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningController.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningController.java @@ -14,8 +14,8 @@ */ package org.hyperledger.besu.ethereum.permissioning.node; +import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.permissioning.NodeLocalConfigPermissioningController; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.plugin.services.permissioning.NodeConnectionPermissioningProvider; import org.hyperledger.besu.util.Subscribers; @@ -38,7 +38,7 @@ public NodePermissioningController(final List {}", sourceEnode, destinationEnode); diff --git a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/LocalPermissioningConfigurationTest.java b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/LocalPermissioningConfigurationTest.java index e947d250c8d..26519421855 100644 --- a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/LocalPermissioningConfigurationTest.java +++ b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/LocalPermissioningConfigurationTest.java @@ -17,7 +17,6 @@ import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; -import org.hyperledger.besu.plugin.data.EnodeURL; import java.util.Arrays; @@ -25,7 +24,7 @@ public class LocalPermissioningConfigurationTest { - final EnodeURL[] nodes = { + final EnodeURLImpl[] nodes = { EnodeURLImpl.fromString( "enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@127.0.0.1:4567"), EnodeURLImpl.fromString( diff --git a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/NodeLocalConfigPermissioningControllerTest.java b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/NodeLocalConfigPermissioningControllerTest.java index 971577abf36..eb97613bbc5 100644 --- a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/NodeLocalConfigPermissioningControllerTest.java +++ b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/NodeLocalConfigPermissioningControllerTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.ethereum.p2p.peers.EnodeDnsConfiguration; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.p2p.peers.ImmutableEnodeDnsConfiguration; @@ -59,7 +60,7 @@ public class NodeLocalConfigPermissioningControllerTest { @Mock private AllowlistPersistor allowlistPersistor; - private final List bootnodesList = new ArrayList<>(); + private final List bootnodesList = new ArrayList<>(); private NodeLocalConfigPermissioningController controller; private final String enode1 = @@ -224,7 +225,7 @@ public void whenNodeIdsAreDifferentItShouldNotBePermitted() { String peer1 = "enode://aaaa80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@127.0.0.1:30303"; String peer2 = - "enode://bbbb80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@127.0.0.1:30303"; + "enode://bbbb80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@127.0.0.2:30303"; controller.addNodes(List.of(peer1)); assertThat(controller.isPermitted(peer2)).isFalse(); diff --git a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/InsufficientPeersPermissioningProviderTest.java b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/InsufficientPeersPermissioningProviderTest.java index 3c2f6e99da2..653b8ddbd1a 100644 --- a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/InsufficientPeersPermissioningProviderTest.java +++ b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/InsufficientPeersPermissioningProviderTest.java @@ -45,19 +45,19 @@ @MockitoSettings(strictness = Strictness.LENIENT) public class InsufficientPeersPermissioningProviderTest { @Mock private P2PNetwork p2pNetwork; - private final EnodeURL SELF_ENODE = + private final EnodeURLImpl SELF_ENODE = EnodeURLImpl.fromString( "enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001@192.168.0.1:30303"); - private final EnodeURL ENODE_2 = + private final EnodeURLImpl ENODE_2 = EnodeURLImpl.fromString( "enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002@192.168.0.2:30303"); - private final EnodeURL ENODE_3 = + private final EnodeURLImpl ENODE_3 = EnodeURLImpl.fromString( "enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003@192.168.0.3:30303"); - private final EnodeURL ENODE_4 = + private final EnodeURLImpl ENODE_4 = EnodeURLImpl.fromString( "enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004@192.168.0.4:30303"); - private final EnodeURL ENODE_5 = + private final EnodeURLImpl ENODE_5 = EnodeURLImpl.fromString( "enode://00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005@192.168.0.5:30303"); @@ -68,7 +68,7 @@ public void setup() { @Test public void noResultWhenNoBootnodes() { - final Collection bootnodes = Collections.emptyList(); + final Collection bootnodes = Collections.emptyList(); when(p2pNetwork.getPeers()).thenReturn(Collections.emptyList()); @@ -84,7 +84,7 @@ public void noResultWhenOtherConnections() { when(neverMatchPeerConnection.getRemoteEnode()).thenReturn(ENODE_5); when(p2pNetwork.getPeers()).thenReturn(Collections.singletonList(neverMatchPeerConnection)); - final Collection bootnodes = Collections.singletonList(ENODE_2); + final Collection bootnodes = Collections.singletonList(ENODE_2); final InsufficientPeersPermissioningProvider provider = new InsufficientPeersPermissioningProvider(p2pNetwork, bootnodes); @@ -95,7 +95,7 @@ public void noResultWhenOtherConnections() { @Test public void allowsConnectionIfBootnodeAndNoConnections() { - final Collection bootnodes = Collections.singletonList(ENODE_2); + final Collection bootnodes = Collections.singletonList(ENODE_2); when(p2pNetwork.getPeers()).thenReturn(Collections.emptyList()); @@ -108,7 +108,7 @@ public void allowsConnectionIfBootnodeAndNoConnections() { @Test public void noResultWhenLocalNodeNotReady() { - final Collection bootnodes = Collections.singletonList(ENODE_2); + final Collection bootnodes = Collections.singletonList(ENODE_2); when(p2pNetwork.getPeers()).thenReturn(Collections.emptyList()); when(p2pNetwork.getLocalEnode()).thenReturn(Optional.empty()); @@ -122,7 +122,7 @@ public void noResultWhenLocalNodeNotReady() { @Test public void allowsConnectionIfBootnodeAndOnlyBootnodesConnected() { - final Collection bootnodes = Collections.singletonList(ENODE_2); + final Collection bootnodes = Collections.singletonList(ENODE_2); final PeerConnection bootnodeMatchPeerConnection = mock(PeerConnection.class); when(bootnodeMatchPeerConnection.getRemoteEnode()).thenReturn(ENODE_2); @@ -143,7 +143,7 @@ private PeerConnection peerConnectionMatching(final EnodeURL enode) { @Test public void firesUpdateWhenDisconnectLastNonBootnode() { - final Collection bootnodes = Collections.singletonList(ENODE_2); + final Collection bootnodes = Collections.singletonList(ENODE_2); final Collection pcs = Arrays.asList( peerConnectionMatching(ENODE_2), @@ -173,7 +173,7 @@ public void firesUpdateWhenDisconnectLastNonBootnode() { @Test public void firesUpdateWhenNonBootnodeConnects() { - final Collection bootnodes = Arrays.asList(ENODE_2, ENODE_3); + final Collection bootnodes = Arrays.asList(ENODE_2, ENODE_3); final Collection pcs = Collections.emptyList(); when(p2pNetwork.getPeers()).thenReturn(pcs); @@ -206,7 +206,7 @@ public void firesUpdateWhenNonBootnodeConnects() { @Test public void firesUpdateWhenGettingAndLosingConnection() { - final Collection bootnodes = Arrays.asList(ENODE_2, ENODE_3); + final Collection bootnodes = Arrays.asList(ENODE_2, ENODE_3); final Collection pcs = Collections.emptyList(); when(p2pNetwork.getPeers()).thenReturn(pcs); diff --git a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningControllerFactoryTest.java b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningControllerFactoryTest.java index 67f72fc0393..ef8d3c44798 100644 --- a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningControllerFactoryTest.java +++ b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningControllerFactoryTest.java @@ -20,6 +20,7 @@ import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.Synchronizer; +import org.hyperledger.besu.ethereum.p2p.discovery.NodeIdentifier; import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.permissioning.LocalPermissioningConfiguration; import org.hyperledger.besu.ethereum.permissioning.NodeLocalConfigPermissioningController; @@ -27,7 +28,6 @@ import org.hyperledger.besu.ethereum.permissioning.PermissioningConfiguration; import org.hyperledger.besu.ethereum.transaction.TransactionSimulator; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.plugin.services.permissioning.NodeConnectionPermissioningProvider; import java.util.Collection; @@ -53,8 +53,8 @@ public class NodePermissioningControllerFactoryTest { private final String enode = "enode://5f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.10:1111"; - Collection bootnodes = Collections.emptyList(); - EnodeURL selfEnode = EnodeURLImpl.fromString(enode); + Collection bootnodes = Collections.emptyList(); + EnodeURLImpl selfEnode = EnodeURLImpl.fromString(enode); LocalPermissioningConfiguration localPermissioningConfig; PermissioningConfiguration config; @@ -110,7 +110,7 @@ public void testCreateWithLocalNodePermissioningEnabledOnly() { @Test public void testCreateWithLocalNodePermissioningEnabledAndBootnode() { - final Collection fixedNodes = Collections.singleton(selfEnode); + final Collection fixedNodes = Collections.singleton(selfEnode); localPermissioningConfig = LocalPermissioningConfiguration.createDefault(); localPermissioningConfig.setNodeAllowlist(Collections.emptyList()); localPermissioningConfig.setNodePermissioningConfigFilePath("fake-file-path"); diff --git a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningControllerTest.java b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningControllerTest.java index 110acfd7517..06e025c2b86 100644 --- a/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningControllerTest.java +++ b/ethereum/permissioning/src/test/java/org/hyperledger/besu/ethereum/permissioning/node/NodePermissioningControllerTest.java @@ -24,7 +24,6 @@ import org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl; import org.hyperledger.besu.ethereum.permissioning.NodeLocalConfigPermissioningController; -import org.hyperledger.besu.plugin.data.EnodeURL; import org.hyperledger.besu.plugin.services.permissioning.NodeConnectionPermissioningProvider; import java.util.ArrayList; @@ -40,10 +39,10 @@ @ExtendWith(MockitoExtension.class) public class NodePermissioningControllerTest { - private static final EnodeURL enode1 = + private static final EnodeURLImpl enode1 = EnodeURLImpl.fromString( "enode://94c15d1b9e2fe7ce56e458b9a3b672ef11894ddedd0c6f247e0f1d3487f52b66208fb4aeb8179fce6e3a749ea93ed147c37976d67af557508d199d9594c35f09@192.168.0.2:1234"); - private static final EnodeURL enode2 = + private static final EnodeURLImpl enode2 = EnodeURLImpl.fromString( "enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@192.168.0.3:5678");