Search in sources :

Example 1 with AuthenticationService

use of org.hyperledger.besu.ethereum.api.jsonrpc.authentication.AuthenticationService 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 2 with AuthenticationService

use of org.hyperledger.besu.ethereum.api.jsonrpc.authentication.AuthenticationService in project besu by hyperledger.

the class WebSocketRequestHandler method executeHandler.

private Handler<Promise<Object>> executeHandler(final Optional<AuthenticationService> authenticationService, final ServerWebSocket websocket, final String payload, final Optional<User> user, final Collection<String> noAuthApiMethods) {
    return future -> {
        final String json = payload.trim();
        if (!json.isEmpty() && json.charAt(0) == '{') {
            try {
                handleSingleRequest(authenticationService, websocket, user, future, getRequest(payload), noAuthApiMethods);
            } catch (final IllegalArgumentException | DecodeException e) {
                LOG.debug("Error mapping json to WebSocketRpcRequest", e);
                future.complete(new JsonRpcErrorResponse(null, JsonRpcError.INVALID_REQUEST));
                return;
            }
        } else if (json.length() == 0) {
            future.complete(errorResponse(null, INVALID_REQUEST));
            return;
        } else {
            final JsonArray jsonArray = new JsonArray(json);
            if (jsonArray.size() < 1) {
                future.complete(errorResponse(null, INVALID_REQUEST));
                return;
            }
            // handle batch request
            LOG.debug("batch request size {}", jsonArray.size());
            handleJsonBatchRequest(authenticationService, websocket, jsonArray, user, noAuthApiMethods);
        }
    };
}
Also used : JsonRpcUnauthorizedResponse(org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcUnauthorizedResponse) ServerWebSocket(io.vertx.core.http.ServerWebSocket) Json(io.vertx.core.json.Json) JsonRpcError(org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError) DecodeException(io.vertx.core.json.DecodeException) AuthenticationService(org.hyperledger.besu.ethereum.api.jsonrpc.authentication.AuthenticationService) LoggerFactory(org.slf4j.LoggerFactory) IsAliveHandler(org.hyperledger.besu.ethereum.api.handlers.IsAliveHandler) JsonRpcResponseType(org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponseType) CompositeFuture(io.vertx.core.CompositeFuture) EthScheduler(org.hyperledger.besu.ethereum.eth.manager.EthScheduler) Map(java.util.Map) RpcMethodTimeoutException(org.hyperledger.besu.ethereum.api.handlers.RpcMethodTimeoutException) JsonRpcRequestContext(org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext) JsonObject(io.vertx.core.json.JsonObject) AsyncResult(io.vertx.core.AsyncResult) WebSocketRpcRequest(org.hyperledger.besu.ethereum.api.jsonrpc.websocket.methods.WebSocketRpcRequest) Logger(org.slf4j.Logger) INVALID_REQUEST(org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError.INVALID_REQUEST) ObjectWriter(com.fasterxml.jackson.databind.ObjectWriter) JsonRpcResponse(org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse) Collection(java.util.Collection) Promise(io.vertx.core.Promise) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Vertx(io.vertx.core.Vertx) IOException(java.io.IOException) JsonRpcErrorResponse(org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse) InvalidJsonRpcParameters(org.hyperledger.besu.ethereum.api.jsonrpc.internal.exception.InvalidJsonRpcParameters) Future(io.vertx.core.Future) Jdk8Module(com.fasterxml.jackson.datatype.jdk8.Jdk8Module) JsonArray(io.vertx.core.json.JsonArray) Collectors.toList(java.util.stream.Collectors.toList) List(java.util.List) Feature(com.fasterxml.jackson.core.JsonGenerator.Feature) User(io.vertx.ext.auth.User) Optional(java.util.Optional) Handler(io.vertx.core.Handler) Collections(java.util.Collections) JsonRpcMethod(org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod) JsonArray(io.vertx.core.json.JsonArray) JsonRpcErrorResponse(org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse)

Aggregations

Vertx (io.vertx.core.Vertx)2 IOException (java.io.IOException)2 Collection (java.util.Collection)2 Collections (java.util.Collections)2 List (java.util.List)2 Map (java.util.Map)2 Optional (java.util.Optional)2 AuthenticationService (org.hyperledger.besu.ethereum.api.jsonrpc.authentication.AuthenticationService)2 Feature (com.fasterxml.jackson.core.JsonGenerator.Feature)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 ObjectWriter (com.fasterxml.jackson.databind.ObjectWriter)1 Jdk8Module (com.fasterxml.jackson.datatype.jdk8.Jdk8Module)1 VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 Preconditions (com.google.common.base.Preconditions)1 Preconditions.checkArgument (com.google.common.base.Preconditions.checkArgument)1 Strings (com.google.common.base.Strings)1 GraphQL (graphql.GraphQL)1 AsyncResult (io.vertx.core.AsyncResult)1 CompositeFuture (io.vertx.core.CompositeFuture)1 Future (io.vertx.core.Future)1