pallet_session_validator_management_benchmarking/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2#![cfg(any(feature = "runtime-benchmarks", test))]
3
4#[cfg(test)]
5mod mock;
6
7use frame_benchmarking::v2::*;
8use frame_support::BoundedVec;
9use frame_system::Pallet as System;
10use frame_system::RawOrigin;
11use pallet_aura::Pallet as Aura;
12use pallet_session_validator_management::Pallet as SessionCommitteeManagement;
13use parity_scale_codec::Encode;
14use sp_core::Get;
15use sp_runtime::traits::One;
16use sp_runtime::{Digest, DigestItem};
17use sp_std::{vec, vec::Vec};
18
19const SEED: u32 = 0;
20pub const SLOTS_PER_EPOCH: u32 = 60;
21
22pub trait Config: pallet_session_validator_management::Config + pallet_aura::Config {}
23pub struct Pallet<T: Config>(SessionCommitteeManagement<T>);
24
25fn set_epoch_number<T: Config>(epoch: u64) {
26	let slot = epoch * (SLOTS_PER_EPOCH as u64);
27
28	let pre_runtime_digest = Digest {
29		logs: vec![DigestItem::PreRuntime(sp_consensus_aura::AURA_ENGINE_ID, slot.encode())],
30	};
31	let block_number = System::<T>::block_number() + One::one();
32	System::<T>::initialize(&block_number, &System::<T>::parent_hash(), &pre_runtime_digest);
33	use frame_support::traits::OnInitialize;
34	Aura::<T>::on_initialize(block_number);
35
36	assert_eq!(T::current_epoch_number(), epoch.into());
37}
38
39use pallet_session_validator_management::Call;
40#[benchmarks(where <T as pallet_session_validator_management::Config>::CommitteeMember: From<(<T as pallet_session_validator_management::Config>::AuthorityId, <T as pallet_session_validator_management::Config>::AuthorityKeys)>)]
41pub mod benchmarks {
42	use super::*;
43
44	/// Benchmarking the `set()` extrinsic
45	///
46	/// `v` represents the number of validators that will be set in the new validators set
47	#[benchmark]
48	fn set(v: Linear<0, { T::MaxValidators::get() }>)
49	where
50		<T as pallet_session_validator_management::Config>::ScEpochNumber: From<ScEpochNumber>,
51	{
52		let validators: Vec<(
53			<T as pallet_session_validator_management::Config>::AuthorityId,
54			T::AuthorityKeys,
55		)> = (0..v)
56			.map(|i| {
57				(
58					account::<<T as pallet_session_validator_management::Config>::AuthorityId>(
59						"member", i, SEED,
60					),
61					// Contrary to its name, `account` can fill any `Decode`able type with garbage data
62					account::<<T as pallet_session_validator_management::Config>::AuthorityKeys>(
63						"member", i, SEED,
64					),
65				)
66			})
67			.collect();
68		let validators: BoundedVec<
69			<T as pallet_session_validator_management::Config>::CommitteeMember,
70			T::MaxValidators,
71		> = BoundedVec::truncate_from(validators.into_iter().map(|member| member.into()).collect());
72
73		let for_epoch_number = T::current_epoch_number() + One::one();
74		set_epoch_number::<T>(for_epoch_number.into());
75
76		#[extrinsic_call]
77		_(RawOrigin::None, validators, for_epoch_number, Default::default());
78	}
79
80	impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test);
81}