pallet_elections/
benchmarking.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use super::*;
use crate::Pallet;

use pallet_members::MemberOnline;
use pallet_networks::{NetworkName, NetworkShardSize};
use polkadot_sdk::frame_benchmarking::benchmarks;
use polkadot_sdk::{frame_support::traits::Get, frame_system, sp_runtime};
use scale_codec::Encode;
use sp_runtime::{BoundedVec, Vec};
use time_primitives::{AccountId, ChainName, ElectionsInterface, NetworkId};
const ETHEREUM: NetworkId = 0;
const SHARD_SIZE: u16 = 3;

benchmarks! {
	where_clause { where T: pallet_members::Config + pallet_networks::Config }

	try_elect_shards {
		let b in 1..T::MaxElectionsPerBlock::get();
		// Insert network
		let net_name =
			ChainName(BoundedVec::truncate_from("ETHEREUM SEPOLIA".encode()));
		NetworkName::<T>::insert(ETHEREUM, net_name);
		// Register enough members for `b` new shards
		let mut all_new_shard_members = Vec::new();
		let account = |x, y| -> AccountId {
			let mut acc = [0u8; 32];
			acc[..16].copy_from_slice(&[x as u8; 16]);
			acc[16..].copy_from_slice(&[y as u8; 16]);
			Into::<AccountId>::into(acc)
		};
		for i in 0..b {
			for j in 0..NetworkShardSize::<T>::get(ETHEREUM).unwrap_or(SHARD_SIZE) {
				let member = account(i, j);
				MemberOnline::<T>::insert(member.clone(), ());
				Pallet::<T>::member_online(&member, ETHEREUM);
				all_new_shard_members.push(member);
			}
		}
		let pre_unassigned_count: u16 = Unassigned::<T>::get(ETHEREUM).len() as u16;
	}: {
		Pallet::<T>::try_elect_shards(ETHEREUM, b);
	} verify {
		let post_unassigned_count: u16 = Unassigned::<T>::get(ETHEREUM).len() as u16;
		// ShardSize # of unassigned were elected to a shard
		assert_eq!(
			pre_unassigned_count - post_unassigned_count,
			(b as u16).saturating_mul(NetworkShardSize::<T>::get(ETHEREUM).unwrap_or(SHARD_SIZE)),
		);
		let unassigned = Unassigned::<T>::get(ETHEREUM);
		// New shard members were removed from Unassigned
		for m in all_new_shard_members {
			assert!(!unassigned.contains(&m));
		}
	}

	impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test);
}