pub struct InactivityScoreTracker { /* private fields */ }Expand description
Per-validator inactivity-score store.
Implements DSL-088 (+ DSL-089/090 in later commits). Traces to SPEC §9.2.
§Storage
Vec<u64> indexed by validator_index. Size fixed at
construction; caller resizes at validator-set growth via
future resize DSL.
§Default
InactivityScoreTracker::new(n) zero-initialises all slots.
Implementations§
Source§impl InactivityScoreTracker
impl InactivityScoreTracker
Sourcepub fn new(validator_count: usize) -> Self
pub fn new(validator_count: usize) -> Self
New tracker sized for validator_count validators with
all scores at 0.
Sourcepub fn score(&self, validator_index: u32) -> Option<u64>
pub fn score(&self, validator_index: u32) -> Option<u64>
Read score at validator_index. None when out of
range.
Sourcepub fn validator_count(&self) -> usize
pub fn validator_count(&self) -> usize
Number of validator slots tracked.
Sourcepub fn set_score(&mut self, validator_index: u32, score: u64) -> bool
pub fn set_score(&mut self, validator_index: u32, score: u64) -> bool
Mutable score access for tests + DSL-089/090 rollout.
Sourcepub fn update_for_epoch(
&mut self,
participation: &ParticipationTracker,
in_finality_stall: bool,
)
pub fn update_for_epoch( &mut self, participation: &ParticipationTracker, in_finality_stall: bool, )
Apply per-epoch score deltas based on the just-finished
epoch’s participation (read from
participation.previous_flags).
Implements DSL-088. DSL-089 (miss + stall → +4) and DSL-090 (global -16 out of stall) extend the body in later commits.
§DSL-088 rule (hit decrement)
For every validator whose previous-epoch flags had
TIMELY_TARGET set, decrement the score by 1 saturating
at 0. Applies in BOTH regimes (stall + no-stall) — timely
target participation is the canonical signal for reducing
inactivity score, and the _in_finality_stall argument
is reserved (stored, not read) so future DSLs can pick
it up without changing the caller signature.
§Iteration
Iterates 0..min(validator_count, participation.validator_count()).
A validator that is tracked here but missing from the
participation tracker receives no delta (defensive: grow
happens at the tracker boundary, not here).
Sourcepub fn epoch_penalties(
&self,
effective_balances: &dyn EffectiveBalanceView,
in_finality_stall: bool,
) -> Vec<(u32, u64)>
pub fn epoch_penalties( &self, effective_balances: &dyn EffectiveBalanceView, in_finality_stall: bool, ) -> Vec<(u32, u64)>
Compute per-validator inactivity-leak debits for the current epoch.
Implements DSL-091. DSL-092 lands the in-stall penalty formula; for now the in-stall branch returns an empty vec, same as the out-of-stall branch.
§Out-of-stall (DSL-091)
!in_finality_stall → empty Vec<(u32, u64)>. Inactivity
penalties NEVER charge validators outside a stall — DSL-090
global recovery handles score decay and that is the only
no-stall effect.
§In-stall (DSL-092 — stub today)
Returns empty until DSL-092 lands the formula
penalty_mojos = eff_bal * score / INACTIVITY_PENALTY_QUOTIENT. Callers that iterate the
return see zero entries either way; once DSL-092 ships,
they’ll receive one (validator_index, penalty_mojos)
pair per validator whose score contributes.
Sourcepub fn rewind_on_reorg(&mut self, depth: u64) -> u64
pub fn rewind_on_reorg(&mut self, depth: u64) -> u64
Grow or shrink the score vector to validator_count
slots.
Implements DSL-093. Traces to SPEC §9.2, §10.
§Semantics
- Growing: new trailing slots initialise to 0. Matches the activation semantics — freshly-activated validators start with a clean inactivity record.
- Shrinking: trailing entries are dropped. Rarely used
(exits don’t reuse indices); provided for symmetry
with
ParticipationTracker::rotate_epoch. - Same size: no-op.
Existing scores in the preserved range are unchanged. Rewind the tracker on fork-choice reorg.
Implements the inactivity leg of DSL-130
rewind_all_on_reorg. Zeroes every score — the same
conservative-choice rationale as
ParticipationTracker::rewind_on_reorg: no historical
snapshots to restore, so fresh accumulation on the new
canonical tip is safest (no ghost inactivity penalties).
Returns the number of epochs dropped — computed by the
caller, not the tracker (the tracker does not carry an
epoch counter). Accepts the value as depth so the
DSL-130 ReorgReport can carry it uniformly with the
participation-side report.
pub fn resize_for(&mut self, validator_count: usize)
Trait Implementations§
Source§impl Clone for InactivityScoreTracker
impl Clone for InactivityScoreTracker
Source§fn clone(&self) -> InactivityScoreTracker
fn clone(&self) -> InactivityScoreTracker
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for InactivityScoreTracker
impl RefUnwindSafe for InactivityScoreTracker
impl Send for InactivityScoreTracker
impl Sync for InactivityScoreTracker
impl Unpin for InactivityScoreTracker
impl UnsafeUnpin for InactivityScoreTracker
impl UnwindSafe for InactivityScoreTracker
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.