mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-29 07:58:00 +00:00
Audit fixes for election/staking decoupling part 2 (#8167)
* Base features and traits. * pallet and unsigned phase * Undo bad formattings. * some formatting cleanup. * Small self-cleanup. * Make it all build * self-review * Some doc tests. * Some changes from other PR * Fix session test * Update Cargo.lock * Update frame/election-provider-multi-phase/src/lib.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Some review comments * Rename + make encode/decode * Do an assert as well, just in case. * Fix build * Update frame/election-provider-multi-phase/src/unsigned.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Las comment * fix staking fuzzer. * cargo run --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_election_provider_multi_phase --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/election-provider-multi-phase/src/weights.rs --template=./.maintain/frame-weight-template.hbs * Add one last layer of feasibility check as well. * Last fixes to benchmarks * Some more docs. * cargo run --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_election_provider_multi_phase --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/election-provider-multi-phase/src/weights.rs --template=./.maintain/frame-weight-template.hbs * cargo run --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_election_provider_multi_phase --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/election-provider-multi-phase/src/weights.rs --template=./.maintain/frame-weight-template.hbs * Some nits * cargo run --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_staking --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/staking/src/weights.rs --template=./.maintain/frame-weight-template.hbs * Fix doc * Mkae ci green * Audit fixes for election-provider: part 2 signed phase. * Fix weight * Some grumbles. * Try and weigh to get_npos_voters * Fix build * Fix line width * cargo run --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_staking --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/staking/src/weights.rs --template=./.maintain/frame-weight-template.hbs * Fix tests. * Fix build * Reorg some stuff * More reorg. * Reorg done. * Fix build * Another rename * Fix build * Update frame/election-provider-multi-phase/src/mock.rs Co-authored-by: Peter Goodspeed-Niklaus <coriolinus@users.noreply.github.com> * nit * better doc * Line width * Fix build * Self-review * Self-review * Fix wan * cargo run --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_election_provider_multi_phase --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/election-provider-multi-phase/src/weights.rs --template=./.maintain/frame-weight-template.hbs * cargo run --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_staking --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/staking/src/weights.rs --template=./.maintain/frame-weight-template.hbs * fix build and review comments. * Update frame/election-provider-multi-phase/src/lib.rs Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> * add comment Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: Parity Benchmarking Bot <admin@parity.io> Co-authored-by: Peter Goodspeed-Niklaus <coriolinus@users.noreply.github.com>
This commit is contained in:
@@ -331,7 +331,7 @@ use sp_npos_elections::{
|
||||
to_supports, EvaluateSupport, seq_phragmen, generate_solution_type, is_score_better, Supports,
|
||||
VoteWeight, CompactSolution, PerThing128,
|
||||
};
|
||||
use sp_election_providers::ElectionProvider;
|
||||
use frame_election_provider_support::{ElectionProvider, data_provider};
|
||||
pub use weights::WeightInfo;
|
||||
|
||||
const STAKING_ID: LockIdentifier = *b"staking ";
|
||||
@@ -800,7 +800,7 @@ pub trait Config: frame_system::Config + SendTransactionTypes<Call<Self>> {
|
||||
type CurrencyToVote: CurrencyToVote<BalanceOf<Self>>;
|
||||
|
||||
/// Something that provides the election functionality.
|
||||
type ElectionProvider: sp_election_providers::ElectionProvider<
|
||||
type ElectionProvider: frame_election_provider_support::ElectionProvider<
|
||||
Self::AccountId,
|
||||
Self::BlockNumber,
|
||||
// we only accept an election provider that has staking as data provider.
|
||||
@@ -3345,19 +3345,45 @@ impl<T: Config> Module<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Config> sp_election_providers::ElectionDataProvider<T::AccountId, T::BlockNumber>
|
||||
impl<T: Config> frame_election_provider_support::ElectionDataProvider<T::AccountId, T::BlockNumber>
|
||||
for Module<T>
|
||||
{
|
||||
fn desired_targets() -> u32 {
|
||||
Self::validator_count()
|
||||
fn desired_targets() -> data_provider::Result<(u32, Weight)> {
|
||||
Ok((Self::validator_count(), <T as frame_system::Config>::DbWeight::get().reads(1)))
|
||||
}
|
||||
|
||||
fn voters() -> Vec<(T::AccountId, VoteWeight, Vec<T::AccountId>)> {
|
||||
Self::get_npos_voters()
|
||||
fn voters(
|
||||
maybe_max_len: Option<usize>,
|
||||
) -> data_provider::Result<(Vec<(T::AccountId, VoteWeight, Vec<T::AccountId>)>, Weight)> {
|
||||
// NOTE: reading these counts already needs to iterate a lot of storage keys, but they get
|
||||
// cached. This is okay for the case of `Ok(_)`, but bad for `Err(_)`, as the trait does not
|
||||
// report weight in failures.
|
||||
let nominator_count = <Nominators<T>>::iter().count();
|
||||
let validator_count = <Validators<T>>::iter().count();
|
||||
let voter_count = nominator_count.saturating_add(validator_count);
|
||||
|
||||
if maybe_max_len.map_or(false, |max_len| voter_count > max_len) {
|
||||
return Err("Voter snapshot too big");
|
||||
}
|
||||
|
||||
let slashing_span_count = <SlashingSpans<T>>::iter().count();
|
||||
let weight = T::WeightInfo::get_npos_voters(
|
||||
nominator_count as u32,
|
||||
validator_count as u32,
|
||||
slashing_span_count as u32,
|
||||
);
|
||||
Ok((Self::get_npos_voters(), weight))
|
||||
}
|
||||
|
||||
fn targets() -> Vec<T::AccountId> {
|
||||
Self::get_npos_targets()
|
||||
fn targets(maybe_max_len: Option<usize>) -> data_provider::Result<(Vec<T::AccountId>, Weight)> {
|
||||
let target_count = <Validators<T>>::iter().count();
|
||||
|
||||
if maybe_max_len.map_or(false, |max_len| target_count > max_len) {
|
||||
return Err("Target snapshot too big");
|
||||
}
|
||||
|
||||
let weight = <T as frame_system::Config>::DbWeight::get().reads(target_count as u64);
|
||||
Ok((Self::get_npos_targets(), weight))
|
||||
}
|
||||
|
||||
fn next_election_prediction(now: T::BlockNumber) -> T::BlockNumber {
|
||||
@@ -3391,15 +3417,45 @@ impl<T: Config> sp_election_providers::ElectionDataProvider<T::AccountId, T::Blo
|
||||
fn put_snapshot(
|
||||
voters: Vec<(T::AccountId, VoteWeight, Vec<T::AccountId>)>,
|
||||
targets: Vec<T::AccountId>,
|
||||
target_stake: Option<VoteWeight>,
|
||||
) {
|
||||
use sp_std::convert::TryFrom;
|
||||
targets.into_iter().for_each(|v| {
|
||||
let stake: BalanceOf<T> = target_stake
|
||||
.and_then(|w| <BalanceOf<T>>::try_from(w).ok())
|
||||
.unwrap_or(T::Currency::minimum_balance() * 100u32.into());
|
||||
<Bonded<T>>::insert(v.clone(), v.clone());
|
||||
<Ledger<T>>::insert(
|
||||
v.clone(),
|
||||
StakingLedger {
|
||||
stash: v.clone(),
|
||||
active: stake,
|
||||
total: stake,
|
||||
unlocking: vec![],
|
||||
claimed_rewards: vec![],
|
||||
},
|
||||
);
|
||||
<Validators<T>>::insert(
|
||||
v,
|
||||
ValidatorPrefs { commission: Perbill::zero(), blocked: false },
|
||||
);
|
||||
});
|
||||
|
||||
voters.into_iter().for_each(|(v, _s, t)| {
|
||||
voters.into_iter().for_each(|(v, s, t)| {
|
||||
let stake = <BalanceOf<T>>::try_from(s).unwrap_or_else(|_| {
|
||||
panic!("cannot convert a VoteWeight into BalanceOf, benchmark needs reconfiguring.")
|
||||
});
|
||||
<Bonded<T>>::insert(v.clone(), v.clone());
|
||||
<Ledger<T>>::insert(
|
||||
v.clone(),
|
||||
StakingLedger {
|
||||
stash: v.clone(),
|
||||
active: stake,
|
||||
total: stake,
|
||||
unlocking: vec![],
|
||||
claimed_rewards: vec![],
|
||||
},
|
||||
);
|
||||
<Nominators<T>>::insert(
|
||||
v,
|
||||
Nominations { targets: t, submitted_in: 0, suppressed: false },
|
||||
|
||||
Reference in New Issue
Block a user