mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 03:31:05 +00:00
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:
@@ -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))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user