Search in sources :

Example 1 with EnodeURL

use of org.hyperledger.besu.plugin.data.EnodeURL in project besu by hyperledger.

the class P2PPlainNetworkTest method rejectIncomingConnectionFromBlacklistedPeer.

@Test
public void rejectIncomingConnectionFromBlacklistedPeer() throws Exception {
    final PeerPermissionsDenylist localBlacklist = PeerPermissionsDenylist.create();
    try (final P2PNetwork localNetwork = builder("partner1client1").peerPermissions(localBlacklist).build();
        final P2PNetwork remoteNetwork = builder("partner2client1").build()) {
        localNetwork.start();
        remoteNetwork.start();
        final EnodeURL localEnode = localNetwork.getLocalEnode().get();
        final Bytes localId = localEnode.getNodeId();
        final int localPort = localEnode.getListeningPort().get();
        final EnodeURL remoteEnode = remoteNetwork.getLocalEnode().get();
        final Bytes remoteId = remoteEnode.getNodeId();
        final int remotePort = remoteEnode.getListeningPort().get();
        final Peer localPeer = createPeer(localId, localPort);
        final Peer remotePeer = createPeer(remoteId, remotePort);
        // Blacklist the remote peer
        localBlacklist.add(remotePeer);
        // Setup disconnect listener
        final CompletableFuture<PeerConnection> peerFuture = new CompletableFuture<>();
        final CompletableFuture<DisconnectReason> reasonFuture = new CompletableFuture<>();
        remoteNetwork.subscribeDisconnect((peerConnection, reason, initiatedByPeer) -> {
            peerFuture.complete(peerConnection);
            reasonFuture.complete(reason);
        });
        // Remote connect to local
        final CompletableFuture<PeerConnection> connectFuture = remoteNetwork.connect(localPeer);
        // Check connection is made, and then a disconnect is registered at remote
        Assertions.assertThat(connectFuture.get(5L, TimeUnit.SECONDS).getPeerInfo().getNodeId()).isEqualTo(localId);
        Assertions.assertThat(peerFuture.get(5L, TimeUnit.SECONDS).getPeerInfo().getNodeId()).isEqualTo(localId);
        assertThat(reasonFuture.get(5L, TimeUnit.SECONDS)).isEqualByComparingTo(DisconnectReason.UNKNOWN);
    }
}
Also used : EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) Bytes(org.apache.tuweni.bytes.Bytes) PeerPermissionsDenylist(org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissionsDenylist) CompletableFuture(java.util.concurrent.CompletableFuture) PeerConnection(org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection) DisconnectReason(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason) Peer(org.hyperledger.besu.ethereum.p2p.peers.Peer) DefaultPeer(org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer) Test(org.junit.Test)

Example 2 with EnodeURL

use of org.hyperledger.besu.plugin.data.EnodeURL in project besu by hyperledger.

the class RunnerBuilder method build.

