mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-11 23:31:07 +00:00
Properly defer slashes (#11823)
* initial draft of fixing slashing * fix test * Update frame/staking/src/tests.rs Co-authored-by: Piotr Mikołajczyk <piomiko41@gmail.com> * last touches * add more detail about unbonding * add migration * fmt Co-authored-by: Piotr Mikołajczyk <piomiko41@gmail.com> Co-authored-by: parity-processbot <>
This commit is contained in:
@@ -32,7 +32,7 @@ use frame_support::{
|
||||
use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin};
|
||||
use pallet_session::historical;
|
||||
use sp_runtime::{
|
||||
traits::{Bounded, Convert, SaturatedConversion, Saturating, StaticLookup, Zero},
|
||||
traits::{Bounded, Convert, One, SaturatedConversion, Saturating, StaticLookup, Zero},
|
||||
Perbill,
|
||||
};
|
||||
use sp_staking::{
|
||||
@@ -599,20 +599,17 @@ impl<T: Config> Pallet<T> {
|
||||
|
||||
/// Apply previously-unapplied slashes on the beginning of a new era, after a delay.
|
||||
fn apply_unapplied_slashes(active_era: EraIndex) {
|
||||
let slash_defer_duration = T::SlashDeferDuration::get();
|
||||
<Self as Store>::EarliestUnappliedSlash::mutate(|earliest| {
|
||||
if let Some(ref mut earliest) = earliest {
|
||||
let keep_from = active_era.saturating_sub(slash_defer_duration);
|
||||
for era in (*earliest)..keep_from {
|
||||
let era_slashes = <Self as Store>::UnappliedSlashes::take(&era);
|
||||
for slash in era_slashes {
|
||||
slashing::apply_slash::<T>(slash, era);
|
||||
}
|
||||
}
|
||||
|
||||
*earliest = (*earliest).max(keep_from)
|
||||
}
|
||||
})
|
||||
let era_slashes = <Self as Store>::UnappliedSlashes::take(&active_era);
|
||||
log!(
|
||||
debug,
|
||||
"found {} slashes scheduled to be executed in era {:?}",
|
||||
era_slashes.len(),
|
||||
active_era,
|
||||
);
|
||||
for slash in era_slashes {
|
||||
let slash_era = active_era.saturating_sub(T::SlashDeferDuration::get());
|
||||
slashing::apply_slash::<T>(slash, slash_era);
|
||||
}
|
||||
}
|
||||
|
||||
/// Add reward points to validators using their stash account ID.
|
||||
@@ -1209,11 +1206,6 @@ where
|
||||
}
|
||||
};
|
||||
|
||||
<Self as Store>::EarliestUnappliedSlash::mutate(|earliest| {
|
||||
if earliest.is_none() {
|
||||
*earliest = Some(active_era)
|
||||
}
|
||||
});
|
||||
add_db_reads_writes(1, 1);
|
||||
|
||||
let slash_defer_duration = T::SlashDeferDuration::get();
|
||||
@@ -1263,9 +1255,18 @@ where
|
||||
}
|
||||
} else {
|
||||
// Defer to end of some `slash_defer_duration` from now.
|
||||
<Self as Store>::UnappliedSlashes::mutate(active_era, move |for_later| {
|
||||
for_later.push(unapplied)
|
||||
});
|
||||
log!(
|
||||
debug,
|
||||
"deferring slash of {:?}% happened in {:?} (reported in {:?}) to {:?}",
|
||||
slash_fraction,
|
||||
slash_era,
|
||||
active_era,
|
||||
slash_era + slash_defer_duration + 1,
|
||||
);
|
||||
<Self as Store>::UnappliedSlashes::mutate(
|
||||
slash_era.saturating_add(slash_defer_duration).saturating_add(One::one()),
|
||||
move |for_later| for_later.push(unapplied),
|
||||
);
|
||||
add_db_reads_writes(1, 1);
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -477,10 +477,6 @@ pub mod pallet {
|
||||
ValueQuery,
|
||||
>;
|
||||
|
||||
/// The earliest era for which we have a pending, unapplied slash.
|
||||
#[pallet::storage]
|
||||
pub(crate) type EarliestUnappliedSlash<T> = StorageValue<_, EraIndex>;
|
||||
|
||||
/// The last planned session scheduled by the session pallet.
|
||||
///
|
||||
/// This is basically in sync with the call to [`pallet_session::SessionManager::new_session`].
|
||||
|
||||
Reference in New Issue
Block a user