diff --git a/pallets/authority-members/src/benchmarking.rs b/pallets/authority-members/src/benchmarking.rs index 893d89ba867bb56f5d9f209536f2df6fccb428e4..808ea5865cee6ab763bcdf1be40adcc66ff08051 100644 --- a/pallets/authority-members/src/benchmarking.rs +++ b/pallets/authority-members/src/benchmarking.rs @@ -17,70 +17,83 @@ #![cfg(feature = "runtime-benchmarks")] use super::*; - -use frame_benchmarking::benchmarks; -use frame_system::RawOrigin; - use crate::Pallet; -fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { - frame_system::Pallet::<T>::assert_has_event(generic_event.into()); -} +use frame_benchmarking::v2::*; +use frame_system::RawOrigin; -benchmarks! { - where_clause { +#[benchmarks( where - T::MemberId: From<u32>, + <T as Config>::MemberId: From<u32>, +)] +mod benchmarks { + use super::*; + + fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { + frame_system::Pallet::<T>::assert_has_event(generic_event.into()); } - go_offline { + + #[benchmark] + fn go_offline() { let id: T::MemberId = OnlineAuthorities::<T>::get()[0]; let caller: T::AccountId = Members::<T>::get(id).unwrap().owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); - }: _<T::RuntimeOrigin>(caller_origin) - verify { - assert_has_event::<T>(Event::<T>::MemberGoOffline{member: id}.into()); + + #[extrinsic_call] + _(RawOrigin::Signed(caller)); + + assert_has_event::<T>(Event::<T>::MemberGoOffline { member: id }.into()); } - go_online { + + #[benchmark] + fn go_online() { let id: T::MemberId = OnlineAuthorities::<T>::get()[0]; let caller: T::AccountId = Members::<T>::get(id).unwrap().owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); OnlineAuthorities::<T>::mutate(|ids| { ids.retain(|&x| x != id); }); OutgoingAuthorities::<T>::mutate(|ids| { ids.retain(|&x| x != id); }); - }: _<T::RuntimeOrigin>(caller_origin) - verify { - assert_has_event::<T>(Event::<T>::MemberGoOnline{member: id}.into()); + + #[extrinsic_call] + _(RawOrigin::Signed(caller)); + + assert_has_event::<T>(Event::<T>::MemberGoOnline { member: id }.into()); } - set_session_keys { + + #[benchmark] + fn set_session_keys() { let id: T::MemberId = OnlineAuthorities::<T>::get()[0]; let caller: T::AccountId = Members::<T>::get(id).unwrap().owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); - let validator_id = T::ValidatorIdOf::convert(caller.clone()).unwrap(); - let session_keys: T::Keys = pallet_session::NextKeys::<T>::get(validator_id).unwrap(); - }: _<T::RuntimeOrigin>(caller_origin, session_keys) - remove_member { + let validator_id = T::ValidatorIdOf::convert(caller.clone()).unwrap(); + let session_keys: T::Keys = pallet_session::NextKeys::<T>::get(validator_id).unwrap(); + + #[extrinsic_call] + _(RawOrigin::Signed(caller), session_keys); + } + + #[benchmark] + fn remove_member() { let id: T::MemberId = OnlineAuthorities::<T>::get()[0]; - let caller_origin = RawOrigin::Root.into(); - }: _<T::RuntimeOrigin>(caller_origin, id) - verify { - assert_has_event::<T>(Event::<T>::MemberRemoved{member: id}.into()); + + #[extrinsic_call] + _(RawOrigin::Root, id); + + assert_has_event::<T>(Event::<T>::MemberRemoved { member: id }.into()); } - remove_member_from_blacklist { + + #[benchmark] + fn remove_member_from_blacklist() { let id: T::MemberId = OnlineAuthorities::<T>::get()[0]; Blacklist::<T>::mutate(|blacklist| { blacklist.push(id); }); - }: _<T::RuntimeOrigin>(RawOrigin::Root.into(), id) - verify { - assert_has_event::<T>(Event::<T>::MemberRemovedFromBlacklist{member: id}.into()); + + #[extrinsic_call] + _(RawOrigin::Root, id); + + assert_has_event::<T>(Event::<T>::MemberRemovedFromBlacklist { member: id }.into()); } - impl_benchmark_test_suite!( - Pallet, - crate::mock::new_test_ext(2), - crate::mock::Test - ); + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(2), crate::mock::Test); } diff --git a/pallets/certification/src/benchmarking.rs b/pallets/certification/src/benchmarking.rs index 5aa67fdf40a170cd4d629e99ebdf6abbdb26c9d6..1f273af05a42c2cf90a87a1906e9ca8871cdb1bd 100644 --- a/pallets/certification/src/benchmarking.rs +++ b/pallets/certification/src/benchmarking.rs @@ -18,122 +18,160 @@ use super::*; -use frame_benchmarking::benchmarks; +use frame_benchmarking::v2::*; use frame_system::RawOrigin; use sp_runtime::traits::Zero; -#[cfg(test)] -use maplit::btreemap; - use crate::Pallet; -fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { - frame_system::Pallet::<T>::assert_has_event(generic_event.into()); -} +#[benchmarks( + where + <T as Config>::IdtyIndex: From<u32>, +)] +mod benchmarks { + use super::*; -fn add_certs<T: Config>(i: u32, receiver: T::IdtyIndex) -> Result<(), &'static str> { - Pallet::<T>::remove_all_certs_received_by(RawOrigin::Root.into(), receiver)?; - for j in 1..i { - Pallet::<T>::do_add_cert_checked(j.into(), receiver, false)?; + fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { + frame_system::Pallet::<T>::assert_has_event(generic_event.into()); } - assert!( - CertsByReceiver::<T>::get(receiver).len() as u32 == i - 1, - "Certs not added", - ); - Ok(()) -} -benchmarks! { - where_clause { - where - T::IdtyIndex: From<u32>, + fn add_certs<T: Config>(i: u32, receiver: T::IdtyIndex) -> Result<(), &'static str> { + Pallet::<T>::remove_all_certs_received_by(RawOrigin::Root.into(), receiver)?; + for j in 1..i { + Pallet::<T>::do_add_cert_checked(j.into(), receiver, false)?; + } + assert!( + CertsByReceiver::<T>::get(receiver).len() as u32 == i - 1, + "Certs not added", + ); + Ok(()) } - add_cert { + + #[benchmark] + fn add_cert() -> Result<(), BenchmarkError> { let issuer: T::IdtyIndex = 1.into(); - let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap(); - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); + let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap(); let receiver: T::IdtyIndex = 2.into(); Pallet::<T>::del_cert(RawOrigin::Root.into(), issuer, receiver)?; - let issuer_cert: u32 = StorageIdtyCertMeta::<T>::get(issuer).issued_count; - let receiver_cert: u32 = StorageIdtyCertMeta::<T>::get(receiver).received_count; frame_system::pallet::Pallet::<T>::set_block_number(T::CertPeriod::get()); - }: _<T::RuntimeOrigin>(caller_origin, receiver) - verify { - assert_has_event::<T>(Event::<T>::CertAdded{ issuer, receiver }.into()); + + #[extrinsic_call] + _(RawOrigin::Signed(caller), receiver); + + assert_has_event::<T>(Event::<T>::CertAdded { issuer, receiver }.into()); + Ok(()) } - renew_cert { + #[benchmark] + fn renew_cert() -> Result<(), BenchmarkError> { let issuer: T::IdtyIndex = 1.into(); - let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap(); - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); + let caller: T::AccountId = T::IdtyAttr::owner_key(issuer).unwrap(); let receiver: T::IdtyIndex = 2.into(); Pallet::<T>::del_cert(RawOrigin::Root.into(), issuer, receiver)?; - let issuer_cert: u32 = StorageIdtyCertMeta::<T>::get(issuer).issued_count; - let receiver_cert: u32 = StorageIdtyCertMeta::<T>::get(receiver).received_count; frame_system::pallet::Pallet::<T>::set_block_number(T::CertPeriod::get()); - Pallet::<T>::add_cert(caller_origin.clone(), receiver)?; - frame_system::pallet::Pallet::<T>::set_block_number(T::CertPeriod::get() + T::CertPeriod::get()); - }: _<T::RuntimeOrigin>(caller_origin, receiver) - verify { - assert_has_event::<T>(Event::<T>::CertAdded{ issuer, receiver }.into()); + Pallet::<T>::add_cert(RawOrigin::Signed(caller.clone()).into(), receiver)?; + frame_system::pallet::Pallet::<T>::set_block_number( + T::CertPeriod::get() + T::CertPeriod::get(), + ); + + #[extrinsic_call] + _(RawOrigin::Signed(caller), receiver); + + assert_has_event::<T>(Event::<T>::CertAdded { issuer, receiver }.into()); + Ok(()) } - del_cert { + #[benchmark] + fn del_cert() -> Result<(), BenchmarkError> { let issuer: T::IdtyIndex = 1.into(); let receiver: T::IdtyIndex = 2.into(); // try to add cert if missing, else ignore // this depends on initial data let _ = Pallet::<T>::do_add_cert_checked(issuer, receiver, false); - let receiver_cert: u32 = StorageIdtyCertMeta::<T>::get(receiver).received_count; - let issuer_cert: u32 = StorageIdtyCertMeta::<T>::get(issuer).issued_count; - }: _<T::RuntimeOrigin>(RawOrigin::Root.into(), issuer, receiver) - verify { - assert_has_event::<T>(Event::<T>::CertRemoved{ issuer, receiver, expiration: false }.into()); + + #[extrinsic_call] + _(RawOrigin::Root, issuer, receiver); + + assert_has_event::<T>( + Event::<T>::CertRemoved { + issuer, + receiver, + expiration: false, + } + .into(), + ); + Ok(()) } - remove_all_certs_received_by { + #[benchmark] + fn remove_all_certs_received_by(i: Linear<2, 1_000>) -> Result<(), BenchmarkError> { let receiver: T::IdtyIndex = 0.into(); - let i in 2..1000 => add_certs::<T>(i, receiver)?; - }: _<T::RuntimeOrigin>(RawOrigin::Root.into(), receiver) - verify { - assert!(CertsByReceiver::<T>::get(receiver).is_empty() ); + add_certs::<T>(i, receiver)?; + + #[extrinsic_call] + _(RawOrigin::Root, receiver); + + assert!(CertsByReceiver::<T>::get(receiver).is_empty()); + Ok(()) } - on_initialize { + #[benchmark] + fn on_initialize() { assert!(CertsRemovableOn::<T>::try_get(BlockNumberFor::<T>::zero()).is_err()); - }: {Pallet::<T>::on_initialize(BlockNumberFor::<T>::zero());} - do_remove_cert_noop { - }: {Pallet::<T>::do_remove_cert(100.into(), 101.into(), Some(BlockNumberFor::<T>::zero()));} + #[block] + { + Pallet::<T>::on_initialize(BlockNumberFor::<T>::zero()); + } + } + + #[benchmark] + fn do_remove_cert_noop() { + #[block] + { + Pallet::<T>::do_remove_cert(100.into(), 101.into(), Some(BlockNumberFor::<T>::zero())); + } + } - do_remove_cert { + #[benchmark] + fn do_remove_cert() -> Result<(), BenchmarkError> { let issuer: T::IdtyIndex = 1.into(); let receiver: T::IdtyIndex = 0.into(); Pallet::<T>::do_remove_cert(issuer, receiver, None); Pallet::<T>::do_add_cert_checked(issuer, receiver, false)?; - let issuer_cert: u32 = StorageIdtyCertMeta::<T>::get(issuer).issued_count; - let receiver_cert: u32 = StorageIdtyCertMeta::<T>::get(receiver).received_count; let block_number = T::ValidityPeriod::get(); frame_system::pallet::Pallet::<T>::set_block_number(block_number); - }: {Pallet::<T>::do_remove_cert(issuer, receiver, Some(block_number));} - verify { - assert_has_event::<T>(Event::<T>::CertRemoved{ issuer, receiver, expiration: true }.into()); + + #[block] + { + Pallet::<T>::do_remove_cert(issuer, receiver, Some(block_number)); + } + + assert_has_event::<T>( + Event::<T>::CertRemoved { + issuer, + receiver, + expiration: true, + } + .into(), + ); + Ok(()) } impl_benchmark_test_suite!( Pallet, crate::mock::new_test_ext(crate::mock::DefaultCertificationConfig { - apply_cert_period_at_genesis: true, - certs_by_receiver: btreemap![ - 0 => btreemap![ + apply_cert_period_at_genesis: true, + certs_by_receiver: maplit::btreemap![ + 0 => maplit::btreemap![ 1 => Some(7), 2 => Some(9), ], - 1 => btreemap![ + 1 => maplit::btreemap![ 0 => Some(10), 2 => Some(3), ], - ] , + ], }), crate::mock::Test ); diff --git a/pallets/distance/src/benchmarking.rs b/pallets/distance/src/benchmarking.rs index 4b5fb9557650cbae9ec1dc1f758c6de36d3852ec..0e888c8264c180d1ee4f494675ad8a853b4180b6 100644 --- a/pallets/distance/src/benchmarking.rs +++ b/pallets/distance/src/benchmarking.rs @@ -19,7 +19,7 @@ use super::*; use codec::Encode; -use frame_benchmarking::benchmarks; +use frame_benchmarking::v2::*; use frame_support::traits::{Currency, OnFinalize}; use frame_system::pallet_prelude::BlockNumberFor; use frame_system::RawOrigin; @@ -29,92 +29,150 @@ use sp_runtime::Perbill; use crate::Pallet; -fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { - frame_system::Pallet::<T>::assert_has_event(generic_event.into()); -} - -fn populate_pool<T: Config>(i: u32) -> Result<(), &'static str> { - EvaluationPool0::<T>::mutate(|current_pool| -> Result<(), &'static str> { - for j in 0..i { - current_pool - .evaluations - .try_push((j, median::MedianAcc::new())) - .map_err(|_| Error::<T>::QueueFull)?; - } - Ok(()) - }) -} - -benchmarks! { - where_clause { +#[benchmarks( where - T: pallet_balances::Config, T::Balance: From<u64>, + T: pallet_balances::Config, + T::Balance: From<u64>, BlockNumberFor<T>: From<u32>, +)] +mod benchmarks { + use super::*; + + fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { + frame_system::Pallet::<T>::assert_has_event(generic_event.into()); } - // request distance evaluation - request_distance_evaluation { + fn populate_pool<T: Config>(i: u32) -> Result<(), &'static str> { + EvaluationPool0::<T>::mutate(|current_pool| -> Result<(), &'static str> { + for j in 0..i { + current_pool + .evaluations + .try_push((j, median::MedianAcc::new())) + .map_err(|_| Error::<T>::QueueFull)?; + } + Ok(()) + }) + } + + #[benchmark] + fn request_distance_evaluation() { let idty = T::IdtyIndex::one(); - let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty).unwrap().owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); - let _ = <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value()); - }: _<T::RuntimeOrigin>(caller_origin.clone()) - verify { - assert!(PendingEvaluationRequest::<T>::get(idty) == Some(caller.clone()), "Request not added"); - assert_has_event::<T>(Event::<T>::EvaluationRequested { idty_index: idty, who: caller }.into()); + let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty) + .unwrap() + .owner_key; + let _ = + <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value()); + + #[extrinsic_call] + _(RawOrigin::Signed(caller.clone())); + + assert!( + PendingEvaluationRequest::<T>::get(idty) == Some(caller.clone()), + "Request not added" + ); + assert_has_event::<T>( + Event::<T>::EvaluationRequested { + idty_index: idty, + who: caller, + } + .into(), + ); } - // request distance evaluation for - request_distance_evaluation_for { + #[benchmark] + fn request_distance_evaluation_for() { let idty = T::IdtyIndex::one(); - let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty).unwrap().owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); - let _ = <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value()); - let target = 2u32; + let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty) + .unwrap() + .owner_key; + <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value()); + let target: T::IdtyIndex = 2u32; // set target status since targeted distance evaluation only allowed for unvalidated - pallet_identity::Identities::<T>::mutate(target, - |idty_val| idty_val.as_mut().unwrap().status = pallet_identity::IdtyStatus::Unvalidated); - }: _<T::RuntimeOrigin>(caller_origin.clone(), target) - verify { - assert!(PendingEvaluationRequest::<T>::get(target) == Some(caller.clone()), "Request not added"); - assert_has_event::<T>(Event::<T>::EvaluationRequested { idty_index: target, who: caller }.into()); + pallet_identity::Identities::<T>::mutate(target, |idty_val| { + idty_val.as_mut().unwrap().status = pallet_identity::IdtyStatus::Unvalidated + }); + + #[extrinsic_call] + _(RawOrigin::Signed(caller.clone()), target); + + assert!( + PendingEvaluationRequest::<T>::get(target) == Some(caller.clone()), + "Request not added" + ); + assert_has_event::<T>( + Event::<T>::EvaluationRequested { + idty_index: target, + who: caller, + } + .into(), + ); } - // update evaluation - update_evaluation { + #[benchmark] + fn update_evaluation(i: Linear<1, MAX_EVALUATIONS_PER_SESSION>) -> Result<(), BenchmarkError> { let digest_data = sp_consensus_babe::digests::PreDigest::SecondaryPlain( - sp_consensus_babe::digests::SecondaryPlainPreDigest { authority_index: 0u32, slot: Default::default() }); + sp_consensus_babe::digests::SecondaryPlainPreDigest { + authority_index: 0u32, + slot: Default::default(), + }, + ); // A BABE digest item is needed to check authorship let digest = sp_runtime::DigestItem::PreRuntime(*b"BABE", digest_data.encode()); - let _ = <frame_system::Pallet<T>>::deposit_log(digest); + <frame_system::Pallet<T>>::deposit_log(digest); + populate_pool::<T>(i)?; + + #[extrinsic_call] + _( + RawOrigin::None, + ComputationResult { + distances: vec![Perbill::one(); i as usize], + }, + ); + + Ok(()) + } + + #[benchmark] + fn force_update_evaluation( + i: Linear<1, MAX_EVALUATIONS_PER_SESSION>, + ) -> Result<(), BenchmarkError> { let idty = T::IdtyIndex::one(); - let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty).unwrap().owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); - let i in 1 .. MAX_EVALUATIONS_PER_SESSION => populate_pool::<T>(i)?; - }: _<T::RuntimeOrigin>(RawOrigin::None.into(), ComputationResult{distances: vec![Perbill::one(); i as usize]}) - - // force update evaluation - force_update_evaluation { - let idty = T::IdtyIndex::one(); - let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty).unwrap().owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); - let i in 1 .. MAX_EVALUATIONS_PER_SESSION => populate_pool::<T>(i)?; - }: _<T::RuntimeOrigin>(RawOrigin::Root.into(), caller.clone(), ComputationResult{distances: vec![Perbill::one(); i as usize]}) - - // force valid distance status - force_valid_distance_status { + let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty) + .unwrap() + .owner_key; + populate_pool::<T>(i)?; + + #[extrinsic_call] + _( + RawOrigin::Root, + caller, + ComputationResult { + distances: vec![Perbill::one(); i as usize], + }, + ); + + Ok(()) + } + + #[benchmark] + fn force_valid_distance_status() { let idty = T::IdtyIndex::one(); - let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty).unwrap().owner_key; - }: _<T::RuntimeOrigin>(RawOrigin::Root.into(), idty) - verify { + + #[extrinsic_call] + _(RawOrigin::Root, idty); + assert_has_event::<T>(Event::<T>::EvaluatedValid { idty_index: idty }.into()); } - // on finalize - on_finalize { + #[benchmark] + fn on_finalize() { DidUpdate::<T>::set(true); - }: { Pallet::<T>::on_finalize(Default::default()); } - verify { + + #[block] + { + Pallet::<T>::on_finalize(Default::default()); + } + assert!(!DidUpdate::<T>::get()); } diff --git a/pallets/duniter-account/src/benchmarking.rs b/pallets/duniter-account/src/benchmarking.rs index 27a839e1a714503c4c3f01dd940f1cec48576771..74835636c1c00dd0fdc1f6757976e2cce2a43360 100644 --- a/pallets/duniter-account/src/benchmarking.rs +++ b/pallets/duniter-account/src/benchmarking.rs @@ -18,73 +18,139 @@ use super::*; -use frame_benchmarking::{account, benchmarks, whitelisted_caller}; +use frame_benchmarking::v2::*; use frame_support::sp_runtime::{traits::One, Saturating}; -use frame_support::traits::{Currency, Get}; +use frame_support::traits::Currency; +use frame_system::RawOrigin; use pallet_provide_randomness::OnFilledRandomness; use crate::Pallet; -fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { - frame_system::Pallet::<T>::assert_has_event(generic_event.into()); -} +#[benchmarks] +mod benchmarks { + use super::*; -fn create_pending_accounts<T: Config>( - i: u32, - is_balance: bool, - is_sufficient: bool, -) -> Result<(), &'static str> { - for _ in 0..i { - let caller: T::AccountId = whitelisted_caller(); - if is_balance { - let existential_deposit = T::ExistentialDeposit::get(); - let balance = existential_deposit.saturating_mul((200u32).into()); - let _ = <pallet_balances::Pallet<T> as Currency<T::AccountId>>::make_free_balance_be( - &caller, balance, - ); - } else { - assert!( - frame_system::Pallet::<T>::get(&caller).free - < T::NewAccountPrice::get() + T::ExistentialDeposit::get() - ); - } - if is_sufficient { - frame_system::Pallet::<T>::inc_sufficients(&caller); - } else { - assert!(frame_system::Pallet::<T>::sufficients(&caller) == 0); + fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { + frame_system::Pallet::<T>::assert_has_event(generic_event.into()); + } + + fn create_pending_accounts<T: Config>( + i: u32, + is_balance: bool, + is_sufficient: bool, + ) -> Result<(), &'static str> { + for _ in 0..i { + let caller: T::AccountId = whitelisted_caller(); + if is_balance { + let existential_deposit = T::ExistentialDeposit::get(); + let balance = existential_deposit.saturating_mul((200u32).into()); + let _ = + <pallet_balances::Pallet<T> as Currency<T::AccountId>>::make_free_balance_be( + &caller, balance, + ); + } else { + assert!( + frame_system::Pallet::<T>::get(&caller).free + < T::NewAccountPrice::get() + T::ExistentialDeposit::get() + ); + } + if is_sufficient { + frame_system::Pallet::<T>::inc_sufficients(&caller); + } else { + assert!(frame_system::Pallet::<T>::sufficients(&caller) == 0); + } + PendingNewAccounts::<T>::insert(caller, ()); } - PendingNewAccounts::<T>::insert(caller, ()); + Ok(()) } - Ok(()) -} -benchmarks! { - unlink_identity { + #[benchmark] + fn unlink_identity() { let account = account("Alice", 1, 1); - let origin = frame_system::RawOrigin::Signed(account); - }: _<T::RuntimeOrigin>(origin.into()) - on_initialize_sufficient { - let i in 0 .. T::MaxNewAccountsPerBlock::get() => create_pending_accounts::<T>(i, false, true)?; - }: { Pallet::<T>::on_initialize(BlockNumberFor::<T>::one()); } - on_initialize_with_balance { - let i in 0 .. T::MaxNewAccountsPerBlock::get() => create_pending_accounts::<T>(i, true, false)?; - }: { Pallet::<T>::on_initialize(BlockNumberFor::<T>::one()); } - on_initialize_no_balance { - let i in 0 .. T::MaxNewAccountsPerBlock::get() => create_pending_accounts::<T>(i, false, false)?; - }: { Pallet::<T>::on_initialize(BlockNumberFor::<T>::one()); } - on_filled_randomness_pending { + + #[extrinsic_call] + _(RawOrigin::Signed(account)); + } + + #[benchmark] + fn on_initialize_sufficient( + i: Linear<0, { T::MaxNewAccountsPerBlock::get() }>, + ) -> Result<(), BenchmarkError> { + create_pending_accounts::<T>(i, false, true)?; + + #[block] + { + Pallet::<T>::on_initialize(BlockNumberFor::<T>::one()); + } + + Ok(()) + } + + #[benchmark] + fn on_initialize_with_balance( + i: Linear<0, { T::MaxNewAccountsPerBlock::get() }>, + ) -> Result<(), BenchmarkError> { + create_pending_accounts::<T>(i, true, false)?; + + #[block] + { + Pallet::<T>::on_initialize(BlockNumberFor::<T>::one()); + } + + Ok(()) + } + + #[benchmark] + fn on_initialize_no_balance( + i: Linear<0, { T::MaxNewAccountsPerBlock::get() }>, + ) -> Result<(), BenchmarkError> { + create_pending_accounts::<T>(i, false, false)?; + + #[block] + { + Pallet::<T>::on_initialize(BlockNumberFor::<T>::one()); + } + + Ok(()) + } + + #[benchmark] + fn on_filled_randomness_pending() { let caller: T::AccountId = whitelisted_caller(); let randomness = H256(T::AccountIdToSalt::convert(caller.clone())); - let request_id = pallet_provide_randomness::Pallet::<T>::force_request(pallet_provide_randomness::RandomnessType::RandomnessFromTwoEpochsAgo, randomness); + let request_id = pallet_provide_randomness::Pallet::<T>::force_request( + pallet_provide_randomness::RandomnessType::RandomnessFromTwoEpochsAgo, + randomness, + ); PendingRandomIdAssignments::<T>::insert(request_id, caller.clone()); - }: { Pallet::<T>::on_filled_randomness(request_id, randomness); } - verify { - assert_has_event::<T>(Event::<T>::RandomIdAssigned { who: caller, random_id: randomness }.into()); + + #[block] + { + Pallet::<T>::on_filled_randomness(request_id, randomness); + } + + assert_has_event::<T>( + Event::<T>::RandomIdAssigned { + who: caller, + random_id: randomness, + } + .into(), + ); } - on_filled_randomness_no_pending { + + #[benchmark] + fn on_filled_randomness_no_pending() { let caller: T::AccountId = whitelisted_caller(); let randomness = H256(T::AccountIdToSalt::convert(caller.clone())); - let request_id = pallet_provide_randomness::Pallet::<T>::force_request(pallet_provide_randomness::RandomnessType::RandomnessFromTwoEpochsAgo, randomness); + let request_id = pallet_provide_randomness::Pallet::<T>::force_request( + pallet_provide_randomness::RandomnessType::RandomnessFromTwoEpochsAgo, + randomness, + ); assert!(!PendingRandomIdAssignments::<T>::contains_key(request_id)); - }: { Pallet::<T>::on_filled_randomness(request_id, randomness); } + + #[block] + { + Pallet::<T>::on_filled_randomness(request_id, randomness); + } + } } diff --git a/pallets/identity/src/benchmarking.rs b/pallets/identity/src/benchmarking.rs index 0d4fe93e42ccc159f6b6c438857d078fb553a798..89db5ffe4cf602691632743a11a86e925baccd8e 100644 --- a/pallets/identity/src/benchmarking.rs +++ b/pallets/identity/src/benchmarking.rs @@ -20,7 +20,8 @@ use super::*; //use codec::Encode; use codec::Encode; -use frame_benchmarking::{account, benchmarks}; +use frame_benchmarking::account; +use frame_benchmarking::v2::*; use frame_support::traits::OnInitialize; use frame_system::pallet_prelude::BlockNumberFor; use frame_system::RawOrigin; @@ -30,128 +31,146 @@ use sp_runtime::{AccountId32, MultiSigner}; use crate::Pallet; -const SEED: u32 = 1; - -fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { - frame_system::Pallet::<T>::assert_has_event(generic_event.into()); -} +#[benchmarks( + where + T::Signature: From<sp_core::sr25519::Signature>, + T::Signature: From<sp_core::sr25519::Signature>, + T::AccountId: From<AccountId32>, + T::IdtyIndex: From<u32>, +)] +mod benchmarks { + use super::*; -struct Account<T: Config> { - key: T::AccountId, - index: T::IdtyIndex, - origin: <T as frame_system::Config>::RuntimeOrigin, - // name: IdtyName, -} + fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { + frame_system::Pallet::<T>::assert_has_event(generic_event.into()); + } -// Create and confirm one account using Alice authorized account. -// key, origin, name and index are returned. -// Alice next_creatable_identity_on is reinitialized at the end so several account can be -// created in a row. -fn create_one_identity<T: Config>(owner_key: T::AccountId) -> Result<Account<T>, &'static str> { - // get Alice account to create identity - let caller: T::AccountId = Identities::<T>::get(T::IdtyIndex::from(1u32)) - .unwrap() - .owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = - RawOrigin::Signed(caller.clone()).into(); - let owner_key_origin: <T as frame_system::Config>::RuntimeOrigin = - RawOrigin::Signed(owner_key.clone()).into(); - Pallet::<T>::create_identity(caller_origin.clone(), owner_key.clone())?; - let name = IdtyName("new_identity".into()); - Pallet::<T>::confirm_identity(owner_key_origin.clone(), name.clone())?; - let idty_index = IdentityIndexOf::<T>::get(&owner_key).unwrap(); - // make identity member - <Identities<T>>::mutate_exists(idty_index, |idty_val_opt| { - if let Some(ref mut idty_val) = idty_val_opt { - idty_val.status = IdtyStatus::Member; - } - }); - // Reset next_creatable_identity_on to add more identities with Alice - <Identities<T>>::mutate_exists(T::IdtyIndex::from(1u32), |idty_val_opt| { - if let Some(ref mut idty_val) = idty_val_opt { - idty_val.next_creatable_identity_on = BlockNumberFor::<T>::zero(); - } - }); - Ok(Account { - key: owner_key, - index: idty_index, - origin: owner_key_origin, - // name: name, - }) -} + struct Account<T: Config> { + key: T::AccountId, + index: T::IdtyIndex, + origin: <T as frame_system::Config>::RuntimeOrigin, + } -// Create a dummy identity bypassing all the checks. -fn create_dummy_identity<T: Config>(i: u32) -> Result<(), &'static str> { - let idty_index: T::IdtyIndex = i.into(); - let owner_key: T::AccountId = account("Bob", i, SEED); - let next_scheduled = BlockNumberFor::<T>::zero(); - let value = IdtyValue { - data: Default::default(), - next_creatable_identity_on: BlockNumberFor::<T>::zero(), - old_owner_key: None, - owner_key: owner_key.clone(), - next_scheduled, - status: IdtyStatus::Unvalidated, - }; - let name = i.to_le_bytes(); - let idty_name = IdtyName(name.into()); - <Identities<T>>::insert(idty_index, value); - IdentityChangeSchedule::<T>::append(next_scheduled, idty_index); - IdentityIndexOf::<T>::insert(owner_key.clone(), idty_index); - <IdentitiesNames<T>>::insert(idty_name.clone(), idty_index); - Ok(()) -} + // Create and confirm one account using Alice authorized account. + // key, origin, name and index are returned. + // Alice next_creatable_identity_on is reinitialized at the end so several account can be + // created in a row. + fn create_one_identity<T: Config>(owner_key: T::AccountId) -> Result<Account<T>, &'static str> { + // get Alice account to create identity + let caller: T::AccountId = Identities::<T>::get(T::IdtyIndex::from(1u32)) + .unwrap() + .owner_key; + let caller_origin: <T as frame_system::Config>::RuntimeOrigin = + RawOrigin::Signed(caller.clone()).into(); + let owner_key_origin: <T as frame_system::Config>::RuntimeOrigin = + RawOrigin::Signed(owner_key.clone()).into(); + Pallet::<T>::create_identity(caller_origin.clone(), owner_key.clone())?; + let name = IdtyName("new_identity".into()); + Pallet::<T>::confirm_identity(owner_key_origin.clone(), name.clone())?; + let idty_index = IdentityIndexOf::<T>::get(&owner_key).unwrap(); + // make identity member + <Identities<T>>::mutate_exists(idty_index, |idty_val_opt| { + if let Some(ref mut idty_val) = idty_val_opt { + idty_val.status = IdtyStatus::Member; + } + }); + // Reset next_creatable_identity_on to add more identities with Alice + <Identities<T>>::mutate_exists(T::IdtyIndex::from(1u32), |idty_val_opt| { + if let Some(ref mut idty_val) = idty_val_opt { + idty_val.next_creatable_identity_on = BlockNumberFor::<T>::zero(); + } + }); + Ok(Account { + key: owner_key, + index: idty_index, + origin: owner_key_origin, + // name: name, + }) + } -// Add `i` dummy identities. -fn create_identities<T: Config>(i: u32) -> Result<(), &'static str> { - let identities_count = Pallet::<T>::identities_count(); - for j in 0..i { - create_dummy_identity::<T>(j + identities_count + 1)?; + // Create a dummy identity bypassing all the checks. + fn create_dummy_identity<T: Config>(i: u32) -> Result<(), &'static str> { + let idty_index: T::IdtyIndex = i.into(); + let owner_key: T::AccountId = account("Bob", i, 1); + let next_scheduled = BlockNumberFor::<T>::zero(); + let value = IdtyValue { + data: Default::default(), + next_creatable_identity_on: BlockNumberFor::<T>::zero(), + old_owner_key: None, + owner_key: owner_key.clone(), + next_scheduled, + status: IdtyStatus::Unvalidated, + }; + let name = i.to_le_bytes(); + let idty_name = IdtyName(name.into()); + <Identities<T>>::insert(idty_index, value); + IdentityChangeSchedule::<T>::append(next_scheduled, idty_index); + IdentityIndexOf::<T>::insert(owner_key.clone(), idty_index); + <IdentitiesNames<T>>::insert(idty_name.clone(), idty_index); + Ok(()) } - assert!( - identities_count + i == Pallet::<T>::identities_count(), - "Identities not created" - ); - Ok(()) -} -benchmarks! { - where_clause { - where - T::Signature: From<sp_core::sr25519::Signature>, - T::Signature: From<sp_core::sr25519::Signature>, - T::AccountId: From<AccountId32>, - T::IdtyIndex: From<u32>, + // Add `i` dummy identities. + fn create_identities<T: Config>(i: u32) -> Result<(), &'static str> { + let identities_count = Pallet::<T>::identities_count(); + for j in 0..i { + create_dummy_identity::<T>(j + identities_count + 1)?; + } + assert!( + identities_count + i == Pallet::<T>::identities_count(), + "Identities not created" + ); + Ok(()) } - // create identity - create_identity { - let caller: T::AccountId = Identities::<T>::get(T::IdtyIndex::one()).unwrap().owner_key; // Alice - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); - let owner_key: T::AccountId = account("new_identity", 2, SEED); - }: _<T::RuntimeOrigin>(caller_origin.clone(), owner_key.clone()) - verify { + #[benchmark] + fn create_identity() { + let caller: T::AccountId = Identities::<T>::get(T::IdtyIndex::one()).unwrap().owner_key; // Alice + let owner_key: T::AccountId = account("new_identity", 2, 1); + + #[extrinsic_call] + _(RawOrigin::Signed(caller), owner_key.clone()); + let idty_index = IdentityIndexOf::<T>::get(&owner_key); assert!(idty_index.is_some(), "Identity not added"); - assert_has_event::<T>(Event::<T>::IdtyCreated { idty_index: idty_index.unwrap(), owner_key }.into()); + assert_has_event::<T>( + Event::<T>::IdtyCreated { + idty_index: idty_index.unwrap(), + owner_key, + } + .into(), + ); } - // confirm identity - confirm_identity { - let caller: T::AccountId = Identities::<T>::get(T::IdtyIndex::one()).unwrap().owner_key; - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); - let owner_key: T::AccountId = account("new_identity", 2, SEED); - let owner_key_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(owner_key.clone()).into(); + #[benchmark] + fn confirm_identity() -> Result<(), BenchmarkError> { + let caller: T::AccountId = Identities::<T>::get(T::IdtyIndex::one()).unwrap().owner_key; + let caller_origin: <T as frame_system::Config>::RuntimeOrigin = + RawOrigin::Signed(caller.clone()).into(); + let owner_key: T::AccountId = account("new_identity", 2, 1); Pallet::<T>::create_identity(caller_origin.clone(), owner_key.clone())?; - }: _<T::RuntimeOrigin>(owner_key_origin.clone(), IdtyName("new_identity".into())) - verify { + + #[extrinsic_call] + _( + RawOrigin::Signed(owner_key.clone()), + IdtyName("new_identity".into()), + ); + let idty_index = IdentityIndexOf::<T>::get(&owner_key); - assert_has_event::<T>(Event::<T>::IdtyConfirmed { idty_index: idty_index.unwrap(), owner_key, name: IdtyName("new_identity".into()) }.into()); + assert_has_event::<T>( + Event::<T>::IdtyConfirmed { + idty_index: idty_index.unwrap(), + owner_key, + name: IdtyName("new_identity".into()), + } + .into(), + ); + Ok(()) } - // change owner key - change_owner_key { - let old_key: T::AccountId = account("new_identity", 2, SEED); + #[benchmark] + fn change_owner_key() -> Result<(), BenchmarkError> { + let old_key: T::AccountId = account("new_identity", 2, 1); let account: Account<T> = create_one_identity(old_key.clone())?; // Change key a first time to add an old-old key @@ -164,12 +183,14 @@ benchmarks! { let message = (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode(); let caller_public = sr25519_generate(0.into(), None); let caller: T::AccountId = MultiSigner::Sr25519(caller_public).into_account().into(); - let signature = sr25519_sign(0.into(), &caller_public, &message).unwrap().into(); + let signature = sr25519_sign(0.into(), &caller_public, &message) + .unwrap() + .into(); Pallet::<T>::change_owner_key(account.origin.clone(), caller.clone(), signature)?; // Change key a second time to benchmark // The sufficients for the old_old key will drop to 0 during benchmark - let caller_origin: <T as frame_system::Config>::RuntimeOrigin = RawOrigin::Signed(caller.clone()).into(); + let caller_origin = RawOrigin::Signed(caller.clone()); let genesis_hash = frame_system::Pallet::<T>::block_hash(BlockNumberFor::<T>::zero()); let new_key_payload = IdtyIndexAccountIdPayload { genesis_hash: &genesis_hash, @@ -179,17 +200,33 @@ benchmarks! { let message = (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode(); let caller_public = sr25519_generate(0.into(), None); let caller: T::AccountId = MultiSigner::Sr25519(caller_public).into_account().into(); - let signature = sr25519_sign(0.into(), &caller_public, &message).unwrap().into(); - <frame_system::Pallet<T>>::set_block_number(<frame_system::Pallet<T>>::block_number() + T::ChangeOwnerKeyPeriod::get()); - }: _<T::RuntimeOrigin>(caller_origin.clone(), caller.clone(), signature) - verify { - assert_has_event::<T>(Event::<T>::IdtyChangedOwnerKey { idty_index: account.index, new_owner_key: caller.clone() }.into()); - assert!(IdentityIndexOf::<T>::get(&caller).unwrap() == account.index, "Owner key not changed"); + let signature = sr25519_sign(0.into(), &caller_public, &message) + .unwrap() + .into(); + <frame_system::Pallet<T>>::set_block_number( + <frame_system::Pallet<T>>::block_number() + T::ChangeOwnerKeyPeriod::get(), + ); + + #[extrinsic_call] + _(caller_origin, caller.clone(), signature); + + assert_has_event::<T>( + Event::<T>::IdtyChangedOwnerKey { + idty_index: account.index, + new_owner_key: caller.clone(), + } + .into(), + ); + assert!( + IdentityIndexOf::<T>::get(&caller).unwrap() == account.index, + "Owner key not changed" + ); + Ok(()) } - // revoke identity - revoke_identity { - let old_key: T::AccountId = account("new_identity", 2, SEED); + #[benchmark] + fn revoke_identity() -> Result<(), BenchmarkError> { + let old_key: T::AccountId = account("new_identity", 2, 1); let account: Account<T> = create_one_identity(old_key.clone())?; // Change key @@ -203,7 +240,9 @@ benchmarks! { let message = (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode(); let caller_public = sr25519_generate(0.into(), None); let caller: T::AccountId = MultiSigner::Sr25519(caller_public).into_account().into(); - let signature = sr25519_sign(0.into(), &caller_public, &message).unwrap().into(); + let signature = sr25519_sign(0.into(), &caller_public, &message) + .unwrap() + .into(); Pallet::<T>::change_owner_key(account.origin.clone(), caller.clone(), signature)?; let genesis_hash = frame_system::Pallet::<T>::block_hash(BlockNumberFor::<T>::zero()); @@ -212,147 +251,252 @@ benchmarks! { idty_index: account.index, }; let message = (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode(); - let signature = sr25519_sign(0.into(), &caller_public, &message).unwrap().into(); - }: _<T::RuntimeOrigin>(account.origin, account.index, caller.clone(), signature) - verify { - assert_has_event::<T>(Event::<T>::IdtyRevoked { idty_index: account.index, reason: RevocationReason::User }.into()); - // revocation does not mean deletion anymore - // assert!(IdentityIndexOf::<T>::get(&account.key).is_none(), "Identity not revoked"); + let signature = sr25519_sign(0.into(), &caller_public, &message) + .unwrap() + .into(); + + #[extrinsic_call] + _( + RawOrigin::Signed(account.key), + account.index, + caller.clone(), + signature, + ); + + assert_has_event::<T>( + Event::<T>::IdtyRevoked { + idty_index: account.index, + reason: RevocationReason::User, + } + .into(), + ); + Ok(()) } - // The complexity depends on the number of identities to prune - prune_item_identities_names { + #[benchmark] + fn prune_item_identities_names(i: Linear<2, 1_000>) -> Result<(), BenchmarkError> { + // The complexity depends on the number of identities to prune // Populate identities let identities_count = Pallet::<T>::identities_count(); - let i in 1 .. 1000 => create_identities::<T>(i)?; + create_identities::<T>(i)?; let mut names = Vec::<IdtyName>::new(); for k in 1..i { let name: IdtyName = IdtyName((k + identities_count).to_le_bytes().into()); - assert!(IdentitiesNames::<T>::contains_key(&name), "Name not existing"); + assert!( + IdentitiesNames::<T>::contains_key(&name), + "Name not existing" + ); names.push(name); } - }: _<T::RuntimeOrigin>(RawOrigin::Root.into(), names.clone()) - verify { + + #[extrinsic_call] + _(RawOrigin::Root, names.clone()); + for name in names { assert!(!IdentitiesNames::<T>::contains_key(&name), "Name existing"); } + Ok(()) } - // fix sufficients identity - fix_sufficients { - let new_identity: T::AccountId = account("Bob", 2, SEED); + #[benchmark] + fn fix_sufficients() -> Result<(), BenchmarkError> { + let new_identity: T::AccountId = account("Bob", 2, 1); let account: Account<T> = create_one_identity(new_identity)?; let sufficient = frame_system::Pallet::<T>::sufficients(&account.key); - }: _<T::RuntimeOrigin>(RawOrigin::Root.into(), account.key.clone(), true) - verify { - assert!(sufficient < frame_system::Pallet::<T>::sufficients(&account.key), "Sufficient not incremented"); + + #[extrinsic_call] + _(RawOrigin::Root, account.key.clone(), true); + + assert!( + sufficient < frame_system::Pallet::<T>::sufficients(&account.key), + "Sufficient not incremented" + ); + Ok(()) } - // link account - link_account { - let alice_origin = RawOrigin::Signed(Identities::<T>::get(T::IdtyIndex::one()).unwrap().owner_key); + #[benchmark] + fn link_account() -> Result<(), BenchmarkError> { + let alice_origin = + RawOrigin::Signed(Identities::<T>::get(T::IdtyIndex::one()).unwrap().owner_key); let bob_public = sr25519_generate(0.into(), None); let bob: T::AccountId = MultiSigner::Sr25519(bob_public).into_account().into(); frame_system::Pallet::<T>::inc_providers(&bob); let genesis_hash = frame_system::Pallet::<T>::block_hash(BlockNumberFor::<T>::zero()); let payload = ( - LINK_IDTY_PAYLOAD_PREFIX, genesis_hash, T::IdtyIndex::one(), bob.clone(), - ).encode(); - let signature = sr25519_sign(0.into(), &bob_public, &payload).unwrap().into(); - }: _<T::RuntimeOrigin>(alice_origin.into(), bob, signature) + LINK_IDTY_PAYLOAD_PREFIX, + genesis_hash, + T::IdtyIndex::one(), + bob.clone(), + ) + .encode(); + let signature = sr25519_sign(0.into(), &bob_public, &payload) + .unwrap() + .into(); - // Base weight of an empty initialize - on_initialize { - }: {Pallet::<T>::on_initialize(BlockNumberFor::<T>::zero());} + #[extrinsic_call] + _(alice_origin, bob, signature); - // --- do revoke identity - do_revoke_identity_noop { + Ok(()) + } + + #[benchmark] + fn on_initialize() { + // Base weight of an empty initialize + #[block] + { + Pallet::<T>::on_initialize(BlockNumberFor::<T>::zero()); + } + } + + #[benchmark] + fn do_revoke_identity_noop() { let idty_index: T::IdtyIndex = 0u32.into(); assert!(Identities::<T>::get(idty_index).is_none()); - }: {Pallet::<T>::do_revoke_identity(idty_index, RevocationReason::Root);} - do_revoke_identity { + + #[block] + { + Pallet::<T>::do_revoke_identity(idty_index, RevocationReason::Root); + } + } + + #[benchmark] + fn do_revoke_identity() { let idty_index: T::IdtyIndex = 1u32.into(); - let new_identity: T::AccountId = account("Bob", 2, SEED); + let new_identity: T::AccountId = account("Bob", 2, 1); assert!(Identities::<T>::get(idty_index).is_some()); - Identities::<T>::mutate( idty_index, |id| { + Identities::<T>::mutate(idty_index, |id| { if let Some(id) = id { id.old_owner_key = Some((new_identity, BlockNumberFor::<T>::zero())); } }); - assert!(Identities::<T>::get(idty_index).unwrap().old_owner_key.is_some()); - }: {Pallet::<T>::do_revoke_identity(idty_index, RevocationReason::Root);} - verify { - assert_has_event::<T>(Event::<T>::IdtyRevoked { idty_index, reason: RevocationReason::Root }.into()); + assert!(Identities::<T>::get(idty_index) + .unwrap() + .old_owner_key + .is_some()); + + #[block] + { + Pallet::<T>::do_revoke_identity(idty_index, RevocationReason::Root); + } + + assert_has_event::<T>( + Event::<T>::IdtyRevoked { + idty_index, + reason: RevocationReason::Root, + } + .into(), + ); } - // --- do remove identity - do_remove_identity_noop { + #[benchmark] + fn do_remove_identity_noop() { let idty_index: T::IdtyIndex = 0u32.into(); assert!(Identities::<T>::get(idty_index).is_none()); - }: {Pallet::<T>::do_remove_identity(idty_index, RemovalReason::Revoked);} - do_remove_identity { + + #[block] + { + Pallet::<T>::do_remove_identity(idty_index, RemovalReason::Revoked); + } + } + + #[benchmark] + fn do_remove_identity() { let idty_index: T::IdtyIndex = 1u32.into(); - let new_identity: T::AccountId = account("Bob", 2, SEED); + let new_identity: T::AccountId = account("Bob", 2, 1); assert!(Identities::<T>::get(idty_index).is_some()); - Identities::<T>::mutate( idty_index, |id| { + Identities::<T>::mutate(idty_index, |id| { if let Some(id) = id { id.old_owner_key = Some((new_identity, BlockNumberFor::<T>::zero())); } }); - assert!(Identities::<T>::get(idty_index).unwrap().old_owner_key.is_some()); - }: {Pallet::<T>::do_remove_identity(idty_index, RemovalReason::Revoked);} - verify { - assert_has_event::<T>(Event::<T>::IdtyRemoved { idty_index, reason: RemovalReason::Revoked }.into()); + assert!(Identities::<T>::get(idty_index) + .unwrap() + .old_owner_key + .is_some()); + + #[block] + { + Pallet::<T>::do_remove_identity(idty_index, RemovalReason::Revoked); + } + + assert_has_event::<T>( + Event::<T>::IdtyRemoved { + idty_index, + reason: RemovalReason::Revoked, + } + .into(), + ); } - // --- prune identities - prune_identities_noop { + #[benchmark] + fn prune_identities_noop() { assert!(IdentityChangeSchedule::<T>::try_get(BlockNumberFor::<T>::zero()).is_err()); - }: {Pallet::<T>::prune_identities(BlockNumberFor::<T>::zero());} - prune_identities_none { + #[block] + { + Pallet::<T>::prune_identities(BlockNumberFor::<T>::zero()); + } + } + + #[benchmark] + fn prune_identities_none() { let idty_index: T::IdtyIndex = 100u32.into(); IdentityChangeSchedule::<T>::append(BlockNumberFor::<T>::zero(), idty_index); assert!(IdentityChangeSchedule::<T>::try_get(BlockNumberFor::<T>::zero()).is_ok()); assert!(<Identities<T>>::try_get(idty_index).is_err()); - }: {Pallet::<T>::prune_identities(BlockNumberFor::<T>::zero());} - prune_identities_err { + #[block] + { + Pallet::<T>::prune_identities(BlockNumberFor::<T>::zero()); + } + } + + #[benchmark] + fn prune_identities_err() -> Result<(), BenchmarkError> { let idty_index: T::IdtyIndex = 100u32.into(); create_dummy_identity::<T>(100u32)?; IdentityChangeSchedule::<T>::append(BlockNumberFor::<T>::zero(), idty_index); - }: {Pallet::<T>::prune_identities(BlockNumberFor::<T>::zero());} + + #[block] + { + Pallet::<T>::prune_identities(BlockNumberFor::<T>::zero()); + } + + Ok(()) + } impl_benchmark_test_suite!( Pallet, // Create genesis identity Alice to test benchmark in mock - crate::mock::new_test_ext(crate::mock::IdentityConfig{ identities: vec![ - GenesisIdty { - index: 1, - name: IdtyName::from("Alice"), - value: IdtyValue { - data: (), - next_creatable_identity_on: 0, - old_owner_key: None, - owner_key: account("Alice", 1, SEED), - next_scheduled: 0, - status: crate::IdtyStatus::Member, + crate::mock::new_test_ext(crate::mock::IdentityConfig { + identities: vec![ + crate::GenesisIdty { + index: 1, + name: crate::IdtyName::from("Alice"), + value: crate::IdtyValue { + data: (), + next_creatable_identity_on: 0, + old_owner_key: None, + owner_key: frame_benchmarking::account("Alice", 1, 1), + next_scheduled: 0, + status: crate::IdtyStatus::Member, + }, }, - }, - GenesisIdty { - index: 2, - name: IdtyName::from("Bob"), - value: IdtyValue { - data: (), - next_creatable_identity_on: 0, - old_owner_key: None, - owner_key: account("Bob", 1, SEED), - next_scheduled: 0, - status: crate::IdtyStatus::Unconfirmed, + crate::GenesisIdty { + index: 2, + name: crate::IdtyName::from("Bob"), + value: crate::IdtyValue { + data: (), + next_creatable_identity_on: 0, + old_owner_key: None, + owner_key: frame_benchmarking::account("Bob", 1, 1), + next_scheduled: 0, + status: crate::IdtyStatus::Unconfirmed, + }, }, - }, - ]}), + ] + }), crate::mock::Test, ); } diff --git a/pallets/membership/src/benchmarking.rs b/pallets/membership/src/benchmarking.rs index a3475c7d031209aa5f8b2820e0e5a4536e139e88..0f2be6c80895b9548bc523acd5b1720e92b01fd7 100644 --- a/pallets/membership/src/benchmarking.rs +++ b/pallets/membership/src/benchmarking.rs @@ -18,58 +18,66 @@ use super::*; -use frame_benchmarking::benchmarks; +use frame_benchmarking::v2::*; use frame_system::pallet_prelude::BlockNumberFor; -#[cfg(test)] -use maplit::btreemap; - use crate::Pallet; -// fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) { -// frame_system::Pallet::<T>::assert_has_event(generic_event.into()); -// } - -benchmarks! { - where_clause { +#[benchmarks( where T::IdtyId: From<u32>, BlockNumberFor<T>: From<u32>, - } +)] +mod benchmarks { + use super::*; // TODO membership add and renewal should be included to distance on_new_session as worst case scenario - // Base weight of an empty initialize - on_initialize { - }: {Pallet::<T>::on_initialize(BlockNumberFor::<T>::zero());} + #[benchmark] + fn on_initialize() { + // Base weight of an empty initialize + #[block] + { + Pallet::<T>::on_initialize(BlockNumberFor::<T>::zero()); + } + } - expire_memberships { - let i in 0..3; // Limited by the number of validators + #[benchmark] + fn expire_memberships(i: Linear<0, 3>) { + // Limited by the number of validators // Arbitrarily high, to be in the worst case of wot instance, // this will overcount the weight in hooks see https://git.duniter.org/nodes/rust/duniter-v2s/-/issues/167 - let block_number: BlockNumberFor::<T> = 10_000_000.into(); + let block_number: BlockNumberFor<T> = 10_000_000.into(); frame_system::pallet::Pallet::<T>::set_block_number(block_number); let mut idties: Vec<T::IdtyId> = Vec::new(); - for j in 1..i+1 { + for j in 1..i + 1 { let j: T::IdtyId = j.into(); Membership::<T>::insert(j, MembershipData::<BlockNumberFor<T>>::default()); idties.push(j); } MembershipsExpireOn::<T>::insert(block_number, idties); - assert_eq!(MembershipsExpireOn::<T>::get(block_number).len(), i as usize); - }: {Pallet::<T>::expire_memberships(block_number);} - verify { + assert_eq!( + MembershipsExpireOn::<T>::get(block_number).len(), + i as usize + ); + + #[block] + { + Pallet::<T>::expire_memberships(block_number); + } + assert_eq!(MembershipsExpireOn::<T>::get(block_number).len(), 0_usize); } impl_benchmark_test_suite!( Pallet, crate::mock::new_test_ext(crate::mock::MembershipConfig { - memberships: btreemap![ - 3 => MembershipData { - expire_on: 3, - }, - ],}), + memberships: maplit::btreemap![ + 3 => crate::MembershipData { + expire_on: 3, + }, + ], + }), crate::mock::Test ); }