Fast Unstake Pallet (#12129)

* add failing test for itamar

* an ugly example of fast unstake

* Revert "add failing test for itamar"

This reverts commit 16c4d8015698a0684c090c54fce8b470a2d2feb2.

* fast unstake wip

* clean it up a bit

* some comments

* on_idle logic

* fix

* comment

* new working version, checks all pass, looking good

* some notes

* add mock boilerplate

* more boilerplate

* simplify the weight stuff

* ExtBuilder for pools

* fmt

* rm bags-list, simplify setup_works

* mock + tests boilerplate

* make some benchmarks work

* mock boilerplate

* tests boilerplate

* run_to_block works

* add Error enums

* add test

* note

* make UnstakeRequest fields pub

* some tests

* fix origin

* fmt

* add fast_unstake_events_since_last_call

* text

* rewrite some benchmes and fix them -- the outcome is still strange

* Fix weights

* cleanup

* Update frame/election-provider-support/solution-type/src/single_page.rs

* fix build

* Fix pools tests

* iterate teset + mock

* test unfinished

* cleanup and add some tests

* add test successful_multi_queue

* comment

* rm Head check

* add TODO

* complete successful_multi_queue

* + test early_exit

* fix a lot of things above the beautiful atlantic ocean 🌊

* seemingly it is finished now

* Fix build

* ".git/.scripts/fmt.sh" 1

* Fix slashing amount as well

* better docs

* abstract types

* rm use

* import

* Update frame/nomination-pools/benchmarking/src/lib.rs

Co-authored-by: Nitwit <47109040+nitwit69@users.noreply.github.com>

* Update frame/fast-unstake/src/types.rs

Co-authored-by: Nitwit <47109040+nitwit69@users.noreply.github.com>

* Fix build

* fmt

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Keith Yeung <kungfukeith11@gmail.com>

* make bounded

* feedback from code review with Ankan

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/lib.rs

Co-authored-by: Roman Useinov <roman.useinov@gmail.com>

* Update frame/fast-unstake/src/mock.rs

* update to master

* some final review comments

* fmt

* fix clippy

* remove unused

* ".git/.scripts/fmt.sh" 1

* make it all build again

* fmt

* undo fishy change

Co-authored-by: Ross Bulat <ross@jkrbinvestments.com>
Co-authored-by: command-bot <>
Co-authored-by: Nitwit <47109040+nitwit69@users.noreply.github.com>
Co-authored-by: Keith Yeung <kungfukeith11@gmail.com>
Co-authored-by: Roman Useinov <roman.useinov@gmail.com>
This commit is contained in:
Kian Paimani
2022-09-23 10:36:33 +01:00
committed by GitHub
parent 34bfd2ad00
commit b56c0e4cb6
21 changed files with 2650 additions and 29 deletions
+210
View File
@@ -0,0 +1,210 @@
// This file is part of Substrate.
// Copyright (C) 2022 Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Autogenerated weights for pallet_fast_unstake
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2022-09-07, STEPS: `10`, REPEAT: 1, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! HOSTNAME: `Kians-MacBook-Pro-2.local`, CPU: `<UNKNOWN>`
//! EXECUTION: Some(Native), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024
// Executed Command:
// target/release/substrate
// benchmark
// pallet
// --steps=10
// --repeat=1
// --pallet=pallet_fast_unstake
// --extrinsic=*
// --execution=native
// --output
// weight.rs
// --template
// ./.maintain/frame-weight-template.hbs
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
#![allow(unused_imports)]
use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}};
use sp_std::marker::PhantomData;
/// Weight functions needed for pallet_fast_unstake.
pub trait WeightInfo {
fn on_idle_unstake() -> Weight;
fn on_idle_check(x: u32, ) -> Weight;
fn register_fast_unstake() -> Weight;
fn deregister() -> Weight;
fn control() -> Weight;
}
/// Weights for pallet_fast_unstake using the Substrate node and recommended hardware.
pub struct SubstrateWeight<T>(PhantomData<T>);
impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0)
// Storage: Staking ValidatorCount (r:1 w:0)
// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0)
// Storage: FastUnstake Head (r:1 w:1)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking SlashingSpans (r:1 w:0)
// Storage: Staking Bonded (r:2 w:1)
// Storage: Staking Ledger (r:2 w:2)
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:0)
// Storage: System Account (r:3 w:2)
// Storage: Balances Locks (r:2 w:2)
// Storage: NominationPools MinJoinBond (r:1 w:0)
// Storage: NominationPools PoolMembers (r:1 w:1)
// Storage: NominationPools BondedPools (r:1 w:1)
// Storage: NominationPools RewardPools (r:1 w:1)
// Storage: NominationPools MaxPoolMembersPerPool (r:1 w:0)
// Storage: NominationPools MaxPoolMembers (r:1 w:0)
// Storage: NominationPools CounterForPoolMembers (r:1 w:1)
// Storage: BagsList ListNodes (r:1 w:0)
// Storage: Staking Payee (r:0 w:1)
fn on_idle_unstake() -> Weight {
Weight::from_ref_time(102_000_000 as u64)
.saturating_add(T::DbWeight::get().reads(25 as u64))
.saturating_add(T::DbWeight::get().writes(13 as u64))
}
// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0)
// Storage: Staking ValidatorCount (r:1 w:0)
// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0)
// Storage: FastUnstake Head (r:1 w:1)
// Storage: FastUnstake Queue (r:2 w:1)
// Storage: FastUnstake CounterForQueue (r:1 w:1)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking ErasStakers (r:1344 w:0)
/// The range of component `x` is `[672, 86016]`.
fn on_idle_check(x: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 244_000
.saturating_add(Weight::from_ref_time(13_913_000 as u64).saturating_mul(x as u64))
.saturating_add(T::DbWeight::get().reads(585 as u64))
.saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(x as u64)))
.saturating_add(T::DbWeight::get().writes(3 as u64))
}
// Storage: Staking Ledger (r:1 w:1)
// Storage: Staking Nominators (r:1 w:1)
// Storage: FastUnstake Queue (r:1 w:1)
// Storage: FastUnstake Head (r:1 w:0)
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:1 w:1)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Balances Locks (r:1 w:1)
// Storage: FastUnstake CounterForQueue (r:1 w:1)
fn register_fast_unstake() -> Weight {
Weight::from_ref_time(57_000_000 as u64)
.saturating_add(T::DbWeight::get().reads(12 as u64))
.saturating_add(T::DbWeight::get().writes(9 as u64))
}
// Storage: Staking Ledger (r:1 w:0)
// Storage: FastUnstake Queue (r:1 w:1)
// Storage: FastUnstake Head (r:1 w:0)
// Storage: FastUnstake CounterForQueue (r:1 w:1)
fn deregister() -> Weight {
Weight::from_ref_time(15_000_000 as u64)
.saturating_add(T::DbWeight::get().reads(4 as u64))
.saturating_add(T::DbWeight::get().writes(2 as u64))
}
// Storage: FastUnstake ErasToCheckPerBlock (r:0 w:1)
fn control() -> Weight {
Weight::from_ref_time(3_000_000 as u64)
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
}
// For backwards compatibility and tests
impl WeightInfo for () {
// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0)
// Storage: Staking ValidatorCount (r:1 w:0)
// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0)
// Storage: FastUnstake Head (r:1 w:1)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking SlashingSpans (r:1 w:0)
// Storage: Staking Bonded (r:2 w:1)
// Storage: Staking Ledger (r:2 w:2)
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:0)
// Storage: System Account (r:3 w:2)
// Storage: Balances Locks (r:2 w:2)
// Storage: NominationPools MinJoinBond (r:1 w:0)
// Storage: NominationPools PoolMembers (r:1 w:1)
// Storage: NominationPools BondedPools (r:1 w:1)
// Storage: NominationPools RewardPools (r:1 w:1)
// Storage: NominationPools MaxPoolMembersPerPool (r:1 w:0)
// Storage: NominationPools MaxPoolMembers (r:1 w:0)
// Storage: NominationPools CounterForPoolMembers (r:1 w:1)
// Storage: BagsList ListNodes (r:1 w:0)
// Storage: Staking Payee (r:0 w:1)
fn on_idle_unstake() -> Weight {
Weight::from_ref_time(102_000_000 as u64)
.saturating_add(RocksDbWeight::get().reads(25 as u64))
.saturating_add(RocksDbWeight::get().writes(13 as u64))
}
// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0)
// Storage: Staking ValidatorCount (r:1 w:0)
// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0)
// Storage: FastUnstake Head (r:1 w:1)
// Storage: FastUnstake Queue (r:2 w:1)
// Storage: FastUnstake CounterForQueue (r:1 w:1)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking ErasStakers (r:1344 w:0)
/// The range of component `x` is `[672, 86016]`.
fn on_idle_check(x: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 244_000
.saturating_add(Weight::from_ref_time(13_913_000 as u64).saturating_mul(x as u64))
.saturating_add(RocksDbWeight::get().reads(585 as u64))
.saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(x as u64)))
.saturating_add(RocksDbWeight::get().writes(3 as u64))
}
// Storage: Staking Ledger (r:1 w:1)
// Storage: Staking Nominators (r:1 w:1)
// Storage: FastUnstake Queue (r:1 w:1)
// Storage: FastUnstake Head (r:1 w:0)
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:1 w:1)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Balances Locks (r:1 w:1)
// Storage: FastUnstake CounterForQueue (r:1 w:1)
fn register_fast_unstake() -> Weight {
Weight::from_ref_time(57_000_000 as u64)
.saturating_add(RocksDbWeight::get().reads(12 as u64))
.saturating_add(RocksDbWeight::get().writes(9 as u64))
}
// Storage: Staking Ledger (r:1 w:0)
// Storage: FastUnstake Queue (r:1 w:1)
// Storage: FastUnstake Head (r:1 w:0)
// Storage: FastUnstake CounterForQueue (r:1 w:1)
fn deregister() -> Weight {
Weight::from_ref_time(15_000_000 as u64)
.saturating_add(RocksDbWeight::get().reads(4 as u64))
.saturating_add(RocksDbWeight::get().writes(2 as u64))
}
// Storage: FastUnstake ErasToCheckPerBlock (r:0 w:1)
fn control() -> Weight {
Weight::from_ref_time(3_000_000 as u64)
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
}