diff --git a/pallets/certification/src/benchmarking.rs b/pallets/certification/src/benchmarking.rs index 1fa4b0bfb708c1573e8dc46f2fdd60c2488b723c..668d5cdfae938ace52c59b76c7e78e4386d81ca2 100644 --- a/pallets/certification/src/benchmarking.rs +++ b/pallets/certification/src/benchmarking.rs @@ -37,11 +37,11 @@ mod benchmarks { 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 { + for j in 1..i + 1 { Pallet::<T>::do_add_cert_checked(j.into(), receiver, false)?; } assert!( - CertsByReceiver::<T>::get(receiver).len() as u32 == i - 1, + CertsByReceiver::<T>::get(receiver).len() as u32 == i, "Certs not added", ); Ok(()) @@ -157,6 +157,29 @@ mod benchmarks { Ok(()) } + #[benchmark] + fn do_remove_all_certs_received_by(i: Linear<2, 100>) -> Result<(), BenchmarkError> { + let receiver: T::IdtyIndex = 0.into(); + add_certs::<T>(i, receiver)?; + + #[block] + { + Pallet::<T>::do_remove_all_certs_received_by(receiver); + } + + for issuer in 1..i + 1 { + assert_has_event::<T>( + Event::<T>::CertRemoved { + issuer: issuer.into(), + receiver, + expiration: false, + } + .into(), + ); + } + Ok(()) + } + impl_benchmark_test_suite!( Pallet, crate::mock::new_test_ext(crate::mock::DefaultCertificationConfig { diff --git a/pallets/certification/src/lib.rs b/pallets/certification/src/lib.rs index 08aa992f71627b50bc57fb8bf059eeb8b3dabc72..204c8cb08d70bb44323b8eaa53df92db2ff69154 100644 --- a/pallets/certification/src/lib.rs +++ b/pallets/certification/src/lib.rs @@ -362,11 +362,28 @@ pub mod pallet { impl<T: Config> Pallet<T> { /// Perform removal of all certifications received by an identity. pub fn do_remove_all_certs_received_by(idty_index: T::IdtyIndex) -> Weight { - let mut weight = T::DbWeight::get().reads_writes(1, 0); - for (issuer, _) in CertsByReceiver::<T>::get(idty_index) { - weight = weight.saturating_add(Self::do_remove_cert(issuer, idty_index, None)); + let received_certs = CertsByReceiver::<T>::take(idty_index); + for (receiver_received_count, (issuer, _)) in received_certs.iter().enumerate().rev() { + let issuer_issued_count = + <StorageIdtyCertMeta<T>>::mutate_exists(issuer, |cert_meta_opt| { + let cert_meta = cert_meta_opt.get_or_insert(IdtyCertMeta::default()); + cert_meta.issued_count = cert_meta.issued_count.saturating_sub(1); + cert_meta.issued_count + }); + T::OnRemovedCert::on_removed_cert( + *issuer, + issuer_issued_count, + idty_index, + receiver_received_count as u32, + false, + ); + Self::deposit_event(Event::CertRemoved { + issuer: *issuer, + receiver: idty_index, + expiration: false, + }); } - weight + T::WeightInfo::do_remove_all_certs_received_by(received_certs.len() as u32) } /// Get the issuer index from the origin. diff --git a/pallets/certification/src/weights.rs b/pallets/certification/src/weights.rs index e58c33831e312ab841d57ef2d91c56159d941e23..49280e9f297d4eec2b90db86fe011f30b891b630 100644 --- a/pallets/certification/src/weights.rs +++ b/pallets/certification/src/weights.rs @@ -27,6 +27,7 @@ pub trait WeightInfo { fn on_initialize() -> Weight; fn do_remove_cert_noop() -> Weight; fn do_remove_cert() -> Weight; + fn do_remove_all_certs_received_by(i: u32) -> Weight; } // Insecure weights implementation, use it for tests only! @@ -102,4 +103,20 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(7 as u64)) .saturating_add(RocksDbWeight::get().writes(4 as u64)) } + + // Storage: Cert CertsByReceiver (r:1 w:1) + // Storage: Cert StorageIdtyCertMeta (r:2 w:2) + // Storage: Parameters ParametersStorage (r:1 w:0) + // Storage: Membership Membership (r:1 w:0) + /// The range of component `i` is `[2, 1000]`. + fn do_remove_all_certs_received_by(i: u32) -> Weight { + // Minimum execution time: 223_292 nanoseconds. + Weight::from_parts(233_586_000 as u64, 0) + // Standard Error: 598_929 + .saturating_add(Weight::from_parts(53_659_501 as u64, 0).saturating_mul(i as u64)) + .saturating_add(RocksDbWeight::get().reads(3 as u64)) + .saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(i as u64))) + .saturating_add(RocksDbWeight::get().writes(1 as u64)) + .saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(i as u64))) + } } diff --git a/runtime/g1/src/weights/pallet_certification.rs b/runtime/g1/src/weights/pallet_certification.rs index 9b40f1ab37e273f17ab497b9d7e33a201f161f63..3b52d4e48a4d49b559614a03f87b12da53d58d20 100644 --- a/runtime/g1/src/weights/pallet_certification.rs +++ b/runtime/g1/src/weights/pallet_certification.rs @@ -188,4 +188,26 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T> .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } + /// Storage: `Certification::CertsByReceiver` (r:1 w:1) + /// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Certification::StorageIdtyCertMeta` (r:1000 w:1000) + /// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Membership::Membership` (r:1 w:0) + /// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `i` is `[2, 1000]`. + fn do_remove_all_certs_received_by(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `554 + i * (35 ±0)` + // Estimated: `4018 + i * (2511 ±0)` + // Minimum execution time: 30_026_000 picoseconds. + Weight::from_parts(30_298_000, 0) + .saturating_add(Weight::from_parts(0, 4018)) + // Standard Error: 24_742 + .saturating_add(Weight::from_parts(8_970_118, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + .saturating_add(Weight::from_parts(0, 2511).saturating_mul(i.into())) + } } diff --git a/runtime/gdev/src/weights/pallet_certification.rs b/runtime/gdev/src/weights/pallet_certification.rs index e3accd5ecafa1602dc6bfb4affcd1d4e0e4e5f93..73df17f4b80ad7deb0ff5c2a0ab985425abdb755 100644 --- a/runtime/gdev/src/weights/pallet_certification.rs +++ b/runtime/gdev/src/weights/pallet_certification.rs @@ -172,4 +172,28 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T> .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(3)) } + /// Storage: `Certification::CertsByReceiver` (r:1 w:1) + /// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Certification::StorageIdtyCertMeta` (r:1000 w:1000) + /// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Parameters::ParametersStorage` (r:1 w:0) + /// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Membership::Membership` (r:1 w:0) + /// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `i` is `[2, 1000]`. + fn do_remove_all_certs_received_by(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `665 + i * (35 ±0)` + // Estimated: `4129 + i * (2511 ±0)` + // Minimum execution time: 33_392_000 picoseconds. + Weight::from_parts(34_295_000, 0) + .saturating_add(Weight::from_parts(0, 4129)) + // Standard Error: 24_307 + .saturating_add(Weight::from_parts(9_192_872, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + .saturating_add(Weight::from_parts(0, 2511).saturating_mul(i.into())) + } } diff --git a/runtime/gtest/src/weights/pallet_certification.rs b/runtime/gtest/src/weights/pallet_certification.rs index df9b6216da3df8c692168ee1db4b785b156fbc5b..6c9f58a2c7e403c39c300978ad204a62ba96619e 100644 --- a/runtime/gtest/src/weights/pallet_certification.rs +++ b/runtime/gtest/src/weights/pallet_certification.rs @@ -188,4 +188,26 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T> .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } + /// Storage: `Certification::CertsByReceiver` (r:1 w:1) + /// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Certification::StorageIdtyCertMeta` (r:1000 w:1000) + /// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Membership::Membership` (r:1 w:0) + /// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `i` is `[2, 1000]`. + fn do_remove_all_certs_received_by(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `554 + i * (35 ±0)` + // Estimated: `4018 + i * (2511 ±0)` + // Minimum execution time: 29_810_000 picoseconds. + Weight::from_parts(30_875_000, 0) + .saturating_add(Weight::from_parts(0, 4018)) + // Standard Error: 25_367 + .saturating_add(Weight::from_parts(8_966_191, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + .saturating_add(Weight::from_parts(0, 2511).saturating_mul(i.into())) + } }