diff --git a/Cargo.lock b/Cargo.lock index 7ec7e9a8b543f62cc5666c001330e6850d8fcf8f..468fd6f4fe5ff69bfd01cb2908eddb349ff3f51c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1465,6 +1465,7 @@ dependencies = [ "frame-support", "frame-system", "frame-system-benchmarking", + "frame-try-runtime", "pallet-authority-members", "pallet-babe", "pallet-balances", @@ -3438,6 +3439,7 @@ dependencies = [ "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "frame-try-runtime", "hex-literal", "log", "node-primitives", @@ -3511,6 +3513,7 @@ dependencies = [ "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "frame-try-runtime", "hex-literal", "log", "node-primitives", diff --git a/README.md b/README.md index e0f90e8b379a7cf4ffa0faef05677e90e4d97cae..87da44bff3379104081c5514900741e176c80e87 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ - [git-conventions](./docs/dev/git-conventions.md) - [launch-a-live-network](./docs/dev/launch-a-live-network.md) - [setup](./docs/dev/setup.md) + - [compilation features](./docs/dev/compilation.md) - [verify-runtime-code](./docs/dev/verify-runtime-code.md) - [weights-benchmarking](./docs/dev/weights-benchmarking.md) - [upgrade-substrate](./docs/dev/upgrade-substrate.md) diff --git a/docs/dev/compilation.md b/docs/dev/compilation.md new file mode 100644 index 0000000000000000000000000000000000000000..e26c408be9ae7c3c7077c3e63ffe62ae72851070 --- /dev/null +++ b/docs/dev/compilation.md @@ -0,0 +1,26 @@ +# Compilation + +Duniter is compiled using the Rust compiler. For a general overview, refer to the [Rustc Dev Guide](https://rustc-dev-guide.rust-lang.org/overview.html). + +Substrate and Duniter provide a set of features enabling or disabling parts of the code using conditional compilation. More information on conditional compilation can be found [here](https://doc.rust-lang.org/reference/conditional-compilation.html), or by enabling or disabling compilation of packages. Below is a list of all available features: + +## External + +- **runtime-benchmarks**: Compiles the runtime with benchmarks for extrinsics benchmarking. +- **try-runtime**: Compiles the runtime for tests and verifies operations in a simulated environment. +- **std**: Enables the Rust standard library. + +## Duniter + +- **gdev**: Sets `gdev-runtime` and `std` used to build the development chain. +- **gtest**: Sets `gtest-runtime` and `std` used to build the test chain. +- **g1**: Sets `g1-runtime` and `std` used to build the production chain. +- **constant-fees**: Uses a constant and predictable weight-to-fee conversion only for testing. +- **embed**: Enables hardcoded live chainspecs loaded from "../specs/gtest-raw.json" file. +- **native**: Compiles the runtime into native-platform executable only for debugging purposes. + +Note: By default, Duniter will be compiled using the `gdev` feature and including the compilation of the distance oracle. Since the three Duniter chains are mutually exclusive, it is mandatory to disable the default feature to compile `gtest` and `g1` as follows: + +- `cargo build --no-default-features --features gtest` +- `cargo build --no-default-features --features g1` +- `cargo build --no-default-features -p distance-oracle --features std` diff --git a/node/Cargo.toml b/node/Cargo.toml index fc62d177c502f1a993b1ce4021866451d795e04b..4f1958cfa1ae9af016fc9d201ef89c384d148ef8 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -48,6 +48,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", ] try-runtime = [ + "runtime-benchmarks", "common-runtime/try-runtime", "dc-distance/try-runtime", "distance-oracle?/try-runtime", diff --git a/node/src/cli.rs b/node/src/cli.rs index effac655de2fd519c2a098967d56a53128fcc601..175ffa56a601623feb9a1ffcc87836a6576178c4 100644 --- a/node/src/cli.rs +++ b/node/src/cli.rs @@ -83,7 +83,7 @@ pub enum Subcommand { /// Try some command against runtime state. #[cfg(feature = "try-runtime")] - TryRuntime(try_runtime_cli::TryRuntimeCmd), + TryRuntime, /// Try some command against runtime state. Note: `try-runtime` feature must be enabled. #[cfg(not(feature = "try-runtime"))] diff --git a/node/src/command.rs b/node/src/command.rs index 494001e91575c66e5a3cc1106d9d0662399446a0..fa6900d93e398c6e55f30072ad3d473c655aac9f 100644 --- a/node/src/command.rs +++ b/node/src/command.rs @@ -20,16 +20,9 @@ pub mod key; pub mod utils; -#[cfg(feature = "gtest")] -use crate::chain_spec::gtest; use crate::cli::{Cli, Subcommand}; -#[cfg(feature = "g1")] -use crate::service::g1_executor::G1Executor; -#[cfg(feature = "gdev")] -use crate::service::gdev_executor::GDevExecutor; -#[cfg(feature = "gtest")] -use crate::service::gtest_executor::GTestExecutor; -use crate::service::{IdentifyRuntimeType, RuntimeType}; +use crate::service::runtime_executor::Executor; +use crate::service::RuntimeType; use crate::{chain_spec, service}; use clap::CommandFactory; #[cfg(feature = "runtime-benchmarks")] @@ -56,14 +49,7 @@ macro_rules! unwrap_client { $code:expr ) => { match $client.as_ref() { - #[cfg(feature = "g1")] - crate::service::client::Client::G1($client) => $code, - #[cfg(feature = "gtest")] - crate::service::client::Client::GTest($client) => $code, - #[cfg(feature = "gdev")] - crate::service::client::Client::GDev($client) => $code, - #[allow(unreachable_patterns)] - _ => panic!("unknown runtime"), + crate::service::client::Client::Client($client) => $code, } }; } @@ -95,19 +81,20 @@ impl SubstrateCli for Cli { fn load_spec(&self, id: &str) -> Result<Box<dyn sc_service::ChainSpec>, String> { Ok(match id { - // === GDEV === - // development chainspec with generated genesis and Alice validator + // Development chainspec with generated genesis and Alice as a validator #[cfg(feature = "gdev")] "dev" => Box::new(chain_spec::gdev::local_testnet_config(1, 3, 4)?), - // local testnet with g1 data, gdev configuration (parameters & smiths) and Alice validator - // > optionally from DUNITER_GENESIS_CONFIG file to override default gdev configuration + + // Local testnet with G1 data, Gdev configuration (parameters & Smiths), and Alice as a validator. + // Optionally, load configuration from DUNITER_GENESIS_CONFIG file to override default Gdev configuration. #[cfg(feature = "gdev")] "gdev_dev" => Box::new(chain_spec::gdev::gdev_development_chain_spec( "resources/gdev.yaml".to_string(), )?), - // chainspecs for live network with g1 data, gdev configuration (parameters & smiths) - // but must have a smith with declared session keys - // > optionally from DUNITER_GENESIS_CONFIG file to override default gdev configuration + + // Chainspecs for live network with G1 data, Gdev configuration (parameters & Smiths). + // A Smith with declared session keys is required. + // Optionally load configuration from DUNITER_GENESIS_CONFIG file to override default Gdev configuration. #[cfg(feature = "gdev")] "gdev_live" => { const CLIENT_SPEC: &str = "./node/specs/gdev_client-specs.yaml"; @@ -119,34 +106,33 @@ impl SubstrateCli for Cli { .map_err(|e| format!("failed to read {CLIENT_SPEC} {e}"))?[..], ) .map_err(|e| format!("failed to parse {e}"))?; - // rebuild chainspecs from these files Box::new(chain_spec::gdev::gen_live_conf( client_spec, "resources/gdev.yaml".to_string(), )?) } - // hardcoded previously generated raw chainspecs - // yields a pointlessly heavy binary because of hexadecimal-text-encoded values + + // Hardcoded raw chainspecs with previously generated values, resulting in a needlessly heavy binary due to hexadecimal-text-encoded values. #[cfg(feature = "gdev")] "gdev" => Box::new(chain_spec::gdev::ChainSpec::from_json_bytes( &include_bytes!("../specs/gdev-raw.json")[..], )?), - // === GTEST === - // generate dev chainspecs with Alice validator - // provide DUNITER_GTEST_GENESIS env var if you want to build genesis from json - // otherwise you get a local testnet with generated genesis + + // Generate development chainspecs with Alice as a validator. + // Provide the DUNITER_GTEST_GENESIS environment variable to build genesis from JSON; otherwise, a local testnet with generated genesis will be used. #[cfg(feature = "gtest")] "gtest_dev" => Box::new(chain_spec::gtest::development_chainspecs( "resources/gtest.yaml".to_string(), )?), - // chainspecs for live network - // must have following files in ./node/specs folder or overwrite with env var: + + // Chainspecs for the live network. + // Required files in the ./node/specs folder or override with environment variables: // - gtest.json / DUNITER_GTEST_GENESIS // - gtest_client-specs.json / DUNITER_GTEST_CLIENT_SPEC #[cfg(feature = "gtest")] "gtest_live" => { const JSON_CLIENT_SPEC: &str = "./node/specs/gtest_client-specs.yaml"; - let client_spec: gtest::ClientSpec = serde_yaml::from_slice( + let client_spec: chain_spec::gtest::ClientSpec = serde_yaml::from_slice( &std::fs::read( std::env::var("DUNITER_CLIENT_SPEC") .unwrap_or_else(|_| JSON_CLIENT_SPEC.to_string()), @@ -154,31 +140,27 @@ impl SubstrateCli for Cli { .map_err(|e| format!("failed to read {JSON_CLIENT_SPEC} {e}"))?[..], ) .map_err(|e| format!("failed to parse {e}"))?; - // rebuild chainspecs from these files Box::new(chain_spec::gtest::live_chainspecs( client_spec, "resources/gtest.yaml".to_string(), )?) } - // return hardcoded live chainspecs, only with embed feature - // embed client spec and genesis to avoid embeding hexadecimal runtime - // and having hexadecimal runtime in git history - // will only build on a branch that has a file - // ./node/specs/gtest-raw.json + + // Return hardcoded live chainspecs, only with the embed feature enabled. + // Embed client spec and genesis to avoid embedding hexadecimal runtime + // and having hexadecimal runtime in the git history. + // This will only build on a branch that has a file named ./node/specs/gtest-raw.json. #[cfg(all(feature = "gtest", feature = "embed"))] "gtest" => Box::new(chain_spec::gtest::ChainSpec::from_json_bytes( &include_bytes!("../specs/gtest-raw.json")[..], )?), - // === G1 === #[cfg(feature = "g1")] "g1" => { unimplemented!() //Box::new(chain_spec::g1::ChainSpec::from_json_file(file_path)?) } - // Specs provided as json specify which runtime to use in their file name. For example, - // `g1-custom.json` uses the g1 runtime. - // `gdev-workshop.json` uses the gdev runtime. + path => { let path = std::path::PathBuf::from(path); @@ -311,7 +293,7 @@ pub fn run() -> sc_cli::Result<()> { #[cfg(feature = "runtime-benchmarks")] Some(Subcommand::Benchmark(cmd)) => { let runner = cli.create_runner(&**cmd)?; - let chain_spec = &runner.config().chain_spec; + let _chain_spec = &runner.config().chain_spec; match &**cmd { BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| { @@ -346,30 +328,12 @@ pub fn run() -> sc_cli::Result<()> { }), BenchmarkCmd::Pallet(cmd) => { if cfg!(feature = "runtime-benchmarks") { - match chain_spec.runtime_type() { - #[cfg(feature = "g1")] - RuntimeType::G1 => runner.sync_run(|config| { - cmd.run::<g1_runtime::Block, ExtendedHostFunctions< - sp_io::SubstrateHostFunctions, - <G1Executor as NativeExecutionDispatch>::ExtendHostFunctions, - >>(config) - }), - #[cfg(feature = "gtest")] - RuntimeType::GTest => runner.sync_run(|config| { - cmd.run::<gtest_runtime::Block, ExtendedHostFunctions< + runner.sync_run(|config| { + cmd.run::<service::runtime_executor::runtime::Block, ExtendedHostFunctions< sp_io::SubstrateHostFunctions, - <GTestExecutor as NativeExecutionDispatch>::ExtendHostFunctions, + <Executor as NativeExecutionDispatch>::ExtendHostFunctions, >>(config) - }), - #[cfg(feature = "gdev")] - RuntimeType::GDev => runner.sync_run(|config| { - cmd.run::<gdev_runtime::Block, ExtendedHostFunctions< - sp_io::SubstrateHostFunctions, - <GDevExecutor as NativeExecutionDispatch>::ExtendHostFunctions, - >>(config) - }), - _ => Err(sc_cli::Error::Application("unknown runtime type".into())), - } + }) } else { Err("Benchmarking wasn't enabled when building the node. \ You can enable it with `--features runtime-benchmarks`." @@ -392,42 +356,7 @@ pub fn run() -> sc_cli::Result<()> { .into()) } #[cfg(feature = "try-runtime")] - Some(Subcommand::TryRuntime(cmd)) => { - let runner = cli.create_runner(cmd)?; - let chain_spec = &runner.config().chain_spec; - - use sc_service::TaskManager; - let registry = &runner - .config() - .prometheus_config - .as_ref() - .map(|cfg| &cfg.registry); - let task_manager = TaskManager::new(runner.config().tokio_handle.clone(), *registry) - .map_err(|e| { - sc_cli::Error::Application(format!("Fail to create TaskManager: {}", e).into()) - })?; - - // Ensure dev spec - if !chain_spec.id().ends_with("dev") { - return Err(sc_cli::Error::Application( - "try-runtime only support dev specs".into(), - )); - } - - match chain_spec.runtime_type() { - #[cfg(feature = "gdev")] - RuntimeType::GDev => { - //sp_core::crypto::set_default_ss58_version(Ss58AddressFormatRegistry::GDev); - runner.async_run(|config| { - Ok(( - cmd.run::<gdev_runtime::Block, GDevExecutor>(config), - task_manager, - )) - }) - } - _ => Err(sc_cli::Error::Application("unknown runtime type".into())), - } - } + Some(Subcommand::TryRuntime) => Err(try_runtime_cli::DEPRECATION_NOTICE.into()), #[cfg(not(feature = "try-runtime"))] Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \ You can enable it with `--features try-runtime`." @@ -441,27 +370,12 @@ pub fn run() -> sc_cli::Result<()> { config.offchain_worker.indexing_enabled = true; } - match config.chain_spec.runtime_type() { - #[cfg(feature = "g1")] - RuntimeType::G1 => { - service::new_full::<g1_runtime::RuntimeApi, G1Executor>(config, cli.sealing) - .map_err(sc_cli::Error::Service) - } - #[cfg(feature = "gtest")] - RuntimeType::GTest => service::new_full::< - gtest_runtime::RuntimeApi, - GTestExecutor, - >(config, cli.sealing) - .map_err(sc_cli::Error::Service), - #[cfg(feature = "gdev")] - RuntimeType::GDev => { - service::new_full::<gdev_runtime::RuntimeApi, GDevExecutor>( - config, - cli.sealing, - ) - .map_err(sc_cli::Error::Service) - } - _ => Err(sc_cli::Error::Application("unknown runtime".into())), + { + service::new_full::<service::runtime_executor::runtime::RuntimeApi, Executor>( + config, + cli.sealing, + ) + .map_err(sc_cli::Error::Service) } }) } diff --git a/node/src/service.rs b/node/src/service.rs index 3c08c188197c9850dc1c4a70d75d827a86e2b171..e8375a7af709738912d601dfa1cedb856728ded2 100644 --- a/node/src/service.rs +++ b/node/src/service.rs @@ -29,6 +29,7 @@ use sc_consensus_manual_seal::{run_manual_seal, EngineCommand, ManualSealParams} use sc_service::WarpSyncParams; use sc_service::{error::Error as ServiceError, Configuration, PartialComponents, TaskManager}; use sc_telemetry::{Telemetry, TelemetryWorker}; +use sp_consensus_babe::inherents::InherentDataProvider; use sp_core::H256; use sp_runtime::traits::BlakeTwo256; use std::{sync::Arc, time::Duration}; @@ -54,91 +55,30 @@ type FullClient<RuntimeApi, Executor> = type FullBackend = sc_service::TFullBackend<Block>; type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>; -#[cfg(feature = "gdev")] -pub mod gdev_executor { +pub mod runtime_executor { use crate::service::HostFunctions; - pub use gdev_runtime; - use sc_executor::sp_wasm_interface::{Function, HostFunctionRegistry}; - - pub struct GDevExecutor; - impl sc_executor::NativeExecutionDispatch for GDevExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> { - gdev_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - gdev_runtime::native_version() - } - } - impl sc_executor::sp_wasm_interface::HostFunctions for GDevExecutor { - fn host_functions() -> Vec<&'static dyn Function> { - HostFunctions::host_functions() - } - - fn register_static<T>(registry: &mut T) -> Result<(), T::Error> - where - T: HostFunctionRegistry, - { - HostFunctions::register_static(registry) - } - } -} + #[cfg(feature = "g1")] + pub use g1_runtime as runtime; + #[cfg(feature = "gdev")] + pub use gdev_runtime as runtime; + #[cfg(feature = "gtest")] + pub use gtest_runtime as runtime; -#[allow(dead_code)] -#[cfg(feature = "g1")] -pub mod g1_executor { - use crate::service::HostFunctions; - pub use g1_runtime; use sc_executor::sp_wasm_interface::{Function, HostFunctionRegistry}; - pub struct G1Executor; - impl sc_executor::NativeExecutionDispatch for G1Executor { + pub struct Executor; + impl sc_executor::NativeExecutionDispatch for Executor { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> { - g1_runtime::api::dispatch(method, data) + runtime::api::dispatch(method, data) } fn native_version() -> sc_executor::NativeVersion { - g1_runtime::native_version() + runtime::native_version() } } - impl sc_executor::sp_wasm_interface::HostFunctions for G1Executor { - fn host_functions() -> Vec<&'static dyn Function> { - HostFunctions::host_functions() - } - - fn register_static<T>(registry: &mut T) -> Result<(), T::Error> - where - T: HostFunctionRegistry, - { - HostFunctions::register_static(registry) - } - } -} - -#[allow(dead_code)] -#[cfg(feature = "gtest")] -pub mod gtest_executor { - use crate::service::HostFunctions; - pub use gtest_runtime; - use sc_executor::sp_wasm_interface::{Function, HostFunctionRegistry}; - - pub struct GTestExecutor; - impl sc_executor::NativeExecutionDispatch for GTestExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> { - gtest_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - gtest_runtime::native_version() - } - } - impl sc_executor::sp_wasm_interface::HostFunctions for GTestExecutor { + impl sc_executor::sp_wasm_interface::HostFunctions for Executor { fn host_functions() -> Vec<&'static dyn Function> { HostFunctions::host_functions() } @@ -163,27 +103,6 @@ pub enum RuntimeType { GTest, } -/// Can be called for a `Configuration` to check if it is a configuration for -/// a particular runtime type. -pub trait IdentifyRuntimeType { - /// Returns the runtime type - fn runtime_type(&self) -> RuntimeType; -} - -impl IdentifyRuntimeType for Box<dyn sc_chain_spec::ChainSpec> { - fn runtime_type(&self) -> RuntimeType { - if self.id().starts_with("g1") { - RuntimeType::G1 - } else if self.id().starts_with("dev") || self.id().starts_with("gdev") { - RuntimeType::GDev - } else if self.id().starts_with("gtest") { - RuntimeType::GTest - } else { - panic!("unknown runtime") - } - } -} - /// Builds a new object suitable for chain operations. #[allow(clippy::type_complexity)] pub fn new_chain_ops( @@ -198,66 +117,22 @@ pub fn new_chain_ops( ), ServiceError, > { - match config.chain_spec.runtime_type() { - #[cfg(feature = "g1")] - RuntimeType::G1::G1 => { - let PartialComponents { - client, - backend, - import_queue, - task_manager, - .. - } = new_partial::<g1_runtime::RuntimeApi, g1_executor::G1Executor>( - config, - manual_consensus, - )?; - Ok(( - Arc::new(Client::G1(client)), - backend, - import_queue, - task_manager, - )) - } - #[cfg(feature = "gtest")] - RuntimeType::GTest => { - let PartialComponents { - client, - backend, - import_queue, - task_manager, - .. - } = new_partial::<gtest_runtime::RuntimeApi, gtest_executor::GTestExecutor>( - config, - manual_consensus, - )?; - Ok(( - Arc::new(Client::GTest(client)), - backend, - import_queue, - task_manager, - )) - } - #[cfg(feature = "gdev")] - RuntimeType::GDev => { - let PartialComponents { - client, - backend, - import_queue, - task_manager, - .. - } = new_partial::<gdev_runtime::RuntimeApi, gdev_executor::GDevExecutor>( - config, - manual_consensus, - )?; - Ok(( - Arc::new(Client::GDev(client)), - backend, - import_queue, - task_manager, - )) - } - _ => panic!("unknown runtime"), - } + let PartialComponents { + client, + backend, + import_queue, + task_manager, + .. + } = new_partial::<runtime_executor::runtime::RuntimeApi, runtime_executor::Executor>( + config, + manual_consensus, + )?; + Ok(( + Arc::new(Client::Client(client)), + backend, + import_queue, + task_manager, + )) } type FullGrandpaBlockImport<RuntimeApi, Executor> = sc_consensus_grandpa::GrandpaBlockImport< @@ -382,11 +257,10 @@ where create_inherent_data_providers: move |_, ()| async move { let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - let slot = - sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); + let slot = InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); Ok((slot, timestamp)) }, @@ -603,7 +477,7 @@ where client.clone(), ) .map_err(|err| format!("{:?}", err))?; - let babe = sp_consensus_babe::inherents::InherentDataProvider::new( + let babe = InherentDataProvider::new( timestamp.slot(), ); let distance = @@ -643,11 +517,10 @@ where async move { let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - let slot = - sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); + let slot = InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); let storage_proof = sp_transaction_storage_proof::registration::new_data_provider( diff --git a/node/src/service/client.rs b/node/src/service/client.rs index cad8ce1d679a92cfef21b17774c69d6832294d99..d9019c6825fe9e406a963dd4a244c9f509b8ca54 100644 --- a/node/src/service/client.rs +++ b/node/src/service/client.rs @@ -145,12 +145,14 @@ impl<Api> RuntimeApiCollection for Api where /// A client instance. #[derive(Clone)] pub enum Client { - #[cfg(feature = "g1")] - G1(Arc<super::FullClient<g1_runtime::RuntimeApi, super::g1_executor::G1Executor>>), - #[cfg(feature = "gtest")] - GTest(Arc<super::FullClient<gtest_runtime::RuntimeApi, super::gtest_executor::GTestExecutor>>), - #[cfg(feature = "gdev")] - GDev(Arc<super::FullClient<gdev_runtime::RuntimeApi, super::gdev_executor::GDevExecutor>>), + Client( + Arc< + super::FullClient< + super::runtime_executor::runtime::RuntimeApi, + super::runtime_executor::Executor, + >, + >, + ), } macro_rules! with_client { @@ -162,22 +164,8 @@ macro_rules! with_client { } } => { match $self { - #[cfg(feature = "g1")] - Self::G1($client) => { - #[allow(unused_imports)] - use g1_runtime as runtime; - $( $code )* - } - #[cfg(feature = "gtest")] - Self::GTest($client) => { - #[allow(unused_imports)] - use gtest_runtime as runtime; - $( $code )* - } - #[cfg(feature = "gdev")] - Self::GDev($client) => { + Self::Client($client) => { #[allow(unused_imports)] - use gdev_runtime as runtime; $( $code )* } } @@ -196,52 +184,32 @@ impl ClientHandle for Client { } } -#[cfg(feature = "g1")] -impl From<Arc<super::FullClient<g1_runtime::RuntimeApi, super::g1_executor::G1Executor>>> - for Client -{ - fn from( - client: Arc<super::FullClient<g1_runtime::RuntimeApi, super::g1_executor::G1Executor>>, - ) -> Self { - Self::G1(client) - } -} - -#[cfg(feature = "gtest")] -impl From<Arc<super::FullClient<gtest_runtime::RuntimeApi, super::gtest_executor::GTestExecutor>>> - for Client -{ - fn from( - client: Arc< - super::FullClient<gtest_runtime::RuntimeApi, super::gtest_executor::GTestExecutor>, +impl + From< + Arc< + super::FullClient< + super::runtime_executor::runtime::RuntimeApi, + super::runtime_executor::Executor, + >, >, - ) -> Self { - Self::GTest(client) - } -} - -#[cfg(feature = "gdev")] -impl From<Arc<super::FullClient<gdev_runtime::RuntimeApi, super::gdev_executor::GDevExecutor>>> - for Client + > for Client { fn from( client: Arc< - super::FullClient<gdev_runtime::RuntimeApi, super::gdev_executor::GDevExecutor>, + super::FullClient< + super::runtime_executor::runtime::RuntimeApi, + super::runtime_executor::Executor, + >, >, ) -> Self { - Self::GDev(client) + Self::Client(client) } } macro_rules! match_client { ($self:ident, $method:ident($($param:ident),*)) => { match $self { - #[cfg(feature = "g1")] - Self::G1(client) => client.$method($($param),*), - #[cfg(feature = "gtest")] - Self::GTest(client) => client.$method($($param),*), - #[cfg(feature = "gdev")] - Self::GDev(client) => client.$method($($param),*), + Self::Client(client) => client.$method($($param),*), } }; } @@ -326,23 +294,28 @@ trait BenchmarkCallSigner<RuntimeCall: Encode + Clone, Signer: Pair> { } #[cfg(feature = "g1")] -use g1_runtime as runtime; -#[cfg(feature = "g1")] -type FullClient = super::FullClient<runtime::RuntimeApi, super::g1_executor::G1Executor>; -#[cfg(feature = "gdev")] -use gdev_runtime as runtime; +type FullClient = super::FullClient< + super::runtime_executor::runtime::RuntimeApi, + super::runtime_executor::Executor, +>; #[cfg(feature = "gdev")] -type FullClient = super::FullClient<runtime::RuntimeApi, super::gdev_executor::GDevExecutor>; +type FullClient = super::FullClient< + super::runtime_executor::runtime::RuntimeApi, + super::runtime_executor::Executor, +>; #[cfg(feature = "gtest")] -use gtest_runtime as runtime; -#[cfg(feature = "gtest")] -type FullClient = super::FullClient<runtime::RuntimeApi, super::gtest_executor::GTestExecutor>; - -#[cfg(any(feature = "gdev", feature = "gtest"))] -impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullClient { +type FullClient = super::FullClient< + super::runtime_executor::runtime::RuntimeApi, + super::runtime_executor::Executor, +>; + +#[cfg(any(feature = "gdev", feature = "gtest", feature = "g1"))] +impl BenchmarkCallSigner<super::runtime_executor::runtime::RuntimeCall, sp_core::sr25519::Pair> + for FullClient +{ fn sign_call( &self, - call: runtime::RuntimeCall, + call: super::runtime_executor::runtime::RuntimeCall, nonce: u32, current_block: u64, period: u64, @@ -351,17 +324,20 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC ) -> sp_runtime::OpaqueExtrinsic { // use runtime; - let extra: runtime::SignedExtra = ( - frame_system::CheckNonZeroSender::<runtime::Runtime>::new(), - frame_system::CheckSpecVersion::<runtime::Runtime>::new(), - frame_system::CheckTxVersion::<runtime::Runtime>::new(), - frame_system::CheckGenesis::<runtime::Runtime>::new(), - frame_system::CheckMortality::<runtime::Runtime>::from( + let extra: super::runtime_executor::runtime::SignedExtra = ( + frame_system::CheckNonZeroSender::<super::runtime_executor::runtime::Runtime>::new(), + frame_system::CheckSpecVersion::<super::runtime_executor::runtime::Runtime>::new(), + frame_system::CheckTxVersion::<super::runtime_executor::runtime::Runtime>::new(), + frame_system::CheckGenesis::<super::runtime_executor::runtime::Runtime>::new(), + frame_system::CheckMortality::<super::runtime_executor::runtime::Runtime>::from( sp_runtime::generic::Era::mortal(period, current_block), ), - frame_system::CheckNonce::<runtime::Runtime>::from(nonce).into(), - frame_system::CheckWeight::<runtime::Runtime>::new(), - pallet_transaction_payment::ChargeTransactionPayment::<runtime::Runtime>::from(0), + frame_system::CheckNonce::<super::runtime_executor::runtime::Runtime>::from(nonce) + .into(), + frame_system::CheckWeight::<super::runtime_executor::runtime::Runtime>::new(), + pallet_transaction_payment::ChargeTransactionPayment::< + super::runtime_executor::runtime::Runtime, + >::from(0), ); let payload = sp_runtime::generic::SignedPayload::from_raw( @@ -369,8 +345,8 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC extra.clone(), ( (), - runtime::VERSION.spec_version, - runtime::VERSION.transaction_version, + super::runtime_executor::runtime::VERSION.spec_version, + super::runtime_executor::runtime::VERSION.transaction_version, genesis, genesis, (), @@ -380,7 +356,7 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC ); let signature = payload.using_encoded(|p| acc.sign(p)); - runtime::UncheckedExtrinsic::new_signed( + super::runtime_executor::runtime::UncheckedExtrinsic::new_signed( call, sp_runtime::AccountId32::from(acc.public()).into(), common_runtime::Signature::Sr25519(signature), @@ -402,10 +378,10 @@ impl frame_benchmarking_cli::ExtrinsicBuilder for Client { fn build(&self, nonce: u32) -> std::result::Result<sp_runtime::OpaqueExtrinsic, &'static str> { with_client! { self, client, { - let call = runtime::RuntimeCall::System(runtime::SystemCall::remark { remark: vec![] }); + let call = super::runtime_executor::runtime::RuntimeCall::System(super::runtime_executor::runtime::SystemCall::remark { remark: vec![] }); let signer = sp_keyring::Sr25519Keyring::Bob.pair(); - let period = runtime::BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64; + let period = super::runtime_executor::runtime::BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64; let genesis = client.usage_info().chain.best_hash; Ok(client.sign_call(call, nonce, 0, period, genesis, signer)) diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index aafe5a6b14de465e42a911f8c36b4ef844a6c9ed..a204abf7b207843103bd8fa7ca9b6bd1d1bb6983 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -55,6 +55,7 @@ std = [ "frame-support/std", "frame-system-benchmarking?/std", "frame-system/std", + "frame-try-runtime/std", "pallet-authority-members/std", "pallet-babe/std", "pallet-balances/std", @@ -98,6 +99,7 @@ try-runtime = [ "duniter-primitives/try-runtime", "frame-support/try-runtime", "frame-system/try-runtime", + "frame-try-runtime/try-runtime", "pallet-authority-members/try-runtime", "pallet-babe/try-runtime", "pallet-balances/try-runtime", @@ -137,6 +139,7 @@ frame-benchmarking = { workspace = true } frame-support = { workspace = true } frame-system = { workspace = true } frame-system-benchmarking = { workspace = true, optional = true } +frame-try-runtime = { workspace = true, optional = true } pallet-authority-members = { workspace = true } pallet-babe = { workspace = true } pallet-balances = { workspace = true } diff --git a/runtime/common/src/apis.rs b/runtime/common/src/apis.rs index af95e113f640d2a2318d6f464d20722c1b760f63..e654b92494695406deb993d44962350b59a62c3f 100644 --- a/runtime/common/src/apis.rs +++ b/runtime/common/src/apis.rs @@ -231,23 +231,19 @@ macro_rules! runtime_apis { } #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime<Block> for Runtime where <Runtime as frame_system::Config>::BlockNumber: Clone + sp_std::fmt::Debug + sp_runtime::traits::AtLeast32BitUnsigned { - fn on_runtime_upgrade() -> (Weight, Weight) { - log::info!("try-runtime::on_runtime_upgrade."); - todo!() - // TODO solve the problem to uncomment this: - //let weight = Executive::try_runtime_upgrade().unwrap(); - //(weight, BlockWeights::get().max_block) + impl frame_try_runtime::TryRuntime<Block> for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + let weight = Executive::try_runtime_upgrade(checks).unwrap(); + (weight, BlockWeights::get().max_block) } fn execute_block( block: Block, state_root_check: bool, + signature_check: bool, select: frame_try_runtime::TryStateSelect, ) -> Weight { - todo!() - // TODO solve the problem to uncomment this: - //Executive::try_execute_block(block, state_root_check, select).expect("try_execute_block failed") + Executive::try_execute_block(block, state_root_check, signature_check, select).expect("execute-block failed") } } diff --git a/runtime/g1/Cargo.toml b/runtime/g1/Cargo.toml index 76c98358b332ebbdd5e5289daf76d18bf2a39775..94b683b12f8e9a7c3dbffafd51f120e85c0314d0 100644 --- a/runtime/g1/Cargo.toml +++ b/runtime/g1/Cargo.toml @@ -60,6 +60,7 @@ std = [ "frame-system-benchmarking/std", "frame-system-rpc-runtime-api/std", "frame-system/std", + "frame-try-runtime/std", "log/std", "node-primitives/std", "pallet-atomic-swap/std", @@ -124,6 +125,7 @@ try-runtime = [ "frame-executive/try-runtime", "frame-support/try-runtime", "frame-system/try-runtime", + "frame-try-runtime/try-runtime", "pallet-atomic-swap/try-runtime", "pallet-authority-discovery/try-runtime", "pallet-authority-members/try-runtime", @@ -178,6 +180,7 @@ frame-benchmarking = { workspace = true } frame-system-benchmarking = { workspace = true } frame-system = { workspace = true } frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { workspace = true, optional = true } hex-literal = { workspace = true, optional = true } log = { workspace = true } pallet-atomic-swap = { workspace = true } diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs index 64b716370645ae389873c616ceaecb720be7f6de..3ce455b521947adc07bc9f9370f9abadb5bf0d20 100644 --- a/runtime/g1/src/lib.rs +++ b/runtime/g1/src/lib.rs @@ -33,6 +33,7 @@ pub use common_runtime::{ constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber, FullIdentificationOfImpl, GetCurrentEpochIndex, Hash, Header, IdtyIndex, Index, Signature, }; +pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; pub use pallet_identity::{IdtyStatus, IdtyValue}; pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId; diff --git a/runtime/gdev/Cargo.toml b/runtime/gdev/Cargo.toml index ef804b7e94e0c75568108ba79655475c39aa64ea..76c167816194255171006124e51020cbf00b2d56 100644 --- a/runtime/gdev/Cargo.toml +++ b/runtime/gdev/Cargo.toml @@ -60,6 +60,7 @@ std = [ "frame-system-benchmarking/std", "frame-system-rpc-runtime-api/std", "frame-system/std", + "frame-try-runtime/std", "log/std", "node-primitives/std", "pallet-atomic-swap/std", @@ -126,6 +127,7 @@ try-runtime = [ "frame-executive/try-runtime", "frame-support/try-runtime", "frame-system/try-runtime", + "frame-try-runtime/try-runtime", "pallet-atomic-swap/try-runtime", "pallet-authority-discovery/try-runtime", "pallet-authority-members/try-runtime", @@ -182,6 +184,7 @@ frame-support = { workspace = true } frame-system = { workspace = true } frame-system-benchmarking = { workspace = true, optional = true } frame-system-rpc-runtime-api = { workspace = true } +frame-try-runtime = { workspace = true, optional = true } hex-literal = { workspace = true, optional = true } log = { workspace = true } node-primitives = { workspace = true } diff --git a/runtime/gtest/Cargo.toml b/runtime/gtest/Cargo.toml index 2b7cbbcc1edcc490efac4a91f96e4d980a7d180d..3e14eae2708c8c29770c63a430375dd5dc76b1f4 100644 --- a/runtime/gtest/Cargo.toml +++ b/runtime/gtest/Cargo.toml @@ -59,7 +59,7 @@ std = [ "frame-system-benchmarking/std", "frame-system-rpc-runtime-api/std", "frame-system/std", - "frame-try-runtime?/std", + "frame-try-runtime/std", "log/std", "node-primitives/std", "pallet-atomic-swap/std", @@ -124,7 +124,7 @@ try-runtime = [ "frame-executive/try-runtime", "frame-support/try-runtime", "frame-system/try-runtime", - "frame-try-runtime?/try-runtime", + "frame-try-runtime/try-runtime", "pallet-atomic-swap/try-runtime", "pallet-authority-discovery/try-runtime", "pallet-authority-members/try-runtime",