Staking: Add deprecate_controller_batch AdminOrigin call (#2589)

Partially Addresses #2500

Adds a `deprecate_controller_batch` call to the staking pallet that is
callable by `Root` and `StakingAdmin`. To be used for controller account
deprecation and removed thereafter. Adds
`MaxControllersDeprecationBatch` pallet constant that defines max
possible deprecations per call.

- [x] Add `deprecate_controller_batch` call, and
`MaxControllersInDeprecationBatch` constant.
- [x] Add tests, benchmark, weights. Tests that weight is only consumed
if unique pair.
- [x] Adds `StakingAdmin` origin to staking's `AdminOrigin` type in
westend runtime.
- [x] Determined that worst case 5,900 deprecations does fit into
`maxBlock` `proofSize` and `refTime` in both normal and operational
thresholds, meaning we can deprecate all controllers for each network in
one call.

## Block Weights

By querying `consts.system.blockWeights` we can see that the
`deprecate_controller_batch` weights fit within the `normal` threshold
on Polkadot.

#### `controller_deprecation_batch` where i = 5900:
#### Ref time: 69,933,325,300
#### Proof size: 21,040,390

### Polkadot 

```
// consts.query.blockWeights

maxBlock: {
        refTime: 2,000,000,000,000
        proofSize: 18,446,744,073,709,551,615
}
normal: {
 maxExtrinsic: {
	refTime: 1,479,873,955,000
	proofSize: 13,650,590,614,545,068,195
 }
 maxTotal: {
	refTime: 1,500,000,000,000
	proofSize: 13,835,058,055,282,163,711
 }
}
```

### Kusama

```
// consts.query.blockWeights

  maxBlock: {
    refTime: 2,000,000,000,000
    proofSize: 18,446,744,073,709,551,615
  }
    normal: {
      maxExtrinsic: {
        refTime: 1,479,875,294,000
        proofSize: 13,650,590,614,545,068,195
      }
      maxTotal: {
        refTime: 1,500,000,000,000
        proofSize: 13,835,058,055,282,163,711
      }
}
```

---------

Co-authored-by: command-bot <>
Co-authored-by: Gonçalo Pestana <g6pestana@gmail.com>
This commit is contained in:
Ross Bulat
2023-12-12 13:23:02 +07:00
committed by GitHub
parent c2d45e7e47
commit 048a9c2744
19 changed files with 624 additions and 285 deletions
@@ -25,6 +25,7 @@ use codec::Decode;
use frame_election_provider_support::{bounds::DataProviderBounds, SortedListProvider};
use frame_support::{
pallet_prelude::*,
storage::bounded_vec::BoundedVec,
traits::{Currency, Get, Imbalance, UnfilteredDispatchable},
};
use sp_runtime::{
@@ -525,6 +526,39 @@ benchmarks! {
assert_eq!(Invulnerables::<T>::get().len(), v as usize);
}
deprecate_controller_batch {
// We pass a dynamic number of controllers to the benchmark, up to
// `MaxControllersInDeprecationBatch`.
let i in 0 .. T::MaxControllersInDeprecationBatch::get();
let mut controllers: Vec<_> = vec![];
let mut stashes: Vec<_> = vec![];
for n in 0..i as u32 {
let (stash, controller) = create_unique_stash_controller::<T>(
n,
100,
RewardDestination::Staked,
false
)?;
controllers.push(controller);
stashes.push(stash);
}
let bounded_controllers: BoundedVec<_, T::MaxControllersInDeprecationBatch> =
BoundedVec::try_from(controllers.clone()).unwrap();
}: _(RawOrigin::Root, bounded_controllers)
verify {
for n in 0..i as u32 {
let stash = &stashes[n as usize];
let controller = &controllers[n as usize];
// Ledger no longer keyed by controller.
assert_eq!(Ledger::<T>::get(controller), None);
// Bonded now maps to the stash.
assert_eq!(Bonded::<T>::get(stash), Some(stash.clone()));
// Ledger is now keyed by stash.
assert_eq!(Ledger::<T>::get(stash).unwrap().stash, *stash);
}
}
force_unstake {
// Slashing Spans
let s in 0 .. MAX_SPANS;