Skip to content

Commit b1434e8

Browse files
Developed generate_insert_output_descriptors_payload_sized method for the benchmarking module of the bitcoin vaults pallet. Developed the pallet bitcoin vaults benchmark for the finalize_proof extrinsic. Developed the pallet rbac benchmark for the tx_create_and_set_roles extrinsic. Developed the pallet rbac benchmark for the tx_remove_role_from_user extrinsic. Developed the pallet rbac benchmark for the tx_create_and_set_permissions extrinsic. Developed the pallet rbac benchmark for the assingn_role_to_user extrinsic. Developed the pallet rbac benchmark for the tx_revoke_permission_from_role extrinsic.
1 parent 3e35e06 commit b1434e8

File tree

3 files changed

+318
-1
lines changed

3 files changed

+318
-1
lines changed

pallets/bitcoin-vaults/src/benchmarking.rs

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! Confidential Docs pallet benchmarking.
1+
//! Bitcoin Vaults pallet benchmarking.
22
33
#![cfg(feature = "runtime-benchmarks")]
44

@@ -95,6 +95,23 @@ pub fn setup_vaults_sized<T: Config>(
9595
}
9696
}
9797

98+
pub fn generate_insert_output_descriptors_payload_sized<T: Config>(
99+
descriptor_size: u32,
100+
) -> Vec<SingleVaultPayload> {
101+
let mut payload = Vec::<SingleVaultPayload>::new();
102+
for (vault_id, vault) in <Vaults<T>>::iter() {
103+
if vault.offchain_status == BDKStatus::Pending {
104+
payload.push(SingleVaultPayload {
105+
vault_id,
106+
output_descriptor: generate_output_descriptor_sized::<T>(1, descriptor_size).into(),
107+
change_descriptor: generate_output_descriptor_sized::<T>(2, descriptor_size).into(),
108+
status: OffchainStatus::Valid,
109+
});
110+
}
111+
}
112+
payload
113+
}
114+
98115
pub fn setup_xpub_sized<T: Config>(owner: T::AccountId, id: u8, size: u32) {
99116
// println!("xpub id: {:?}", id);
100117
let xpub = generate_xpub_sized::<T>(id, size);
@@ -476,6 +493,12 @@ mod benchmarks {
476493
T::VaultDescriptionMaxLen::get(),
477494
T::MaxCosignersPerVault::get(),
478495
);
496+
assert_ok!(BitcoinVaults::<T>::create_proof(
497+
RawOrigin::Signed(owner.clone()).into(),
498+
vault_id,
499+
generate_description_sized::<T>(0, T::VaultDescriptionMaxLen::get()),
500+
generate_psbt_sized::<T>(1, s)
501+
));
479502
let cosigner = sign_proof_sized::<T>(vault_id, s, true, false).unwrap();
480503
let psbt = generate_psbt_sized::<T>(2, s);
481504
#[extrinsic_call]
@@ -485,6 +508,53 @@ mod benchmarks {
485508
assert_eq!(vault.cosigners.len(), proof.signed_psbts.len());
486509
}
487510

511+
#[benchmark]
512+
fn finalize_proof(s: Linear<2, { T::PSBTMaxLen::get() }>) {
513+
let owner: T::AccountId = account("owner", 0, SEED);
514+
setup_xpub_sized::<T>(owner.clone(), 0, T::XPubLen::get());
515+
let vault_id = setup_vault_sized::<T>(
516+
owner.clone(),
517+
0,
518+
T::XPubLen::get(),
519+
T::VaultDescriptionMaxLen::get(),
520+
T::MaxCosignersPerVault::get(),
521+
);
522+
assert_ok!(BitcoinVaults::<T>::create_proof(
523+
RawOrigin::Signed(owner.clone()).into(),
524+
vault_id,
525+
generate_description_sized::<T>(0, T::VaultDescriptionMaxLen::get()),
526+
generate_psbt_sized::<T>(1, s)
527+
));
528+
sign_proof_sized::<T>(vault_id, s, true, false).unwrap();
529+
let psbt = generate_psbt_sized::<T>(2, s);
530+
#[extrinsic_call]
531+
_(RawOrigin::Signed(owner.clone()), vault_id, psbt);
532+
let proof = BitcoinVaults::<T>::proof_of_reserve(vault_id).unwrap();
533+
assert_eq!(proof.status, ProposalStatus::Broadcasted);
534+
}
535+
536+
// #[benchmark]
537+
// fn ocw_insert_descriptors(
538+
// o: Linear<2, { T::OutputDescriptorMaxLen::get() }>,
539+
// v: Linear<1, { 1000 }>,
540+
// ) {
541+
// let owner: T::AccountId = account("owner", 0, SEED);
542+
// setup_xpub_sized::<T>(owner.clone(), 0, T::XPubLen::get());
543+
// setup_vaults_sized::<T>(
544+
// owner.clone(),
545+
// v,
546+
// T::XPubLen::get(),
547+
// T::VaultDescriptionMaxLen::get(),
548+
// T::MaxCosignersPerVault::get(),
549+
// );
550+
// let payload = generate_insert_output_descriptors_payload_sized(o);
551+
552+
// #[extrinsic_call]
553+
// _(RawOrigin::Unsigned, vault_id, psbt);
554+
// let proof = BitcoinVaults::<T>::proof_of_reserve(vault_id).unwrap();
555+
// assert_eq!(proof.status, ProposalStatus::Broadcasted);
556+
// }
557+
488558
impl_benchmark_test_suite! {
489559
BitcoinVaults,
490560
crate::mock::new_test_ext(),

pallets/rbac/src/benchmarking.rs

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
//! rbac pallet benchmarking.
2+
3+
#![cfg(feature = "runtime-benchmarks")]
4+
5+
use super::*;
6+
use crate::{types::*, Pallet as RBAC};
7+
use scale_info::prelude::*;
8+
9+
use frame_benchmarking::v2::*;
10+
use frame_support::{assert_ok, pallet_prelude::*, traits::Get};
11+
use frame_system::RawOrigin;
12+
use sp_io::hashing::blake2_256;
13+
14+
const SEED: u32 = 0;
15+
16+
pub fn generate_pallet_id_sized(id: u8, size: u32) -> IdOrVec {
17+
IdOrVec::Vec(generate_vector(0, id, size))
18+
}
19+
20+
pub fn generate_role_sized(id: u8, size: u32) -> Vec<u8> {
21+
generate_vector(1, id, size)
22+
}
23+
24+
pub fn generate_scope_sized(id: u8, size: u32) -> Vec<u8> {
25+
generate_vector(2, id, size)
26+
}
27+
28+
pub fn generate_roles_sized(num_roles: u32, size: u32) -> Vec<Vec<u8>> {
29+
let mut roles = Vec::new();
30+
for r in 0..num_roles {
31+
roles.push(generate_role_sized(r as u8, size));
32+
}
33+
roles
34+
}
35+
36+
pub fn generate_id(item: Vec<u8>) -> [u8; 32] {
37+
item.using_encoded(blake2_256)
38+
}
39+
40+
pub fn setup_roles_sized<T: Config>(pallet_id: IdOrVec, num_roles: u32, size: u32) -> Vec<RoleId> {
41+
let roles = generate_roles_sized(num_roles, size);
42+
assert_ok!(RBAC::<T>::tx_create_and_set_roles(
43+
RawOrigin::Root.into(),
44+
pallet_id,
45+
roles.clone()
46+
));
47+
roles.into_iter().map(|role| generate_id(role)).collect()
48+
}
49+
50+
pub fn setup_scopes_sized<T: Config>(pallet_id: IdOrVec, num_scopes: u32) -> Vec<ScopeId> {
51+
let mut scopes = Vec::new();
52+
for s in 0..num_scopes {
53+
let scope = generate_scope_sized(s as u8, 10);
54+
let scope_id = generate_id(scope);
55+
assert_ok!(RBAC::<T>::create_scope(pallet_id.clone(), scope_id));
56+
scopes.push(scope_id);
57+
}
58+
scopes
59+
}
60+
61+
pub fn assign_roles_to_user<T: Config>(
62+
user: T::AccountId,
63+
pallet_id: IdOrVec,
64+
scope_id: ScopeId,
65+
role_ids: &[RoleId],
66+
) {
67+
for role_id in role_ids {
68+
assert_ok!(RBAC::<T>::tx_assign_role_to_user(
69+
RawOrigin::Root.into(),
70+
user.clone(),
71+
pallet_id.clone(),
72+
scope_id,
73+
role_id.clone()
74+
));
75+
}
76+
}
77+
78+
pub fn assign_roles_to_users<T: Config>(
79+
num_users: u32,
80+
pallet_id: IdOrVec,
81+
scope_id: ScopeId,
82+
role_ids: &[RoleId],
83+
) -> Vec<T::AccountId> {
84+
let mut users = Vec::new();
85+
for u in 0..num_users {
86+
let user: T::AccountId = account("user", u, SEED);
87+
assign_roles_to_user::<T>(user.clone(), pallet_id.clone(), scope_id, role_ids);
88+
users.push(user);
89+
}
90+
users
91+
}
92+
93+
pub fn generate_permission_sized(id: u8, size: u32) -> Vec<u8> {
94+
generate_vector(2, id, size)
95+
}
96+
97+
pub fn generate_permissions_sized(num_permissions: u32, size: u32) -> Vec<Vec<u8>> {
98+
let mut permissions = Vec::new();
99+
for p in 0..num_permissions {
100+
permissions.push(generate_permission_sized(p as u8, size));
101+
}
102+
permissions
103+
}
104+
105+
pub fn setup_permissions_sized<T: Config>(
106+
pallet_id: IdOrVec,
107+
role_id: RoleId,
108+
num_permissions: u32,
109+
size: u32,
110+
) -> Vec<PermissionId> {
111+
let permissions = generate_permissions_sized(num_permissions, size);
112+
assert_ok!(RBAC::<T>::tx_create_and_set_permissions(
113+
RawOrigin::Root.into(),
114+
pallet_id.clone(),
115+
role_id.clone(),
116+
permissions.clone()
117+
));
118+
permissions.into_iter().map(|permission| generate_id(permission)).collect()
119+
}
120+
121+
pub fn generate_vector(prefix: u8, id: u8, size: u32) -> scale_info::prelude::vec::Vec<u8> {
122+
assert!(size > 0, "vector size must be greater than 0");
123+
let mut v = vec![id; size as usize];
124+
v[0] = prefix;
125+
v
126+
}
127+
128+
#[benchmarks(where T: Config)]
129+
mod benchmarks {
130+
use super::*;
131+
132+
#[benchmark]
133+
fn tx_create_and_set_roles(
134+
i: Linear<1, 400>,
135+
l: Linear<2, { T::RoleMaxLen::get() }>,
136+
r: Linear<1, { T::MaxRolesPerPallet::get() }>,
137+
) {
138+
let pallet_id = generate_pallet_id_sized(0, i);
139+
let roles = generate_roles_sized(r, l);
140+
#[extrinsic_call]
141+
_(RawOrigin::Root, pallet_id.clone(), roles);
142+
assert_eq!(RBAC::<T>::pallet_roles(pallet_id.to_id()).len() as u32, r);
143+
}
144+
145+
#[benchmark]
146+
fn tx_remove_role_from_user(
147+
i: Linear<1, 400>,
148+
s: Linear<1, { T::MaxScopesPerPallet::get() }>,
149+
r: Linear<1, { T::MaxRolesPerUser::get() }>,
150+
u: Linear<1, { T::MaxUsersPerRole::get() }>,
151+
) {
152+
let pallet_id = generate_pallet_id_sized(0, i);
153+
let scope_id = setup_scopes_sized::<T>(pallet_id.clone(), s)[0];
154+
let role_ids = setup_roles_sized::<T>(
155+
pallet_id.clone(),
156+
T::MaxRolesPerPallet::get(),
157+
T::RoleMaxLen::get(),
158+
);
159+
let ru = r as usize;
160+
let user =
161+
assign_roles_to_users::<T>(u, pallet_id.clone(), scope_id, &role_ids[0..ru])[0].clone();
162+
let role_id = role_ids[ru - 1];
163+
#[extrinsic_call]
164+
_(RawOrigin::Root, user.clone(), pallet_id.clone(), scope_id, role_id);
165+
assert!(!RBAC::<T>::roles_by_user((user, pallet_id.to_id(), scope_id)).contains(&role_id));
166+
}
167+
168+
#[benchmark]
169+
fn tx_create_and_set_permissions(
170+
i: Linear<1, 400>,
171+
l: Linear<2, { T::PermissionMaxLen::get() }>,
172+
p: Linear<1, { T::MaxPermissionsPerRole::get() }>,
173+
) {
174+
let pallet_id = generate_pallet_id_sized(0, i);
175+
let role_id = setup_roles_sized::<T>(
176+
pallet_id.clone(),
177+
T::MaxRolesPerPallet::get(),
178+
T::RoleMaxLen::get(),
179+
)[0];
180+
let permissions = generate_permissions_sized(p, l);
181+
#[extrinsic_call]
182+
_(RawOrigin::Root, pallet_id.clone(), role_id, permissions);
183+
assert_eq!(RBAC::<T>::permissions_by_role(pallet_id.to_id(), role_id).len() as u32, p);
184+
}
185+
186+
#[benchmark]
187+
fn tx_assign_role_to_user(
188+
i: Linear<1, 400>,
189+
s: Linear<1, { T::MaxScopesPerPallet::get() }>,
190+
r: Linear<1, { T::MaxRolesPerUser::get() }>,
191+
u: Linear<1, { T::MaxUsersPerRole::get() - 1 }>,
192+
) {
193+
let user: T::AccountId = account("lastuser", 0, SEED);
194+
let pallet_id = generate_pallet_id_sized(0, i);
195+
let scope_id = setup_scopes_sized::<T>(pallet_id.clone(), s)[0];
196+
let role_ids = setup_roles_sized::<T>(
197+
pallet_id.clone(),
198+
T::MaxRolesPerPallet::get(),
199+
T::RoleMaxLen::get(),
200+
);
201+
let ru = r as usize;
202+
assign_roles_to_users::<T>(u, pallet_id.clone(), scope_id, &role_ids[0..ru]);
203+
assign_roles_to_user::<T>(
204+
user.clone(),
205+
pallet_id.clone(),
206+
scope_id,
207+
&role_ids[0..(ru - 1)],
208+
);
209+
let role_id = role_ids[ru - 1];
210+
#[extrinsic_call]
211+
_(RawOrigin::Root, user.clone(), pallet_id.clone(), scope_id, role_id);
212+
assert_eq!(RBAC::<T>::roles_by_user((user, pallet_id.to_id(), scope_id)).len() as u32, r);
213+
assert_eq!(
214+
RBAC::<T>::users_by_scope((pallet_id.to_id(), scope_id, role_id)).len() as u32,
215+
u + 1
216+
);
217+
}
218+
219+
#[benchmark]
220+
fn revoke_permission_from_role(
221+
i: Linear<1, 400>,
222+
l: Linear<2, { T::PermissionMaxLen::get() }>,
223+
p: Linear<1, { T::MaxPermissionsPerRole::get() }>,
224+
) {
225+
let pallet_id = generate_pallet_id_sized(0, i);
226+
let role_id = setup_roles_sized::<T>(
227+
pallet_id.clone(),
228+
T::MaxRolesPerPallet::get(),
229+
T::RoleMaxLen::get(),
230+
)[0];
231+
let permission_id = setup_permissions_sized::<T>(pallet_id.clone(), role_id, p, l)[0];
232+
#[extrinsic_call]
233+
_(RawOrigin::Root, pallet_id.clone(), role_id, permission_id);
234+
assert!(
235+
!RBAC::<T>::permissions_by_role(pallet_id.to_id(), role_id).contains(&permission_id)
236+
);
237+
}
238+
239+
impl_benchmark_test_suite! {
240+
RBAC,
241+
crate::mock::new_test_ext(),
242+
crate::mock::Test,
243+
}
244+
}

pallets/rbac/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
/// <https://docs.substrate.io/v3/runtime/frame>
66
pub use pallet::*;
77

8+
// #[cfg(feature = "runtime-benchmarks")]
9+
mod benchmarking;
10+
811
#[cfg(test)]
912
mod mock;
1013

0 commit comments

Comments
 (0)