From 9ab54e19d6b7fe7e89e184c0d9b99dd8d992b23b Mon Sep 17 00:00:00 2001 From: Liu-Cheng Xu Date: Tue, 6 Aug 2024 21:54:52 +0800 Subject: [PATCH] Fix system rpc (#34) * Remove dummy build_system_rpc_future() * Add protocol id to chain spec * Fix clippy --- .../res/chain-spec-raw-bitcoin-mainnet.json | 4 +- crates/subcoin-node/src/commands/run.rs | 59 +++++---- crates/subcoin-service/src/chain_spec.rs | 8 +- crates/subcoin-service/src/lib.rs | 123 ++---------------- 4 files changed, 44 insertions(+), 150 deletions(-) diff --git a/crates/subcoin-node/res/chain-spec-raw-bitcoin-mainnet.json b/crates/subcoin-node/res/chain-spec-raw-bitcoin-mainnet.json index e076e40b..230b0a05 100644 --- a/crates/subcoin-node/res/chain-spec-raw-bitcoin-mainnet.json +++ b/crates/subcoin-node/res/chain-spec-raw-bitcoin-mainnet.json @@ -4,7 +4,7 @@ "chainType": "Live", "bootNodes": [], "telemetryEndpoints": null, - "protocolId": null, + "protocolId": "subcoin-cc1", "properties": { "tokenDecimals": 8, "tokenSymbol": "BTC" @@ -27,4 +27,4 @@ "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/crates/subcoin-node/src/commands/run.rs b/crates/subcoin-node/src/commands/run.rs index cc36b4c8..0247436e 100644 --- a/crates/subcoin-node/src/commands/run.rs +++ b/crates/subcoin-node/src/commands/run.rs @@ -95,7 +95,7 @@ impl RunCmd { /// Start subcoin node. pub async fn start( self, - config: Configuration, + mut config: Configuration, run: Run, no_hardware_benchmarks: bool, storage_monitor: sc_storage_monitor::StorageMonitorParams, @@ -111,7 +111,6 @@ impl RunCmd { backend, mut task_manager, block_executor, - system_rpc_tx, keystore_container, telemetry, .. @@ -170,6 +169,34 @@ impl RunCmd { task_manager.keep_alive(bitcoin_network); } + let system_rpc_tx = match config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => { + subcoin_service::start_substrate_network::< + sc_network::NetworkWorker< + subcoin_runtime::interface::OpaqueBlock, + ::Hash, + >, + >( + &mut config, + client.clone(), + backend, + &mut task_manager, + keystore_container.keystore(), + telemetry, + )? + } + sc_network::config::NetworkBackendType::Litep2p => { + subcoin_service::start_substrate_network::( + &mut config, + client.clone(), + backend, + &mut task_manager, + keystore_container.keystore(), + telemetry, + )? + } + }; + // TODO: Bitcoin-compatible RPC // Start JSON-RPC server. let gen_rpc_module = |deny_unsafe: sc_rpc::DenyUnsafe| { @@ -195,34 +222,6 @@ impl RunCmd { let rpc = sc_service::start_rpc_servers(&config, gen_rpc_module, None)?; task_manager.keep_alive((config.base_path.clone(), rpc)); - match config.network.network_backend { - sc_network::config::NetworkBackendType::Libp2p => { - subcoin_service::start_substrate_network::< - sc_network::NetworkWorker< - subcoin_runtime::interface::OpaqueBlock, - ::Hash, - >, - >( - config, - client.clone(), - backend, - &mut task_manager, - keystore_container.keystore(), - telemetry, - )?; - } - sc_network::config::NetworkBackendType::Litep2p => { - subcoin_service::start_substrate_network::( - config, - client.clone(), - backend, - &mut task_manager, - keystore_container.keystore(), - telemetry, - )?; - } - } - if !no_finalizer { spawn_handle.spawn("finalizer", None, { subcoin_service::finalize_confirmed_blocks( diff --git a/crates/subcoin-service/src/chain_spec.rs b/crates/subcoin-service/src/chain_spec.rs index cc84f0b6..b779eb12 100644 --- a/crates/subcoin-service/src/chain_spec.rs +++ b/crates/subcoin-service/src/chain_spec.rs @@ -13,10 +13,10 @@ fn props() -> Properties { pub fn config(network: bitcoin::Network) -> Result { let (name, id) = match network { - bitcoin::Network::Bitcoin => ("Bitcoin", "mainnet"), - bitcoin::Network::Testnet => ("Bitcoin Testnet", "testnet"), - bitcoin::Network::Signet => ("Bitcoin Signet", "signet"), - bitcoin::Network::Regtest => ("Bitcoin Regtest", "regtest"), + bitcoin::Network::Bitcoin => ("Bitcoin Mainnet", "bitcoin-mainnet"), + bitcoin::Network::Testnet => ("Bitcoin Testnet", "bitcoin-testnet"), + bitcoin::Network::Signet => ("Bitcoin Signet", "bitcoin-signet"), + bitcoin::Network::Regtest => ("Bitcoin Regtest", "bitcoin-regtest"), unknown_network => unreachable!("Unknown Bitcoin network: {unknown_network:?}"), }; Ok(ChainSpec::builder( diff --git a/crates/subcoin-service/src/lib.rs b/crates/subcoin-service/src/lib.rs index fd4d9be3..95d9df36 100644 --- a/crates/subcoin-service/src/lib.rs +++ b/crates/subcoin-service/src/lib.rs @@ -17,14 +17,13 @@ use sc_consensus::import_queue::BasicQueue; use sc_consensus::{BlockImportParams, Verifier}; use sc_consensus_nakamoto::{BlockExecutionStrategy, BlockExecutor}; use sc_executor::NativeElseWasmExecutor; -use sc_network::PeerId; use sc_service::config::PrometheusConfig; use sc_service::error::Error as ServiceError; use sc_service::{ - Configuration, KeystoreContainer, MetricsService, NativeExecutionDispatch, Role, TaskManager, + Configuration, KeystoreContainer, MetricsService, NativeExecutionDispatch, TaskManager, }; use sc_telemetry::{Telemetry, TelemetryWorker}; -use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; +use sc_utils::mpsc::TracingUnboundedSender; use sp_core::traits::SpawnNamed; use sp_core::Encode; use sp_keystore::KeystorePtr; @@ -74,90 +73,6 @@ impl NativeExecutionDispatch for BitcoinExecutorDispatch { } } -/// Builds a future that processes system RPC requests. -/// -/// This is adapted from the upstream `build_system_rpc_future`. -async fn build_system_rpc_future( - role: Role, - client: Arc, - mut rpc_rx: TracingUnboundedReceiver>, - should_have_peers: bool, -) where - Block: BlockT, - Client: HeaderBackend + Send + Sync + 'static, -{ - // Current best block at initialization, to report to the RPC layer. - let starting_block = client.info().best_number; - - loop { - // Answer incoming RPC requests. - let Some(req) = rpc_rx.next().await else { - tracing::debug!( - "RPC requests stream has terminated, shutting down the system RPC future." - ); - return; - }; - - match req { - sc_rpc::system::Request::Health(sender) => { - // TODO: Proper is_major_syncing - let _ = sender.send(sc_rpc::system::Health { - peers: 0, - is_syncing: false, - should_have_peers, - }); - } - sc_rpc::system::Request::LocalPeerId(sender) => { - // TODO: Proper local peer id. - let _ = sender.send(PeerId::random().to_base58()); - } - sc_rpc::system::Request::LocalListenAddresses(sender) => { - // TODO: Proper addresses - let _ = sender.send(Vec::new()); - } - sc_rpc::system::Request::Peers(sender) => { - // TODO: Proper peers - let _ = sender.send(Vec::new()); - } - sc_rpc::system::Request::NetworkState(sender) => { - // TODO: Proper network state. - let _ = sender.send(serde_json::Value::Null); - } - sc_rpc::system::Request::NetworkAddReservedPeer(_peer_addr, _sender) => { - unreachable!("NetworkAddReservedPeer"); - } - sc_rpc::system::Request::NetworkRemoveReservedPeer(_peer_id, _sender) => { - unreachable!("NetworkRemoveReservedPeer"); - } - sc_rpc::system::Request::NetworkReservedPeers(sender) => { - let _ = sender.send(Vec::new()); - } - sc_rpc::system::Request::NodeRoles(sender) => { - use sc_rpc::system::NodeRole; - - let node_role = match role { - Role::Authority { .. } => NodeRole::Authority, - Role::Full => NodeRole::Full, - }; - - let _ = sender.send(vec![node_role]); - } - sc_rpc::system::Request::SyncState(sender) => { - use sc_rpc::system::SyncState; - - let best_number = client.info().best_number; - - // TODO: Proper highest_block - let _ = sender.send(SyncState { - starting_block, - current_block: best_number, - highest_block: best_number, - }); - } - } - } -} - pub struct CoinStorageKey; impl subcoin_primitives::CoinStorageKey for CoinStorageKey { @@ -182,8 +97,6 @@ pub struct NodeComponents { pub task_manager: TaskManager, /// Block processor used in the block import pipeline. pub block_executor: Box>, - /// TODO: useless, remove later? - pub system_rpc_tx: TracingUnboundedSender>, pub keystore_container: KeystoreContainer, pub telemetry: Option, } @@ -297,21 +210,6 @@ pub fn new_node(config: SubcoinConfiguration) -> Result Result Result( - mut config: Configuration, + config: &mut Configuration, client: Arc, _backend: Arc, task_manager: &mut TaskManager, _keystore: KeystorePtr, mut telemetry: Option, -) -> Result<(), ServiceError> +) -> Result>, ServiceError> where N: sc_network::NetworkBackend::Hash>, { @@ -398,7 +295,7 @@ where let (network, system_rpc_tx, _tx_handler_controller, network_starter, sync_service) = sc_service::build_network(sc_service::BuildNetworkParams { - config: &config, + config, net_config, client: client.clone(), transaction_pool: transaction_pool.clone(), @@ -420,7 +317,7 @@ where .as_mut() .map(|telemetry| { sc_service::init_telemetry( - &mut config, + config, network.clone(), client.clone(), telemetry, @@ -433,7 +330,7 @@ where let metrics_service = if let Some(PrometheusConfig { port, registry }) = config.prometheus_config.clone() { // Set static metrics. - let metrics = MetricsService::with_prometheus(telemetry, ®istry, &config)?; + let metrics = MetricsService::with_prometheus(telemetry, ®istry, config)?; spawn_handle.spawn( "prometheus-endpoint", None, @@ -464,15 +361,13 @@ where client.clone(), Arc::new(network), sync_service.clone(), - config.informant_output_format, + config.informant_output_format.clone(), ), ); - task_manager.keep_alive(system_rpc_tx); - network_starter.start_network(); - Ok(()) + Ok(system_rpc_tx) } /// Creates a future to finalize blocks with enough confirmations.