Files
pezkuwi-subxt/substrate/frame/staking/CHANGELOG.md
Tsvetomir Dimitrov 988e30f102 Implementation of the new validator disabling strategy (#2226)
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/bbb6631641f9adba30c0ee6f4d11023a424dd362/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/bbb6631641f9adba30c0ee6f4d11023a424dd362/substrate/frame/staking/src/slashing.rs#L325)
from staking pallet.
* In
[`rotate_session`](https://github.com/paritytech/polkadot-sdk/blob/bdbe98297032e21a553bf191c530690b1d591405/substrate/frame/session/src/lib.rs#L623)
the `end_session` also calls
[`end_era`](https://github.com/paritytech/polkadot-sdk/blob/bbb6631641f9adba30c0ee6f4d11023a424dd362/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/bdbe98297032e21a553bf191c530690b1d591405/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/bbb6631641f9adba30c0ee6f4d11023a424dd362/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: ordian <noreply@reusable.software>
Co-authored-by: ordian <write@reusable.software>
Co-authored-by: Maciej <maciej.zyszkiewicz@parity.io>
Co-authored-by: Gonçalo Pestana <g6pestana@gmail.com>
Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
Co-authored-by: command-bot <>
Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com>
2024-04-26 13:28:08 +00:00

1.9 KiB

Changelog

All notable changes and migrations to pallet-staking will be documented in this file.

The format is loosely based on Keep a Changelog. We maintain a single integer version number for staking pallet to keep track of all storage migrations.

[v15]

Added

  • New trait DisablingStrategy which is responsible for making a decision which offenders should be disabled on new offence.
  • Default implementation of DisablingStrategy - UpToLimitDisablingStrategy. It disables each new offender up to a threshold (1/3 by default). Offenders are not runtime disabled for offences in previous era(s). But they will be low-priority node-side disabled for dispute initiation.
  • OffendingValidators storage item is replaced with DisabledValidators. The former keeps all offenders and if they are disabled or not. The latter just keeps a list of all offenders as they are disabled by default.

Deprecated

  • enum DisableStrategy is no longer needed because disabling is not related to the type of the offence anymore. A decision if a offender is disabled or not is made by a DisablingStrategy implementation.

v14

Added

  • New item ErasStakersPaged that keeps up to MaxExposurePageSize individual nominator exposures by era, validator and page.
  • New item ErasStakersOverview complementary to ErasStakersPaged which keeps state of own and total stake of the validator across pages.
  • New item ClaimedRewards to support paged rewards payout.

Deprecated

  • ErasStakers and ErasStakersClipped is deprecated, will not be used any longer for the exposures of the new era post v14 and can be removed after 84 eras once all the exposures are stale.
  • Field claimed_rewards in item Ledger is renamed to legacy_claimed_rewards and can be removed after 84 eras.