public Runner build() {
    Preconditions.checkNotNull(besuController);
    final DiscoveryConfiguration discoveryConfiguration = DiscoveryConfiguration.create().setBindHost(p2pListenInterface).setBindPort(p2pListenPort).setAdvertisedHost(p2pAdvertisedHost);
    if (discovery) {
        final List<EnodeURL> bootstrap;
        if (ethNetworkConfig.getBootNodes() == null) {
            bootstrap = EthNetworkConfig.getNetworkConfig(NetworkName.MAINNET).getBootNodes();
        } else {
            bootstrap = ethNetworkConfig.getBootNodes();
        }
        discoveryConfiguration.setBootnodes(bootstrap);
        discoveryConfiguration.setDnsDiscoveryURL(ethNetworkConfig.getDnsDiscoveryUrl());
    } else {
        discoveryConfiguration.setActive(false);
    }
    final NodeKey nodeKey = besuController.getNodeKey();
    final SubProtocolConfiguration subProtocolConfiguration = besuController.getSubProtocolConfiguration();
    final ProtocolSchedule protocolSchedule = besuController.getProtocolSchedule();
    final ProtocolContext context = besuController.getProtocolContext();
    final List<SubProtocol> subProtocols = subProtocolConfiguration.getSubProtocols();
    final List<ProtocolManager> protocolManagers = subProtocolConfiguration.getProtocolManagers();
    final Set<Capability> supportedCapabilities = protocolManagers.stream().flatMap(protocolManager -> protocolManager.getSupportedCapabilities().stream()).collect(Collectors.toSet());
    final RlpxConfiguration rlpxConfiguration = RlpxConfiguration.create().setBindHost(p2pListenInterface).setBindPort(p2pListenPort).setMaxPeers(maxPeers).setSupportedProtocols(subProtocols).setClientId(BesuInfo.nodeName(identityString)).setLimitRemoteWireConnectionsEnabled(limitRemoteWireConnectionsEnabled).setFractionRemoteWireConnectionsAllowed(fractionRemoteConnectionsAllowed);
    networkingConfiguration.setRlpx(rlpxConfiguration).setDiscovery(discoveryConfiguration);
    final PeerPermissionsDenylist bannedNodes = PeerPermissionsDenylist.create();
    bannedNodeIds.forEach(bannedNodes::add);
    final List<EnodeURL> bootnodes = discoveryConfiguration.getBootnodes();
    final Synchronizer synchronizer = besuController.getSynchronizer();
    final TransactionSimulator transactionSimulator = new TransactionSimulator(context.getBlockchain(), context.getWorldStateArchive(), protocolSchedule);
    final Bytes localNodeId = nodeKey.getPublicKey().getEncodedBytes();
    final Optional<NodePermissioningController> nodePermissioningController = buildNodePermissioningController(bootnodes, synchronizer, transactionSimulator, localNodeId, context.getBlockchain());
    final PeerPermissions peerPermissions = nodePermissioningController.map(nodePC -> new PeerPermissionsAdapter(nodePC, bootnodes, context.getBlockchain())).map(nodePerms -> PeerPermissions.combine(nodePerms, bannedNodes)).orElse(bannedNodes);
    LOG.info("Detecting NAT service.");
    final boolean fallbackEnabled = natMethod == NatMethod.AUTO || natMethodFallbackEnabled;
    final NatService natService = new NatService(buildNatManager(natMethod), fallbackEnabled);
    final NetworkBuilder inactiveNetwork = caps -> new NoopP2PNetwork();
    final NetworkBuilder activeNetwork = caps -> DefaultP2PNetwork.builder().vertx(vertx).nodeKey(nodeKey).config(networkingConfiguration).peerPermissions(peerPermissions).metricsSystem(metricsSystem).supportedCapabilities(caps).natService(natService).randomPeerPriority(randomPeerPriority).storageProvider(storageProvider).forkIdSupplier(forkIdSupplier).p2pTLSConfiguration(p2pTLSConfiguration).build();
    final NetworkRunner networkRunner = NetworkRunner.builder().protocolManagers(protocolManagers).subProtocols(subProtocols).network(p2pEnabled ? activeNetwork : inactiveNetwork).metricsSystem(metricsSystem).build();
    final P2PNetwork network = networkRunner.getNetwork();
    // ForkId in Ethereum Node Record needs updating when we transition to a new protocol spec
    context.getBlockchain().observeBlockAdded(blockAddedEvent -> {
        if (protocolSchedule.streamMilestoneBlocks().anyMatch(blockNumber -> blockNumber == blockAddedEvent.getBlock().getHeader().getNumber())) {
            network.updateNodeRecord();
        }
    });
    nodePermissioningController.ifPresent(n -> n.setInsufficientPeersPermissioningProvider(new InsufficientPeersPermissioningProvider(network, bootnodes)));
    final TransactionPool transactionPool = besuController.getTransactionPool();
    final MiningCoordinator miningCoordinator = besuController.getMiningCoordinator();
    final BlockchainQueries blockchainQueries = new BlockchainQueries(context.getBlockchain(), context.getWorldStateArchive(), Optional.of(dataDir.resolve(CACHE_PATH)), Optional.of(besuController.getProtocolManager().ethContext().getScheduler()), apiConfiguration);
    final PrivacyParameters privacyParameters = besuController.getPrivacyParameters();
    final FilterManager filterManager = new FilterManagerBuilder().blockchainQueries(blockchainQueries).transactionPool(transactionPool).privacyParameters(privacyParameters).build();
    vertx.deployVerticle(filterManager);
    createPrivateTransactionObserver(filterManager, privacyParameters);
    final P2PNetwork peerNetwork = networkRunner.getNetwork();
    final MiningParameters miningParameters = besuController.getMiningParameters();
    Optional<StratumServer> stratumServer = Optional.empty();
    if (miningParameters.isStratumMiningEnabled()) {
        var powMiningCoordinator = miningCoordinator;
        if (miningCoordinator instanceof TransitionCoordinator) {
            LOG.debug("fetching powMiningCoordinator from TransitionCoordinator");
            powMiningCoordinator = ((TransitionCoordinator) miningCoordinator).getPreMergeObject();
        }
        stratumServer = Optional.of(new StratumServer(vertx, powMiningCoordinator, miningParameters.getStratumPort(), miningParameters.getStratumNetworkInterface(), miningParameters.getStratumExtranonce(), metricsSystem));
        miningCoordinator.addEthHashObserver(stratumServer.get());
        LOG.debug("added ethash observer: {}", stratumServer.get());
    }
    sanitizePeers(network, staticNodes).map(DefaultPeer::fromEnodeURL).forEach(peerNetwork::addMaintainedConnectionPeer);
    final Optional<NodeLocalConfigPermissioningController> nodeLocalConfigPermissioningController = nodePermissioningController.flatMap(NodePermissioningController::localConfigController);
    final Optional<AccountPermissioningController> accountPermissioningController = buildAccountPermissioningController(permissioningConfiguration, besuController, transactionSimulator, context.getBlockchain());
    final Optional<AccountLocalConfigPermissioningController> accountLocalConfigPermissioningController = accountPermissioningController.flatMap(AccountPermissioningController::getAccountLocalConfigPermissioningController);
    Optional<JsonRpcHttpService> jsonRpcHttpService = Optional.empty();
    if (jsonRpcConfiguration.isEnabled()) {
        final Map<String, JsonRpcMethod> nonEngineMethods = jsonRpcMethods(protocolSchedule, context, besuController, peerNetwork, blockchainQueries, synchronizer, transactionPool, miningCoordinator, metricsSystem, supportedCapabilities, jsonRpcConfiguration.getRpcApis().stream().filter(apiGroup -> !apiGroup.toLowerCase().startsWith("engine")).collect(Collectors.toList()), filterManager, accountLocalConfigPermissioningController, nodeLocalConfigPermissioningController, privacyParameters, jsonRpcConfiguration, webSocketConfiguration, metricsConfiguration, natService, besuPluginContext.getNamedPlugins(), dataDir, rpcEndpointServiceImpl);
        jsonRpcHttpService = Optional.of(new JsonRpcHttpService(vertx, dataDir, jsonRpcConfiguration, metricsSystem, natService, nonEngineMethods, new HealthService(new LivenessCheck()), new HealthService(new ReadinessCheck(peerNetwork, synchronizer))));
    }
    Optional<JsonRpcService> engineJsonRpcService = Optional.empty();
    if (engineJsonRpcConfiguration.isPresent() && engineJsonRpcConfiguration.get().isEnabled()) {
        final Map<String, JsonRpcMethod> engineMethods = jsonRpcMethods(protocolSchedule, context, besuController, peerNetwork, blockchainQueries, synchronizer, transactionPool, miningCoordinator, metricsSystem, supportedCapabilities, engineJsonRpcConfiguration.get().getRpcApis(), filterManager, accountLocalConfigPermissioningController, nodeLocalConfigPermissioningController, privacyParameters, engineJsonRpcConfiguration.get(), webSocketConfiguration, metricsConfiguration, natService, besuPluginContext.getNamedPlugins(), dataDir, rpcEndpointServiceImpl);
        Optional<AuthenticationService> authToUse = engineJsonRpcConfiguration.get().isAuthenticationEnabled() ? Optional.of(new EngineAuthService(vertx, Optional.ofNullable(engineJsonRpcConfiguration.get().getAuthenticationPublicKeyFile()), dataDir)) : Optional.empty();
        WebSocketConfiguration engineSocketConfig = webSocketConfiguration.isEnabled() ? webSocketConfiguration : WebSocketConfiguration.createEngineDefault();
        engineJsonRpcService = Optional.of(new JsonRpcService(vertx, dataDir, engineJsonRpcConfiguration.orElse(JsonRpcConfiguration.createEngineDefault()), metricsSystem, natService, engineMethods, Optional.ofNullable(engineSocketConfig), besuController.getProtocolManager().ethContext().getScheduler(), authToUse, new HealthService(new LivenessCheck()), new HealthService(new ReadinessCheck(peerNetwork, synchronizer))));
    }
    Optional<GraphQLHttpService> graphQLHttpService = Optional.empty();
    if (graphQLConfiguration.isEnabled()) {
        final GraphQLDataFetchers fetchers = new GraphQLDataFetchers(supportedCapabilities, privacyParameters.getGoQuorumPrivacyParameters());
        final Map<GraphQLContextType, Object> graphQlContextMap = new ConcurrentHashMap<>();
        graphQlContextMap.putIfAbsent(GraphQLContextType.BLOCKCHAIN_QUERIES, blockchainQueries);
        graphQlContextMap.putIfAbsent(GraphQLContextType.PROTOCOL_SCHEDULE, protocolSchedule);
        graphQlContextMap.putIfAbsent(GraphQLContextType.TRANSACTION_POOL, transactionPool);
        graphQlContextMap.putIfAbsent(GraphQLContextType.MINING_COORDINATOR, miningCoordinator);
        graphQlContextMap.putIfAbsent(GraphQLContextType.SYNCHRONIZER, synchronizer);
        final GraphQL graphQL;
        try {
            graphQL = GraphQLProvider.buildGraphQL(fetchers);
        } catch (final IOException ioe) {
            throw new RuntimeException(ioe);
        }
        graphQLHttpService = Optional.of(new GraphQLHttpService(vertx, dataDir, graphQLConfiguration, graphQL, graphQlContextMap, besuController.getProtocolManager().ethContext().getScheduler()));
    }
    Optional<WebSocketService> webSocketService = Optional.empty();
    if (webSocketConfiguration.isEnabled()) {
        final Map<String, JsonRpcMethod> nonEngineMethods = jsonRpcMethods(protocolSchedule, context, besuController, peerNetwork, blockchainQueries, synchronizer, transactionPool, miningCoordinator, metricsSystem, supportedCapabilities, webSocketConfiguration.getRpcApis().stream().filter(apiGroup -> !apiGroup.toLowerCase().startsWith("engine")).collect(Collectors.toList()), filterManager, accountLocalConfigPermissioningController, nodeLocalConfigPermissioningController, privacyParameters, jsonRpcConfiguration, webSocketConfiguration, metricsConfiguration, natService, besuPluginContext.getNamedPlugins(), dataDir, rpcEndpointServiceImpl);
        final SubscriptionManager subscriptionManager = createSubscriptionManager(vertx, transactionPool, blockchainQueries);
        createLogsSubscriptionService(context.getBlockchain(), context.getWorldStateArchive(), subscriptionManager, privacyParameters);
        createNewBlockHeadersSubscriptionService(context.getBlockchain(), blockchainQueries, subscriptionManager);
        createSyncingSubscriptionService(synchronizer, subscriptionManager);
        webSocketService = Optional.of(createWebsocketService(vertx, webSocketConfiguration, subscriptionManager, nonEngineMethods, privacyParameters, protocolSchedule, blockchainQueries, DefaultAuthenticationService.create(vertx, webSocketConfiguration), metricsSystem));
        createPrivateTransactionObserver(subscriptionManager, privacyParameters);
    }
    Optional<MetricsService> metricsService = createMetricsService(vertx, metricsConfiguration);
    final Optional<EthStatsService> ethStatsService;
    if (!Strings.isNullOrEmpty(ethstatsUrl)) {
        ethStatsService = Optional.of(new EthStatsService(NetstatsUrl.fromParams(ethstatsUrl, ethstatsContact), blockchainQueries, besuController.getProtocolManager(), transactionPool, miningCoordinator, besuController.getSyncState(), vertx, BesuInfo.nodeName(identityString), besuController.getGenesisConfigOptions(), network));
    } else {
        ethStatsService = Optional.empty();
    }
    final Optional<JsonRpcIpcService> jsonRpcIpcService;
    if (jsonRpcIpcConfiguration.isEnabled()) {
        Map<String, JsonRpcMethod> ipcMethods = jsonRpcMethods(protocolSchedule, context, besuController, peerNetwork, blockchainQueries, synchronizer, transactionPool, miningCoordinator, metricsSystem, supportedCapabilities, jsonRpcIpcConfiguration.getEnabledApis().stream().filter(apiGroup -> !apiGroup.toLowerCase().startsWith("engine")).collect(Collectors.toList()), filterManager, accountLocalConfigPermissioningController, nodeLocalConfigPermissioningController, privacyParameters, jsonRpcConfiguration, webSocketConfiguration, metricsConfiguration, natService, besuPluginContext.getNamedPlugins(), dataDir, rpcEndpointServiceImpl);
        jsonRpcIpcService = Optional.of(new JsonRpcIpcService(vertx, jsonRpcIpcConfiguration.getPath(), new JsonRpcExecutor(new BaseJsonRpcProcessor(), ipcMethods)));
    } else {
        jsonRpcIpcService = Optional.empty();
    }
    return new Runner(vertx, networkRunner, natService, jsonRpcHttpService, engineJsonRpcService, graphQLHttpService, webSocketService, jsonRpcIpcService, stratumServer, metricsService, ethStatsService, besuController, dataDir, pidPath, autoLogBloomCaching ? blockchainQueries.getTransactionLogBloomCacher() : Optional.empty(), context.getBlockchain());
}
Also used : NoopP2PNetwork(org.hyperledger.besu.ethereum.p2p.network.NoopP2PNetwork) PermissioningConfiguration(org.hyperledger.besu.ethereum.permissioning.PermissioningConfiguration) NodeLocalConfigPermissioningController(org.hyperledger.besu.ethereum.permissioning.NodeLocalConfigPermissioningController) AuthenticationService(org.hyperledger.besu.ethereum.api.jsonrpc.authentication.AuthenticationService) WebSocketConfiguration(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.WebSocketConfiguration) DockerDetector(org.hyperledger.besu.nat.docker.DockerDetector) FilterManagerBuilder(org.hyperledger.besu.ethereum.api.jsonrpc.internal.filter.FilterManagerBuilder) Map(java.util.Map) DiscoveryConfiguration(org.hyperledger.besu.ethereum.p2p.config.DiscoveryConfiguration) Objects.isNull(java.util.Objects.isNull) BesuPluginContextImpl(org.hyperledger.besu.services.BesuPluginContextImpl) NetworkUtility(org.hyperledger.besu.util.NetworkUtility) Path(java.nio.file.Path) ProtocolManager(org.hyperledger.besu.ethereum.p2p.network.ProtocolManager) PendingTransactionDroppedSubscriptionService(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.pending.PendingTransactionDroppedSubscriptionService) FlexiblePrivacyPrecompiledContract(org.hyperledger.besu.ethereum.mainnet.precompiles.privacy.FlexiblePrivacyPrecompiledContract) NetworkingConfiguration(org.hyperledger.besu.ethereum.p2p.config.NetworkingConfiguration) ReadinessCheck(org.hyperledger.besu.ethereum.api.jsonrpc.health.ReadinessCheck) BlockchainQueries(org.hyperledger.besu.ethereum.api.query.BlockchainQueries) PeerPermissionsDenylist(org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissionsDenylist) Set(java.util.Set) GraphQLProvider(org.hyperledger.besu.ethereum.api.graphql.GraphQLProvider) P2PNetwork(org.hyperledger.besu.ethereum.p2p.network.P2PNetwork) PrivateTransactionObserver(org.hyperledger.besu.ethereum.privacy.PrivateTransactionObserver) Stream(java.util.stream.Stream) SyncingSubscriptionService(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.syncing.SyncingSubscriptionService) NewBlockHeadersSubscriptionService(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.blockheaders.NewBlockHeadersSubscriptionService) WebSocketService(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.WebSocketService) PendingTransactionSubscriptionService(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.pending.PendingTransactionSubscriptionService) LogsSubscriptionService(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.logs.LogsSubscriptionService) Capability(org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability) Predicate.not(java.util.function.Predicate.not) FLEXIBLE_PRIVACY(org.hyperledger.besu.ethereum.core.PrivacyParameters.FLEXIBLE_PRIVACY) JsonRpcExecutor(org.hyperledger.besu.ethereum.api.jsonrpc.execution.JsonRpcExecutor) LivenessCheck(org.hyperledger.besu.ethereum.api.jsonrpc.health.LivenessCheck) MetricsService(org.hyperledger.besu.metrics.MetricsService) JsonRpcProcessor(org.hyperledger.besu.ethereum.api.jsonrpc.execution.JsonRpcProcessor) AccountPermissioningController(org.hyperledger.besu.ethereum.permissioning.account.AccountPermissioningController) Bytes(org.apache.tuweni.bytes.Bytes) Supplier(java.util.function.Supplier) TLSConfiguration(org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.TLSConfiguration) KubernetesNatManager(org.hyperledger.besu.nat.kubernetes.KubernetesNatManager) ArrayList(java.util.ArrayList) ProtocolSchedule(org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule) PrivacyQueries(org.hyperledger.besu.ethereum.api.query.PrivacyQueries) Strings(com.google.common.base.Strings) FilterManager(org.hyperledger.besu.ethereum.api.jsonrpc.internal.filter.FilterManager) JsonRpcMethodsFactory(org.hyperledger.besu.ethereum.api.jsonrpc.methods.JsonRpcMethodsFactory) MiningCoordinator(org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator) InsufficientPeersPermissioningProvider(org.hyperledger.besu.ethereum.permissioning.node.InsufficientPeersPermissioningProvider) DefaultAuthenticationService(org.hyperledger.besu.ethereum.api.jsonrpc.authentication.DefaultAuthenticationService) TransactionSimulator(org.hyperledger.besu.ethereum.transaction.TransactionSimulator) JsonRpcHttpService(org.hyperledger.besu.ethereum.api.jsonrpc.JsonRpcHttpService) StratumServer(org.hyperledger.besu.ethereum.stratum.StratumServer) Vertx(io.vertx.core.Vertx) Predicate.isEqual(java.util.function.Predicate.isEqual) NatMethod(org.hyperledger.besu.nat.NatMethod) GraphQLConfiguration(org.hyperledger.besu.ethereum.api.graphql.GraphQLConfiguration) IOException(java.io.IOException) MetricsConfiguration(org.hyperledger.besu.metrics.prometheus.MetricsConfiguration) DockerNatManager(org.hyperledger.besu.nat.docker.DockerNatManager) TransitionCoordinator(org.hyperledger.besu.consensus.merge.blockcreation.TransitionCoordinator) AccountPermissioningControllerFactory(org.hyperledger.besu.ethereum.permissioning.account.AccountPermissioningControllerFactory) NetworkBuilder(org.hyperledger.besu.ethereum.p2p.network.NetworkRunner.NetworkBuilder) WebSocketMethodsFactory(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.methods.WebSocketMethodsFactory) Preconditions(com.google.common.base.Preconditions) PrivacyParameters(org.hyperledger.besu.ethereum.core.PrivacyParameters) PrivateWebSocketMethodsFactory(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.methods.PrivateWebSocketMethodsFactory) BesuPlugin(org.hyperledger.besu.plugin.BesuPlugin) LoggerFactory(org.slf4j.LoggerFactory) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) JsonRpcIpcService(org.hyperledger.besu.ethereum.api.jsonrpc.ipc.JsonRpcIpcService) StorageProvider(org.hyperledger.besu.ethereum.storage.StorageProvider) Synchronizer(org.hyperledger.besu.ethereum.core.Synchronizer) NetworkName(org.hyperledger.besu.cli.config.NetworkName) DefaultP2PNetwork(org.hyperledger.besu.ethereum.p2p.network.DefaultP2PNetwork) WebSocketMessageHandler(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.WebSocketMessageHandler) Collection(java.util.Collection) Blockchain(org.hyperledger.besu.ethereum.chain.Blockchain) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) MiningParameters(org.hyperledger.besu.ethereum.core.MiningParameters) Collectors(java.util.stream.Collectors) GraphQLHttpService(org.hyperledger.besu.ethereum.api.graphql.GraphQLHttpService) EthStatsService(org.hyperledger.besu.ethstats.EthStatsService) List(java.util.List) UpnpNatManager(org.hyperledger.besu.nat.upnp.UpnpNatManager) Optional(java.util.Optional) KubernetesDetector(org.hyperledger.besu.nat.kubernetes.KubernetesDetector) NodeKey(org.hyperledger.besu.crypto.NodeKey) ApiConfiguration(org.hyperledger.besu.ethereum.api.ApiConfiguration) GraphQLContextType(org.hyperledger.besu.ethereum.api.graphql.GraphQLContextType) SubProtocolConfiguration(org.hyperledger.besu.ethereum.p2p.config.SubProtocolConfiguration) NatManager(org.hyperledger.besu.nat.core.NatManager) GraphQL(graphql.GraphQL) EthNetworkConfig(org.hyperledger.besu.cli.config.EthNetworkConfig) CACHE_PATH(org.hyperledger.besu.controller.BesuController.CACHE_PATH) EngineAuthService(org.hyperledger.besu.ethereum.api.jsonrpc.authentication.EngineAuthService) NodePermissioningController(org.hyperledger.besu.ethereum.permissioning.node.NodePermissioningController) SubProtocol(org.hyperledger.besu.ethereum.p2p.rlpx.wire.SubProtocol) NetworkRunner(org.hyperledger.besu.ethereum.p2p.network.NetworkRunner) BesuController(org.hyperledger.besu.controller.BesuController) PermissioningServiceImpl(org.hyperledger.besu.services.PermissioningServiceImpl) JsonRpcConfiguration(org.hyperledger.besu.ethereum.api.jsonrpc.JsonRpcConfiguration) RpcEndpointServiceImpl(org.hyperledger.besu.services.RpcEndpointServiceImpl) DefaultPeer(org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer) HealthService(org.hyperledger.besu.ethereum.api.jsonrpc.health.HealthService) WorldStateArchive(org.hyperledger.besu.ethereum.worldstate.WorldStateArchive) BaseJsonRpcProcessor(org.hyperledger.besu.ethereum.api.jsonrpc.execution.BaseJsonRpcProcessor) RlpxConfiguration(org.hyperledger.besu.ethereum.p2p.config.RlpxConfiguration) TransactionPool(org.hyperledger.besu.ethereum.eth.transactions.TransactionPool) Logger(org.slf4j.Logger) NodePermissioningControllerFactory(org.hyperledger.besu.ethereum.permissioning.NodePermissioningControllerFactory) PeerPermissionsAdapter(org.hyperledger.besu.ethereum.permissioning.node.PeerPermissionsAdapter) NetstatsUrl(org.hyperledger.besu.ethstats.util.NetstatsUrl) AccountLocalConfigPermissioningController(org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController) GraphQLDataFetchers(org.hyperledger.besu.ethereum.api.graphql.GraphQLDataFetchers) EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) JsonRpcService(org.hyperledger.besu.ethereum.api.jsonrpc.JsonRpcService) SubscriptionManager(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.SubscriptionManager) JsonRpcIpcConfiguration(org.hyperledger.besu.ethereum.api.jsonrpc.ipc.JsonRpcIpcConfiguration) ObservableMetricsSystem(org.hyperledger.besu.metrics.ObservableMetricsSystem) ProtocolContext(org.hyperledger.besu.ethereum.ProtocolContext) PeerPermissions(org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissions) VisibleForTesting(com.google.common.annotations.VisibleForTesting) Collections(java.util.Collections) JsonRpcMethod(org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod) NatService(org.hyperledger.besu.nat.NatService) AuthenticatedJsonRpcProcessor(org.hyperledger.besu.ethereum.api.jsonrpc.execution.AuthenticatedJsonRpcProcessor) StratumServer(org.hyperledger.besu.ethereum.stratum.StratumServer) DiscoveryConfiguration(org.hyperledger.besu.ethereum.p2p.config.DiscoveryConfiguration) AccountLocalConfigPermissioningController(org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController) SubscriptionManager(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.SubscriptionManager) RlpxConfiguration(org.hyperledger.besu.ethereum.p2p.config.RlpxConfiguration) EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) Bytes(org.apache.tuweni.bytes.Bytes) MiningParameters(org.hyperledger.besu.ethereum.core.MiningParameters) ReadinessCheck(org.hyperledger.besu.ethereum.api.jsonrpc.health.ReadinessCheck) HealthService(org.hyperledger.besu.ethereum.api.jsonrpc.health.HealthService) LivenessCheck(org.hyperledger.besu.ethereum.api.jsonrpc.health.LivenessCheck) SubProtocol(org.hyperledger.besu.ethereum.p2p.rlpx.wire.SubProtocol) EngineAuthService(org.hyperledger.besu.ethereum.api.jsonrpc.authentication.EngineAuthService) ProtocolContext(org.hyperledger.besu.ethereum.ProtocolContext) TransactionSimulator(org.hyperledger.besu.ethereum.transaction.TransactionSimulator) NodeKey(org.hyperledger.besu.crypto.NodeKey) JsonRpcExecutor(org.hyperledger.besu.ethereum.api.jsonrpc.execution.JsonRpcExecutor) PeerPermissionsAdapter(org.hyperledger.besu.ethereum.permissioning.node.PeerPermissionsAdapter) Synchronizer(org.hyperledger.besu.ethereum.core.Synchronizer) TransactionPool(org.hyperledger.besu.ethereum.eth.transactions.TransactionPool) Capability(org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability) WebSocketConfiguration(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.WebSocketConfiguration) NatService(org.hyperledger.besu.nat.NatService) GraphQL(graphql.GraphQL) ProtocolSchedule(org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule) PrivacyParameters(org.hyperledger.besu.ethereum.core.PrivacyParameters) JsonRpcIpcService(org.hyperledger.besu.ethereum.api.jsonrpc.ipc.JsonRpcIpcService) SubProtocolConfiguration(org.hyperledger.besu.ethereum.p2p.config.SubProtocolConfiguration) ProtocolManager(org.hyperledger.besu.ethereum.p2p.network.ProtocolManager) NodePermissioningController(org.hyperledger.besu.ethereum.permissioning.node.NodePermissioningController) GraphQLDataFetchers(org.hyperledger.besu.ethereum.api.graphql.GraphQLDataFetchers) JsonRpcHttpService(org.hyperledger.besu.ethereum.api.jsonrpc.JsonRpcHttpService) EthStatsService(org.hyperledger.besu.ethstats.EthStatsService) NetworkRunner(org.hyperledger.besu.ethereum.p2p.network.NetworkRunner) GraphQLHttpService(org.hyperledger.besu.ethereum.api.graphql.GraphQLHttpService) NodeLocalConfigPermissioningController(org.hyperledger.besu.ethereum.permissioning.NodeLocalConfigPermissioningController) MiningCoordinator(org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator) FilterManager(org.hyperledger.besu.ethereum.api.jsonrpc.internal.filter.FilterManager) AccountPermissioningController(org.hyperledger.besu.ethereum.permissioning.account.AccountPermissioningController) PeerPermissionsDenylist(org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissionsDenylist) BaseJsonRpcProcessor(org.hyperledger.besu.ethereum.api.jsonrpc.execution.BaseJsonRpcProcessor) NetworkBuilder(org.hyperledger.besu.ethereum.p2p.network.NetworkRunner.NetworkBuilder) TransitionCoordinator(org.hyperledger.besu.consensus.merge.blockcreation.TransitionCoordinator) BlockchainQueries(org.hyperledger.besu.ethereum.api.query.BlockchainQueries) WebSocketService(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.WebSocketService) NetworkRunner(org.hyperledger.besu.ethereum.p2p.network.NetworkRunner) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) InsufficientPeersPermissioningProvider(org.hyperledger.besu.ethereum.permissioning.node.InsufficientPeersPermissioningProvider) NoopP2PNetwork(org.hyperledger.besu.ethereum.p2p.network.NoopP2PNetwork) MetricsService(org.hyperledger.besu.metrics.MetricsService) NoopP2PNetwork(org.hyperledger.besu.ethereum.p2p.network.NoopP2PNetwork) P2PNetwork(org.hyperledger.besu.ethereum.p2p.network.P2PNetwork) DefaultP2PNetwork(org.hyperledger.besu.ethereum.p2p.network.DefaultP2PNetwork) FilterManagerBuilder(org.hyperledger.besu.ethereum.api.jsonrpc.internal.filter.FilterManagerBuilder) IOException(java.io.IOException) GraphQLContextType(org.hyperledger.besu.ethereum.api.graphql.GraphQLContextType) JsonRpcService(org.hyperledger.besu.ethereum.api.jsonrpc.JsonRpcService) JsonRpcMethod(org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod) PeerPermissions(org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissions) AuthenticationService(org.hyperledger.besu.ethereum.api.jsonrpc.authentication.AuthenticationService) DefaultAuthenticationService(org.hyperledger.besu.ethereum.api.jsonrpc.authentication.DefaultAuthenticationService)

