From e41cc12efdb764cb4b728e5ca81483c137aa54b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lo=C3=AFs?= Date: Fri, 20 Jan 2023 14:25:57 +0100 Subject: [PATCH] Start minimal relay node if `relay_chain_rpc_url` is set (#2042) * feat: start minimal relay node is relay_chain_rpc_url is set * editorconfig --- Cargo.lock | 45 ++++++++++++++++++++++++++++ node/cli/src/command.rs | 18 +++++++++++- node/service/Cargo.toml | 1 + node/service/src/lib.rs | 65 +++++++++++++++++++++++++++++++---------- 4 files changed, 113 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 923d3ee592..ef6468649a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1730,6 +1730,50 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cumulus-relay-chain-minimal-node" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.32#6d9310724ce42b7c8bf5b398ce09e5eda844c668" +dependencies = [ + "array-bytes", + "async-trait", + "cumulus-primitives-core", + "cumulus-relay-chain-interface", + "cumulus-relay-chain-rpc-interface", + "futures 0.3.25", + "lru 0.8.1", + "polkadot-availability-distribution", + "polkadot-core-primitives", + "polkadot-network-bridge", + "polkadot-node-core-av-store", + "polkadot-node-network-protocol", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "polkadot-service", + "sc-authority-discovery", + "sc-client-api", + "sc-consensus", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-network-light", + "sc-network-sync", + "sc-service", + "sc-telemetry", + "sc-tracing", + "sc-transaction-pool", + "sc-transaction-pool-api", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-runtime", + "tokio", + "tracing", + "url", +] + [[package]] name = "cumulus-relay-chain-rpc-interface" version = "0.1.0" @@ -5446,6 +5490,7 @@ dependencies = [ "cumulus-primitives-parachain-inherent", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", + "cumulus-relay-chain-minimal-node", "cumulus-relay-chain-rpc-interface", "cumulus-test-relay-sproof-builder", "derive_more", diff --git a/node/cli/src/command.rs b/node/cli/src/command.rs index 03e2018cfa..adb099f62f 100644 --- a/node/cli/src/command.rs +++ b/node/cli/src/command.rs @@ -21,7 +21,7 @@ use cli_opt::{EthApi, RpcConfig}; use cumulus_client_cli::generate_genesis_block; use cumulus_primitives_core::ParaId; use frame_benchmarking_cli::BenchmarkCmd; -use log::info; +use log::{info, warn}; use parity_scale_codec::Encode; #[cfg(feature = "westend-native")] use polkadot_service::WestendChainSpec; @@ -812,6 +812,22 @@ pub fn run() -> Result<()> { info!("Parachain id: {:?}", id); info!("Parachain Account: {}", parachain_account); info!("Parachain genesis state: {}", genesis_state); + info!( + "Is collating: {}", + if config.role.is_authority() { + "yes" + } else { + "no" + } + ); + + if rpc_config.relay_chain_rpc_url.is_some() && cli.relaychain_args.len() > 0 { + warn!( + "Detected relay chain node arguments together with \ + --relay-chain-rpc-url. This command starts a minimal Polkadot node that only \ + uses a network-related subset of all relay chain CLI options." + ); + } match &config.chain_spec { #[cfg(feature = "moonriver-native")] diff --git a/node/service/Cargo.toml b/node/service/Cargo.toml index 2d5f7f1c1a..391757409b 100644 --- a/node/service/Cargo.toml +++ b/node/service/Cargo.toml @@ -114,6 +114,7 @@ cumulus-primitives-core = { git = "https://github.com/purestake/cumulus", branch cumulus-primitives-parachain-inherent = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.32" } cumulus-relay-chain-inprocess-interface = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.32" } cumulus-relay-chain-interface = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.32" } +cumulus-relay-chain-minimal-node = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.32" } cumulus-relay-chain-rpc-interface = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.32" } cumulus-test-relay-sproof-builder = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.32" } nimbus-consensus = { git = "https://github.com/purestake/nimbus", branch = "moonbeam-polkadot-v0.9.32" } diff --git a/node/service/src/lib.rs b/node/service/src/lib.rs index c537bc8aa6..1b8c4c6bf1 100644 --- a/node/service/src/lib.rs +++ b/node/service/src/lib.rs @@ -22,7 +22,23 @@ //! Full Service: A complete parachain node including the pool, rpc, network, embedded relay chain //! Dev Service: A leaner service without the relay chain backing. +pub mod rpc; + use cli_opt::{EthApi as EthApiCmd, RpcConfig}; +use cumulus_client_cli::CollatorOptions; +use cumulus_client_consensus_common::ParachainConsensus; +use cumulus_client_network::BlockAnnounceValidator; +use cumulus_client_service::{ + prepare_node_config, start_collator, start_full_node, StartCollatorParams, StartFullNodeParams, +}; +use cumulus_primitives_core::relay_chain::v2::CollatorPair; +use cumulus_primitives_core::ParaId; +use cumulus_primitives_parachain_inherent::{ + MockValidationDataInherentDataProvider, MockXcmConfig, +}; +use cumulus_relay_chain_inprocess_interface::build_inprocess_relay_chain; +use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult}; +use cumulus_relay_chain_minimal_node::build_minimal_relay_chain_node; use fc_consensus::FrontierBlockImport; use fc_db::DatabaseSource; use fc_rpc_core::types::{FeeHistoryCache, FilterPool}; @@ -34,19 +50,6 @@ pub use moonbase_runtime; pub use moonbeam_runtime; #[cfg(feature = "moonriver-native")] pub use moonriver_runtime; -use std::{collections::BTreeMap, sync::Mutex, time::Duration}; -pub mod rpc; -use cumulus_client_consensus_common::ParachainConsensus; -use cumulus_client_network::BlockAnnounceValidator; -use cumulus_client_service::{ - prepare_node_config, start_collator, start_full_node, StartCollatorParams, StartFullNodeParams, -}; -use cumulus_primitives_core::ParaId; -use cumulus_primitives_parachain_inherent::{ - MockValidationDataInherentDataProvider, MockXcmConfig, -}; -use cumulus_relay_chain_inprocess_interface::build_inprocess_relay_chain; -use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface}; use nimbus_consensus::NimbusManualSealConsensusDataProvider; use nimbus_consensus::{BuildNimbusConsensusParams, NimbusConsensus}; use nimbus_primitives::NimbusId; @@ -63,6 +66,7 @@ use sp_api::ConstructRuntimeApi; use sp_blockchain::HeaderBackend; use sp_keystore::SyncCryptoStorePtr; use std::sync::Arc; +use std::{collections::BTreeMap, sync::Mutex, time::Duration}; use substrate_prometheus_endpoint::Registry; pub use client::*; @@ -494,6 +498,31 @@ where }) } +async fn build_relay_chain_interface( + polkadot_config: Configuration, + parachain_config: &Configuration, + telemetry_worker_handle: Option, + task_manager: &mut TaskManager, + collator_options: CollatorOptions, + hwbench: Option, +) -> RelayChainResult<( + Arc<(dyn RelayChainInterface + 'static)>, + Option, +)> { + match collator_options.relay_chain_rpc_url { + Some(relay_chain_url) => { + build_minimal_relay_chain_node(polkadot_config, task_manager, relay_chain_url).await + } + None => build_inprocess_relay_chain( + polkadot_config, + parachain_config, + telemetry_worker_handle, + task_manager, + hwbench, + ), + } +} + /// Start a node with the given parachain `Configuration` and relay chain `Configuration`. /// /// This is the actual implementation that is abstract over the executor and the runtime api. @@ -531,6 +560,10 @@ where { let mut parachain_config = prepare_node_config(parachain_config); + let collator_options = CollatorOptions { + relay_chain_rpc_url: rpc_config.relay_chain_rpc_url.clone(), + }; + let params = new_partial(&mut parachain_config, false)?; let ( _block_import, @@ -545,13 +578,15 @@ where let backend = params.backend.clone(); let mut task_manager = params.task_manager; - let (relay_chain_interface, collator_key) = build_inprocess_relay_chain( + let (relay_chain_interface, collator_key) = build_relay_chain_interface( polkadot_config, ¶chain_config, telemetry_worker_handle, &mut task_manager, - None, + collator_options.clone(), + hwbench.clone(), ) + .await .map_err(|e| match e { RelayChainError::ServiceError(polkadot_service::Error::Sub(x)) => x, s => s.to_string().into(),