pallet_shards/
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
use super::*;
use crate::{Config, Pallet};

use frame_benchmarking::benchmarks;
use frame_support::{assert_ok, traits::Get};
use frame_system::RawOrigin;
use polkadot_sdk::{frame_benchmarking, frame_support, frame_system, sp_runtime, sp_std};
use sp_runtime::{BoundedVec, Saturating};

use sp_std::vec;
use sp_std::vec::Vec;

use time_primitives::{
	AccountId, Commitment, ElectionsInterface, NetworkId, ProofOfKnowledge, ShardStatus,
	ShardsInterface,
};

pub const ALICE: [u8; 32] = [1u8; 32];
pub const BOB: [u8; 32] = [2u8; 32];
pub const CHARLIE: [u8; 32] = [3u8; 32];
pub const ETHEREUM: NetworkId = 0;
const SHARD_ID: u64 = 0;

// Since benchmarks are no-std and we need std computation on constructing proof so
// these values are taken by running the code in pallets/shards/src/tests.rs
// in a seperate tests and then taking the data from commitment and pok and using them here.

pub const ALICE_COMMITMENT: [u8; 33] = [
	3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96,
	72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143,
];
pub const BOB_COMMITMENT: [u8; 33] = [
	2, 77, 75, 108, 209, 54, 16, 50, 202, 155, 210, 174, 185, 217, 0, 170, 77, 69, 217, 234, 216,
	10, 201, 66, 51, 116, 196, 81, 167, 37, 77, 7, 102,
];
pub const CHARLIE_COMMITMENT: [u8; 33] = [
	2, 83, 31, 230, 6, 129, 52, 80, 61, 39, 35, 19, 50, 39, 200, 103, 172, 143, 166, 200, 60, 83,
	126, 154, 68, 195, 197, 189, 189, 203, 31, 227, 55,
];
pub const ALICE_POK: ProofOfKnowledge = [
	2, 130, 142, 156, 2, 13, 251, 97, 156, 208, 17, 0, 246, 123, 48, 97, 171, 221, 27, 179, 198,
	196, 203, 31, 198, 249, 181, 23, 239, 34, 197, 193, 206, 128, 187, 250, 214, 213, 204, 223,
	189, 100, 9, 39, 120, 37, 224, 56, 143, 248, 172, 139, 127, 95, 54, 51, 144, 241, 239, 134, 86,
	214, 45, 191, 237,
];
pub const BOB_POK: ProofOfKnowledge = [
	2, 228, 146, 211, 147, 253, 131, 230, 153, 86, 219, 237, 174, 73, 215, 139, 20, 38, 17, 79,
	100, 229, 78, 191, 233, 254, 98, 92, 213, 100, 162, 70, 79, 205, 137, 138, 183, 209, 11, 130,
	174, 14, 171, 144, 83, 20, 227, 233, 15, 27, 247, 11, 145, 142, 24, 41, 88, 80, 78, 175, 163,
	130, 204, 191, 137,
];
pub const CHARLIE_POK: ProofOfKnowledge = [
	3, 57, 183, 166, 234, 228, 13, 139, 136, 54, 192, 207, 166, 77, 49, 160, 100, 97, 84, 244, 204,
	111, 158, 214, 72, 185, 254, 195, 139, 87, 231, 148, 76, 186, 107, 203, 85, 70, 175, 100, 117,
	123, 134, 165, 76, 77, 20, 6, 24, 216, 29, 182, 93, 75, 80, 152, 224, 73, 163, 34, 141, 42, 58,
	147, 134,
];

pub fn get_commitment(member: [u8; 32]) -> Commitment {
	let commitment = match member {
		ALICE => ALICE_COMMITMENT,
		BOB => BOB_COMMITMENT,
		CHARLIE => CHARLIE_COMMITMENT,
		_ => {
			panic!("Invalid member")
		},
	};
	Commitment(BoundedVec::truncate_from(vec![commitment]))
}
pub fn get_proof_of_knowledge(member: [u8; 32]) -> ProofOfKnowledge {
	match member {
		ALICE => ALICE_POK,
		BOB => BOB_POK,
		CHARLIE => CHARLIE_POK,
		_ => {
			panic!("Invalid member")
		},
	}
}

benchmarks! {
	where_clause {  where T: pallet_members::Config }
	commit {
		let shard: Vec<[u8; 32]> = vec![ALICE, BOB, CHARLIE];
		assert_ok!(Pallet::<T>::create_shard(ETHEREUM, shard.clone().into_iter().map(|x| x.into()).collect::<Vec<AccountId>>(), 1));
		let alice: AccountId = ALICE.into();
		// benchmark commitment that changes shard status
		for member in shard {
			let member_account: AccountId = member.into();
			pallet_members::Pallet::<T>::register_member(
				RawOrigin::Root.into(),
				ETHEREUM,
				member_account.clone(),
				member,
			)?;
			if member != ALICE {
				Pallet::<T>::commit(
					RawOrigin::Signed(member_account.clone()).into(),
					0,
					get_commitment(member_account.clone().into()),
					get_proof_of_knowledge(member_account.into()),
				)?;
			}
		}
	}: _(RawOrigin::Signed(ALICE.into()), SHARD_ID, get_commitment(ALICE),
	get_proof_of_knowledge(ALICE))
	verify { }

	ready {
		let shard: Vec<[u8; 32]> = vec![ALICE, BOB, CHARLIE];
		assert_ok!(Pallet::<T>::create_shard(ETHEREUM, shard.clone().into_iter().map(|x| x.into()).collect::<Vec<AccountId>>(), 1));
		for member in shard.clone() {
			let member_account: AccountId = member.into();
			pallet_members::Pallet::<T>::register_member(
				RawOrigin::Root.into(),
				ETHEREUM,
				member_account.clone(),
				member,
			)?;
			Pallet::<T>::commit(
				RawOrigin::Signed(member_account.clone()).into(),
				0,
				get_commitment(member_account.clone().into()),
				get_proof_of_knowledge(member_account.into()),
			)?;
		}
		// benchmark ready that changes shard status
		for member in shard {
			if member != ALICE {
				Pallet::<T>::ready(
					RawOrigin::Signed(member.into()).into(),
					SHARD_ID,
				)?;
			}
		}
	}: _(RawOrigin::Signed(ALICE.into()), SHARD_ID)
	verify { }

	force_shard_offline {
		let shard: Vec<AccountId> = vec![ALICE.into(), BOB.into(), CHARLIE.into()];
		assert_ok!(Pallet::<T>::create_shard(ETHEREUM, shard.clone(), 1));
	}: _(RawOrigin::Root, SHARD_ID)
	verify { }

	timeout_dkgs {
		let b in 1..<<T as Config>::Elections as ElectionsInterface>::MaxElectionsPerBlock::get();
		for i in 0..b {
			assert_ok!(Pallet::<T>::create_shard(ETHEREUM, vec![ALICE.into(), BOB.into(), CHARLIE.into()], 1));
			assert_eq!(ShardState::<T>::get(i as u64), Some(ShardStatus::Created));
		}
		let timeout_block = frame_system::Pallet::<T>::block_number().saturating_add(T::DkgTimeout::get());
	}: {
		Pallet::<T>::timeout_dkgs(timeout_block);
	} verify {
		for i in 0..b {
			assert_eq!(ShardState::<T>::get(i as u64), Some(ShardStatus::Offline));
		}
	}

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