Skip to content
  • Tsvetomir Dimitrov's avatar
    Implementation of the new validator disabling strategy (#2226) · 988e30f1
    Tsvetomir Dimitrov authored
    Closes https://github.com/paritytech/polkadot-sdk/issues/1966,
    https://github.com/paritytech/polkadot-sdk/issues/1963 and
    https://github.com/paritytech/polkadot-sdk/issues/1962.
    
    Disabling strategy specification
    [here](https://github.com/paritytech/polkadot-sdk/pull/2955). (Updated
    13/02/2024)
    
    Implements:
    * validator disabling for a whole era instead of just a session
    * no more than 1/3 of the validators in the active set are disabled
    Removes:
    * `DisableStrategy` enum - now each validator committing an offence is
    disabled.
    * New era is not forced if too many validators are disabled.
    
    Before this PR not all offenders were disabled. A decision was made
    based on [`enum
    DisableStrategy`](https://github.com/paritytech/polkadot-sdk/blob/bbb66316/substrate/primitives/staking/src/offence.rs#L54).
    Some offenders were disabled for a whole era, some just for a session,
    some were not disabled at all.
    
    This PR changes the disabling behaviour. Now a validator committing an
    offense is disabled immediately till the end of the current era.
    
    Some implementation notes:
    * `OffendingValidators` in pallet session keeps all offenders (this is
    not changed). However its type is changed from `Vec<(u32, bool)>` to
    `Vec<u32>`. The reason is simple - each offender is getting disabled so
    the bool doesn't make sense anymore.
    * When a validator is disabled it is first added to
    `OffendingValidators` and then to `DisabledValidators`. This is done in
    [`add_offending_validator`](https://github.com/paritytech/polkadot-sdk/blob/bbb66316/substrate/frame/staking/src/slashing.rs#L325)
    from staking pallet.
    * In
    [`rotate_session`](https://github.com/paritytech/polkadot-sdk/blob/bdbe9829/substrate/frame/session/src/lib.rs#L623)
    the `end_session` also calls
    [`end_era`](https://github.com/paritytech/polkadot-sdk/blob/bbb66316/substrate/frame/staking/src/pallet/impls.rs#L490)
    when an era ends. In this case `OffendingValidators` are cleared
    **(1)**.
    * Then in
    [`rotate_session`](https://github.com/paritytech/polkadot-sdk/blob/bdbe9829/substrate/frame/session/src/lib.rs#L623)
    `DisabledValidators` are cleared **(2)**
    * And finally (still in `rotate_session`) a call to
    [`start_session`](https://github.com/paritytech/polkadot-sdk/blob/bbb66316
    
    /substrate/frame/staking/src/pallet/impls.rs#L430)
    repopulates the disabled validators **(3)**.
    * The reason for this complication is that session pallet knows nothing
    abut eras. To overcome this on each new session the disabled list is
    repopulated (points 2 and 3). Staking pallet knows when a new era starts
    so with point 1 it ensures that the offenders list is cleared.
    
    ---------
    
    Co-authored-by: default avatarordian <[email protected]>
    Co-authored-by: default avatarordian <[email protected]>
    Co-authored-by: default avatarMaciej <[email protected]>
    Co-authored-by: default avatarGonçalo Pestana <[email protected]>
    Co-authored-by: default avatarKian Paimani <[email protected]>
    Co-authored-by: command-bot <>
    Co-authored-by: default avatarAnkan <[email protected]>
    988e30f1