Example 3 with EnodeURL

use of org.hyperledger.besu.plugin.data.EnodeURL in project besu by hyperledger.

the class EthNetworkConfig method getNetworkConfig.

public static EthNetworkConfig getNetworkConfig(final NetworkName networkName) {
    final String genesisContent = jsonConfig(networkName.getGenesisFile());
    final GenesisConfigOptions genesisConfigOptions = GenesisConfigFile.fromConfig(genesisContent).getConfigOptions();
    final Optional<List<String>> rawBootNodes = genesisConfigOptions.getDiscoveryOptions().getBootNodes();
    final List<EnodeURL> bootNodes = rawBootNodes.map(strings -> strings.stream().map(EnodeURLImpl::fromString).collect(Collectors.toList())).orElse(Collections.emptyList());
    return new EthNetworkConfig(genesisContent, networkName.getNetworkId(), bootNodes, genesisConfigOptions.getDiscoveryOptions().getDiscoveryDnsUrl().orElse(null));
}
Also used : EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) EnodeURLImpl(org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl) UTF_8(java.nio.charset.StandardCharsets.UTF_8) IOException(java.io.IOException) GenesisConfigOptions(org.hyperledger.besu.config.GenesisConfigOptions) Collectors(java.util.stream.Collectors) EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) Objects(java.util.Objects) List(java.util.List) GenesisConfigFile(org.hyperledger.besu.config.GenesisConfigFile) Optional(java.util.Optional) BigInteger(java.math.BigInteger) Collections(java.util.Collections) InputStream(java.io.InputStream) List(java.util.List) GenesisConfigOptions(org.hyperledger.besu.config.GenesisConfigOptions)

