From 42a4c2eef083180e7f5a8755c189d46a17aab590 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi <shawntabrizi@gmail.com> Date: Mon, 21 Sep 2020 15:31:44 +0200 Subject: [PATCH] Add `WeightInfo` to Babe and Grandpa Pallet (#7155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add `WeightInfo` to Babe Pallet * Also grandpa * Update frame/grandpa/src/default_weights.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> --- .../bin/node-template/runtime/src/lib.rs | 2 + substrate/bin/node/runtime/src/lib.rs | 4 ++ substrate/frame/babe/src/default_weights.rs | 47 ++++++++++++++++ substrate/frame/babe/src/lib.rs | 43 +++----------- substrate/frame/babe/src/mock.rs | 1 + substrate/frame/babe/src/tests.rs | 4 +- .../frame/grandpa/src/default_weights.rs | 54 ++++++++++++++++++ substrate/frame/grandpa/src/lib.rs | 56 +++++-------------- substrate/frame/grandpa/src/mock.rs | 2 + substrate/frame/grandpa/src/tests.rs | 4 +- substrate/test-utils/runtime/src/lib.rs | 2 + 11 files changed, 138 insertions(+), 81 deletions(-) create mode 100644 substrate/frame/babe/src/default_weights.rs create mode 100644 substrate/frame/grandpa/src/default_weights.rs diff --git a/substrate/bin/node-template/runtime/src/lib.rs b/substrate/bin/node-template/runtime/src/lib.rs index 9612394cc7f..3d5b91f6574 100644 --- a/substrate/bin/node-template/runtime/src/lib.rs +++ b/substrate/bin/node-template/runtime/src/lib.rs @@ -211,6 +211,8 @@ impl pallet_grandpa::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = (); + + type WeightInfo = (); } parameter_types! { diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 9c2c3beb779..8129fec68ad 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -311,6 +311,8 @@ impl pallet_babe::Trait for Runtime { type HandleEquivocation = pallet_babe::EquivocationHandler<Self::KeyOwnerIdentification, Offences>; + + type WeightInfo = (); } parameter_types! { @@ -782,6 +784,8 @@ impl pallet_grandpa::Trait for Runtime { type HandleEquivocation = pallet_grandpa::EquivocationHandler<Self::KeyOwnerIdentification, Offences>; + + type WeightInfo = (); } parameter_types! { diff --git a/substrate/frame/babe/src/default_weights.rs b/substrate/frame/babe/src/default_weights.rs new file mode 100644 index 00000000000..a0e13781961 --- /dev/null +++ b/substrate/frame/babe/src/default_weights.rs @@ -0,0 +1,47 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Default weights for the Babe Pallet +//! This file was not auto-generated. + +use frame_support::weights::{ + Weight, constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS, RocksDbWeight as DbWeight}, +}; + +impl crate::WeightInfo for () { + fn report_equivocation(validator_count: u32) -> Weight { + // we take the validator set count from the membership proof to + // calculate the weight but we set a floor of 100 validators. + let validator_count = validator_count.max(100) as u64; + + // worst case we are considering is that the given offender + // is backed by 200 nominators + const MAX_NOMINATORS: u64 = 200; + + // checking membership proof + (35 * WEIGHT_PER_MICROS) + .saturating_add((175 * WEIGHT_PER_NANOS).saturating_mul(validator_count)) + .saturating_add(DbWeight::get().reads(5)) + // check equivocation proof + .saturating_add(110 * WEIGHT_PER_MICROS) + // report offence + .saturating_add(110 * WEIGHT_PER_MICROS) + .saturating_add(25 * WEIGHT_PER_MICROS * MAX_NOMINATORS) + .saturating_add(DbWeight::get().reads(14 + 3 * MAX_NOMINATORS)) + .saturating_add(DbWeight::get().writes(10 + 3 * MAX_NOMINATORS)) + } +} diff --git a/substrate/frame/babe/src/lib.rs b/substrate/frame/babe/src/lib.rs index 2c1b2b16efc..3f13fe7e030 100644 --- a/substrate/frame/babe/src/lib.rs +++ b/substrate/frame/babe/src/lib.rs @@ -51,6 +51,7 @@ use sp_inherents::{InherentData, InherentIdentifier, MakeFatalError, ProvideInhe pub use sp_consensus_babe::{AuthorityId, PUBLIC_KEY_LENGTH, RANDOMNESS_LENGTH, VRF_OUTPUT_LENGTH}; mod equivocation; +mod default_weights; #[cfg(any(feature = "runtime-benchmarks", test))] mod benchmarking; @@ -102,6 +103,12 @@ pub trait Trait: pallet_timestamp::Trait { /// `()`) you must use this pallet's `ValidateUnsigned` in the runtime /// definition. type HandleEquivocation: HandleEquivocation<Self>; + + type WeightInfo: WeightInfo; +} + +pub trait WeightInfo { + fn report_equivocation(validator_count: u32) -> Weight; } /// Trigger an epoch change, if any should take place. @@ -256,7 +263,7 @@ decl_module! { /// the equivocation proof and validate the given key ownership proof /// against the extracted offender. If both are valid, the offence will /// be reported. - #[weight = weight_for::report_equivocation::<T>(key_owner_proof.validator_count())] + #[weight = <T as Trait>::WeightInfo::report_equivocation(key_owner_proof.validator_count())] fn report_equivocation( origin, equivocation_proof: EquivocationProof<T::Header>, @@ -279,7 +286,7 @@ decl_module! { /// block authors will call it (validated in `ValidateUnsigned`), as such /// if the block author is defined it will be defined as the equivocation /// reporter. - #[weight = weight_for::report_equivocation::<T>(key_owner_proof.validator_count())] + #[weight = <T as Trait>::WeightInfo::report_equivocation(key_owner_proof.validator_count())] fn report_equivocation_unsigned( origin, equivocation_proof: EquivocationProof<T::Header>, @@ -296,38 +303,6 @@ decl_module! { } } -mod weight_for { - use frame_support::{ - traits::Get, - weights::{ - constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS}, - Weight, - }, - }; - - pub fn report_equivocation<T: super::Trait>(validator_count: u32) -> Weight { - // we take the validator set count from the membership proof to - // calculate the weight but we set a floor of 100 validators. - let validator_count = validator_count.max(100) as u64; - - // worst case we are considering is that the given offender - // is backed by 200 nominators - const MAX_NOMINATORS: u64 = 200; - - // checking membership proof - (35 * WEIGHT_PER_MICROS) - .saturating_add((175 * WEIGHT_PER_NANOS).saturating_mul(validator_count)) - .saturating_add(T::DbWeight::get().reads(5)) - // check equivocation proof - .saturating_add(110 * WEIGHT_PER_MICROS) - // report offence - .saturating_add(110 * WEIGHT_PER_MICROS) - .saturating_add(25 * WEIGHT_PER_MICROS * MAX_NOMINATORS) - .saturating_add(T::DbWeight::get().reads(14 + 3 * MAX_NOMINATORS)) - .saturating_add(T::DbWeight::get().writes(10 + 3 * MAX_NOMINATORS)) - } -} - impl<T: Trait> RandomnessT<<T as frame_system::Trait>::Hash> for Module<T> { /// Some BABE blocks have VRF outputs where the block producer has exactly one bit of influence, /// either they make the block or they do not make the block and thus someone else makes the diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index 925e301dea8..978740a5ce0 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -248,6 +248,7 @@ impl Trait for Test { )>>::IdentificationTuple; type HandleEquivocation = super::EquivocationHandler<Self::KeyOwnerIdentification, Offences>; + type WeightInfo = (); } pub type Balances = pallet_balances::Module<Test>; diff --git a/substrate/frame/babe/src/tests.rs b/substrate/frame/babe/src/tests.rs index 66229e5a6c8..6cfa7e41dff 100644 --- a/substrate/frame/babe/src/tests.rs +++ b/substrate/frame/babe/src/tests.rs @@ -593,7 +593,7 @@ fn report_equivocation_has_valid_weight() { // but there's a lower bound of 100 validators. assert!( (1..=100) - .map(weight_for::report_equivocation::<Test>) + .map(<Test as Trait>::WeightInfo::report_equivocation) .collect::<Vec<_>>() .windows(2) .all(|w| w[0] == w[1]) @@ -603,7 +603,7 @@ fn report_equivocation_has_valid_weight() { // with every extra validator. assert!( (100..=1000) - .map(weight_for::report_equivocation::<Test>) + .map(<Test as Trait>::WeightInfo::report_equivocation) .collect::<Vec<_>>() .windows(2) .all(|w| w[0] < w[1]) diff --git a/substrate/frame/grandpa/src/default_weights.rs b/substrate/frame/grandpa/src/default_weights.rs new file mode 100644 index 00000000000..4893fc2cf18 --- /dev/null +++ b/substrate/frame/grandpa/src/default_weights.rs @@ -0,0 +1,54 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Default weights for the GRANDPA Pallet +//! This file was not auto-generated. + +use frame_support::weights::{ + Weight, constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS, RocksDbWeight as DbWeight}, +}; + +impl crate::WeightInfo for () { + fn report_equivocation(validator_count: u32) -> Weight { + // we take the validator set count from the membership proof to + // calculate the weight but we set a floor of 100 validators. + let validator_count = validator_count.max(100) as u64; + + // worst case we are considering is that the given offender + // is backed by 200 nominators + const MAX_NOMINATORS: u64 = 200; + + // checking membership proof + (35 * WEIGHT_PER_MICROS) + .saturating_add((175 * WEIGHT_PER_NANOS).saturating_mul(validator_count)) + .saturating_add(DbWeight::get().reads(5)) + // check equivocation proof + .saturating_add(95 * WEIGHT_PER_MICROS) + // report offence + .saturating_add(110 * WEIGHT_PER_MICROS) + .saturating_add(25 * WEIGHT_PER_MICROS * MAX_NOMINATORS) + .saturating_add(DbWeight::get().reads(14 + 3 * MAX_NOMINATORS)) + .saturating_add(DbWeight::get().writes(10 + 3 * MAX_NOMINATORS)) + // fetching set id -> session index mappings + .saturating_add(DbWeight::get().reads(2)) + } + + fn note_stalled() -> Weight { + (3 * WEIGHT_PER_MICROS) + .saturating_add(DbWeight::get().writes(1)) + } +} diff --git a/substrate/frame/grandpa/src/lib.rs b/substrate/frame/grandpa/src/lib.rs index 893bfc0dd5b..9a592ab9266 100644 --- a/substrate/frame/grandpa/src/lib.rs +++ b/substrate/frame/grandpa/src/lib.rs @@ -41,7 +41,7 @@ use fg_primitives::{ }; use frame_support::{ decl_error, decl_event, decl_module, decl_storage, dispatch::DispatchResultWithPostInfo, - storage, traits::KeyOwnerProofSystem, weights::Pays, Parameter, + storage, traits::KeyOwnerProofSystem, weights::{Pays, Weight}, Parameter, }; use frame_system::{ensure_none, ensure_root, ensure_signed}; use pallet_finality_tracker::OnFinalizationStalled; @@ -54,6 +54,7 @@ use sp_session::{GetSessionNumber, GetValidatorCount}; use sp_staking::SessionIndex; mod equivocation; +mod default_weights; #[cfg(any(feature = "runtime-benchmarks", test))] mod benchmarking; @@ -97,6 +98,14 @@ pub trait Trait: frame_system::Trait { /// `()`) you must use this pallet's `ValidateUnsigned` in the runtime /// definition. type HandleEquivocation: HandleEquivocation<Self>; + + /// Weights for this pallet. + type WeightInfo: WeightInfo; +} + +pub trait WeightInfo { + fn report_equivocation(validator_count: u32) -> Weight; + fn note_stalled() -> Weight; } /// A stored pending change, old format. @@ -242,7 +251,7 @@ decl_module! { /// equivocation proof and validate the given key ownership proof /// against the extracted offender. If both are valid, the offence /// will be reported. - #[weight = weight_for::report_equivocation::<T>(key_owner_proof.validator_count())] + #[weight = T::WeightInfo::report_equivocation(key_owner_proof.validator_count())] fn report_equivocation( origin, equivocation_proof: EquivocationProof<T::Hash, T::BlockNumber>, @@ -266,7 +275,7 @@ decl_module! { /// block authors will call it (validated in `ValidateUnsigned`), as such /// if the block author is defined it will be defined as the equivocation /// reporter. - #[weight = weight_for::report_equivocation::<T>(key_owner_proof.validator_count())] + #[weight = T::WeightInfo::report_equivocation(key_owner_proof.validator_count())] fn report_equivocation_unsigned( origin, equivocation_proof: EquivocationProof<T::Hash, T::BlockNumber>, @@ -288,7 +297,7 @@ decl_module! { /// forced change will not be re-orged (e.g. 1000 blocks). The GRANDPA voters /// will start the new authority set using the given finalized block as base. /// Only callable by root. - #[weight = weight_for::note_stalled::<T>()] + #[weight = T::WeightInfo::note_stalled()] fn note_stalled( origin, delay: T::BlockNumber, @@ -364,45 +373,6 @@ decl_module! { } } -mod weight_for { - use frame_support::{ - traits::Get, - weights::{ - constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS}, - Weight, - }, - }; - - pub fn report_equivocation<T: super::Trait>(validator_count: u32) -> Weight { - // we take the validator set count from the membership proof to - // calculate the weight but we set a floor of 100 validators. - let validator_count = validator_count.max(100) as u64; - - // worst case we are considering is that the given offender - // is backed by 200 nominators - const MAX_NOMINATORS: u64 = 200; - - // checking membership proof - (35 * WEIGHT_PER_MICROS) - .saturating_add((175 * WEIGHT_PER_NANOS).saturating_mul(validator_count)) - .saturating_add(T::DbWeight::get().reads(5)) - // check equivocation proof - .saturating_add(95 * WEIGHT_PER_MICROS) - // report offence - .saturating_add(110 * WEIGHT_PER_MICROS) - .saturating_add(25 * WEIGHT_PER_MICROS * MAX_NOMINATORS) - .saturating_add(T::DbWeight::get().reads(14 + 3 * MAX_NOMINATORS)) - .saturating_add(T::DbWeight::get().writes(10 + 3 * MAX_NOMINATORS)) - // fetching set id -> session index mappings - .saturating_add(T::DbWeight::get().reads(2)) - } - - pub fn note_stalled<T: super::Trait>() -> Weight { - (3 * WEIGHT_PER_MICROS) - .saturating_add(T::DbWeight::get().writes(1)) - } -} - impl<T: Trait> Module<T> { /// Get the current set of authorities, along with their respective weights. pub fn grandpa_authorities() -> AuthorityList { diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs index 7358d50e260..7aeab445075 100644 --- a/substrate/frame/grandpa/src/mock.rs +++ b/substrate/frame/grandpa/src/mock.rs @@ -262,6 +262,8 @@ impl Trait for Test { )>>::IdentificationTuple; type HandleEquivocation = super::EquivocationHandler<Self::KeyOwnerIdentification, Offences>; + + type WeightInfo = (); } mod pallet_grandpa { diff --git a/substrate/frame/grandpa/src/tests.rs b/substrate/frame/grandpa/src/tests.rs index 951b28df57e..4916808fe00 100644 --- a/substrate/frame/grandpa/src/tests.rs +++ b/substrate/frame/grandpa/src/tests.rs @@ -850,7 +850,7 @@ fn report_equivocation_has_valid_weight() { // but there's a lower bound of 100 validators. assert!( (1..=100) - .map(weight_for::report_equivocation::<Test>) + .map(<Test as Trait>::WeightInfo::report_equivocation) .collect::<Vec<_>>() .windows(2) .all(|w| w[0] == w[1]) @@ -860,7 +860,7 @@ fn report_equivocation_has_valid_weight() { // with every extra validator. assert!( (100..=1000) - .map(weight_for::report_equivocation::<Test>) + .map(<Test as Trait>::WeightInfo::report_equivocation) .collect::<Vec<_>>() .windows(2) .all(|w| w[0] < w[1]) diff --git a/substrate/test-utils/runtime/src/lib.rs b/substrate/test-utils/runtime/src/lib.rs index a67d2455be1..44136546814 100644 --- a/substrate/test-utils/runtime/src/lib.rs +++ b/substrate/test-utils/runtime/src/lib.rs @@ -492,6 +492,8 @@ impl pallet_babe::Trait for Runtime { )>>::IdentificationTuple; type HandleEquivocation = (); + + type WeightInfo = (); } /// Adds one to the given input and returns the final result. -- GitLab