From dc0bf210fb3dad76003e6943496e5caaedebc22d Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 12 Mar 2020 00:00:10 +0100 Subject: [PATCH] ChainSpec trait (#5185) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ChainSpec trait * Apply suggestions from code review Co-Authored-By: Bastian Köcher * Added docs * Fixed build * Fixed build Co-authored-by: Bastian Köcher --- .../bin/node-template/node/src/chain_spec.rs | 8 +- .../bin/node-template/node/src/service.rs | 6 +- substrate/bin/node/cli/src/chain_spec.rs | 2 +- substrate/bin/node/cli/src/command.rs | 6 +- substrate/bin/node/cli/src/lib.rs | 6 +- substrate/bin/node/cli/src/service.rs | 9 +-- substrate/bin/node/inspect/src/command.rs | 11 +-- .../bin/utils/chain-spec-builder/src/main.rs | 2 +- .../client/chain-spec/derive/src/impls.rs | 9 +++ substrate/client/chain-spec/src/chain_spec.rs | 55 ++++++++++++- substrate/client/chain-spec/src/extension.rs | 34 +++++++- substrate/client/chain-spec/src/lib.rs | 46 ++++++++--- .../client/cli/src/commands/build_spec_cmd.rs | 24 +++--- .../cli/src/commands/check_block_cmd.rs | 18 ++--- .../cli/src/commands/export_blocks_cmd.rs | 18 ++--- .../cli/src/commands/import_blocks_cmd.rs | 18 ++--- substrate/client/cli/src/commands/mod.rs | 20 ++--- .../cli/src/commands/purge_chain_cmd.rs | 23 ++---- .../client/cli/src/commands/revert_cmd.rs | 18 ++--- substrate/client/cli/src/commands/runcmd.rs | 36 ++++----- .../client/cli/src/params/import_params.rs | 11 +-- .../params/network_configuration_params.rs | 11 +-- .../client/cli/src/params/node_key_params.rs | 19 ++--- .../client/cli/src/params/pruning_params.rs | 11 +-- .../client/cli/src/params/shared_params.rs | 21 ++--- .../cli/src/params/transaction_pool_params.rs | 4 +- substrate/client/cli/src/runtime.rs | 12 +-- substrate/client/db/src/lib.rs | 5 +- substrate/client/service/src/builder.rs | 79 +++++++------------ substrate/client/service/src/chain_ops.rs | 13 ++- substrate/client/service/src/config.rs | 14 ++-- substrate/client/service/src/lib.rs | 12 +-- substrate/client/service/test/src/lib.rs | 58 ++++++++------ substrate/client/src/client.rs | 4 +- substrate/client/src/light/mod.rs | 5 +- substrate/primitives/runtime/src/lib.rs | 2 +- substrate/utils/browser/src/lib.rs | 12 +-- .../utils/frame/benchmarking-cli/src/lib.rs | 27 +++---- 38 files changed, 354 insertions(+), 335 deletions(-) diff --git a/substrate/bin/node-template/node/src/chain_spec.rs b/substrate/bin/node-template/node/src/chain_spec.rs index 64b8400507..f1a7e29d44 100644 --- a/substrate/bin/node-template/node/src/chain_spec.rs +++ b/substrate/bin/node-template/node/src/chain_spec.rs @@ -12,7 +12,7 @@ use sp_runtime::traits::{Verify, IdentifyAccount}; //const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; /// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type. -pub type ChainSpec = sc_service::ChainSpec; +pub type ChainSpec = sc_service::GenericChainSpec; /// The chain specification option. This is expected to come in from the CLI and /// is little more than one of a number of alternatives which can easily be converted @@ -142,9 +142,9 @@ fn testnet_genesis(initial_authorities: Vec<(AuraId, GrandpaId)>, } } -pub fn load_spec(id: &str) -> Result, String> { +pub fn load_spec(id: &str) -> Result, String> { Ok(match Alternative::from(id) { - Some(spec) => Some(spec.load()?), - None => None, + Some(spec) => Box::new(spec.load()?), + None => Box::new(ChainSpec::from_json_file(std::path::PathBuf::from(id))?), }) } diff --git a/substrate/bin/node-template/node/src/service.rs b/substrate/bin/node-template/node/src/service.rs index f289ff5854..4b66f90fbb 100644 --- a/substrate/bin/node-template/node/src/service.rs +++ b/substrate/bin/node-template/node/src/service.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use std::time::Duration; use sc_client::LongestChain; use sc_client_api::ExecutorProvider; -use node_template_runtime::{self, GenesisConfig, opaque::Block, RuntimeApi}; +use node_template_runtime::{self, opaque::Block, RuntimeApi}; use sc_service::{error::{Error as ServiceError}, AbstractService, Configuration, ServiceBuilder}; use sp_inherents::InherentDataProviders; use sc_executor::native_executor_instance; @@ -69,7 +69,7 @@ macro_rules! new_full_start { } /// Builds a new service for a full client. -pub fn new_full(config: Configuration) +pub fn new_full(config: Configuration) -> Result { let is_authority = config.roles.is_authority(); @@ -181,7 +181,7 @@ pub fn new_full(config: Configuration) } /// Builds a new service for a light client. -pub fn new_light(config: Configuration) +pub fn new_light(config: Configuration) -> Result { let inherent_data_providers = InherentDataProviders::new(); diff --git a/substrate/bin/node/cli/src/chain_spec.rs b/substrate/bin/node/cli/src/chain_spec.rs index af24db704c..1ef481fb7c 100644 --- a/substrate/bin/node/cli/src/chain_spec.rs +++ b/substrate/bin/node/cli/src/chain_spec.rs @@ -56,7 +56,7 @@ pub struct Extensions { } /// Specialized `ChainSpec`. -pub type ChainSpec = sc_service::ChainSpec< +pub type ChainSpec = sc_service::GenericChainSpec< GenesisConfig, Extensions, >; diff --git a/substrate/bin/node/cli/src/command.rs b/substrate/bin/node/cli/src/command.rs index dfdf5533f2..a97257ddd7 100644 --- a/substrate/bin/node/cli/src/command.rs +++ b/substrate/bin/node/cli/src/command.rs @@ -46,7 +46,7 @@ where cmd.update_config(&mut config, load_spec, &version)?; let client = sc_service::new_full_client::< - node_runtime::Block, node_runtime::RuntimeApi, node_executor::Executor, _, _, + node_runtime::Block, node_runtime::RuntimeApi, node_executor::Executor, >(&config)?; let inspect = node_inspect::Inspector::::new(client); @@ -56,7 +56,7 @@ where cmd.init(&version)?; cmd.update_config(&mut config, load_spec, &version)?; - cmd.run::<_, _, node_runtime::Block, node_executor::Executor>(config) + cmd.run::(config) }, Some(Subcommand::Factory(cli_args)) => { cli_args.shared_params.init(&version)?; @@ -108,7 +108,7 @@ where subcommand.update_config(&mut config, load_spec, &version)?; subcommand.run( config, - |config: service::NodeConfiguration| Ok(new_full_start!(config).0), + |config: sc_service::Configuration| Ok(new_full_start!(config).0), ) }, } diff --git a/substrate/bin/node/cli/src/lib.rs b/substrate/bin/node/cli/src/lib.rs index 789d6a6913..6b3644856c 100644 --- a/substrate/bin/node/cli/src/lib.rs +++ b/substrate/bin/node/cli/src/lib.rs @@ -83,9 +83,9 @@ impl ChainSpec { } } -fn load_spec(id: &str) -> Result, String> { +fn load_spec(id: &str) -> Result, String> { Ok(match ChainSpec::from(id) { - Some(spec) => Some(spec.load()?), - None => None, + Some(spec) => Box::new(spec.load()?), + None => Box::new(chain_spec::ChainSpec::from_json_file(std::path::PathBuf::from(id))?), }) } diff --git a/substrate/bin/node/cli/src/service.rs b/substrate/bin/node/cli/src/service.rs index 5b0fdbbdbd..572221b6a5 100644 --- a/substrate/bin/node/cli/src/service.rs +++ b/substrate/bin/node/cli/src/service.rs @@ -25,7 +25,7 @@ use sc_client::{self, LongestChain}; use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider, StorageAndProofProvider}; use node_executor; use node_primitives::Block; -use node_runtime::{GenesisConfig, RuntimeApi}; +use node_runtime::RuntimeApi; use sc_service::{ AbstractService, ServiceBuilder, config::Configuration, error::{Error as ServiceError}, }; @@ -270,11 +270,8 @@ type ConcreteTransactionPool = sc_transaction_pool::BasicPool< ConcreteBlock >; -/// A specialized configuration object for setting up the node.. -pub type NodeConfiguration = Configuration; - /// Builds a new service for a full client. -pub fn new_full(config: NodeConfiguration) +pub fn new_full(config: Configuration) -> Result< Service< ConcreteBlock, @@ -296,7 +293,7 @@ pub fn new_full(config: NodeConfiguration) } /// Builds a new service for a light client. -pub fn new_light(config: NodeConfiguration) +pub fn new_light(config: Configuration) -> Result { type RpcExtension = jsonrpc_core::IoHandler; let inherent_data_providers = InherentDataProviders::new(); diff --git a/substrate/bin/node/inspect/src/command.rs b/substrate/bin/node/inspect/src/command.rs index 71e70e3e44..16bfda2bd9 100644 --- a/substrate/bin/node/inspect/src/command.rs +++ b/substrate/bin/node/inspect/src/command.rs @@ -31,15 +31,12 @@ impl InspectCmd { } /// Parse CLI arguments and initialize given config. - pub fn update_config( + pub fn update_config( &self, - mut config: &mut sc_service::config::Configuration, - spec_factory: impl FnOnce(&str) -> Result>, String>, + mut config: &mut sc_service::config::Configuration, + spec_factory: impl FnOnce(&str) -> Result, String>, version: &sc_cli::VersionInfo, - ) -> sc_cli::Result<()> where - G: sc_service::RuntimeGenesis, - E: sc_service::ChainSpecExtension, - { + ) -> sc_cli::Result<()> { self.shared_params.update_config(config, spec_factory, version)?; // make sure to configure keystore diff --git a/substrate/bin/utils/chain-spec-builder/src/main.rs b/substrate/bin/utils/chain-spec-builder/src/main.rs index b1eab2ebe5..3673909706 100644 --- a/substrate/bin/utils/chain-spec-builder/src/main.rs +++ b/substrate/bin/utils/chain-spec-builder/src/main.rs @@ -128,7 +128,7 @@ fn generate_chain_spec( Default::default(), ); - chain_spec.to_json(false).map_err(|err| err.to_string()) + chain_spec.as_json(false).map_err(|err| err.to_string()) } fn generate_authority_keys_and_store( diff --git a/substrate/client/chain-spec/derive/src/impls.rs b/substrate/client/chain-spec/derive/src/impls.rs index 43874241f6..1b22f16581 100644 --- a/substrate/client/chain-spec/derive/src/impls.rs +++ b/substrate/client/chain-spec/derive/src/impls.rs @@ -50,6 +50,15 @@ pub fn extension_derive(ast: &DeriveInput) -> proc_macro::TokenStream { _ => None, } } + + fn get_any(&self, t: std::any::TypeId) -> &dyn std::any::Any { + use std::any::{Any, TypeId}; + + match t { + #( x if x == TypeId::of::<#field_types>() => &self.#field_names ),*, + _ => self, + } + } } } }) diff --git a/substrate/client/chain-spec/src/chain_spec.rs b/substrate/client/chain-spec/src/chain_spec.rs index a7e5738fc4..008af6f7e0 100644 --- a/substrate/client/chain-spec/src/chain_spec.rs +++ b/substrate/client/chain-spec/src/chain_spec.rs @@ -26,6 +26,7 @@ use sp_core::storage::{StorageKey, StorageData, ChildInfo, Storage, StorageChild use sp_runtime::BuildStorage; use serde_json as json; use crate::RuntimeGenesis; +use crate::extension::GetExtension; use sc_network::Multiaddr; use sc_telemetry::TelemetryEndpoints; @@ -269,9 +270,9 @@ impl ChainSpec { } } -impl ChainSpec { +impl ChainSpec { /// Dump to json string. - pub fn to_json(self, raw: bool) -> Result { + pub fn as_json(&self, raw: bool) -> Result { #[derive(Serialize, Deserialize)] struct Container { #[serde(flatten)] @@ -306,7 +307,7 @@ impl ChainSpec { (_, genesis) => genesis, }; let container = Container { - client_spec: self.client_spec, + client_spec: self.client_spec.clone(), genesis, }; json::to_string_pretty(&container) @@ -314,6 +315,52 @@ impl ChainSpec { } } +impl crate::ChainSpec for ChainSpec +where + G: RuntimeGenesis, + E: GetExtension + serde::Serialize + Clone, +{ + fn boot_nodes(&self) -> &[String] { + ChainSpec::boot_nodes(self) + } + + fn name(&self) -> &str { + ChainSpec::name(self) + } + + fn id(&self) -> &str { + ChainSpec::id(self) + } + + fn telemetry_endpoints(&self) -> &Option { + ChainSpec::telemetry_endpoints(self) + } + + fn protocol_id(&self) -> Option<&str> { + ChainSpec::protocol_id(self) + } + + fn properties(&self) -> Properties { + ChainSpec::properties(self) + } + + fn add_boot_node(&mut self, addr: Multiaddr) { + ChainSpec::add_boot_node(self, addr) + } + + fn extensions(&self) -> &dyn GetExtension { + ChainSpec::extensions(self) as &dyn GetExtension + } + + fn as_json(&self, raw: bool) -> Result { + ChainSpec::as_json(self, raw) + } + + fn as_storage_builder(&self) -> &dyn BuildStorage { + self + } +} + #[cfg(test)] mod tests { use super::*; @@ -344,7 +391,7 @@ mod tests { PathBuf::from("./res/chain_spec.json") ).unwrap(); - assert_eq!(spec1.to_json(false), spec2.to_json(false)); + assert_eq!(spec1.as_json(false), spec2.as_json(false)); } #[derive(Debug, Serialize, Deserialize)] diff --git a/substrate/client/chain-spec/src/extension.rs b/substrate/client/chain-spec/src/extension.rs index fb73eec9d8..c0338203eb 100644 --- a/substrate/client/chain-spec/src/extension.rs +++ b/substrate/client/chain-spec/src/extension.rs @@ -17,6 +17,8 @@ //! Chain Spec extensions helpers. use std::fmt::Debug; +use std::any::{TypeId, Any}; + use std::collections::BTreeMap; use serde::{Serialize, Deserialize, de::DeserializeOwned}; @@ -120,6 +122,8 @@ pub trait Extension: Serialize + DeserializeOwned + Clone { /// Get an extension of specific type. fn get(&self) -> Option<&T>; + /// Get an extension of specific type as refernce to `Any` + fn get_any(&self, t: TypeId) -> &dyn Any; /// Get forkable extensions of specific type. fn forks(&self) -> Option> where @@ -137,6 +141,7 @@ impl Extension for crate::NoExtension { type Forks = Self; fn get(&self) -> Option<&T> { None } + fn get_any(&self, _t: TypeId) -> &dyn Any { self } } pub trait IsForks { @@ -225,22 +230,25 @@ impl Extension for Forks where type Forks = Self; fn get(&self) -> Option<&T> { - use std::any::{TypeId, Any}; - match TypeId::of::() { x if x == TypeId::of::() => Any::downcast_ref(&self.base), _ => self.base.get(), } } + fn get_any(&self, t: TypeId) -> &dyn Any { + match t { + x if x == TypeId::of::() => &self.base, + _ => self.base.get_any(t), + } + } + fn forks(&self) -> Option> where BlockNumber: Ord + Clone + 'static, T: Group + 'static, ::Extension: Extension, <::Extension as Group>::Fork: Extension, { - use std::any::{TypeId, Any}; - if TypeId::of::() == TypeId::of::() { Any::downcast_ref(&self.for_type::()?).cloned() } else { @@ -250,6 +258,24 @@ impl Extension for Forks where } } +/// A subset if the `Extension` trait that only allows for quering extensions. +pub trait GetExtension { + /// Get an extension of specific type. + fn get_any(&self, t: TypeId) -> &dyn Any; +} + +impl GetExtension for E { + fn get_any(&self, t: TypeId) -> &dyn Any { + Extension::get_any(self, t) + } +} + +/// Helper function that queries an extension by type from `GetExtension` +/// trait object. +pub fn get_extension(e: &dyn GetExtension) -> Option<&T> { + Any::downcast_ref(GetExtension::get_any(e, TypeId::of::())) +} + #[cfg(test)] mod tests { use super::*; diff --git a/substrate/client/chain-spec/src/lib.rs b/substrate/client/chain-spec/src/lib.rs index cce9d5007f..509524fd0a 100644 --- a/substrate/client/chain-spec/src/lib.rs +++ b/substrate/client/chain-spec/src/lib.rs @@ -30,14 +30,14 @@ //! ```rust //! use std::collections::HashMap; //! use serde::{Serialize, Deserialize}; -//! use sc_chain_spec::{ChainSpec, ChainSpecExtension}; +//! use sc_chain_spec::{GenericChainSpec, ChainSpecExtension}; //! //! #[derive(Clone, Debug, Serialize, Deserialize, ChainSpecExtension)] //! pub struct MyExtension { //! pub known_blocks: HashMap, //! } //! -//! pub type MyChainSpec = ChainSpec; +//! pub type MyChainSpec = GenericChainSpec; //! ``` //! //! Some parameters may require different values depending on the @@ -49,7 +49,7 @@ //! //! ```rust //! use serde::{Serialize, Deserialize}; -//! use sc_chain_spec::{Forks, ChainSpec, ChainSpecGroup, ChainSpecExtension}; +//! use sc_chain_spec::{Forks, ChainSpecGroup, ChainSpecExtension, GenericChainSpec}; //! //! #[derive(Clone, Debug, Serialize, Deserialize, ChainSpecGroup)] //! pub struct ClientParams { @@ -71,10 +71,10 @@ //! pub type BlockNumber = u64; //! //! /// A chain spec supporting forkable `ClientParams`. -//! pub type MyChainSpec1 = ChainSpec>; +//! pub type MyChainSpec1 = GenericChainSpec>; //! //! /// A chain spec supporting forkable `Extension`. -//! pub type MyChainSpec2 = ChainSpec>; +//! pub type MyChainSpec2 = GenericChainSpec>; //! ``` //! //! It's also possible to have a set of parameters that is allowed to change @@ -84,7 +84,7 @@ //! //! ```rust //! use serde::{Serialize, Deserialize}; -//! use sc_chain_spec::{Forks, ChainSpec, ChainSpecGroup, ChainSpecExtension}; +//! use sc_chain_spec::{Forks, GenericChainSpec, ChainSpecGroup, ChainSpecExtension}; //! //! #[derive(Clone, Debug, Serialize, Deserialize, ChainSpecGroup)] //! pub struct ClientParams { @@ -104,20 +104,48 @@ //! pub pool: Forks, //! } //! -//! pub type MyChainSpec = ChainSpec; +//! pub type MyChainSpec = GenericChainSpec; //! ``` mod chain_spec; mod extension; -pub use chain_spec::{ChainSpec, Properties, NoExtension}; -pub use extension::{Group, Fork, Forks, Extension}; +pub use chain_spec::{ChainSpec as GenericChainSpec, Properties, NoExtension}; +pub use extension::{Group, Fork, Forks, Extension, GetExtension, get_extension}; pub use sc_chain_spec_derive::{ChainSpecExtension, ChainSpecGroup}; use serde::{Serialize, de::DeserializeOwned}; use sp_runtime::BuildStorage; +use sc_network::Multiaddr; +use sc_telemetry::TelemetryEndpoints; /// A set of traits for the runtime genesis config. pub trait RuntimeGenesis: Serialize + DeserializeOwned + BuildStorage {} impl RuntimeGenesis for T {} + +/// Common interface to `GenericChainSpec` +pub trait ChainSpec: BuildStorage { + /// Spec name. + fn name(&self) -> &str; + /// Spec id. + fn id(&self) -> &str; + /// A list of bootnode addresses. + fn boot_nodes(&self) -> &[String]; + /// Telemetry endpoints (if any) + fn telemetry_endpoints(&self) -> &Option; + /// Network protocol id. + fn protocol_id(&self) -> Option<&str>; + /// Additional loosly-typed properties of the chain. + /// + /// Returns an empty JSON object if 'properties' not defined in config + fn properties(&self) -> Properties; + /// Returns a reference to defined chain spec extensions. + fn extensions(&self) -> &dyn GetExtension; + /// Add a bootnode to the list. + fn add_boot_node(&mut self, addr: Multiaddr); + /// Return spec as JSON. + fn as_json(&self, raw: bool) -> Result; + /// Return StorageBuilder for this spec. + fn as_storage_builder(&self) -> &dyn BuildStorage; +} diff --git a/substrate/client/cli/src/commands/build_spec_cmd.rs b/substrate/client/cli/src/commands/build_spec_cmd.rs index 9b71207efa..59f7fbb4e9 100644 --- a/substrate/client/cli/src/commands/build_spec_cmd.rs +++ b/substrate/client/cli/src/commands/build_spec_cmd.rs @@ -17,7 +17,7 @@ use structopt::StructOpt; use log::info; use sc_network::config::build_multiaddr; -use sc_service::{Configuration, ChainSpecExtension, RuntimeGenesis, ChainSpec}; +use sc_service::{Configuration, ChainSpec}; use crate::error; use crate::VersionInfo; @@ -49,16 +49,12 @@ pub struct BuildSpecCmd { impl BuildSpecCmd { /// Run the build-spec command - pub fn run( + pub fn run( self, - config: Configuration, - ) -> error::Result<()> - where - G: RuntimeGenesis, - E: ChainSpecExtension, - { + config: Configuration, + ) -> error::Result<()> { info!("Building chain spec"); - let mut spec = config.expect_chain_spec().clone(); + let mut spec = config.chain_spec.expect("`chain_spec` is set to `Some` in `update_config`"); let raw_output = self.raw; if spec.boot_nodes().is_empty() && !self.disable_default_bootnode { @@ -72,7 +68,7 @@ impl BuildSpecCmd { spec.add_boot_node(addr) } - let json = sc_service::chain_ops::build_spec(spec, raw_output)?; + let json = sc_service::chain_ops::build_spec(&*spec, raw_output)?; print!("{}", json); @@ -80,15 +76,13 @@ impl BuildSpecCmd { } /// Update and prepare a `Configuration` with command line parameters - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, spec_factory: F, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + F: FnOnce(&str) -> Result, String>, { self.shared_params.update_config(&mut config, spec_factory, version)?; diff --git a/substrate/client/cli/src/commands/check_block_cmd.rs b/substrate/client/cli/src/commands/check_block_cmd.rs index 1036be16de..88248c5969 100644 --- a/substrate/client/cli/src/commands/check_block_cmd.rs +++ b/substrate/client/cli/src/commands/check_block_cmd.rs @@ -18,7 +18,7 @@ use std::fmt::Debug; use std::str::FromStr; use structopt::StructOpt; use sc_service::{ - Configuration, ChainSpecExtension, RuntimeGenesis, ServiceBuilderCommand, Roles, ChainSpec, + Configuration, ServiceBuilderCommand, Roles, ChainSpec, }; use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; use sp_runtime::generic::BlockId; @@ -53,15 +53,13 @@ pub struct CheckBlockCmd { impl CheckBlockCmd { /// Run the check-block command - pub fn run( + pub fn run( self, - config: Configuration, + config: Configuration, builder: B, ) -> error::Result<()> where - B: FnOnce(Configuration) -> Result, - G: RuntimeGenesis, - E: ChainSpecExtension, + B: FnOnce(Configuration) -> Result, BC: ServiceBuilderCommand + Unpin, BB: sp_runtime::traits::Block + Debug, <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, @@ -86,15 +84,13 @@ impl CheckBlockCmd { } /// Update and prepare a `Configuration` with command line parameters - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, spec_factory: F, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + F: FnOnce(&str) -> Result, String>, { self.shared_params.update_config(&mut config, spec_factory, version)?; self.import_params.update_config(&mut config, Roles::FULL, self.shared_params.dev)?; diff --git a/substrate/client/cli/src/commands/export_blocks_cmd.rs b/substrate/client/cli/src/commands/export_blocks_cmd.rs index 21195cccd4..61a63806d2 100644 --- a/substrate/client/cli/src/commands/export_blocks_cmd.rs +++ b/substrate/client/cli/src/commands/export_blocks_cmd.rs @@ -21,7 +21,7 @@ use std::fmt::Debug; use log::info; use structopt::StructOpt; use sc_service::{ - Configuration, ChainSpecExtension, RuntimeGenesis, ServiceBuilderCommand, ChainSpec, + Configuration, ServiceBuilderCommand, ChainSpec, config::DatabaseConfig, Roles, }; use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; @@ -65,15 +65,13 @@ pub struct ExportBlocksCmd { impl ExportBlocksCmd { /// Run the export-blocks command - pub fn run( + pub fn run( self, - config: Configuration, + config: Configuration, builder: B, ) -> error::Result<()> where - B: FnOnce(Configuration) -> Result, - G: RuntimeGenesis, - E: ChainSpecExtension, + B: FnOnce(Configuration) -> Result, BC: ServiceBuilderCommand + Unpin, BB: sp_runtime::traits::Block + Debug, <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, @@ -98,15 +96,13 @@ impl ExportBlocksCmd { } /// Update and prepare a `Configuration` with command line parameters - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, spec_factory: F, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + F: FnOnce(&str) -> Result, String>, { self.shared_params.update_config(&mut config, spec_factory, version)?; self.pruning_params.update_config(&mut config, Roles::FULL, true)?; diff --git a/substrate/client/cli/src/commands/import_blocks_cmd.rs b/substrate/client/cli/src/commands/import_blocks_cmd.rs index 60a57ab78d..b43407add1 100644 --- a/substrate/client/cli/src/commands/import_blocks_cmd.rs +++ b/substrate/client/cli/src/commands/import_blocks_cmd.rs @@ -20,7 +20,7 @@ use std::fs; use std::path::PathBuf; use structopt::StructOpt; use sc_service::{ - Configuration, ChainSpecExtension, RuntimeGenesis, ServiceBuilderCommand, ChainSpec, Roles, + Configuration, ServiceBuilderCommand, ChainSpec, Roles, }; use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; @@ -59,15 +59,13 @@ impl ReadPlusSeek for T {} impl ImportBlocksCmd { /// Run the import-blocks command - pub fn run( + pub fn run( self, - config: Configuration, + config: Configuration, builder: B, ) -> error::Result<()> where - B: FnOnce(Configuration) -> Result, - G: RuntimeGenesis, - E: ChainSpecExtension, + B: FnOnce(Configuration) -> Result, BC: ServiceBuilderCommand + Unpin, BB: sp_runtime::traits::Block + Debug, <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, @@ -88,15 +86,13 @@ impl ImportBlocksCmd { } /// Update and prepare a `Configuration` with command line parameters - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, spec_factory: F, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + F: FnOnce(&str) -> Result, String>, { self.shared_params.update_config(&mut config, spec_factory, version)?; self.import_params.update_config(&mut config, Roles::FULL, self.shared_params.dev)?; diff --git a/substrate/client/cli/src/commands/mod.rs b/substrate/client/cli/src/commands/mod.rs index e9f991c745..50e34856f1 100644 --- a/substrate/client/cli/src/commands/mod.rs +++ b/substrate/client/cli/src/commands/mod.rs @@ -25,9 +25,7 @@ mod purge_chain_cmd; use std::fmt::Debug; use structopt::StructOpt; -use sc_service::{ - Configuration, ChainSpecExtension, RuntimeGenesis, ServiceBuilderCommand, ChainSpec, -}; +use sc_service::{ Configuration, ServiceBuilderCommand, ChainSpec }; use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; use crate::error; @@ -87,15 +85,13 @@ impl Subcommand { } /// Run any `CoreParams` command - pub fn run( + pub fn run( self, - config: Configuration, + config: Configuration, builder: B, ) -> error::Result<()> where - B: FnOnce(Configuration) -> Result, - G: RuntimeGenesis, - E: ChainSpecExtension, + B: FnOnce(Configuration) -> Result, BC: ServiceBuilderCommand + Unpin, BB: sp_runtime::traits::Block + Debug, <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, @@ -112,15 +108,13 @@ impl Subcommand { } /// Update and prepare a `Configuration` with command line parameters - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, spec_factory: F, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + F: FnOnce(&str) -> Result, String>, { match self { Subcommand::BuildSpec(cmd) => cmd.update_config(&mut config, spec_factory, version), diff --git a/substrate/client/cli/src/commands/purge_chain_cmd.rs b/substrate/client/cli/src/commands/purge_chain_cmd.rs index b7c559e5cc..e12a50bf24 100644 --- a/substrate/client/cli/src/commands/purge_chain_cmd.rs +++ b/substrate/client/cli/src/commands/purge_chain_cmd.rs @@ -18,10 +18,7 @@ use std::fmt::Debug; use std::io::{Write, self}; use std::fs; use structopt::StructOpt; -use sc_service::{ - Configuration, ChainSpecExtension, RuntimeGenesis, ChainSpec, - config::{DatabaseConfig}, -}; +use sc_service::{ Configuration, ChainSpec, config::{DatabaseConfig} }; use crate::error; use crate::VersionInfo; @@ -41,14 +38,10 @@ pub struct PurgeChainCmd { impl PurgeChainCmd { /// Run the purge command - pub fn run( + pub fn run( self, - config: Configuration, - ) -> error::Result<()> - where - G: RuntimeGenesis, - E: ChainSpecExtension, - { + config: Configuration, + ) -> error::Result<()> { let db_path = match config.expect_database() { DatabaseConfig::Path { path, .. } => path, _ => { @@ -88,15 +81,13 @@ impl PurgeChainCmd { } /// Update and prepare a `Configuration` with command line parameters - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, spec_factory: F, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + F: FnOnce(&str) -> Result, String>, { self.shared_params.update_config(&mut config, spec_factory, version)?; config.use_in_memory_keystore()?; diff --git a/substrate/client/cli/src/commands/revert_cmd.rs b/substrate/client/cli/src/commands/revert_cmd.rs index f0c534898e..8eba199dff 100644 --- a/substrate/client/cli/src/commands/revert_cmd.rs +++ b/substrate/client/cli/src/commands/revert_cmd.rs @@ -17,7 +17,7 @@ use std::fmt::Debug; use structopt::StructOpt; use sc_service::{ - Configuration, ChainSpecExtension, RuntimeGenesis, ServiceBuilderCommand, ChainSpec, Roles, + Configuration, ServiceBuilderCommand, ChainSpec, Roles, }; use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; @@ -43,15 +43,13 @@ pub struct RevertCmd { impl RevertCmd { /// Run the revert command - pub fn run( + pub fn run( self, - config: Configuration, + config: Configuration, builder: B, ) -> error::Result<()> where - B: FnOnce(Configuration) -> Result, - G: RuntimeGenesis, - E: ChainSpecExtension, + B: FnOnce(Configuration) -> Result, BC: ServiceBuilderCommand + Unpin, BB: sp_runtime::traits::Block + Debug, <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, @@ -64,15 +62,13 @@ impl RevertCmd { } /// Update and prepare a `Configuration` with command line parameters - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, spec_factory: F, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + F: FnOnce(&str) -> Result, String>, { self.shared_params.update_config(&mut config, spec_factory, version)?; self.pruning_params.update_config(&mut config, Roles::FULL, true)?; diff --git a/substrate/client/cli/src/commands/runcmd.rs b/substrate/client/cli/src/commands/runcmd.rs index e6ebae4434..3544486363 100644 --- a/substrate/client/cli/src/commands/runcmd.rs +++ b/substrate/client/cli/src/commands/runcmd.rs @@ -23,7 +23,7 @@ use names::{Generator, Name}; use regex::Regex; use chrono::prelude::*; use sc_service::{ - AbstractService, Configuration, ChainSpecExtension, RuntimeGenesis, ChainSpec, Roles, + AbstractService, Configuration, ChainSpec, Roles, config::{KeystoreConfig, PrometheusConfig}, }; use sc_telemetry::TelemetryEndpoints; @@ -291,16 +291,14 @@ impl RunCmd { } /// Update and prepare a `Configuration` with command line parameters of `RunCmd` and `VersionInfo` - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, spec_factory: F, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + F: FnOnce(&str) -> Result, String>, { self.shared_params.update_config(&mut config, spec_factory, version)?; @@ -447,18 +445,16 @@ impl RunCmd { } /// Run the command that runs the node - pub fn run( + pub fn run( self, - config: Configuration, + config: Configuration, new_light: FNL, new_full: FNF, version: &VersionInfo, ) -> error::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, - FNL: FnOnce(Configuration) -> Result, - FNF: FnOnce(Configuration) -> Result, + FNL: FnOnce(Configuration) -> Result, + FNF: FnOnce(Configuration) -> Result, SL: AbstractService + Unpin, SF: AbstractService + Unpin, { @@ -625,7 +621,7 @@ fn parse_cors(s: &str) -> Result> { #[cfg(test)] mod tests { use super::*; - use sc_service::config::DatabaseConfig; + use sc_service::{GenericChainSpec, config::DatabaseConfig}; const TEST_VERSION_INFO: &'static VersionInfo = &VersionInfo { name: "node-test", @@ -655,7 +651,7 @@ mod tests { #[test] fn keystore_path_is_generated_correctly() { - let chain_spec = ChainSpec::from_genesis( + let chain_spec = GenericChainSpec::from_genesis( "test", "test-id", || (), @@ -673,9 +669,9 @@ mod tests { let mut config = Configuration::default(); config.config_dir = Some(PathBuf::from("/test/path")); - config.chain_spec = Some(chain_spec.clone()); + config.chain_spec = Some(Box::new(chain_spec.clone())); let chain_spec = chain_spec.clone(); - cli.update_config(&mut config, move |_| Ok(Some(chain_spec)), TEST_VERSION_INFO).unwrap(); + cli.update_config(&mut config, move |_| Ok(Box::new(chain_spec)), TEST_VERSION_INFO).unwrap(); let expected_path = match keystore_path { Some(path) => PathBuf::from(path), @@ -688,7 +684,7 @@ mod tests { #[test] fn ensure_load_spec_provide_defaults() { - let chain_spec = ChainSpec::from_genesis( + let chain_spec = GenericChainSpec::from_genesis( "test", "test-id", || (), @@ -703,7 +699,7 @@ mod tests { let cli = RunCmd::from_iter(args); let mut config = Configuration::from_version(TEST_VERSION_INFO); - cli.update_config(&mut config, |_| Ok(Some(chain_spec)), TEST_VERSION_INFO).unwrap(); + cli.update_config(&mut config, |_| Ok(Box::new(chain_spec)), TEST_VERSION_INFO).unwrap(); assert!(config.chain_spec.is_some()); assert!(!config.network.boot_nodes.is_empty()); @@ -712,7 +708,7 @@ mod tests { #[test] fn ensure_update_config_for_running_node_provides_defaults() { - let chain_spec = ChainSpec::from_genesis( + let chain_spec = GenericChainSpec::from_genesis( "test", "test-id", || (), @@ -728,7 +724,7 @@ mod tests { let mut config = Configuration::from_version(TEST_VERSION_INFO); cli.init(&TEST_VERSION_INFO).unwrap(); - cli.update_config(&mut config, |_| Ok(Some(chain_spec)), TEST_VERSION_INFO).unwrap(); + cli.update_config(&mut config, |_| Ok(Box::new(chain_spec)), TEST_VERSION_INFO).unwrap(); assert!(config.config_dir.is_some()); assert!(config.database.is_some()); diff --git a/substrate/client/cli/src/params/import_params.rs b/substrate/client/cli/src/params/import_params.rs index 95d7623d11..2b826d69c7 100644 --- a/substrate/client/cli/src/params/import_params.rs +++ b/substrate/client/cli/src/params/import_params.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use structopt::StructOpt; -use sc_service::{Configuration, RuntimeGenesis, config::DatabaseConfig}; +use sc_service::{Configuration, config::DatabaseConfig}; use crate::error; use crate::arg_enums::{ @@ -79,15 +79,12 @@ pub struct ImportParams { impl ImportParams { /// Put block import CLI params into `config` object. - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, role: sc_service::Roles, is_dev: bool, - ) -> error::Result<()> - where - G: RuntimeGenesis, - { + ) -> error::Result<()> { use sc_client_api::execution_extensions::ExecutionStrategies; if let Some(DatabaseConfig::Path { ref mut cache_size, .. }) = config.database { diff --git a/substrate/client/cli/src/params/network_configuration_params.rs b/substrate/client/cli/src/params/network_configuration_params.rs index eef679d6a6..974fa0be93 100644 --- a/substrate/client/cli/src/params/network_configuration_params.rs +++ b/substrate/client/cli/src/params/network_configuration_params.rs @@ -21,7 +21,7 @@ use structopt::StructOpt; use sc_network::{ config::{NonReservedPeerMode, TransportConfig}, multiaddr::Protocol, }; -use sc_service::{Configuration, RuntimeGenesis}; +use sc_service::Configuration; use crate::error; use crate::params::node_key_params::NodeKeyParams; @@ -101,16 +101,13 @@ pub struct NetworkConfigurationParams { impl NetworkConfigurationParams { /// Fill the given `NetworkConfiguration` by looking at the cli parameters. - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, config_path: PathBuf, client_id: String, is_dev: bool, - ) -> error::Result<()> - where - G: RuntimeGenesis, - { + ) -> error::Result<()> { config.network.boot_nodes.extend(self.bootnodes.clone()); config.network.config_path = Some(config_path.clone()); config.network.net_config_path = Some(config_path.clone()); diff --git a/substrate/client/cli/src/params/node_key_params.rs b/substrate/client/cli/src/params/node_key_params.rs index ddc1d6cc21..aef3af94c7 100644 --- a/substrate/client/cli/src/params/node_key_params.rs +++ b/substrate/client/cli/src/params/node_key_params.rs @@ -16,7 +16,7 @@ use std::{path::PathBuf, str::FromStr}; use structopt::StructOpt; -use sc_service::{Configuration, RuntimeGenesis}; +use sc_service::Configuration; use sc_network::config::NodeKeyConfig; use sp_core::H256; @@ -93,14 +93,11 @@ pub struct NodeKeyParams { impl NodeKeyParams { /// Create a `NodeKeyConfig` from the given `NodeKeyParams` in the context /// of an optional network config storage directory. - pub fn update_config<'a, G, E>( + pub fn update_config<'a>( &self, - mut config: &'a mut Configuration, + mut config: &'a mut Configuration, net_config_path: Option<&PathBuf>, - ) -> error::Result<&'a NodeKeyConfig> - where - G: RuntimeGenesis, - { + ) -> error::Result<&'a NodeKeyConfig> { config.network.node_key = match self.node_key_type { NodeKeyType::Ed25519 => { let secret = if let Some(node_key) = self.node_key.as_ref() { @@ -146,7 +143,7 @@ mod tests { fn test_node_key_config_input() { fn secret_input(net_config_dir: Option<&PathBuf>) -> error::Result<()> { NodeKeyType::variants().iter().try_for_each(|t| { - let mut config = Configuration::<(), ()>::default(); + let mut config = Configuration::default(); let node_key_type = NodeKeyType::from_str(t).unwrap(); let sk = match node_key_type { NodeKeyType::Ed25519 => ed25519::SecretKey::generate().as_ref().to_vec() @@ -173,7 +170,7 @@ mod tests { fn test_node_key_config_file() { fn secret_file(net_config_dir: Option<&PathBuf>) -> error::Result<()> { NodeKeyType::variants().iter().try_for_each(|t| { - let mut config = Configuration::<(), ()>::default(); + let mut config = Configuration::default(); let node_key_type = NodeKeyType::from_str(t).unwrap(); let tmp = tempfile::Builder::new().prefix("alice").tempdir()?; let file = tmp.path().join(format!("{}_mysecret", t)).to_path_buf(); @@ -212,7 +209,7 @@ mod tests { fn no_config_dir() -> error::Result<()> { with_def_params(|params| { - let mut config = Configuration::<(), ()>::default(); + let mut config = Configuration::default(); let typ = params.node_key_type; params.update_config(&mut config, None) .and_then(|c| match c { @@ -225,7 +222,7 @@ mod tests { fn some_config_dir(net_config_dir: &PathBuf) -> error::Result<()> { with_def_params(|params| { - let mut config = Configuration::<(), ()>::default(); + let mut config = Configuration::default(); let dir = PathBuf::from(net_config_dir.clone()); let typ = params.node_key_type; params.update_config(&mut config, Some(net_config_dir)) diff --git a/substrate/client/cli/src/params/pruning_params.rs b/substrate/client/cli/src/params/pruning_params.rs index ad64d757dc..ec1066df95 100644 --- a/substrate/client/cli/src/params/pruning_params.rs +++ b/substrate/client/cli/src/params/pruning_params.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use structopt::StructOpt; -use sc_service::{Configuration, RuntimeGenesis, PruningMode}; +use sc_service::{Configuration, PruningMode}; use crate::error; @@ -33,15 +33,12 @@ pub struct PruningParams { impl PruningParams { /// Put block pruning CLI params into `config` object. - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, + mut config: &mut Configuration, role: sc_service::Roles, unsafe_pruning: bool, - ) -> error::Result<()> - where - G: RuntimeGenesis, - { + ) -> error::Result<()> { // by default we disable pruning if the node is an authority (i.e. // `ArchiveAll`), otherwise we keep state for the last 256 blocks. if the // node is an authority and pruning is enabled explicitly, then we error diff --git a/substrate/client/cli/src/params/shared_params.rs b/substrate/client/cli/src/params/shared_params.rs index 03f4479646..310e3de5da 100644 --- a/substrate/client/cli/src/params/shared_params.rs +++ b/substrate/client/cli/src/params/shared_params.rs @@ -18,8 +18,7 @@ use std::path::PathBuf; use structopt::StructOpt; use app_dirs::{AppInfo, AppDataType}; use sc_service::{ - Configuration, ChainSpecExtension, RuntimeGenesis, - config::DatabaseConfig, ChainSpec, + Configuration, config::DatabaseConfig, ChainSpec, }; use crate::VersionInfo; @@ -50,25 +49,19 @@ pub struct SharedParams { impl SharedParams { /// Load spec to `Configuration` from `SharedParams` and spec factory. - pub fn update_config<'a, G, E, F>( + pub fn update_config<'a, F>( &self, - mut config: &'a mut Configuration, + mut config: &'a mut Configuration, spec_factory: F, version: &VersionInfo, - ) -> error::Result<&'a ChainSpec> where - G: RuntimeGenesis, - E: ChainSpecExtension, - F: FnOnce(&str) -> Result>, String>, + ) -> error::Result<&'a dyn ChainSpec> where + F: FnOnce(&str) -> Result, String>, { let chain_key = match self.chain { Some(ref chain) => chain.clone(), None => if self.dev { "dev".into() } else { "".into() } }; - let spec = match spec_factory(&chain_key)? { - Some(spec) => spec, - None => ChainSpec::from_json_file(PathBuf::from(chain_key))? - }; - + let spec = spec_factory(&chain_key)?; config.network.boot_nodes = spec.boot_nodes().to_vec(); config.telemetry_endpoints = spec.telemetry_endpoints().clone(); @@ -87,7 +80,7 @@ impl SharedParams { }); } - Ok(config.chain_spec.as_ref().unwrap()) + Ok(config.expect_chain_spec()) } /// Initialize substrate. This must be done only once. diff --git a/substrate/client/cli/src/params/transaction_pool_params.rs b/substrate/client/cli/src/params/transaction_pool_params.rs index 80c591d1d2..3468c12243 100644 --- a/substrate/client/cli/src/params/transaction_pool_params.rs +++ b/substrate/client/cli/src/params/transaction_pool_params.rs @@ -31,9 +31,9 @@ pub struct TransactionPoolParams { impl TransactionPoolParams { /// Fill the given `PoolConfiguration` by looking at the cli parameters. - pub fn update_config( + pub fn update_config( &self, - config: &mut Configuration, + config: &mut Configuration, ) -> error::Result<()> { // ready queue config.transaction_pool.ready.count = self.pool_limit; diff --git a/substrate/client/cli/src/runtime.rs b/substrate/client/cli/src/runtime.rs index eccf240f20..183196139f 100644 --- a/substrate/client/cli/src/runtime.rs +++ b/substrate/client/cli/src/runtime.rs @@ -79,12 +79,12 @@ fn build_runtime() -> Result { /// A helper function that runs a future with tokio and stops if the process receives the signal /// SIGTERM or SIGINT -pub fn run_until_exit( - mut config: Configuration, +pub fn run_until_exit( + mut config: Configuration, future_builder: F, ) -> error::Result<()> where - F: FnOnce(Configuration) -> error::Result, + F: FnOnce(Configuration) -> error::Result, FUT: Future> + future::Future, ERR: 'static + std::error::Error, { @@ -106,12 +106,12 @@ where /// A helper function that runs an `AbstractService` with tokio and stops if the process receives /// the signal SIGTERM or SIGINT -pub fn run_service_until_exit( - mut config: Configuration, +pub fn run_service_until_exit( + mut config: Configuration, service_builder: F, ) -> error::Result<()> where - F: FnOnce(Configuration) -> Result, + F: FnOnce(Configuration) -> Result, T: AbstractService + Unpin, { let mut runtime = build_runtime()?; diff --git a/substrate/client/db/src/lib.rs b/substrate/client/db/src/lib.rs index 746c73bea2..4494978aee 100644 --- a/substrate/client/db/src/lib.rs +++ b/substrate/client/db/src/lib.rs @@ -285,10 +285,10 @@ pub enum DatabaseSettingsSrc { } /// Create an instance of db-backed client. -pub fn new_client( +pub fn new_client( settings: DatabaseSettings, executor: E, - genesis_storage: &S, + genesis_storage: &dyn BuildStorage, fork_blocks: ForkBlocks, bad_blocks: BadBlocks, execution_extensions: ExecutionExtensions, @@ -307,7 +307,6 @@ pub fn new_client( where Block: BlockT, E: CodeExecutor + RuntimeInfo, - S: BuildStorage, { let backend = Arc::new(Backend::new(settings, CANONICALIZATION_DELAY)?); let executor = sc_client::LocalCallExecutor::new(backend.clone(), executor); diff --git a/substrate/client/service/src/builder.rs b/substrate/client/service/src/builder.rs index 8b5a203bc7..7237a55377 100644 --- a/substrate/client/service/src/builder.rs +++ b/substrate/client/service/src/builder.rs @@ -26,7 +26,7 @@ use sc_client_api::{ ExecutorProvider, CallExecutor }; use sc_client::Client; -use sc_chain_spec::{RuntimeGenesis, Extension}; +use sc_chain_spec::get_extension; use sp_consensus::import_queue::ImportQueue; use futures::{ Future, FutureExt, StreamExt, @@ -119,10 +119,10 @@ pub type BackgroundTask = Pin + Send>>; /// The order in which the `with_*` methods are called doesn't matter, as the correct binding of /// generics is done when you call `build`. /// -pub struct ServiceBuilder { - config: Configuration, + config: Configuration, pub (crate) client: Arc, backend: Arc, tasks_builder: TaskManagerBuilder, @@ -193,24 +193,20 @@ type TFullParts = ( ); /// Creates a new full client for the given config. -pub fn new_full_client( - config: &Configuration, +pub fn new_full_client( + config: &Configuration, ) -> Result, Error> where TBl: BlockT, TExecDisp: NativeExecutionDispatch + 'static, - TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, - TCSExt: Extension, { new_full_parts(config).map(|parts| parts.0) } -fn new_full_parts( - config: &Configuration, +fn new_full_parts( + config: &Configuration, ) -> Result, Error> where TBl: BlockT, TExecDisp: NativeExecutionDispatch + 'static, - TGen: sp_runtime::BuildStorage + serde::Serialize + for<'de> serde::Deserialize<'de>, - TCSExt: Extension, { let keystore = match &config.keystore { KeystoreConfig::Path { path, password } => Keystore::open( @@ -230,15 +226,11 @@ fn new_full_parts( ); let chain_spec = config.expect_chain_spec(); - let fork_blocks = chain_spec - .extensions() - .get::>() + let fork_blocks = get_extension::>(chain_spec.extensions()) .cloned() .unwrap_or_default(); - let bad_blocks = chain_spec - .extensions() - .get::>() + let bad_blocks = get_extension::>(chain_spec.extensions()) .cloned() .unwrap_or_default(); @@ -267,7 +259,7 @@ fn new_full_parts( sc_client_db::new_client( db_config, executor, - config.expect_chain_spec(), + config.expect_chain_spec().as_storage_builder(), fork_blocks, bad_blocks, extensions, @@ -278,16 +270,13 @@ fn new_full_parts( Ok((client, backend, keystore, tasks_builder)) } -impl ServiceBuilder<(), (), TGen, TCSExt, (), (), (), (), (), (), (), (), ()> -where TGen: RuntimeGenesis, TCSExt: Extension { +impl ServiceBuilder<(), (), (), (), (), (), (), (), (), (), ()> { /// Start the service builder with a configuration. pub fn new_full( - config: Configuration + config: Configuration, ) -> Result, Arc>, (), @@ -323,12 +312,10 @@ where TGen: RuntimeGenesis, TCSExt: Extension { /// Start the service builder with a configuration. pub fn new_light( - config: Configuration + config: Configuration, ) -> Result, Arc>, (), @@ -386,7 +373,7 @@ where TGen: RuntimeGenesis, TCSExt: Extension { let remote_blockchain = backend.remote_blockchain(); let client = Arc::new(sc_client::light::new_light( backend.clone(), - config.expect_chain_spec(), + config.expect_chain_spec().as_storage_builder(), executor, config.prometheus_config.as_ref().map(|config| config.registry.clone()), )?); @@ -411,8 +398,8 @@ where TGen: RuntimeGenesis, TCSExt: Extension { } } -impl - ServiceBuilder + ServiceBuilder { /// Returns a reference to the client that was stored in this builder. @@ -458,9 +445,9 @@ impl( self, select_chain_builder: impl FnOnce( - &Configuration, &Arc + &Configuration, &Arc, ) -> Result, Error> - ) -> Result Result, Error> { let select_chain = select_chain_builder(&self.config, &self.backend)?; @@ -486,8 +473,8 @@ impl( self, - builder: impl FnOnce(&Configuration, &Arc) -> Result - ) -> Result) -> Result, + ) -> Result, Error> { self.with_opt_select_chain(|cfg, b| builder(cfg, b).map(Option::Some)) } @@ -495,9 +482,9 @@ impl( self, - builder: impl FnOnce(&Configuration, Arc, Option, Arc) + builder: impl FnOnce(&Configuration, Arc, Option, Arc) -> Result - ) -> Result Result, Error> where TSc: Clone { let import_queue = builder( @@ -533,8 +520,6 @@ impl Result Result( self, builder: impl FnOnce( - &Configuration, + &Configuration, Arc, Arc, Option, Option, Arc, ) -> Result<(UImpQu, Option), Error> - ) -> Result Result, Error> where TSc: Clone, TFchr: Clone { let (import_queue, fprb) = builder( @@ -634,14 +617,14 @@ impl( self, builder: impl FnOnce( - &Configuration, + &Configuration, Arc, Arc, Option, Option, Arc, ) -> Result<(UImpQu, UFprb), Error> - ) -> Result Result, Error> where TSc: Clone, TFchr: Clone { self.with_import_queue_and_opt_fprb(|cfg, cl, b, f, sc, tx| @@ -658,7 +641,7 @@ impl, Option, ) -> Result<(UExPool, Option), Error> - ) -> Result Result, Error> where TSc: Clone, TFchr: Clone { let (transaction_pool, background_task) = transaction_pool_builder( @@ -694,7 +677,7 @@ impl( self, rpc_ext_builder: impl FnOnce(&Self) -> Result, - ) -> Result Result, Error> where TSc: Clone, TFchr: Clone { let rpc_extensions = rpc_ext_builder(&self)?; @@ -755,12 +738,10 @@ pub trait ServiceBuilderCommand { ) -> Pin> + Send>>; } -impl +impl ServiceBuilder< TBl, TRtApi, - TGen, - TCSExt, Client, Arc>, TSc, @@ -781,8 +762,6 @@ ServiceBuilder< sp_api::ApiExt, TBl: BlockT, TRtApi: 'static + Send + Sync, - TGen: RuntimeGenesis, - TCSExt: Extension, TBackend: 'static + sc_client_api::backend::Backend + Send, TExec: 'static + sc_client::CallExecutor + Send + Sync + Clone, TSc: Clone, diff --git a/substrate/client/service/src/chain_ops.rs b/substrate/client/service/src/chain_ops.rs index 350aac9175..85328d8011 100644 --- a/substrate/client/service/src/chain_ops.rs +++ b/substrate/client/service/src/chain_ops.rs @@ -19,7 +19,7 @@ use crate::error; use crate::builder::{ServiceBuilderCommand, ServiceBuilder}; use crate::error::Error; -use sc_chain_spec::{ChainSpec, RuntimeGenesis, Extension}; +use sc_chain_spec::ChainSpec; use log::{warn, info}; use futures::{future, prelude::*}; use sp_runtime::traits::{ @@ -38,19 +38,16 @@ use std::{io::{Read, Write, Seek}, pin::Pin}; use sc_client_api::BlockBody; /// Build a chain spec json -pub fn build_spec(spec: ChainSpec, raw: bool) -> error::Result where - G: RuntimeGenesis, - E: Extension, -{ - Ok(spec.to_json(raw)?) +pub fn build_spec(spec: &dyn ChainSpec, raw: bool) -> error::Result { + Ok(spec.as_json(raw)?) } impl< - TBl, TRtApi, TGen, TCSExt, TBackend, + TBl, TRtApi, TBackend, TExecDisp, TFchr, TSc, TImpQu, TFprb, TFpp, TExPool, TRpc, Backend > ServiceBuilderCommand for ServiceBuilder< - TBl, TRtApi, TGen, TCSExt, + TBl, TRtApi, Client>, TBl, TRtApi>, TFchr, TSc, TImpQu, TFprb, TFpp, TExPool, TRpc, Backend > where diff --git a/substrate/client/service/src/config.rs b/substrate/client/service/src/config.rs index a896fbb5a6..d9d497d1e9 100644 --- a/substrate/client/service/src/config.rs +++ b/substrate/client/service/src/config.rs @@ -23,7 +23,7 @@ pub use sc_executor::WasmExecutionMethod; use std::{future::Future, path::{PathBuf, Path}, pin::Pin, net::SocketAddr, sync::Arc}; pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions; -use sc_chain_spec::{ChainSpec, NoExtension}; +use sc_chain_spec::ChainSpec; use sp_core::crypto::Protected; use target_info::Target; use sc_telemetry::TelemetryEndpoints; @@ -51,7 +51,7 @@ pub struct VersionInfo { } /// Service configuration. -pub struct Configuration { +pub struct Configuration { /// Implementation name pub impl_name: &'static str, /// Implementation version @@ -79,7 +79,7 @@ pub struct Configuration { /// Pruning settings. pub pruning: PruningMode, /// Chain configuration. - pub chain_spec: Option>, + pub chain_spec: Option>, /// Node name. pub name: String, /// Wasm execution method. @@ -192,7 +192,7 @@ impl PrometheusConfig { } } -impl Default for Configuration { +impl Default for Configuration { /// Create a default config fn default() -> Self { Configuration { @@ -233,7 +233,7 @@ impl Default for Configuration { } } -impl Configuration { +impl Configuration { /// Create a default config using `VersionInfo` pub fn from_version(version: &VersionInfo) -> Self { let mut config = Configuration::default(); @@ -270,8 +270,8 @@ impl Configuration { /// ### Panics /// /// This method panic if the `chain_spec` is `None` - pub fn expect_chain_spec(&self) -> &ChainSpec { - self.chain_spec.as_ref().expect("chain_spec must be specified") + pub fn expect_chain_spec(&self) -> &dyn ChainSpec { + &**self.chain_spec.as_ref().expect("chain_spec must be specified") } /// Return a reference to the `DatabaseConfig` of this `Configuration`. diff --git a/substrate/client/service/src/lib.rs b/substrate/client/service/src/lib.rs index bc5273e700..0a7d5ff103 100644 --- a/substrate/client/service/src/lib.rs +++ b/substrate/client/service/src/lib.rs @@ -59,7 +59,9 @@ pub use self::builder::{ TFullCallExecutor, TLightCallExecutor, }; pub use config::{Configuration, Roles, PruningMode}; -pub use sc_chain_spec::{ChainSpec, Properties, RuntimeGenesis, Extension as ChainSpecExtension}; +pub use sc_chain_spec::{ + ChainSpec, GenericChainSpec, Properties, RuntimeGenesis, Extension as ChainSpecExtension +}; pub use sp_transaction_pool::{TransactionPool, InPoolTransaction, error::IntoPoolError}; pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions; pub use sc_client::FinalityNotifications; @@ -487,8 +489,8 @@ mod waiting { /// Starts RPC servers that run in their own thread, and returns an opaque object that keeps them alive. #[cfg(not(target_os = "unknown"))] -fn start_rpc_servers sc_rpc_server::RpcHandler>( - config: &Configuration, +fn start_rpc_servers sc_rpc_server::RpcHandler>( + config: &Configuration, mut gen_handler: H ) -> Result, error::Error> { fn maybe_start_server(address: Option, mut start: F) -> Result, io::Error> @@ -528,8 +530,8 @@ fn start_rpc_servers sc_rpc_server::RpcHandler sc_rpc_server::RpcHandler>( - _: &Configuration, +fn start_rpc_servers sc_rpc_server::RpcHandler>( + _: &Configuration, _: H ) -> Result, error::Error> { Ok(Box::new(())) diff --git a/substrate/client/service/test/src/lib.rs b/substrate/client/service/test/src/lib.rs index e1fd0b63f4..259c25ee4d 100644 --- a/substrate/client/service/test/src/lib.rs +++ b/substrate/client/service/test/src/lib.rs @@ -29,9 +29,11 @@ use tokio::{runtime::Runtime, prelude::FutureExt}; use tokio::timer::Interval; use sc_service::{ AbstractService, - ChainSpec, + GenericChainSpec, + ChainSpecExtension, Configuration, config::{DatabaseConfig, KeystoreConfig}, + RuntimeGenesis, Roles, Error, }; @@ -48,7 +50,7 @@ struct TestNet { authority_nodes: Vec<(usize, SyncService, U, Multiaddr)>, full_nodes: Vec<(usize, SyncService, U, Multiaddr)>, light_nodes: Vec<(usize, SyncService, Multiaddr)>, - chain_spec: ChainSpec, + chain_spec: GenericChainSpec, base_port: u16, nodes: usize, } @@ -129,15 +131,15 @@ where F: Send + 'static, L: Send +'static, U: Clone + Send + 'static } } -fn node_config ( +fn node_config ( index: usize, - spec: &ChainSpec, + spec: &GenericChainSpec, role: Roles, task_executor: Arc + Send>>) + Send + Sync>, key_seed: Option, base_port: u16, root: &TempDir, -) -> Configuration +) -> Configuration { let root = root.path().join(format!("node-{}", index)); @@ -191,7 +193,7 @@ fn node_config ( state_cache_size: 16777216, state_cache_child_ratio: None, pruning: Default::default(), - chain_spec: Some((*spec).clone()), + chain_spec: Some(Box::new((*spec).clone())), name: format!("Node {}", index), wasm_method: sc_service::config::WasmExecutionMethod::Interpreted, execution_strategies: Default::default(), @@ -217,16 +219,17 @@ fn node_config ( impl TestNet where F: AbstractService, L: AbstractService, - E: Clone, + E: ChainSpecExtension + Clone + 'static, + G: RuntimeGenesis + 'static, { fn new( temp: &TempDir, - spec: ChainSpec, - full: impl Iterator) -> Result<(F, U), Error>>, - light: impl Iterator) -> Result>, + spec: GenericChainSpec, + full: impl Iterator Result<(F, U), Error>>, + light: impl Iterator Result>, authorities: impl Iterator) -> Result<(F, U), Error> + impl FnOnce(Configuration) -> Result<(F, U), Error> )>, base_port: u16 ) -> TestNet { @@ -249,9 +252,9 @@ impl TestNet where fn insert_nodes( &mut self, temp: &TempDir, - full: impl Iterator) -> Result<(F, U), Error>>, - light: impl Iterator) -> Result>, - authorities: impl Iterator) -> Result<(F, U), Error>)> + full: impl Iterator Result<(F, U), Error>>, + light: impl Iterator Result>, + authorities: impl Iterator Result<(F, U), Error>)> ) { let executor = self.runtime.executor(); @@ -317,14 +320,15 @@ fn tempdir_with_prefix(prefix: &str) -> TempDir { } pub fn connectivity( - spec: ChainSpec, + spec: GenericChainSpec, full_builder: Fb, light_builder: Lb, ) where - E: Clone, - Fb: Fn(Configuration) -> Result, + E: ChainSpecExtension + Clone + 'static, + G: RuntimeGenesis + 'static, + Fb: Fn(Configuration) -> Result, F: AbstractService, - Lb: Fn(Configuration) -> Result, + Lb: Fn(Configuration) -> Result, L: AbstractService, { const NUM_FULL_NODES: usize = 5; @@ -415,20 +419,21 @@ pub fn connectivity( } pub fn sync( - spec: ChainSpec, + spec: GenericChainSpec, full_builder: Fb, light_builder: Lb, mut make_block_and_import: B, mut extrinsic_factory: ExF ) where - Fb: Fn(Configuration) -> Result<(F, U), Error>, + Fb: Fn(Configuration) -> Result<(F, U), Error>, F: AbstractService, - Lb: Fn(Configuration) -> Result, + Lb: Fn(Configuration) -> Result, L: AbstractService, B: FnMut(&F, &mut U), ExF: FnMut(&F, &U) -> ::Extrinsic, U: Clone + Send + 'static, - E: Clone, + E: ChainSpecExtension + Clone + 'static, + G: RuntimeGenesis + 'static, { const NUM_FULL_NODES: usize = 10; // FIXME: BABE light client support is currently not working. @@ -485,16 +490,17 @@ pub fn sync( } pub fn consensus( - spec: ChainSpec, + spec: GenericChainSpec, full_builder: Fb, light_builder: Lb, authorities: impl IntoIterator ) where - Fb: Fn(Configuration) -> Result, + Fb: Fn(Configuration) -> Result, F: AbstractService, - Lb: Fn(Configuration) -> Result, + Lb: Fn(Configuration) -> Result, L: AbstractService, - E: Clone, + E: ChainSpecExtension + Clone + 'static, + G: RuntimeGenesis + 'static, { const NUM_FULL_NODES: usize = 10; const NUM_LIGHT_NODES: usize = 10; diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index ab5ea820ee..0ddd37adb2 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -243,10 +243,10 @@ impl Client where Block: BlockT, { /// Creates new Substrate Client with given blockchain and code executor. - pub fn new( + pub fn new( backend: Arc, executor: E, - build_genesis_storage: &S, + build_genesis_storage: &dyn BuildStorage, fork_blocks: ForkBlocks, bad_blocks: BadBlocks, execution_extensions: ExecutionExtensions, diff --git a/substrate/client/src/light/mod.rs b/substrate/client/src/light/mod.rs index 07816b3b35..865e6e9ac9 100644 --- a/substrate/client/src/light/mod.rs +++ b/substrate/client/src/light/mod.rs @@ -55,9 +55,9 @@ pub fn new_light_backend(blockchain: Arc>) -> Arc( +pub fn new_light( backend: Arc>>, - genesis_storage: &GS, + genesis_storage: &dyn BuildStorage, code_executor: E, prometheus_registry: Option, ) -> ClientResult< @@ -74,7 +74,6 @@ pub fn new_light( where B: BlockT, S: BlockchainStorage + 'static, - GS: BuildStorage, E: CodeExecutor + RuntimeInfo + Clone + 'static, { let local_executor = LocalCallExecutor::new(backend.clone(), code_executor); diff --git a/substrate/primitives/runtime/src/lib.rs b/substrate/primitives/runtime/src/lib.rs index 6501dafc0e..632deb13cb 100644 --- a/substrate/primitives/runtime/src/lib.rs +++ b/substrate/primitives/runtime/src/lib.rs @@ -101,7 +101,7 @@ use crate::traits::IdentifyAccount; /// Complex storage builder stuff. #[cfg(feature = "std")] -pub trait BuildStorage: Sized { +pub trait BuildStorage { /// Build the storage out of this builder. fn build_storage(&self) -> Result { let mut storage = Default::default(); diff --git a/substrate/utils/browser/src/lib.rs b/substrate/utils/browser/src/lib.rs index f169d8b199..c9c159efe3 100644 --- a/substrate/utils/browser/src/lib.rs +++ b/substrate/utils/browser/src/lib.rs @@ -19,7 +19,7 @@ use log::{debug, info}; use std::sync::Arc; use sc_service::{ AbstractService, RpcSession, Roles, Configuration, config::{DatabaseConfig, KeystoreConfig}, - ChainSpec, RuntimeGenesis + GenericChainSpec, RuntimeGenesis }; use wasm_bindgen::prelude::*; use futures::{prelude::*, channel::{oneshot, mpsc}, future::{poll_fn, ok}, compat::*}; @@ -34,11 +34,11 @@ pub use console_log::init_with_level as init_console_log; /// Create a service configuration from a chain spec. /// /// This configuration contains good defaults for a browser light client. -pub async fn browser_configuration(chain_spec: ChainSpec) - -> Result, Box> +pub async fn browser_configuration(chain_spec: GenericChainSpec) + -> Result> where - G: RuntimeGenesis, - E: Extension, + G: RuntimeGenesis + 'static, + E: Extension + 'static, { let name = chain_spec.name().to_string(); @@ -46,7 +46,7 @@ where let mut config = Configuration::default(); config.network.boot_nodes = chain_spec.boot_nodes().to_vec(); config.telemetry_endpoints = chain_spec.telemetry_endpoints().clone(); - config.chain_spec = Some(chain_spec); + config.chain_spec = Some(Box::new(chain_spec)); config.network.transport = sc_network::config::TransportConfig::Normal { wasm_external_transport: Some(transport.clone()), allow_private_ipv4: true, diff --git a/substrate/utils/frame/benchmarking-cli/src/lib.rs b/substrate/utils/frame/benchmarking-cli/src/lib.rs index 5e8e485c43..4467753c35 100644 --- a/substrate/utils/frame/benchmarking-cli/src/lib.rs +++ b/substrate/utils/frame/benchmarking-cli/src/lib.rs @@ -14,12 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{fmt::Debug, path::PathBuf}; -use sp_runtime::{BuildStorage, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; +use std::fmt::Debug; +use sp_runtime::{traits::{Block as BlockT, Header as HeaderT, NumberFor}}; use sc_client::StateMachine; use sc_cli::{ExecutionStrategy, WasmExecutionMethod, VersionInfo}; use sc_client_db::BenchmarkingState; -use sc_service::{RuntimeGenesis, ChainSpecExtension, Configuration, ChainSpec}; +use sc_service::{Configuration, ChainSpec}; use sc_executor::{NativeExecutor, NativeExecutionDispatch}; use codec::{Encode, Decode}; use frame_benchmarking::BenchmarkResults; @@ -82,13 +82,11 @@ impl BenchmarkCmd { } /// Runs the command and benchmarks the chain. - pub fn run( + pub fn run( self, - config: Configuration, + config: Configuration, ) -> sc_cli::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, BB: BlockT + Debug, <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, ::Hash: std::str::FromStr, @@ -164,21 +162,16 @@ impl BenchmarkCmd { } /// Update and prepare a `Configuration` with command line parameters - pub fn update_config( + pub fn update_config( &self, - mut config: &mut Configuration, - spec_factory: impl FnOnce(&str) -> Result>, String>, + mut config: &mut Configuration, + spec_factory: impl FnOnce(&str) -> Result, String>, _version: &VersionInfo, - ) -> sc_cli::Result<()> where - G: RuntimeGenesis, - E: ChainSpecExtension, + ) -> sc_cli::Result<()> { // Configure chain spec. let chain_key = self.shared_params.chain.clone().unwrap_or("dev".into()); - let spec = match spec_factory(&chain_key)? { - Some(spec) => spec, - None => ChainSpec::from_json_file(PathBuf::from(chain_key))? - }; + let spec = spec_factory(&chain_key)?; config.chain_spec = Some(spec); // Make sure to configure keystore.