diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock index f56d0b424a8f64fdffa469e96723ac0647f1010b..67fcf09c666a1ac0eb7445632068fbba484f1e03 100644 --- a/polkadot/Cargo.lock +++ b/polkadot/Cargo.lock @@ -7458,6 +7458,7 @@ dependencies = [ "scale-info", "serde", "sp-api", + "sp-application-crypto", "sp-core", "sp-inherents", "sp-io", diff --git a/polkadot/runtime/kusama/src/weights/runtime_parachains_paras.rs b/polkadot/runtime/kusama/src/weights/runtime_parachains_paras.rs index 3e34104451f3319794db1dfc5e553cdd33c3b1c7..f646638c2786eee8a5d38ce402eaf9c21a2b69fc 100644 --- a/polkadot/runtime/kusama/src/weights/runtime_parachains_paras.rs +++ b/polkadot/runtime/kusama/src/weights/runtime_parachains_paras.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2022 Parity Technologies (UK) Ltd. +// Copyright 2017-2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -16,11 +16,11 @@ //! Autogenerated weights for `runtime_parachains::paras` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-02-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot +// target/production/polkadot // benchmark // --chain=kusama-dev // --steps=50 @@ -52,13 +52,13 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn force_set_current_code(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } // Storage: Paras Heads (r:0 w:1) fn force_set_current_head(s: u32, ) -> Weight { - (11_215_000 as Weight) + (10_155_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) @@ -77,7 +77,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn force_schedule_code_upgrade(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(9 as Weight)) .saturating_add(T::DbWeight::get().writes(8 as Weight)) } @@ -85,7 +85,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: Paras Heads (r:0 w:1) // Storage: Paras UpgradeGoAheadSignal (r:0 w:1) fn force_note_new_head(s: u32, ) -> Weight { - (14_968_000 as Weight) + (15_433_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) @@ -94,7 +94,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: ParasShared CurrentSessionIndex (r:1 w:0) // Storage: Paras ActionsQueue (r:1 w:1) fn force_queue_action() -> Weight { - (17_635_000 as Weight) + (16_160_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -103,15 +103,77 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn add_trusted_validation_code(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Paras CodeByHashRefs (r:1 w:0) // Storage: Paras CodeByHash (r:0 w:1) fn poke_unused_validation_code() -> Weight { - (2_669_000 as Weight) + (2_464_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + fn include_pvf_check_statement() -> Weight { + (117_279_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras UpcomingUpgrades (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras FutureCodeUpgrades (r:0 w:100) + fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight { + (624_849_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(104 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras UpgradeGoAheadSignal (r:0 w:100) + // Storage: Paras FutureCodeHash (r:0 w:100) + fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight { + (551_320_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(204 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras ActionsQueue (r:1 w:1) + fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight { + (498_904_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras ParaLifecycles (r:0 w:100) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras CurrentCodeHash (r:0 w:100) + // Storage: Paras UpcomingParasGenesis (r:0 w:100) + fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight { + (609_470_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(304 as Weight)) + } } diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml index 26e151f27a9f80c7026d6abd33dd5571e8879ba2..ec1ec29650f27dd3b28962dda4bd1662a73fb036 100644 --- a/polkadot/runtime/parachains/Cargo.toml +++ b/polkadot/runtime/parachains/Cargo.toml @@ -23,6 +23,7 @@ sp-session = { git = "https://github.com/paritytech/substrate", branch = "master sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } +sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -96,6 +97,7 @@ runtime-benchmarks = [ "frame-system/runtime-benchmarks", "primitives/runtime-benchmarks", "static_assertions", + "sp-application-crypto", ] try-runtime = [ "frame-support/try-runtime", diff --git a/polkadot/runtime/parachains/src/paras/benchmarking.rs b/polkadot/runtime/parachains/src/paras/benchmarking.rs index e2c4954a23401acd51fd14f873c89f426a9a24a9..9d31453638a75bc3505a0b736dfb30031bc803ff 100644 --- a/polkadot/runtime/parachains/src/paras/benchmarking.rs +++ b/polkadot/runtime/parachains/src/paras/benchmarking.rs @@ -15,12 +15,16 @@ // along with Polkadot. If not, see <http://www.gnu.org/licenses/>. use super::*; -use crate::{configuration::HostConfiguration, shared}; +use crate::configuration::HostConfiguration; use frame_benchmarking::benchmarks; use frame_system::RawOrigin; use primitives::v2::{HeadData, Id as ParaId, ValidationCode, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE}; use sp_runtime::traits::{One, Saturating}; +mod pvf_check; + +use self::pvf_check::{VoteCause, VoteOutcome}; + // 2 ^ 10, because binary search time complexity is O(log(2, n)) and n = 1024 gives us a big and // round number. // Due to the limited number of parachains, the number of pruning, upcoming upgrades and cooldowns @@ -139,6 +143,48 @@ benchmarks! { let code_hash = [0; 32].into(); }: _(RawOrigin::Root, code_hash) + include_pvf_check_statement { + let (stmt, signature) = pvf_check::prepare_inclusion_bench::<T>(); + }: { + let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature); + } + + include_pvf_check_statement_finalize_upgrade_accept { + let (stmt, signature) = pvf_check::prepare_finalization_bench::<T>( + VoteCause::Upgrade, + VoteOutcome::Accept, + ); + }: { + let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature); + } + + include_pvf_check_statement_finalize_upgrade_reject { + let (stmt, signature) = pvf_check::prepare_finalization_bench::<T>( + VoteCause::Upgrade, + VoteOutcome::Reject, + ); + }: { + let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature); + } + + include_pvf_check_statement_finalize_onboarding_accept { + let (stmt, signature) = pvf_check::prepare_finalization_bench::<T>( + VoteCause::Onboarding, + VoteOutcome::Accept, + ); + }: { + let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature); + } + + include_pvf_check_statement_finalize_onboarding_reject { + let (stmt, signature) = pvf_check::prepare_finalization_bench::<T>( + VoteCause::Onboarding, + VoteOutcome::Reject, + ); + }: { + let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature); + } + impl_benchmark_test_suite!( Pallet, crate::mock::new_test_ext(Default::default()), diff --git a/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs b/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs new file mode 100644 index 0000000000000000000000000000000000000000..a89315c2857b677fc0aa8b89f06eda1d43972c46 --- /dev/null +++ b/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs @@ -0,0 +1,195 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see <http://www.gnu.org/licenses/>. + +//! This module focuses on the benchmarking of the `include_pvf_check_statement` dispatchable. + +use crate::{configuration, paras::*, shared::Pallet as ParasShared}; +use frame_system::RawOrigin; +use primitives::v2::{HeadData, Id as ParaId, ValidationCode, ValidatorId, ValidatorIndex}; +use sp_application_crypto::RuntimeAppPublic; + +// Constants for the benchmarking +const SESSION_INDEX: SessionIndex = 1; +const VALIDATOR_NUM: usize = 800; +const CAUSES_NUM: usize = 100; +fn validation_code() -> ValidationCode { + ValidationCode(vec![0]) +} +fn old_validation_code() -> ValidationCode { + ValidationCode(vec![1]) +} + +/// Prepares the PVF check statement and the validator signature to pass into +/// `include_pvf_check_statement` during benchmarking phase. +/// +/// It won't trigger finalization, so we expect the benchmarking will only measure the performance +/// of only vote accounting. +pub fn prepare_inclusion_bench<T>() -> (PvfCheckStatement, ValidatorSignature) +where + T: Config + shared::Config, +{ + initialize::<T>(); + // we do not plan to trigger finalization, thus the cause is inconsequential. + initialize_pvf_active_vote::<T>(VoteCause::Onboarding); + + // `unwrap` cannot panic here since the `initialize` function should initialize validators count + // to be more than 0. + // + // VoteDirection doesn't matter here as well. + let stmt_n_sig = generate_statements::<T>(VoteOutcome::Accept).next().unwrap(); + + stmt_n_sig +} + +/// Prepares conditions for benchmarking of the finalization part of `include_pvf_check_statement`. +/// +/// This function will initialize a PVF pre-check vote, then submit a number of PVF pre-checking +/// statements so that to achieve the quorum only one statement is left. This statement is returned +/// from this function and is expected to be passed into `include_pvf_check_statement` during the +/// benchmarking phase. +pub fn prepare_finalization_bench<T>( + cause: VoteCause, + outcome: VoteOutcome, +) -> (PvfCheckStatement, ValidatorSignature) +where + T: Config + shared::Config, +{ + initialize::<T>(); + initialize_pvf_active_vote::<T>(cause); + + let mut stmts = generate_statements::<T>(outcome).collect::<Vec<_>>(); + // this should be ensured by the `initialize` function. + assert!(stmts.len() > 2); + + // stash the last statement to be used in the benchmarking phase. + let stmt_n_sig = stmts.pop().unwrap(); + + for (stmt, sig) in stmts { + let r = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, sig); + assert!(r.is_ok()); + } + + stmt_n_sig +} + +/// What caused the PVF pre-checking vote? +#[derive(PartialEq, Eq, Copy, Clone, Debug)] +pub enum VoteCause { + Onboarding, + Upgrade, +} + +/// The outcome of the PVF pre-checking vote. +#[derive(PartialEq, Eq, Copy, Clone, Debug)] +pub enum VoteOutcome { + Accept, + Reject, +} + +fn initialize<T>() +where + T: Config + shared::Config, +{ + // 0. generate a list of validators + let validators = (0..VALIDATOR_NUM) + .map(|_| <ValidatorId as RuntimeAppPublic>::generate_pair(None)) + .collect::<Vec<_>>(); + + // 1. Make sure PVF pre-checking is enabled in the config. + let mut config = configuration::Pallet::<T>::config(); + config.pvf_checking_enabled = true; + configuration::Pallet::<T>::force_set_active_config(config.clone()); + + // 2. initialize a new session with deterministic validator set. + ParasShared::<T>::set_active_validators_ascending(validators.clone()); + ParasShared::<T>::set_session_index(SESSION_INDEX); +} + +/// Creates a new PVF pre-checking active vote. +/// +/// The subject of the vote (i.e. validation code) and the cause (upgrade/onboarding) is specified +/// by the test setup. +fn initialize_pvf_active_vote<T>(vote_cause: VoteCause) +where + T: Config + shared::Config, +{ + for i in 0..CAUSES_NUM { + let id = ParaId::from(i as u32); + + if vote_cause == VoteCause::Upgrade { + // we do care about validation code being actually different, since there is a check + // that prevents upgrading to the same code. + let old_validation_code = old_validation_code(); + let validation_code = validation_code(); + + let mut parachains = ParachainsCache::new(); + Pallet::<T>::initialize_para_now( + &mut parachains, + id, + &ParaGenesisArgs { + parachain: true, + genesis_head: HeadData(vec![1, 2, 3, 4]), + validation_code: old_validation_code, + }, + ); + // don't care about performance here, but we do care about robustness. So dump the cache + // asap. + drop(parachains); + + Pallet::<T>::schedule_code_upgrade( + id, + validation_code, + /* relay_parent_number */ 1u32.into(), + &configuration::Pallet::<T>::config(), + ); + } else { + let r = Pallet::<T>::schedule_para_initialize( + id, + ParaGenesisArgs { + parachain: true, + genesis_head: HeadData(vec![1, 2, 3, 4]), + validation_code: validation_code(), + }, + ); + assert!(r.is_ok()); + } + } +} + +/// Generates a list of votes combined with signatures for the active validator set. The number of +/// votes is equal to the minimum number of votes required to reach the supermajority. +fn generate_statements<T>( + vote_outcome: VoteOutcome, +) -> impl Iterator<Item = (PvfCheckStatement, ValidatorSignature)> +where + T: Config + shared::Config, +{ + let validators = ParasShared::<T>::active_validator_keys(); + + let required_votes = primitives::v2::supermajority_threshold(validators.len()); + (0..required_votes).map(move |validator_index| { + let stmt = PvfCheckStatement { + accept: vote_outcome == VoteOutcome::Accept, + subject: validation_code().hash(), + session_index: SESSION_INDEX, + + validator_index: ValidatorIndex(validator_index as u32), + }; + let signature = validators[validator_index].sign(&stmt.signing_payload()).unwrap(); + + (stmt, signature) + }) +} diff --git a/polkadot/runtime/parachains/src/paras/mod.rs b/polkadot/runtime/parachains/src/paras/mod.rs index 06902649d35b9a1cc0daef3ed88e84dddcee2d14..4f49b6f2dd59a504e77fdde0627a170a488adbbd 100644 --- a/polkadot/runtime/parachains/src/paras/mod.rs +++ b/polkadot/runtime/parachains/src/paras/mod.rs @@ -404,6 +404,12 @@ pub trait WeightInfo { fn force_queue_action() -> Weight; fn add_trusted_validation_code(c: u32) -> Weight; fn poke_unused_validation_code() -> Weight; + + fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight; + fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight; + fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight; + fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight; + fn include_pvf_check_statement() -> Weight; } pub struct TestWeightInfo; @@ -429,6 +435,22 @@ impl WeightInfo for TestWeightInfo { fn poke_unused_validation_code() -> Weight { Weight::MAX } + fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight { + Weight::MAX + } + fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight { + Weight::MAX + } + fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight { + Weight::MAX + } + fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight { + Weight::MAX + } + fn include_pvf_check_statement() -> Weight { + // This special value is to distinguish from the finalizing variants above in tests. + Weight::MAX - 1 + } } #[frame_support::pallet] @@ -855,12 +877,23 @@ pub mod pallet { /// Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and /// enacts the results if that was the last vote before achieving the supermajority. - #[pallet::weight(Weight::MAX)] + #[pallet::weight( + sp_std::cmp::max( + sp_std::cmp::max( + <T as Config>::WeightInfo::include_pvf_check_statement_finalize_upgrade_accept(), + <T as Config>::WeightInfo::include_pvf_check_statement_finalize_upgrade_reject(), + ), + sp_std::cmp::max( + <T as Config>::WeightInfo::include_pvf_check_statement_finalize_onboarding_accept(), + <T as Config>::WeightInfo::include_pvf_check_statement_finalize_onboarding_reject(), + ) + ) + )] pub fn include_pvf_check_statement( origin: OriginFor<T>, stmt: PvfCheckStatement, signature: ValidatorSignature, - ) -> DispatchResult { + ) -> DispatchResultWithPostInfo { ensure_none(origin)?; // Make sure that PVF pre-checking is enabled. @@ -931,13 +964,17 @@ pub mod pallet { Self::enact_pvf_rejected(&stmt.subject, active_vote.causes); }, } + + // No weight refund since this statement was the last one and lead to finalization. + Ok(().into()) } else { - // No quorum has been achieved. So just store the updated state back into the - // storage. + // No quorum has been achieved. + // + // - So just store the updated state back into the storage. + // - Only charge weight for simple vote inclusion. PvfActiveVoteMap::<T>::insert(&stmt.subject, active_vote); + Ok(Some(<T as Config>::WeightInfo::include_pvf_check_statement()).into()) } - - Ok(()) } } diff --git a/polkadot/runtime/parachains/src/paras/tests.rs b/polkadot/runtime/parachains/src/paras/tests.rs index f2fa90fcafb5666988adb84e943ff6b788f96f89..960132d5f8043ac4246c5bb734d8a2cfe9c46538 100644 --- a/polkadot/runtime/parachains/src/paras/tests.rs +++ b/polkadot/runtime/parachains/src/paras/tests.rs @@ -1277,7 +1277,8 @@ fn pvf_check_submit_vote() { <Paras as ValidateUnsigned>::validate_unsigned(TransactionSource::InBlock, &call) .map(|_| ()); let dispatch_result = - Paras::include_pvf_check_statement(None.into(), stmt.clone(), signature.clone()); + Paras::include_pvf_check_statement(None.into(), stmt.clone(), signature.clone()) + .map(|_| ()); (validate_unsigned, dispatch_result) }; @@ -1375,6 +1376,69 @@ fn pvf_check_submit_vote() { }); } +#[test] +fn include_pvf_check_statement_refunds_weight() { + let a = ParaId::from(111); + let old_code: ValidationCode = vec![1, 2, 3].into(); + let new_code: ValidationCode = vec![3, 2, 1].into(); + + let paras = vec![( + a, + ParaGenesisArgs { + parachain: false, + genesis_head: Default::default(), + validation_code: old_code, + }, + )]; + + let genesis_config = MockGenesisConfig { + paras: GenesisConfig { paras, ..Default::default() }, + configuration: crate::configuration::GenesisConfig { + config: HostConfiguration { pvf_checking_enabled: true, ..Default::default() }, + ..Default::default() + }, + ..Default::default() + }; + + new_test_ext(genesis_config).execute_with(|| { + // At this point `a` is already onboarded. Run to block 1 performing session change at + // the end of block #0. + run_to_block(2, Some(vec![1])); + + // Relay parent of the block that schedules the upgrade. + const RELAY_PARENT: BlockNumber = 1; + // Expected current session index. + const EXPECTED_SESSION: SessionIndex = 1; + + Paras::schedule_code_upgrade(a, new_code.clone(), RELAY_PARENT, &Configuration::config()); + + let mut stmts = IntoIterator::into_iter([0, 1, 2, 3]) + .map(|i| { + let stmt = PvfCheckStatement { + accept: true, + subject: new_code.hash(), + session_index: EXPECTED_SESSION, + validator_index: (i as u32).into(), + }; + let sig = VALIDATORS[i].sign(&stmt.signing_payload()); + (stmt, sig) + }) + .collect::<Vec<_>>(); + let last_one = stmts.pop().unwrap(); + + // Verify that just vote submission is priced accordingly. + for (stmt, sig) in stmts { + let r = Paras::include_pvf_check_statement(None.into(), stmt, sig.into()).unwrap(); + assert_eq!(r.actual_weight, Some(TestWeightInfo::include_pvf_check_statement())); + } + + // Verify that the last statement is priced maximally. + let (stmt, sig) = last_one; + let r = Paras::include_pvf_check_statement(None.into(), stmt, sig.into()).unwrap(); + assert_eq!(r.actual_weight, None); + }); +} + #[test] fn add_trusted_validation_code_inserts_with_no_users() { // This test is to ensure that trusted validation code is inserted into the storage diff --git a/polkadot/runtime/parachains/src/shared.rs b/polkadot/runtime/parachains/src/shared.rs index e309e128800a7182dbe03d88c09d5791cd0cfaa4..3769ff4525c1aee551afa6d6ead313b2e7c61e22 100644 --- a/polkadot/runtime/parachains/src/shared.rs +++ b/polkadot/runtime/parachains/src/shared.rs @@ -124,7 +124,7 @@ impl<T: Config> Pallet<T> { CurrentSessionIndex::<T>::set(index); } - #[cfg(test)] + #[cfg(any(feature = "runtime-benchmarks", test))] pub(crate) fn set_active_validators_ascending(active: Vec<ValidatorId>) { ActiveValidatorIndices::<T>::set( (0..active.len()).map(|i| ValidatorIndex(i as _)).collect(), diff --git a/polkadot/runtime/polkadot/src/weights/runtime_parachains_paras.rs b/polkadot/runtime/polkadot/src/weights/runtime_parachains_paras.rs index 27ae677d5e9062ac9d3edd28e53d2f9065fdc331..ed4a040d4c183cbb0b4089ddcb6069a13bc3ae6b 100644 --- a/polkadot/runtime/polkadot/src/weights/runtime_parachains_paras.rs +++ b/polkadot/runtime/polkadot/src/weights/runtime_parachains_paras.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2022 Parity Technologies (UK) Ltd. +// Copyright 2017-2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -16,11 +16,11 @@ //! Autogenerated weights for `runtime_parachains::paras` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-02-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot +// target/production/polkadot // benchmark // --chain=polkadot-dev // --steps=50 @@ -52,13 +52,13 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn force_set_current_code(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } // Storage: Paras Heads (r:0 w:1) fn force_set_current_head(s: u32, ) -> Weight { - (10_412_000 as Weight) + (8_514_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) @@ -77,7 +77,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn force_schedule_code_upgrade(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(9 as Weight)) .saturating_add(T::DbWeight::get().writes(8 as Weight)) } @@ -85,7 +85,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: Paras Heads (r:0 w:1) // Storage: Paras UpgradeGoAheadSignal (r:0 w:1) fn force_note_new_head(s: u32, ) -> Weight { - (13_903_000 as Weight) + (13_963_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) @@ -94,7 +94,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: ParasShared CurrentSessionIndex (r:1 w:0) // Storage: Paras ActionsQueue (r:1 w:1) fn force_queue_action() -> Weight { - (18_447_000 as Weight) + (15_934_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -103,15 +103,77 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn add_trusted_validation_code(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Paras CodeByHashRefs (r:1 w:0) // Storage: Paras CodeByHash (r:0 w:1) fn poke_unused_validation_code() -> Weight { - (2_619_000 as Weight) + (2_406_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + fn include_pvf_check_statement() -> Weight { + (120_016_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras UpcomingUpgrades (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras FutureCodeUpgrades (r:0 w:100) + fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight { + (623_579_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(104 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras UpgradeGoAheadSignal (r:0 w:100) + // Storage: Paras FutureCodeHash (r:0 w:100) + fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight { + (552_089_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(204 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras ActionsQueue (r:1 w:1) + fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight { + (498_524_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras ParaLifecycles (r:0 w:100) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras CurrentCodeHash (r:0 w:100) + // Storage: Paras UpcomingParasGenesis (r:0 w:100) + fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight { + (611_386_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(304 as Weight)) + } } diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_paras.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_paras.rs index e1ff4d6cc66d17facb79b5137f389ad4d7578848..6f6b6943a14ff968c83e33161b53cf4754d07524 100644 --- a/polkadot/runtime/rococo/src/weights/runtime_parachains_paras.rs +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_paras.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2022 Parity Technologies (UK) Ltd. +// Copyright 2017-2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ //! Autogenerated weights for `runtime_parachains::paras` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-02-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -58,7 +58,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn } // Storage: Paras Heads (r:0 w:1) fn force_set_current_head(s: u32, ) -> Weight { - (11_885_000 as Weight) + (10_856_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) @@ -85,7 +85,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: Paras Heads (r:0 w:1) // Storage: Paras UpgradeGoAheadSignal (r:0 w:1) fn force_note_new_head(s: u32, ) -> Weight { - (14_996_000 as Weight) + (13_762_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) @@ -94,7 +94,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: ParasShared CurrentSessionIndex (r:1 w:0) // Storage: Paras ActionsQueue (r:1 w:1) fn force_queue_action() -> Weight { - (15_924_000 as Weight) + (15_946_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -110,8 +110,70 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: Paras CodeByHashRefs (r:1 w:0) // Storage: Paras CodeByHash (r:0 w:1) fn poke_unused_validation_code() -> Weight { - (2_424_000 as Weight) + (2_509_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + fn include_pvf_check_statement() -> Weight { + (117_675_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras UpcomingUpgrades (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras FutureCodeUpgrades (r:0 w:100) + fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight { + (618_769_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(104 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras UpgradeGoAheadSignal (r:0 w:100) + // Storage: Paras FutureCodeHash (r:0 w:100) + fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight { + (553_319_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(204 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras ActionsQueue (r:1 w:1) + fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight { + (507_519_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + // Storage: Configuration ActiveConfig (r:1 w:0) + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras ParaLifecycles (r:0 w:100) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras CurrentCodeHash (r:0 w:100) + // Storage: Paras UpcomingParasGenesis (r:0 w:100) + fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight { + (609_820_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(304 as Weight)) + } } diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_paras.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_paras.rs index 1fc1043bc40c4566a0f1452b0feaec76f8a96dbc..d64471c488c3a6ce6fd38eee64decf02638eceb6 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_paras.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_paras.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2022 Parity Technologies (UK) Ltd. +// Copyright 2017-2021 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify @@ -16,11 +16,11 @@ //! Autogenerated weights for `runtime_parachains::paras` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-02-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot +// target/production/polkadot // benchmark // --chain=westend-dev // --steps=50 @@ -52,13 +52,13 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn force_set_current_code(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } // Storage: Paras Heads (r:0 w:1) fn force_set_current_head(s: u32, ) -> Weight { - (8_970_000 as Weight) + (10_166_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) @@ -76,7 +76,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn force_schedule_code_upgrade(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(8 as Weight)) .saturating_add(T::DbWeight::get().writes(8 as Weight)) } @@ -84,7 +84,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: Paras Heads (r:0 w:1) // Storage: Paras UpgradeGoAheadSignal (r:0 w:1) fn force_note_new_head(s: u32, ) -> Weight { - (11_059_000 as Weight) + (15_413_000 as Weight) // Standard Error: 0 .saturating_add((1_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) @@ -93,7 +93,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn // Storage: ParasShared CurrentSessionIndex (r:1 w:0) // Storage: Paras ActionsQueue (r:1 w:1) fn force_queue_action() -> Weight { - (18_200_000 as Weight) + (15_999_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -102,15 +102,72 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn fn add_trusted_validation_code(c: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((3_000 as Weight).saturating_mul(c as Weight)) + .saturating_add((2_000 as Weight).saturating_mul(c as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Paras CodeByHashRefs (r:1 w:0) // Storage: Paras CodeByHash (r:0 w:1) fn poke_unused_validation_code() -> Weight { - (2_708_000 as Weight) + (2_445_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + fn include_pvf_check_statement() -> Weight { + (116_591_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras UpcomingUpgrades (r:1 w:1) + // Storage: System Digest (r:1 w:1) + // Storage: Paras FutureCodeUpgrades (r:0 w:100) + fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight { + (622_057_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(104 as Weight)) + } + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras UpgradeGoAheadSignal (r:0 w:100) + // Storage: Paras FutureCodeHash (r:0 w:100) + fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight { + (550_573_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(204 as Weight)) + } + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras ActionsQueue (r:1 w:1) + fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight { + (499_580_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } + // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) + // Storage: ParasShared CurrentSessionIndex (r:1 w:0) + // Storage: Paras PvfActiveVoteMap (r:1 w:1) + // Storage: Paras PvfActiveVoteList (r:1 w:1) + // Storage: Paras CodeByHashRefs (r:1 w:1) + // Storage: Paras ParaLifecycles (r:0 w:100) + // Storage: Paras CodeByHash (r:0 w:1) + // Storage: Paras CurrentCodeHash (r:0 w:100) + // Storage: Paras UpcomingParasGenesis (r:0 w:100) + fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight { + (602_317_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(304 as Weight)) + } }