diff --git a/bridges/README.md b/bridges/README.md index 27e1192f9815b..915fa46dd5368 100644 --- a/bridges/README.md +++ b/bridges/README.md @@ -203,3 +203,4 @@ Element channel. The [Substrate Technical](https://app.element.io/#/room/#substrate-technical:matrix.org) Element channel is most suited for discussions regarding Substrate itself. + diff --git a/bridges/bin/millau/node/Cargo.toml b/bridges/bin/millau/node/Cargo.toml index 83ff05f7049cf..f1e59a45243a2 100644 --- a/bridges/bin/millau/node/Cargo.toml +++ b/bridges/bin/millau/node/Cargo.toml @@ -34,9 +34,11 @@ sc-consensus-aura = { git = "https://github.com/paritytech/substrate.git", branc sc-executor = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "master" } +sc-keystore = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-service = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "master" } +sc-telemetry = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sp-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sp-consensus-aura = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "master" } diff --git a/bridges/bin/millau/node/src/command.rs b/bridges/bin/millau/node/src/command.rs index 1b387d02dda71..ef506e5cdc725 100644 --- a/bridges/bin/millau/node/src/command.rs +++ b/bridges/bin/millau/node/src/command.rs @@ -157,6 +157,7 @@ pub fn run() -> sc_cli::Result<()> { Role::Light => service::new_light(config), _ => service::new_full(config), } + .map_err(sc_cli::Error::Service) }) } } diff --git a/bridges/bin/millau/node/src/service.rs b/bridges/bin/millau/node/src/service.rs index d5dc945cad24a..aef79d9170b49 100644 --- a/bridges/bin/millau/node/src/service.rs +++ b/bridges/bin/millau/node/src/service.rs @@ -33,7 +33,9 @@ use sc_client_api::{ExecutorProvider, RemoteBackend}; use sc_executor::native_executor_instance; pub use sc_executor::NativeExecutor; use sc_finality_grandpa::SharedVoterState; +use sc_keystore::LocalKeystore; use sc_service::{error::Error as ServiceError, Configuration, TaskManager}; +use sc_telemetry::TelemetrySpan; use sp_consensus_aura::sr25519::AuthorityPair as AuraPair; use sp_inherents::InherentDataProviders; use std::sync::Arc; @@ -69,13 +71,17 @@ pub fn new_partial( AuraPair, >, sc_finality_grandpa::LinkHalf, + Option, ), >, ServiceError, > { + if config.keystore_remote.is_some() { + return Err(ServiceError::Other("Remote Keystores are not supported.".to_string())); + } let inherent_data_providers = sp_inherents::InherentDataProviders::new(); - let (client, backend, keystore_container, task_manager) = + let (client, backend, keystore_container, task_manager, telemetry_span) = sc_service::new_full_parts::(&config)?; let client = Arc::new(client); @@ -114,10 +120,17 @@ pub fn new_partial( select_chain, transaction_pool, inherent_data_providers, - other: (aura_block_import, grandpa_link), + other: (aura_block_import, grandpa_link, telemetry_span), }) } +fn remote_keystore(_url: &str) -> Result, &'static str> { + // FIXME: here would the concrete keystore be built, + // must return a concrete type (NOT `LocalKeystore`) that + // implements `CryptoStore` and `SyncCryptoStore` + Err("Remote Keystore not supported.") +} + /// Builds a new service for a full client. pub fn new_full(mut config: Configuration) -> Result { let sc_service::PartialComponents { @@ -125,13 +138,25 @@ pub fn new_full(mut config: Configuration) -> Result backend, mut task_manager, import_queue, - keystore_container, + mut keystore_container, select_chain, transaction_pool, inherent_data_providers, - other: (block_import, grandpa_link), + other: (block_import, grandpa_link, telemetry_span), } = new_partial(&config)?; + if let Some(url) = &config.keystore_remote { + match remote_keystore(url) { + Ok(k) => keystore_container.set_remote_keystore(k), + Err(e) => { + return Err(ServiceError::Other(format!( + "Error hooking up remote keystore for {}: {}", + url, e + ))) + } + }; + } + config .network .extra_sets @@ -164,7 +189,6 @@ pub fn new_full(mut config: Configuration) -> Result let name = config.network.node_name.clone(); let enable_grandpa = !config.disable_grandpa; let prometheus_registry = config.prometheus_registry().cloned(); - let telemetry_connection_sinks = sc_service::TelemetryConnectionSinks::default(); let rpc_extensions_builder = { use bp_message_lane::{LaneId, MessageNonce}; @@ -211,11 +235,12 @@ pub fn new_full(mut config: Configuration) -> Result let justification_stream = grandpa_link.justification_stream(); let shared_authority_set = grandpa_link.shared_authority_set().clone(); - let finality_proof_provider = GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); + let shared_voter_state = sc_finality_grandpa::SharedVoterState::empty(); - Box::new(move |_, subscription_executor| { - let shared_voter_state = SharedVoterState::empty(); + let finality_proof_provider = + GrandpaFinalityProofProvider::new_for_service(backend.clone(), Some(shared_authority_set.clone())); + Box::new(move |_, subscription_executor| { let mut io = jsonrpc_core::IoHandler::default(); io.extend_with(SystemApi::to_delegate(FullSystem::new( client.clone(), @@ -224,7 +249,7 @@ pub fn new_full(mut config: Configuration) -> Result ))); io.extend_with(GrandpaApi::to_delegate(GrandpaRpcHandler::new( shared_authority_set.clone(), - shared_voter_state, + shared_voter_state.clone(), justification_stream.clone(), subscription_executor, finality_proof_provider.clone(), @@ -238,13 +263,12 @@ pub fn new_full(mut config: Configuration) -> Result }) }; - sc_service::spawn_tasks(sc_service::SpawnTasksParams { + let (_rpc_handlers, telemetry_connection_notifier) = sc_service::spawn_tasks(sc_service::SpawnTasksParams { network: network.clone(), client: client.clone(), keystore: keystore_container.sync_keystore(), task_manager: &mut task_manager, transaction_pool: transaction_pool.clone(), - telemetry_connection_sinks: telemetry_connection_sinks.clone(), rpc_extensions_builder, on_demand: None, remote_blockchain: None, @@ -252,6 +276,7 @@ pub fn new_full(mut config: Configuration) -> Result network_status_sinks, system_rpc_tx, config, + telemetry_span, })?; if role.is_authority() { @@ -312,7 +337,7 @@ pub fn new_full(mut config: Configuration) -> Result config: grandpa_config, link: grandpa_link, network, - telemetry_on_connect: Some(telemetry_connection_sinks.on_connect_stream()), + telemetry_on_connect: telemetry_connection_notifier.map(|x| x.on_connect_stream()), voting_rule: sc_finality_grandpa::VotingRulesBuilder::default().build(), prometheus_registry, shared_voter_state: SharedVoterState::empty(), @@ -331,7 +356,7 @@ pub fn new_full(mut config: Configuration) -> Result /// Builds a new service for a light client. pub fn new_light(mut config: Configuration) -> Result { - let (client, backend, keystore_container, mut task_manager, on_demand) = + let (client, backend, keystore_container, mut task_manager, on_demand, telemetry_span) = sc_service::new_light_parts::(&config)?; config @@ -352,9 +377,12 @@ pub fn new_light(mut config: Configuration) -> Result let (grandpa_block_import, _) = sc_finality_grandpa::block_import(client.clone(), &(client.clone() as Arc<_>), select_chain)?; + let aura_block_import = + sc_consensus_aura::AuraBlockImport::<_, _, _, AuraPair>::new(grandpa_block_import.clone(), client.clone()); + let import_queue = sc_consensus_aura::import_queue::<_, _, _, AuraPair, _, _>( sc_consensus_aura::slot_duration(&*client)?, - grandpa_block_import.clone(), + aura_block_import, Some(Box::new(grandpa_block_import)), client.clone(), InherentDataProviders::new(), @@ -390,7 +418,6 @@ pub fn new_light(mut config: Configuration) -> Result task_manager: &mut task_manager, on_demand: Some(on_demand), rpc_extensions_builder: Box::new(|_, _| ()), - telemetry_connection_sinks: sc_service::TelemetryConnectionSinks::default(), config, client, keystore: keystore_container.sync_keystore(), @@ -398,6 +425,7 @@ pub fn new_light(mut config: Configuration) -> Result network, network_status_sinks, system_rpc_tx, + telemetry_span, })?; network_starter.start_network(); diff --git a/bridges/bin/rialto/node/Cargo.toml b/bridges/bin/rialto/node/Cargo.toml index aade85879c551..072667694a196 100644 --- a/bridges/bin/rialto/node/Cargo.toml +++ b/bridges/bin/rialto/node/Cargo.toml @@ -34,9 +34,11 @@ sc-consensus-aura = { git = "https://github.com/paritytech/substrate.git", branc sc-executor = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-finality-grandpa = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-finality-grandpa-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "master" } +sc-keystore = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-service = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-rpc = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sc-transaction-pool = { git = "https://github.com/paritytech/substrate.git", branch = "master" } +sc-telemetry = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sp-consensus = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sp-consensus-aura = { git = "https://github.com/paritytech/substrate.git", branch = "master" } sp-core = { git = "https://github.com/paritytech/substrate.git", branch = "master" } diff --git a/bridges/bin/rialto/node/src/command.rs b/bridges/bin/rialto/node/src/command.rs index 0ba8c87238b1f..72404d64226e2 100644 --- a/bridges/bin/rialto/node/src/command.rs +++ b/bridges/bin/rialto/node/src/command.rs @@ -152,12 +152,14 @@ pub fn run() -> sc_cli::Result<()> { } None => { let runner = cli.create_runner(&cli.run)?; - runner.run_node_until_exit(|config| async move { - match config.role { - Role::Light => service::new_light(config), - _ => service::new_full(config), - } - }) + runner + .run_node_until_exit(|config| async move { + match config.role { + Role::Light => service::new_light(config), + _ => service::new_full(config), + } + }) + .map_err(sc_cli::Error::Service) } } } diff --git a/bridges/bin/rialto/node/src/service.rs b/bridges/bin/rialto/node/src/service.rs index d88f37ac0a80d..f54e43b16dad2 100644 --- a/bridges/bin/rialto/node/src/service.rs +++ b/bridges/bin/rialto/node/src/service.rs @@ -33,7 +33,9 @@ use sc_client_api::{ExecutorProvider, RemoteBackend}; use sc_executor::native_executor_instance; pub use sc_executor::NativeExecutor; use sc_finality_grandpa::SharedVoterState; +use sc_keystore::LocalKeystore; use sc_service::{error::Error as ServiceError, Configuration, TaskManager}; +use sc_telemetry::TelemetrySpan; use sp_consensus_aura::sr25519::AuthorityPair as AuraPair; use sp_inherents::InherentDataProviders; use std::sync::Arc; @@ -69,13 +71,17 @@ pub fn new_partial( AuraPair, >, sc_finality_grandpa::LinkHalf, + Option, ), >, ServiceError, > { + if config.keystore_remote.is_some() { + return Err(ServiceError::Other("Remote Keystores are not supported.".to_string())); + } let inherent_data_providers = sp_inherents::InherentDataProviders::new(); - let (client, backend, keystore_container, task_manager) = + let (client, backend, keystore_container, task_manager, telemetry_span) = sc_service::new_full_parts::(&config)?; let client = Arc::new(client); @@ -114,10 +120,17 @@ pub fn new_partial( select_chain, transaction_pool, inherent_data_providers, - other: (aura_block_import, grandpa_link), + other: (aura_block_import, grandpa_link, telemetry_span), }) } +fn remote_keystore(_url: &str) -> Result, &'static str> { + // FIXME: here would the concrete keystore be built, + // must return a concrete type (NOT `LocalKeystore`) that + // implements `CryptoStore` and `SyncCryptoStore` + Err("Remote Keystore not supported.") +} + /// Builds a new service for a full client. pub fn new_full(mut config: Configuration) -> Result { let sc_service::PartialComponents { @@ -125,13 +138,25 @@ pub fn new_full(mut config: Configuration) -> Result backend, mut task_manager, import_queue, - keystore_container, + mut keystore_container, select_chain, transaction_pool, inherent_data_providers, - other: (block_import, grandpa_link), + other: (block_import, grandpa_link, telemetry_span), } = new_partial(&config)?; + if let Some(url) = &config.keystore_remote { + match remote_keystore(url) { + Ok(k) => keystore_container.set_remote_keystore(k), + Err(e) => { + return Err(ServiceError::Other(format!( + "Error hooking up remote keystore for {}: {}", + url, e + ))) + } + }; + } + config .network .extra_sets @@ -164,7 +189,6 @@ pub fn new_full(mut config: Configuration) -> Result let name = config.network.node_name.clone(); let enable_grandpa = !config.disable_grandpa; let prometheus_registry = config.prometheus_registry().cloned(); - let telemetry_connection_sinks = sc_service::TelemetryConnectionSinks::default(); let rpc_extensions_builder = { use bp_message_lane::{LaneId, MessageNonce}; @@ -204,17 +228,19 @@ pub fn new_full(mut config: Configuration) -> Result use sc_finality_grandpa_rpc::{GrandpaApi, GrandpaRpcHandler}; use sc_rpc::DenyUnsafe; use substrate_frame_rpc_system::{FullSystem, SystemApi}; + let backend = backend.clone(); let client = client.clone(); let pool = transaction_pool.clone(); let justification_stream = grandpa_link.justification_stream(); let shared_authority_set = grandpa_link.shared_authority_set().clone(); - let finality_proof_provider = GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); + let shared_voter_state = sc_finality_grandpa::SharedVoterState::empty(); - Box::new(move |_, subscription_executor| { - let shared_voter_state = SharedVoterState::empty(); + let finality_proof_provider = + GrandpaFinalityProofProvider::new_for_service(backend.clone(), Some(shared_authority_set.clone())); + Box::new(move |_, subscription_executor| { let mut io = jsonrpc_core::IoHandler::default(); io.extend_with(SystemApi::to_delegate(FullSystem::new( client.clone(), @@ -223,7 +249,7 @@ pub fn new_full(mut config: Configuration) -> Result ))); io.extend_with(GrandpaApi::to_delegate(GrandpaRpcHandler::new( shared_authority_set.clone(), - shared_voter_state, + shared_voter_state.clone(), justification_stream.clone(), subscription_executor, finality_proof_provider.clone(), @@ -237,13 +263,12 @@ pub fn new_full(mut config: Configuration) -> Result }) }; - sc_service::spawn_tasks(sc_service::SpawnTasksParams { + let (_rpc_handlers, telemetry_connection_notifier) = sc_service::spawn_tasks(sc_service::SpawnTasksParams { network: network.clone(), client: client.clone(), keystore: keystore_container.sync_keystore(), task_manager: &mut task_manager, transaction_pool: transaction_pool.clone(), - telemetry_connection_sinks: telemetry_connection_sinks.clone(), rpc_extensions_builder, on_demand: None, remote_blockchain: None, @@ -251,6 +276,7 @@ pub fn new_full(mut config: Configuration) -> Result network_status_sinks, system_rpc_tx, config, + telemetry_span, })?; if role.is_authority() { @@ -311,7 +337,7 @@ pub fn new_full(mut config: Configuration) -> Result config: grandpa_config, link: grandpa_link, network, - telemetry_on_connect: Some(telemetry_connection_sinks.on_connect_stream()), + telemetry_on_connect: telemetry_connection_notifier.map(|x| x.on_connect_stream()), voting_rule: sc_finality_grandpa::VotingRulesBuilder::default().build(), prometheus_registry, shared_voter_state: SharedVoterState::empty(), @@ -330,7 +356,7 @@ pub fn new_full(mut config: Configuration) -> Result /// Builds a new service for a light client. pub fn new_light(mut config: Configuration) -> Result { - let (client, backend, keystore_container, mut task_manager, on_demand) = + let (client, backend, keystore_container, mut task_manager, on_demand, telemetry_span) = sc_service::new_light_parts::(&config)?; config @@ -351,9 +377,12 @@ pub fn new_light(mut config: Configuration) -> Result let (grandpa_block_import, _) = sc_finality_grandpa::block_import(client.clone(), &(client.clone() as Arc<_>), select_chain)?; + let aura_block_import = + sc_consensus_aura::AuraBlockImport::<_, _, _, AuraPair>::new(grandpa_block_import.clone(), client.clone()); + let import_queue = sc_consensus_aura::import_queue::<_, _, _, AuraPair, _, _>( sc_consensus_aura::slot_duration(&*client)?, - grandpa_block_import.clone(), + aura_block_import, Some(Box::new(grandpa_block_import)), client.clone(), InherentDataProviders::new(), @@ -389,7 +418,6 @@ pub fn new_light(mut config: Configuration) -> Result task_manager: &mut task_manager, on_demand: Some(on_demand), rpc_extensions_builder: Box::new(|_, _| ()), - telemetry_connection_sinks: sc_service::TelemetryConnectionSinks::default(), config, client, keystore: keystore_container.sync_keystore(), @@ -397,6 +425,7 @@ pub fn new_light(mut config: Configuration) -> Result network, network_status_sinks, system_rpc_tx, + telemetry_span, })?; network_starter.start_network(); diff --git a/bridges/modules/shift-session-manager/src/lib.rs b/bridges/modules/shift-session-manager/src/lib.rs index 102c3fcbc1679..0d16e0b7d1f42 100644 --- a/bridges/modules/shift-session-manager/src/lib.rs +++ b/bridges/modules/shift-session-manager/src/lib.rs @@ -93,7 +93,7 @@ mod tests { traits::{BlakeTwo256, ConvertInto, IdentityLookup}, Perbill, RuntimeAppPublic, }; - use frame_support::{impl_outer_origin, parameter_types, weights::Weight}; + use frame_support::{impl_outer_origin, parameter_types, weights::Weight, BasicExternalities}; use sp_core::H256; type AccountId = u64; @@ -172,17 +172,24 @@ mod tests { let mut t = frame_system::GenesisConfig::default() .build_storage::() .unwrap(); - pallet_session::GenesisConfig:: { - keys: vec![ - (1, 1, UintAuthorityId(1)), - (2, 2, UintAuthorityId(2)), - (3, 3, UintAuthorityId(3)), - (4, 4, UintAuthorityId(4)), - (5, 5, UintAuthorityId(5)), - ], - } - .assimilate_storage(&mut t) - .unwrap(); + + let keys = vec![ + (1, 1, UintAuthorityId(1)), + (2, 2, UintAuthorityId(2)), + (3, 3, UintAuthorityId(3)), + (4, 4, UintAuthorityId(4)), + (5, 5, UintAuthorityId(5)), + ]; + + BasicExternalities::execute_with_storage(&mut t, || { + for (ref k, ..) in &keys { + frame_system::Module::::inc_providers(k); + } + }); + + pallet_session::GenesisConfig:: { keys } + .assimilate_storage(&mut t) + .unwrap(); TestExternalities::new(t) }