Example 4 with EnodeURL

use of org.hyperledger.besu.plugin.data.EnodeURL in project besu by hyperledger.

the class DeFramerTest method decode_handlesHelloFromPeerWithAdvertisedPortOf0.

@Test
public void decode_handlesHelloFromPeerWithAdvertisedPortOf0() throws ExecutionException, InterruptedException {
    ChannelFuture future = NettyMocks.channelFuture(false);
    when(channel.closeFuture()).thenReturn(future);
    final Peer peer = createRemotePeer();
    final PeerInfo remotePeerInfo = new PeerInfo(p2pVersion, clientId, capabilities, 0, peer.getId());
    final DeFramer deFramer = createDeFramer(null);
    HelloMessage helloMessage = HelloMessage.create(remotePeerInfo);
    ByteBuf data = Unpooled.wrappedBuffer(helloMessage.getData().toArray());
    when(framer.deframe(eq(data))).thenReturn(new RawMessage(helloMessage.getCode(), helloMessage.getData())).thenReturn(null);
    List<Object> out = new ArrayList<>();
    deFramer.decode(ctx, data, out);
    assertThat(connectFuture).isDone();
    assertThat(connectFuture).isNotCompletedExceptionally();
    PeerConnection peerConnection = connectFuture.get();
    assertThat(peerConnection.getPeerInfo()).isEqualTo(remotePeerInfo);
    assertThat(out).isEmpty();
    final EnodeURL expectedEnode = EnodeURLImpl.builder().ipAddress(remoteAddress.getAddress()).nodeId(peer.getId()).disableListening().disableDiscovery().build();
    assertThat(peerConnection.getPeer().getEnodeURL()).isEqualTo(expectedEnode);
    // Next phase of pipeline should be setup
    verify(pipeline, times(1)).addLast(any());
    // Next message should be pushed out
    PingMessage nextMessage = PingMessage.get();
    ByteBuf nextData = Unpooled.wrappedBuffer(nextMessage.getData().toArray());
    when(framer.deframe(eq(nextData))).thenReturn(new RawMessage(nextMessage.getCode(), nextMessage.getData())).thenReturn(null);
    verify(pipeline, times(1)).addLast(any());
    deFramer.decode(ctx, nextData, out);
    assertThat(out.size()).isEqualTo(1);
}
Also used : ChannelFuture(io.netty.channel.ChannelFuture) HelloMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage) PeerConnection(org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection) PeerInfo(org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo) Peer(org.hyperledger.besu.ethereum.p2p.peers.Peer) DefaultPeer(org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer) ArrayList(java.util.ArrayList) ByteBuf(io.netty.buffer.ByteBuf) PingMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.PingMessage) EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) RawMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.RawMessage) Test(org.junit.Test)

