From 87ef83684b574b4f9217f8d3d55c9314d500c7ce Mon Sep 17 00:00:00 2001 From: Tsvetomir Dimitrov <tsvetomir@parity.io> Date: Wed, 4 Jan 2023 16:41:56 +0200 Subject: [PATCH] Add `try-runtime` to Rococo runtime (#6501) * Add `try-runtime` to Rococo runtime * Enable try-runtime in all pallets * Update runtime/rococo/src/lib.rs Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Add dev-dependencies for the try-runtime test Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> --- polkadot/Cargo.lock | 4 +++ polkadot/runtime/rococo/Cargo.toml | 15 +++++++- polkadot/runtime/rococo/src/lib.rs | 55 ++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock index e9bd9b74286..c748b5d956f 100644 --- a/polkadot/Cargo.lock +++ b/polkadot/Cargo.lock @@ -8046,10 +8046,12 @@ dependencies = [ "beefy-merkle-tree", "frame-benchmarking", "frame-executive", + "frame-remote-externalities", "frame-support", "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "frame-try-runtime", "hex-literal", "log", "pallet-authority-discovery", @@ -8117,12 +8119,14 @@ dependencies = [ "sp-session", "sp-staking", "sp-std", + "sp-tracing", "sp-transaction-pool", "sp-trie", "sp-version", "static_assertions", "substrate-wasm-builder", "tiny-keccak", + "tokio", "xcm", "xcm-builder", "xcm-executor", diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml index aaf6710b7c1..dda042a6e5c 100644 --- a/polkadot/runtime/rococo/Cargo.toml +++ b/polkadot/runtime/rococo/Cargo.toml @@ -77,6 +77,7 @@ pallet-xcm = { path = "../../xcm/pallet-xcm", default-features = false } pallet-xcm-benchmarks = { path = "../../xcm/pallet-xcm-benchmarks", default-features = false, optional = true } frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } +frame-try-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } hex-literal = { version = "0.3.4" } @@ -92,9 +93,12 @@ xcm-builder = { package = "xcm-builder", path = "../../xcm/xcm-builder", default [dev-dependencies] tiny-keccak = { version = "2.0.2", features = ["keccak"] } keyring = { package = "sp-keyring", git = "https://github.com/paritytech/substrate", branch = "master" } +remote-externalities = { git = "https://github.com/paritytech/substrate", branch = "master", package = "frame-remote-externalities" } sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } separator = "0.4.1" serde_json = "1.0.81" +sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +tokio = { version = "1.22.0", features = ["macros"] } [build-dependencies] substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } @@ -168,6 +172,7 @@ std = [ "sp-session/std", "runtime-common/std", "runtime-parachains/std", + "frame-try-runtime/std", "beefy-primitives/std", "rococo-runtime-constants/std", "xcm/std", @@ -214,10 +219,14 @@ runtime-benchmarks = [ ] try-runtime = [ "frame-executive/try-runtime", + "frame-try-runtime", "frame-system/try-runtime", "pallet-authority-discovery/try-runtime", "pallet-authorship/try-runtime", "pallet-balances/try-runtime", + "pallet-babe/try-runtime", + "pallet-beefy/try-runtime", + "pallet-beefy-mmr/try-runtime", "pallet-bounties/try-runtime", "pallet-child-bounties/try-runtime", "pallet-transaction-payment/try-runtime", @@ -229,7 +238,9 @@ try-runtime = [ "pallet-im-online/try-runtime", "pallet-indices/try-runtime", "pallet-membership/try-runtime", + "pallet-mmr/try-runtime", "pallet-multisig/try-runtime", + "pallet-nis/try-runtime", "pallet-offences/try-runtime", "pallet-preimage/try-runtime", "pallet-proxy/try-runtime", @@ -239,13 +250,15 @@ try-runtime = [ "pallet-society/try-runtime", "pallet-sudo/try-runtime", "pallet-staking/try-runtime", + "pallet-state-trie-migration/try-runtime", "pallet-timestamp/try-runtime", "pallet-tips/try-runtime", "pallet-treasury/try-runtime", "pallet-utility/try-runtime", "pallet-vesting/try-runtime", - "pallet-babe/try-runtime", + "pallet-xcm/try-runtime", "runtime-common/try-runtime", + "runtime-parachains/try-runtime", ] # When enabled, the runtime API will not be build. # diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 91a095cf23f..65ad8223e5d 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -1926,6 +1926,26 @@ sp_api::impl_runtime_apis! { } } + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime<Block> for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + log::info!("try-runtime::on_runtime_upgrade rococo."); + 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 { + // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to + // have a backtrace here. + Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() + } + } + #[cfg(feature = "runtime-benchmarks")] impl frame_benchmarking::Benchmark<Block> for Runtime { fn benchmark_metadata(extra: bool) -> ( @@ -2047,3 +2067,38 @@ sp_api::impl_runtime_apis! { } } } + +#[cfg(all(test, feature = "try-runtime"))] +mod remote_tests { + use super::*; + use frame_try_runtime::runtime_decl_for_TryRuntime::TryRuntime; + use remote_externalities::{ + Builder, Mode, OfflineConfig, OnlineConfig, SnapshotConfig, Transport, + }; + use std::env::var; + + #[tokio::test] + async fn run_migrations() { + sp_tracing::try_init_simple(); + let transport: Transport = + var("WS").unwrap_or("wss://rococo-rpc.polkadot.io:443".to_string()).into(); + let maybe_state_snapshot: Option<SnapshotConfig> = var("SNAP").map(|s| s.into()).ok(); + let mut ext = Builder::<Block>::default() + .mode(if let Some(state_snapshot) = maybe_state_snapshot { + Mode::OfflineOrElseOnline( + OfflineConfig { state_snapshot: state_snapshot.clone() }, + OnlineConfig { + transport, + state_snapshot: Some(state_snapshot), + ..Default::default() + }, + ) + } else { + Mode::Online(OnlineConfig { transport, ..Default::default() }) + }) + .build() + .await + .unwrap(); + ext.execute_with(|| Runtime::on_runtime_upgrade(true)); + } +} -- GitLab