babe: fix report_equivocation weight (#6936)

* babe: fix report_equivocation weight

* node: bump spec_version

* babe: fix floor in report_equivocation weight calculation

Co-authored-by: Gavin Wood <gavin@parity.io>

* grandpa: fix floor in report_equivocation weight calculation

* babe, grandpa: add test for weight_for::report_equivocation

Co-authored-by: Gavin Wood <gavin@parity.io>
This commit is contained in:
André Silva
2020-08-26 17:27:44 +01:00
committed by GitHub
parent 314d948687
commit a79c34778c
4 changed files with 67 additions and 10 deletions
+20 -9
View File
@@ -255,7 +255,7 @@ decl_module! {
/// the equivocation proof and validate the given key ownership proof /// the equivocation proof and validate the given key ownership proof
/// against the extracted offender. If both are valid, the offence will /// against the extracted offender. If both are valid, the offence will
/// be reported. /// be reported.
#[weight = weight::weight_for_report_equivocation::<T>()] #[weight = weight_for::report_equivocation::<T>(key_owner_proof.validator_count())]
fn report_equivocation( fn report_equivocation(
origin, origin,
equivocation_proof: EquivocationProof<T::Header>, equivocation_proof: EquivocationProof<T::Header>,
@@ -278,7 +278,7 @@ decl_module! {
/// block authors will call it (validated in `ValidateUnsigned`), as such /// block authors will call it (validated in `ValidateUnsigned`), as such
/// if the block author is defined it will be defined as the equivocation /// if the block author is defined it will be defined as the equivocation
/// reporter. /// reporter.
#[weight = weight::weight_for_report_equivocation::<T>()] #[weight = weight_for::report_equivocation::<T>(key_owner_proof.validator_count())]
fn report_equivocation_unsigned( fn report_equivocation_unsigned(
origin, origin,
equivocation_proof: EquivocationProof<T::Header>, equivocation_proof: EquivocationProof<T::Header>,
@@ -295,24 +295,35 @@ decl_module! {
} }
} }
mod weight { mod weight_for {
use frame_support::{ use frame_support::{
traits::Get, traits::Get,
weights::{constants::WEIGHT_PER_MICROS, Weight}, weights::{
constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS},
Weight,
},
}; };
pub fn weight_for_report_equivocation<T: super::Trait>() -> 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 // checking membership proof
(35 * WEIGHT_PER_MICROS) (35 * WEIGHT_PER_MICROS)
.saturating_add((175 * WEIGHT_PER_NANOS).saturating_mul(validator_count))
.saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().reads(5))
// check equivocation proof // check equivocation proof
.saturating_add(110 * WEIGHT_PER_MICROS) .saturating_add(110 * WEIGHT_PER_MICROS)
// report offence // report offence
.saturating_add(110 * WEIGHT_PER_MICROS) .saturating_add(110 * WEIGHT_PER_MICROS)
// worst case we are considering is that the given offender .saturating_add(25 * WEIGHT_PER_MICROS * MAX_NOMINATORS)
// is backed by 200 nominators .saturating_add(T::DbWeight::get().reads(14 + 3 * MAX_NOMINATORS))
.saturating_add(T::DbWeight::get().reads(14 + 3 * 200)) .saturating_add(T::DbWeight::get().writes(10 + 3 * MAX_NOMINATORS))
.saturating_add(T::DbWeight::get().writes(10 + 3 * 200))
} }
} }
+23
View File
@@ -585,3 +585,26 @@ fn report_equivocation_validate_unsigned_prevents_duplicates() {
); );
}); });
} }
#[test]
fn report_equivocation_has_valid_weight() {
// the weight depends on the size of the validator set,
// but there's a lower bound of 100 validators.
assert!(
(1..=100)
.map(weight_for::report_equivocation::<Test>)
.collect::<Vec<_>>()
.windows(2)
.all(|w| w[0] == w[1])
);
// after 100 validators the weight should keep increasing
// with every extra validator.
assert!(
(100..=1000)
.map(weight_for::report_equivocation::<Test>)
.collect::<Vec<_>>()
.windows(2)
.all(|w| w[0] < w[1])
);
}
+1 -1
View File
@@ -376,7 +376,7 @@ mod weight_for {
pub fn report_equivocation<T: super::Trait>(validator_count: u32) -> Weight { pub fn report_equivocation<T: super::Trait>(validator_count: u32) -> Weight {
// we take the validator set count from the membership proof to // we take the validator set count from the membership proof to
// calculate the weight but we set a floor of 100 validators. // calculate the weight but we set a floor of 100 validators.
let validator_count = validator_count.min(100) as u64; let validator_count = validator_count.max(100) as u64;
// worst case we are considering is that the given offender // worst case we are considering is that the given offender
// is backed by 200 nominators // is backed by 200 nominators
+23
View File
@@ -842,3 +842,26 @@ fn always_schedules_a_change_on_new_session_when_stalled() {
assert_eq!(Grandpa::current_set_id(), 2); assert_eq!(Grandpa::current_set_id(), 2);
}); });
} }
#[test]
fn report_equivocation_has_valid_weight() {
// the weight depends on the size of the validator set,
// but there's a lower bound of 100 validators.
assert!(
(1..=100)
.map(weight_for::report_equivocation::<Test>)
.collect::<Vec<_>>()
.windows(2)
.all(|w| w[0] == w[1])
);
// after 100 validators the weight should keep increasing
// with every extra validator.
assert!(
(100..=1000)
.map(weight_for::report_equivocation::<Test>)
.collect::<Vec<_>>()
.windows(2)
.all(|w| w[0] < w[1])
);
}