From 565146e55ebd8d59d2e56f46a7867de7b7bf03ce Mon Sep 17 00:00:00 2001 From: librelois <c@elo.tf> Date: Tue, 12 Jul 2022 22:56:52 +0200 Subject: [PATCH] ref(runtime): rework pallet certification --- .../cucumber-features/certification.feature | 1 + end2end-tests/cucumber-genesis/wot.json | 8 +- end2end-tests/tests/cucumber_tests.rs | 18 +- node/src/chain_spec/gdev.rs | 12 +- node/src/chain_spec/gen_genesis_data.rs | 34 +-- pallets/certification/src/lib.rs | 210 ++++++++---------- pallets/certification/src/mock.rs | 2 +- pallets/certification/src/tests.rs | 62 +++--- pallets/certification/src/types.rs | 5 - pallets/duniter-wot/src/mock.rs | 4 +- resources/metadata.scale | Bin 120061 -> 119794 bytes runtime/gdev/tests/common/mod.rs | 7 +- 12 files changed, 179 insertions(+), 184 deletions(-) diff --git a/end2end-tests/cucumber-features/certification.feature b/end2end-tests/cucumber-features/certification.feature index 33821859b..77bfc5746 100644 --- a/end2end-tests/cucumber-features/certification.feature +++ b/end2end-tests/cucumber-features/certification.feature @@ -3,5 +3,6 @@ Feature: Certification Scenario: Dave certifies Alice + When 2 blocks later When dave certifies alice Then alice should be certified by dave diff --git a/end2end-tests/cucumber-genesis/wot.json b/end2end-tests/cucumber-genesis/wot.json index 7b4639842..205481324 100644 --- a/end2end-tests/cucumber-genesis/wot.json +++ b/end2end-tests/cucumber-genesis/wot.json @@ -4,12 +4,12 @@ "identities": { "Alice": { "balance": 1000, - "certs": ["Bob", "Charlie", "Dave"], + "certs": ["Bob", "Charlie"], "pubkey": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" }, "Bob": { "balance": 1000, - "certs": ["Alice", "Charlie", "Dave"], + "certs": ["Alice", "Charlie"], "pubkey": "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty" }, "Charlie": { @@ -19,13 +19,13 @@ }, "Dave": { "balance": 1000, - "certs": [], + "certs": ["Alice", "Bob"], "pubkey": "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy" } }, "parameters": { "babe_epoch_duration": 30, - "cert_period": 15, + "cert_period": 2, "cert_max_by_issuer": 10, "cert_min_received_cert_to_issue_cert": 2, "cert_validity_period": 1000, diff --git a/end2end-tests/tests/cucumber_tests.rs b/end2end-tests/tests/cucumber_tests.rs index 13d88217d..dbe9e4cc8 100644 --- a/end2end-tests/tests/cucumber_tests.rs +++ b/end2end-tests/tests/cucumber_tests.rs @@ -278,15 +278,23 @@ async fn should_be_certified_by( .await? .unwrap(); - let _certification = world + let issuers = world .api() .storage() .cert() - .storage_certs_by_issuer(issuer_index, receiver_index, None) - .await? - .ok_or_else(|| anyhow::anyhow!("no certification found from {} to {}", issuer, receiver))?; + .certs_by_receiver(receiver_index, None) + .await?; - Ok(()) + match issuers.binary_search_by(|(issuer_, _)| issuer_index.cmp(issuer_)) { + Ok(_) => Ok(()), + Err(_) => Err(anyhow::anyhow!( + "no certification found from {} to {}: {:?}", + issuer, + receiver, + issuers + ) + .into()), + } } // ============================================================ diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs index 299482d17..93290c01a 100644 --- a/node/src/chain_spec/gdev.rs +++ b/node/src/chain_spec/gdev.rs @@ -380,7 +380,7 @@ fn gen_genesis_for_local_chain( }, cert: CertConfig { apply_cert_period_at_genesis: false, - certs_by_issuer: clique_wot(initial_identities.len(), cert_validity_period), + certs_by_receiver: clique_wot(initial_identities.len(), cert_validity_period), }, smiths_membership: SmithsMembershipConfig { memberships: (1..=initial_smiths_len) @@ -389,7 +389,7 @@ fn gen_genesis_for_local_chain( }, smiths_cert: SmithsCertConfig { apply_cert_period_at_genesis: false, - certs_by_issuer: clique_wot(initial_smiths_len, smith_cert_validity_period), + certs_by_receiver: clique_wot(initial_smiths_len, smith_cert_validity_period), }, smiths_collective: Default::default(), universal_dividend: UniversalDividendConfig { @@ -427,7 +427,7 @@ fn genesis_data_to_gdev_genesis_conf( ) -> gdev_runtime::GenesisConfig { let super::gen_genesis_data::GenesisData { accounts, - certs_by_issuer, + certs_by_receiver, first_ud, first_ud_reeval, identities, @@ -436,7 +436,7 @@ fn genesis_data_to_gdev_genesis_conf( memberships, parameters, session_keys_map, - smiths_certs_by_issuer, + smiths_certs_by_receiver, smiths_memberships, sudo_key, } = genesis_data; @@ -486,12 +486,12 @@ fn genesis_data_to_gdev_genesis_conf( }, cert: CertConfig { apply_cert_period_at_genesis: true, - certs_by_issuer, + certs_by_receiver, }, membership: MembershipConfig { memberships }, smiths_cert: SmithsCertConfig { apply_cert_period_at_genesis: true, - certs_by_issuer: smiths_certs_by_issuer, + certs_by_receiver: smiths_certs_by_receiver, }, smiths_membership: SmithsMembershipConfig { memberships: smiths_memberships, diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs index 24751d615..dd552e9be 100644 --- a/node/src/chain_spec/gen_genesis_data.rs +++ b/node/src/chain_spec/gen_genesis_data.rs @@ -26,7 +26,7 @@ const EXISTENTIAL_DEPOSIT: u64 = 100; #[derive(Clone)] pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> { pub accounts: BTreeMap<AccountId, GenesisAccountData<u64>>, - pub certs_by_issuer: BTreeMap<u32, BTreeMap<u32, u32>>, + pub certs_by_receiver: BTreeMap<u32, BTreeMap<u32, u32>>, pub first_ud: u64, pub first_ud_reeval: u32, pub identities: Vec<(String, AccountId)>, @@ -35,7 +35,7 @@ pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> { pub memberships: BTreeMap<u32, MembershipData>, pub parameters: Parameters, pub session_keys_map: BTreeMap<AccountId, SessionKeys>, - pub smiths_certs_by_issuer: BTreeMap<u32, BTreeMap<u32, u32>>, + pub smiths_certs_by_receiver: BTreeMap<u32, BTreeMap<u32, u32>>, pub smiths_memberships: BTreeMap<u32, MembershipData>, pub sudo_key: Option<AccountId>, } @@ -209,19 +209,19 @@ where // CERTIFICATIONS // - let mut certs_by_issuer = BTreeMap::new(); + let mut certs_by_receiver = BTreeMap::new(); for (idty_name, identity) in &identities { let issuer_index = idty_index_of .get(&idty_name) .ok_or(format!("Identity '{}' not exist", &idty_name))?; - let mut issuer_certs = BTreeMap::new(); - for receiver in &identity.certs { - let receiver_index = idty_index_of - .get(receiver) - .ok_or(format!("Identity '{}' not exist", receiver))?; - issuer_certs.insert(*receiver_index, genesis_certs_expire_on); + let mut receiver_certs = BTreeMap::new(); + for issuer in &identity.certs { + let issuer_index = idty_index_of + .get(issuer) + .ok_or(format!("Identity '{}' not exist", issuer))?; + receiver_certs.insert(*issuer_index, genesis_certs_expire_on); } - certs_by_issuer.insert(*issuer_index, issuer_certs); + certs_by_receiver.insert(*issuer_index, receiver_certs); } // SMITHS SUB-WOT // @@ -230,7 +230,7 @@ where let mut online_authorities_counter = 0; let mut session_keys_map = BTreeMap::new(); let mut smiths_memberships = BTreeMap::new(); - let mut smiths_certs_by_issuer = BTreeMap::new(); + let mut smiths_certs_by_receiver = BTreeMap::new(); for (idty_name, smith_data) in smith_identities { let idty_index = idty_index_of .get(&idty_name) @@ -284,14 +284,14 @@ where ); // Certifications - let mut issuer_certs = BTreeMap::new(); + let mut receiver_certs = BTreeMap::new(); for receiver in &smith_data.certs { - let receiver_index = idty_index_of + let issuer_index = idty_index_of .get(receiver) .ok_or(format!("Identity '{}' not exist", receiver))?; - issuer_certs.insert(*receiver_index, genesis_smith_certs_expire_on); + receiver_certs.insert(*issuer_index, genesis_smith_certs_expire_on); } - smiths_certs_by_issuer.insert(*idty_index, issuer_certs); + smiths_certs_by_receiver.insert(*idty_index, receiver_certs); // Memberships smiths_memberships.insert( @@ -308,7 +308,7 @@ where let genesis_data = GenesisData { accounts, - certs_by_issuer, + certs_by_receiver, first_ud, first_ud_reeval, identities: identities_, @@ -317,7 +317,7 @@ where memberships, parameters, session_keys_map, - smiths_certs_by_issuer, + smiths_certs_by_receiver, smiths_memberships, sudo_key, }; diff --git a/pallets/certification/src/lib.rs b/pallets/certification/src/lib.rs index 5d333e7be..1c3e5936d 100644 --- a/pallets/certification/src/lib.rs +++ b/pallets/certification/src/lib.rs @@ -92,7 +92,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig<T: Config<I>, I: 'static = ()> { pub apply_cert_period_at_genesis: bool, - pub certs_by_issuer: BTreeMap<T::IdtyIndex, BTreeMap<T::IdtyIndex, T::BlockNumber>>, + pub certs_by_receiver: BTreeMap<T::IdtyIndex, BTreeMap<T::IdtyIndex, T::BlockNumber>>, } #[cfg(feature = "std")] @@ -100,7 +100,7 @@ pub mod pallet { fn default() -> Self { Self { apply_cert_period_at_genesis: false, - certs_by_issuer: Default::default(), + certs_by_receiver: Default::default(), } } } @@ -110,47 +110,36 @@ pub mod pallet { fn build(&self) { let mut cert_meta_by_issuer = BTreeMap::<T::IdtyIndex, IdtyCertMeta<T::BlockNumber>>::new(); - let mut certs_by_receiver = BTreeMap::<T::IdtyIndex, Vec<T::IdtyIndex>>::new(); - for (issuer, receivers) in &self.certs_by_issuer { + let mut certs_removable_on = + BTreeMap::<T::BlockNumber, Vec<(T::IdtyIndex, T::IdtyIndex)>>::new(); + for (receiver, issuers) in &self.certs_by_receiver { + // Forbid self-cert assert!( - !receivers.contains_key(issuer), + !issuers.contains_key(receiver), "Identity cannot certify it-self." ); - assert!( - !receivers.len() >= T::MaxByIssuer::get() as usize, - "Identity n°{:?} exceed MaxByIssuer.", - issuer - ); - cert_meta_by_issuer.insert( - *issuer, - IdtyCertMeta { - issued_count: receivers.len() as u32, + // We should insert cert_meta for receivers that have not issued any cert. + cert_meta_by_issuer + .entry(*receiver) + .or_insert(IdtyCertMeta { + issued_count: 0, next_issuable_on: sp_runtime::traits::Zero::zero(), - received_count: 0, - }, - ); - for receiver in receivers.keys() { - certs_by_receiver - .entry(*receiver) - .or_default() - .push(*issuer); - } - } + received_count: issuers.len() as u32, + }); - // Write StorageCertsByReceiver - for (receiver, mut issuers) in certs_by_receiver { - cert_meta_by_issuer - .entry(receiver) - .and_modify(|cert_meta| cert_meta.received_count = issuers.len() as u32); - issuers.sort(); - <StorageCertsByReceiver<T, I>>::insert(receiver, issuers); - } - // Write StorageCertsByIssuer - let mut certs_removable_on = - BTreeMap::<T::BlockNumber, Vec<(T::IdtyIndex, T::IdtyIndex)>>::new(); - for (issuer, receivers) in &self.certs_by_issuer { - for (receiver, removable_on) in receivers { + for (issuer, removable_on) in issuers { + // Count issued certs + cert_meta_by_issuer + .entry(*issuer) + .or_insert(IdtyCertMeta { + issued_count: 0, + next_issuable_on: sp_runtime::traits::Zero::zero(), + received_count: issuers.len() as u32, + }) + .issued_count += 1; + + // Prepare CertsRemovableOn certs_removable_on .entry(*removable_on) .or_default() @@ -166,23 +155,31 @@ pub mod pallet { } } } - - <StorageCertsByIssuer<T, I>>::insert( - issuer, - receiver, - CertValue { - removable_on: *removable_on, - }, - ); } + + // Write CertsByReceiver + let mut issuers: Vec<_> = issuers.iter().collect(); + issuers.sort(); + CertsByReceiver::<T, I>::insert(receiver, issuers); } + // Write StorageIdtyCertMeta for (issuer, cert_meta) in cert_meta_by_issuer { - <StorageIdtyCertMeta<T, I>>::insert(issuer, cert_meta); + assert!( + !cert_meta.issued_count >= T::MaxByIssuer::get(), + "Identity n°{:?} exceed MaxByIssuer.", + issuer + ); + assert!( + !cert_meta.received_count >= T::MinReceivedCertToBeAbleToIssueCert::get(), + "Identity n°{:?} not respect MinReceivedCertToBeAbleToIssueCert.", + issuer + ); + StorageIdtyCertMeta::<T, I>::insert(issuer, cert_meta); } // Write storage StorageCertsRemovableOn for (removable_on, certs) in certs_removable_on { - <StorageCertsRemovableOn<T, I>>::insert(removable_on, certs); + StorageCertsRemovableOn::<T, I>::insert(removable_on, certs); } } } @@ -195,27 +192,11 @@ pub mod pallet { pub type StorageIdtyCertMeta<T: Config<I>, I: 'static = ()> = StorageMap<_, Twox64Concat, T::IdtyIndex, IdtyCertMeta<T::BlockNumber>, ValueQuery>; - /// Certifications by issuer - #[pallet::storage] - #[pallet::getter(fn cert)] - /// Certifications by issuer - pub(super) type StorageCertsByIssuer<T: Config<I>, I: 'static = ()> = StorageDoubleMap< - _, - Twox64Concat, - T::IdtyIndex, - Twox64Concat, - T::IdtyIndex, - CertValue<T::BlockNumber>, - OptionQuery, - GetDefault, - ConstU32<4_000_000_000>, - >; - /// Certifications by receiver #[pallet::storage] #[pallet::getter(fn certs_by_receiver)] - pub type StorageCertsByReceiver<T: Config<I>, I: 'static = ()> = - StorageMap<_, Twox64Concat, T::IdtyIndex, Vec<T::IdtyIndex>, ValueQuery>; + pub type CertsByReceiver<T: Config<I>, I: 'static = ()> = + StorageMap<_, Twox64Concat, T::IdtyIndex, Vec<(T::IdtyIndex, T::BlockNumber)>, ValueQuery>; /// Certifications removable on #[pallet::storage] @@ -310,8 +291,7 @@ pub mod pallet { } }; - let create = !StorageCertsByIssuer::<T, I>::contains_key(issuer, receiver); - Self::do_add_cert(block_number, create, issuer, receiver) + Self::do_add_cert(block_number, issuer, receiver) } /// Add a new certification or renew an existing one /// @@ -348,8 +328,7 @@ pub mod pallet { return Err(Error::<T, I>::IssuedTooManyCert.into()); } - let create = !StorageCertsByIssuer::<T, I>::contains_key(issuer, receiver); - Self::do_add_cert(block_number, create, issuer, receiver) + Self::do_add_cert(block_number, issuer, receiver) } #[pallet::weight(1_000_000_000)] @@ -369,10 +348,8 @@ pub mod pallet { idty_index: T::IdtyIndex, ) -> DispatchResultWithPostInfo { ensure_root(origin)?; - if let Ok(issuers) = <StorageCertsByReceiver<T, I>>::try_get(idty_index) { - for issuer in issuers { - Self::remove_cert_inner(issuer, idty_index, None); - } + for (issuer, _) in CertsByReceiver::<T, I>::get(idty_index) { + Self::remove_cert_inner(issuer, idty_index, None); } Ok(().into()) } @@ -383,42 +360,42 @@ pub mod pallet { impl<T: Config<I>, I: 'static> Pallet<T, I> { fn do_add_cert( block_number: T::BlockNumber, - create: bool, issuer: T::IdtyIndex, receiver: T::IdtyIndex, ) -> DispatchResultWithPostInfo { - // Write StorageIdtyCertMeta for issuer - let issuer_issued_count = - StorageIdtyCertMeta::<T, I>::mutate(issuer, |issuer_idty_cert_meta| { - issuer_idty_cert_meta.issued_count = - issuer_idty_cert_meta.issued_count.saturating_add(1); - issuer_idty_cert_meta.next_issuable_on = block_number + T::CertPeriod::get(); - issuer_idty_cert_meta.issued_count - }); + // Write StorageCertsRemovableOn + let removable_on = block_number + T::ValidityPeriod::get(); + <StorageCertsRemovableOn<T, I>>::append(removable_on, (issuer, receiver)); + + // Write CertsByReceiver + let mut created = false; + CertsByReceiver::<T, I>::mutate_exists(receiver, |maybe_issuers| { + let issuers = maybe_issuers.get_or_insert(Vec::with_capacity(0)); + if let Err(index) = issuers.binary_search_by(|(issuer_, _)| issuer.cmp(issuer_)) { + issuers.insert(index, (issuer, removable_on)); + created = true; + } + }); - // Write StorageIdtyCertMeta for receiver - let receiver_received_count = - <StorageIdtyCertMeta<T, I>>::mutate_exists(receiver, |cert_meta_opt| { - let cert_meta = cert_meta_opt.get_or_insert(IdtyCertMeta::default()); - cert_meta.received_count = cert_meta.received_count.saturating_add(1); - cert_meta.received_count - }); + if created { + // Write StorageIdtyCertMeta for issuer + let issuer_issued_count = + StorageIdtyCertMeta::<T, I>::mutate(issuer, |issuer_idty_cert_meta| { + issuer_idty_cert_meta.issued_count = + issuer_idty_cert_meta.issued_count.saturating_add(1); + issuer_idty_cert_meta.next_issuable_on = + block_number + T::CertPeriod::get(); + issuer_idty_cert_meta.issued_count + }); + + // Write StorageIdtyCertMeta for receiver + let receiver_received_count = + <StorageIdtyCertMeta<T, I>>::mutate_exists(receiver, |cert_meta_opt| { + let cert_meta = cert_meta_opt.get_or_insert(IdtyCertMeta::default()); + cert_meta.received_count = cert_meta.received_count.saturating_add(1); + cert_meta.received_count + }); - // Write StorageCertsRemovableOn and StorageCertsByIssuer - let cert_value = CertValue { - removable_on: block_number + T::ValidityPeriod::get(), - }; - <StorageCertsRemovableOn<T, I>>::append(cert_value.removable_on, (issuer, receiver)); - <StorageCertsByIssuer<T, I>>::insert(issuer, receiver, cert_value); - - if create { - // Write StorageCertsByReceiver - <StorageCertsByReceiver<T, I>>::mutate_exists(receiver, |issuers_opt| { - let issuers = issuers_opt.get_or_insert(Vec::with_capacity(0)); - if let Err(index) = issuers.binary_search(&issuer) { - issuers.insert(index, issuer); - } - }); Self::deposit_event(Event::NewCert { issuer, issuer_issued_count, @@ -455,24 +432,23 @@ pub mod pallet { ) -> Weight { let mut total_weight: Weight = 0; let mut removed = false; - <StorageCertsByIssuer<T, I>>::mutate_exists(issuer, receiver, |cert_val_opt| { - if let Some(cert_val) = cert_val_opt { - if Some(cert_val.removable_on) == block_number_opt || block_number_opt.is_none() - { + CertsByReceiver::<T, I>::mutate_exists(receiver, |issuers_opt| { + let issuers = issuers_opt.get_or_insert(Vec::with_capacity(0)); + if let Ok(index) = issuers.binary_search_by(|(issuer_, _)| issuer.cmp(issuer_)) { + if let Some(block_number) = block_number_opt { + if let Some((_, removable_on)) = issuers.get(index) { + if *removable_on == block_number { + issuers.remove(index); + removed = true; + } + } + } else { + issuers.remove(index); removed = true; } } - if removed { - cert_val_opt.take(); - } }); if removed { - <StorageCertsByReceiver<T, I>>::mutate_exists(receiver, |issuers_opt| { - let issuers = issuers_opt.get_or_insert(Vec::with_capacity(0)); - if let Ok(index) = issuers.binary_search(&issuer) { - issuers.remove(index); - } - }); let issuer_issued_count = <StorageIdtyCertMeta<T, I>>::mutate_exists(issuer, |cert_meta_opt| { let cert_meta = cert_meta_opt.get_or_insert(IdtyCertMeta::default()); diff --git a/pallets/certification/src/mock.rs b/pallets/certification/src/mock.rs index 96a467257..3bbbe3c22 100644 --- a/pallets/certification/src/mock.rs +++ b/pallets/certification/src/mock.rs @@ -92,7 +92,7 @@ impl frame_support::traits::EnsureOrigin<(Origin, IdtyIndex, IdtyIndex)> for Ens } parameter_types! { - pub const MaxByIssuer: u32 = 3; + pub const MaxByIssuer: u32 = 4; pub const MinReceivedCertToBeAbleToIssueCert: u32 = 2; pub const CertPeriod: u64 = 2; pub const ValidityPeriod: u64 = 10; diff --git a/pallets/certification/src/tests.rs b/pallets/certification/src/tests.rs index 25998c16b..37c56ad3b 100644 --- a/pallets/certification/src/tests.rs +++ b/pallets/certification/src/tests.rs @@ -26,7 +26,7 @@ use sp_std::collections::btree_map::BTreeMap; fn test_must_receive_cert_before_can_issue() { new_test_ext(DefaultCertificationConfig { apply_cert_period_at_genesis: true, - certs_by_issuer: BTreeMap::new(), + certs_by_receiver: BTreeMap::new(), }) .execute_with(|| { assert_eq!( @@ -40,15 +40,10 @@ fn test_must_receive_cert_before_can_issue() { fn test_cannot_certify_self() { new_test_ext(DefaultCertificationConfig { apply_cert_period_at_genesis: true, - certs_by_issuer: btreemap![ - 1 => btreemap![ - 0 => 5, - ], - 2 => btreemap![ - 0 => 5, - ], - 3 => btreemap![ - 0 => 5, + certs_by_receiver: btreemap![ + 0 => btreemap![ + 1 => 5, + 2 => 5, ], ], }) @@ -66,18 +61,18 @@ fn test_cannot_certify_self() { fn test_genesis_build() { new_test_ext(DefaultCertificationConfig { apply_cert_period_at_genesis: true, - certs_by_issuer: btreemap![ + certs_by_receiver: btreemap![ 0 => btreemap![ - 1 => 10, - 2 => 5, + 1 => 7, + 2 => 9, ], 1 => btreemap![ - 0 => 7, - 2 => 4, + 0 => 10, + 2 => 3, ], 2 => btreemap![ - 0 => 9, - 1 => 3, + 0 => 5, + 1 => 4, ], ], }) @@ -135,25 +130,42 @@ fn test_genesis_build() { fn test_cert_period() { new_test_ext(DefaultCertificationConfig { apply_cert_period_at_genesis: true, - certs_by_issuer: btreemap![ - 0 => btreemap![1 => 10], - 2 => btreemap![0 => 10], - 3 => btreemap![0 => 10], + certs_by_receiver: btreemap![ + 0 => btreemap![ + 1 => 10, + 2 => 10, + ], + 1 => btreemap![ + 0 => 10, + 2 => 10, + ], + 2 => btreemap![ + 0 => 10, + 1 => 10, + ], ], }) .execute_with(|| { assert_eq!( - DefaultCertification::add_cert(Origin::signed(0), 2), + DefaultCertification::idty_cert_meta(0), + crate::IdtyCertMeta { + issued_count: 2, + next_issuable_on: 2, + received_count: 2, + } + ); + assert_eq!( + DefaultCertification::add_cert(Origin::signed(0), 3), Err(Error::<Test, _>::NotRespectCertPeriod.into()) ); run_to_block(CertPeriod::get()); - assert_ok!(DefaultCertification::add_cert(Origin::signed(0), 2)); + assert_ok!(DefaultCertification::add_cert(Origin::signed(0), 3)); run_to_block(CertPeriod::get() + 1); assert_eq!( - DefaultCertification::add_cert(Origin::signed(0), 3), + DefaultCertification::add_cert(Origin::signed(0), 4), Err(Error::<Test, _>::NotRespectCertPeriod.into()) ); run_to_block((2 * CertPeriod::get()) + 1); - assert_ok!(DefaultCertification::add_cert(Origin::signed(0), 3)); + assert_ok!(DefaultCertification::add_cert(Origin::signed(0), 4)); }); } diff --git a/pallets/certification/src/types.rs b/pallets/certification/src/types.rs index 4d2534c57..6681fa8b6 100644 --- a/pallets/certification/src/types.rs +++ b/pallets/certification/src/types.rs @@ -20,11 +20,6 @@ use codec::{Decode, Encode}; use frame_support::pallet_prelude::*; use scale_info::TypeInfo; -#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)] -pub struct CertValue<BlockNumber> { - pub removable_on: BlockNumber, -} - #[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub struct IdtyCertMeta<BlockNumber: Default> { pub issued_count: u32, diff --git a/pallets/duniter-wot/src/mock.rs b/pallets/duniter-wot/src/mock.rs index 082388a87..7c1490b38 100644 --- a/pallets/duniter-wot/src/mock.rs +++ b/pallets/duniter-wot/src/mock.rs @@ -270,8 +270,8 @@ pub fn new_test_ext( .unwrap(); pallet_certification::GenesisConfig::<Test, Instance1> { - certs_by_issuer: clique_wot(initial_identities_len, ValidityPeriod::get()), apply_cert_period_at_genesis: true, + certs_by_receiver: clique_wot(initial_identities_len, ValidityPeriod::get()), } .assimilate_storage(&mut t) .unwrap(); @@ -292,8 +292,8 @@ pub fn new_test_ext( .unwrap(); pallet_certification::GenesisConfig::<Test, Instance2> { - certs_by_issuer: clique_wot(initial_smiths_len, SmithsValidityPeriod::get()), apply_cert_period_at_genesis: true, + certs_by_receiver: clique_wot(initial_smiths_len, SmithsValidityPeriod::get()), } .assimilate_storage(&mut t) .unwrap(); diff --git a/resources/metadata.scale b/resources/metadata.scale index 968b774a7abe5dd37311695ef4112ee05e6e9946..90750afa43fe6d866bf9ea3912c915d6b4a4ed08 100644 GIT binary patch delta 827 zcmZWmO-NKx7`^BDji!#GIHo3wQ&?IWiVSL~IoTj4lj*2~iP>aN-&AU&BRYbjk&8hj zhDkmW+O&}%{E6x<G)fUc`*YAJf)*AnYG>4<h0vSPMbPS=d+s^syZ7APhY>%gBf>jn zw<Gr6X!z4`9H~}EsxdC%k2+h4j}q;M=`Z-V!wvg1_>PPMUa%nnI(}!v93s_`dIY5C z7!raG2omw+zaL0d`|bD&Byw{TW@1u;hx&O*B#Sii2R<aLCojTBQAUlIGD&2Tf7@*2 zAD2)dWe0I8pK8UE=-g0fJ|&C%(BwoDkxh#d#f0QWxviwWOb8R3FT<Bm9LzG2C=Gec zn#a87vFv-Q{_$8i*MZ@vs-VY0!b*PEnI!eK14EKjOWdtT5?{HB2WViO3@@63Q5LC% z{7PLq|B?|02kY8#95Uy%V+T%#Q+sV;2WpI+q}?z}2%!N%87}H04-L^Md1-=tBwReG z;1Dl$AP;?eSg+s&?{pxQ>l7U0LPbM&6&z+y5Cs$*jT$59Ej<n)##C+8d>p)c);AvH z@MDiAGYldFJ~j=a29xU8APi>cd1?XYP{QSlFi0k-4U0Gn{8p!)<CgZ%oc0na|EXA0 zwQ}tezDc`bT(pdQfUhlM7&`U)GO~e4PFO(>V$|{#R7i;D+pEY7i=jk*v<eea)Gw=O zmXO9}Yv_lOpRFNXTi&nX6S8@39cjqrx9eC$sXG1&O9U%hH_(Jyp58#a)_ZI~tEY)i z2Vh5w$^pCpTG+mcMy>jpP0W%^W+ywgaIoD)1LYNp+;-h|Q*LXNdwQMSU40Z+6yoX! z_8AYw<%O6^xl8VK_6||Tp2FJQ<96I|x;>+mkrh&$@9t`oy)=*$+Sz4ihvJ^#&s#{< J`DkF0{sIs8^5Osh delta 1008 zcmb_b-%FHf6n>v?&e)h5<EE&oHCFCsX{*#gLPly<w%ID<k1Wb2=WS+cbn=^-nlI2Y zFcA7Rh#Z1q$u6Q@unmgu#$^x@T=ydNBC882B9`s0po@s0cV-Os59sQg_c`Zz&inG5 z_rv`aUmmPT>ycsisyl;ePtvgA7yj)4(h4`$OFi7~4n!oC*9C&zXAVVrPD&kiLCm{R ztcg$N^=6D|_+mcXhv%9GGH*2Ft_CYtxv&@M9ChJOEsI8OI*ZJ`t$3_uWRnnN6C`qJ z<j#Dd>FB^4pn$0p<5|UtV&)@F<cks-nP1E|7dsK7^iqXuWhBbD?>O2}kqAZn<~SZ_ zR3-JClrNl#q1$q+iCjuW)DZI9W%th3T|!jzyDr35*Cb@BNz^7e4T{r{;xsOEn*PUW z<Yy-^u(Bz^X(Z7?BYkywX2gwtO=}|#W+IO>JQzbKk9#nTV@WAKBk=>=JRtEiB#%pM zhM!+ZyhjiJa|)i4K2n$4B!p0jAV-7@>Zd^(qH7eRQ4$e;?Zp~C?L{TO@}iKRc(H}o z`&9PXi=Qx<s@M3i9z&`8f)78g942Ho=x!l~&EI`^WalwMQO+4CM=aI$mjMSxdC9=9 zxMgm=fSg*``AQrIHZ;4!LEY_@3ClxuMq?-xk-C7*Y7Km}kg$0i^&Fc(p5<F&JG{)` z`8aZLmH&;Si!Bp)i%;f%6S%Clf&+0Be76avny?3I$GBn=Rcgh$CNY3?b7>M~Ko;Ak z)JwBX=M?HS<gzi1QcE@!@ZD)RQEV<w<EVxb-Zq2tDCIw9uvUfH8N6IqLA!FA^<dOM zD%gq=C%+5<WEE9B^*1I^YhIegB%y`to}v?NeETU*Deo<Fs8rr>pF;=S=G8gGq3l1n zfOcj7y#+kH=%?BqBFFxEpHzP+*n33kL6_|HNIgQ)-AUASR(7{bJ>(De8f4#*#9E`v zNI%&tlgK{VD?|R!AURSUO+h{E4*0{y5IHt|Q}347C|aI8bx6P07q-MG%AXAsSVt*( Gi@pLA`7reW diff --git a/runtime/gdev/tests/common/mod.rs b/runtime/gdev/tests/common/mod.rs index 323fbeca5..247c0e78a 100644 --- a/runtime/gdev/tests/common/mod.rs +++ b/runtime/gdev/tests/common/mod.rs @@ -231,8 +231,11 @@ impl ExtBuilder { .unwrap(); pallet_certification::GenesisConfig::<Runtime, Instance1> { + certs_by_receiver: clique_wot( + initial_identities.len(), + parameters.cert_validity_period, + ), apply_cert_period_at_genesis: false, - certs_by_issuer: clique_wot(initial_identities.len(), parameters.cert_validity_period), } .assimilate_storage(&mut t) .unwrap(); @@ -254,7 +257,7 @@ impl ExtBuilder { pallet_certification::GenesisConfig::<Runtime, Instance2> { apply_cert_period_at_genesis: false, - certs_by_issuer: clique_wot( + certs_by_receiver: clique_wot( initial_smiths.len(), parameters.smith_cert_validity_period, ), -- GitLab