Example 5 with EnodeURL

use of org.hyperledger.besu.plugin.data.EnodeURL in project besu by hyperledger.

the class InsufficientPeersPermissioningProviderTest method firesUpdateWhenNonBootnodeConnects.

@Test
public void firesUpdateWhenNonBootnodeConnects() {
    final Collection<EnodeURL> bootnodes = Arrays.asList(ENODE_2, ENODE_3);
    final Collection<PeerConnection> pcs = Collections.emptyList();
    when(p2pNetwork.getPeers()).thenReturn(pcs);
    final InsufficientPeersPermissioningProvider provider = new InsufficientPeersPermissioningProvider(p2pNetwork, bootnodes);
    @SuppressWarnings("unchecked") final ArgumentCaptor<ConnectCallback> callbackCaptor = ArgumentCaptor.forClass(ConnectCallback.class);
    verify(p2pNetwork).subscribeConnect(callbackCaptor.capture());
    final ConnectCallback connectCallback = callbackCaptor.getValue();
    final Runnable updatePermsCallback = mock(Runnable.class);
    provider.subscribeToUpdates(updatePermsCallback);
    connectCallback.onConnect(peerConnectionMatching(ENODE_2));
    verify(updatePermsCallback, times(0)).run();
    connectCallback.onConnect(peerConnectionMatching(ENODE_3));
    verify(updatePermsCallback, times(0)).run();
    connectCallback.onConnect(peerConnectionMatching(ENODE_4));
    verify(updatePermsCallback, times(1)).run();
    connectCallback.onConnect(peerConnectionMatching(ENODE_5));
    verify(updatePermsCallback, times(1)).run();
    connectCallback.onConnect(peerConnectionMatching(ENODE_3));
    verify(updatePermsCallback, times(1)).run();
}
Also used : EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) PeerConnection(org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection) ConnectCallback(org.hyperledger.besu.ethereum.p2p.rlpx.ConnectCallback) Test(org.junit.Test)

Aggregations

EnodeURL (org.hyperledger.besu.plugin.data.EnodeURL)109 Test (org.junit.Test)83 Bytes (org.apache.tuweni.bytes.Bytes)26 PeerConnection (org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection)22 DefaultPeer (org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer)17 Peer (org.hyperledger.besu.ethereum.p2p.peers.Peer)17 NodeKey (org.hyperledger.besu.crypto.NodeKey)14 Path (java.nio.file.Path)12 CompletableFuture (java.util.concurrent.CompletableFuture)12 Optional (java.util.Optional)11 List (java.util.List)10 Collectors (java.util.stream.Collectors)10 URL (java.net.URL)9 EnodeURLImpl (org.hyperledger.besu.ethereum.p2p.peers.EnodeURLImpl)9 DisconnectReason (org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason)9 File (java.io.File)8 Collections (java.util.Collections)8 LocalPermissioningConfiguration (org.hyperledger.besu.ethereum.permissioning.LocalPermissioningConfiguration)8 ArrayList (java.util.ArrayList)7 EthNetworkConfig (org.hyperledger.besu.cli.config.EthNetworkConfig)7