Skip to content
Snippets Groups Projects
Commit 565146e5 authored by Éloïs's avatar Éloïs
Browse files

ref(runtime): rework pallet certification

parent e9a2baf2
No related branches found
No related tags found
1 merge request!88perf(pallet-cert): remove useless double map CertsByIssuer
...@@ -3,5 +3,6 @@ ...@@ -3,5 +3,6 @@
Feature: Certification Feature: Certification
Scenario: Dave certifies Alice Scenario: Dave certifies Alice
When 2 blocks later
When dave certifies alice When dave certifies alice
Then alice should be certified by dave Then alice should be certified by dave
...@@ -4,12 +4,12 @@ ...@@ -4,12 +4,12 @@
"identities": { "identities": {
"Alice": { "Alice": {
"balance": 1000, "balance": 1000,
"certs": ["Bob", "Charlie", "Dave"], "certs": ["Bob", "Charlie"],
"pubkey": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" "pubkey": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"
}, },
"Bob": { "Bob": {
"balance": 1000, "balance": 1000,
"certs": ["Alice", "Charlie", "Dave"], "certs": ["Alice", "Charlie"],
"pubkey": "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty" "pubkey": "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty"
}, },
"Charlie": { "Charlie": {
...@@ -19,13 +19,13 @@ ...@@ -19,13 +19,13 @@
}, },
"Dave": { "Dave": {
"balance": 1000, "balance": 1000,
"certs": [], "certs": ["Alice", "Bob"],
"pubkey": "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy" "pubkey": "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy"
} }
}, },
"parameters": { "parameters": {
"babe_epoch_duration": 30, "babe_epoch_duration": 30,
"cert_period": 15, "cert_period": 2,
"cert_max_by_issuer": 10, "cert_max_by_issuer": 10,
"cert_min_received_cert_to_issue_cert": 2, "cert_min_received_cert_to_issue_cert": 2,
"cert_validity_period": 1000, "cert_validity_period": 1000,
......
...@@ -278,15 +278,23 @@ async fn should_be_certified_by( ...@@ -278,15 +278,23 @@ async fn should_be_certified_by(
.await? .await?
.unwrap(); .unwrap();
let _certification = world let issuers = world
.api() .api()
.storage() .storage()
.cert() .cert()
.storage_certs_by_issuer(issuer_index, receiver_index, None) .certs_by_receiver(receiver_index, None)
.await? .await?;
.ok_or_else(|| anyhow::anyhow!("no certification found from {} to {}", issuer, receiver))?;
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()),
}
} }
// ============================================================ // ============================================================
......
...@@ -380,7 +380,7 @@ fn gen_genesis_for_local_chain( ...@@ -380,7 +380,7 @@ fn gen_genesis_for_local_chain(
}, },
cert: CertConfig { cert: CertConfig {
apply_cert_period_at_genesis: false, 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 { smiths_membership: SmithsMembershipConfig {
memberships: (1..=initial_smiths_len) memberships: (1..=initial_smiths_len)
...@@ -389,7 +389,7 @@ fn gen_genesis_for_local_chain( ...@@ -389,7 +389,7 @@ fn gen_genesis_for_local_chain(
}, },
smiths_cert: SmithsCertConfig { smiths_cert: SmithsCertConfig {
apply_cert_period_at_genesis: false, 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(), smiths_collective: Default::default(),
universal_dividend: UniversalDividendConfig { universal_dividend: UniversalDividendConfig {
...@@ -427,7 +427,7 @@ fn genesis_data_to_gdev_genesis_conf( ...@@ -427,7 +427,7 @@ fn genesis_data_to_gdev_genesis_conf(
) -> gdev_runtime::GenesisConfig { ) -> gdev_runtime::GenesisConfig {
let super::gen_genesis_data::GenesisData { let super::gen_genesis_data::GenesisData {
accounts, accounts,
certs_by_issuer, certs_by_receiver,
first_ud, first_ud,
first_ud_reeval, first_ud_reeval,
identities, identities,
...@@ -436,7 +436,7 @@ fn genesis_data_to_gdev_genesis_conf( ...@@ -436,7 +436,7 @@ fn genesis_data_to_gdev_genesis_conf(
memberships, memberships,
parameters, parameters,
session_keys_map, session_keys_map,
smiths_certs_by_issuer, smiths_certs_by_receiver,
smiths_memberships, smiths_memberships,
sudo_key, sudo_key,
} = genesis_data; } = genesis_data;
...@@ -486,12 +486,12 @@ fn genesis_data_to_gdev_genesis_conf( ...@@ -486,12 +486,12 @@ fn genesis_data_to_gdev_genesis_conf(
}, },
cert: CertConfig { cert: CertConfig {
apply_cert_period_at_genesis: true, apply_cert_period_at_genesis: true,
certs_by_issuer, certs_by_receiver,
}, },
membership: MembershipConfig { memberships }, membership: MembershipConfig { memberships },
smiths_cert: SmithsCertConfig { smiths_cert: SmithsCertConfig {
apply_cert_period_at_genesis: true, apply_cert_period_at_genesis: true,
certs_by_issuer: smiths_certs_by_issuer, certs_by_receiver: smiths_certs_by_receiver,
}, },
smiths_membership: SmithsMembershipConfig { smiths_membership: SmithsMembershipConfig {
memberships: smiths_memberships, memberships: smiths_memberships,
......
...@@ -26,7 +26,7 @@ const EXISTENTIAL_DEPOSIT: u64 = 100; ...@@ -26,7 +26,7 @@ const EXISTENTIAL_DEPOSIT: u64 = 100;
#[derive(Clone)] #[derive(Clone)]
pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> { pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> {
pub accounts: BTreeMap<AccountId, GenesisAccountData<u64>>, 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: u64,
pub first_ud_reeval: u32, pub first_ud_reeval: u32,
pub identities: Vec<(String, AccountId)>, pub identities: Vec<(String, AccountId)>,
...@@ -35,7 +35,7 @@ pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> { ...@@ -35,7 +35,7 @@ pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> {
pub memberships: BTreeMap<u32, MembershipData>, pub memberships: BTreeMap<u32, MembershipData>,
pub parameters: Parameters, pub parameters: Parameters,
pub session_keys_map: BTreeMap<AccountId, SessionKeys>, 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 smiths_memberships: BTreeMap<u32, MembershipData>,
pub sudo_key: Option<AccountId>, pub sudo_key: Option<AccountId>,
} }
...@@ -209,19 +209,19 @@ where ...@@ -209,19 +209,19 @@ where
// CERTIFICATIONS // // CERTIFICATIONS //
let mut certs_by_issuer = BTreeMap::new(); let mut certs_by_receiver = BTreeMap::new();
for (idty_name, identity) in &identities { for (idty_name, identity) in &identities {
let issuer_index = idty_index_of let issuer_index = idty_index_of
.get(&idty_name) .get(&idty_name)
.ok_or(format!("Identity '{}' not exist", &idty_name))?; .ok_or(format!("Identity '{}' not exist", &idty_name))?;
let mut issuer_certs = BTreeMap::new(); let mut receiver_certs = BTreeMap::new();
for receiver in &identity.certs { for issuer in &identity.certs {
let receiver_index = idty_index_of let issuer_index = idty_index_of
.get(receiver) .get(issuer)
.ok_or(format!("Identity '{}' not exist", receiver))?; .ok_or(format!("Identity '{}' not exist", issuer))?;
issuer_certs.insert(*receiver_index, genesis_certs_expire_on); 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 // // SMITHS SUB-WOT //
...@@ -230,7 +230,7 @@ where ...@@ -230,7 +230,7 @@ where
let mut online_authorities_counter = 0; let mut online_authorities_counter = 0;
let mut session_keys_map = BTreeMap::new(); let mut session_keys_map = BTreeMap::new();
let mut smiths_memberships = 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 { for (idty_name, smith_data) in smith_identities {
let idty_index = idty_index_of let idty_index = idty_index_of
.get(&idty_name) .get(&idty_name)
...@@ -284,14 +284,14 @@ where ...@@ -284,14 +284,14 @@ where
); );
// Certifications // Certifications
let mut issuer_certs = BTreeMap::new(); let mut receiver_certs = BTreeMap::new();
for receiver in &smith_data.certs { for receiver in &smith_data.certs {
let receiver_index = idty_index_of let issuer_index = idty_index_of
.get(receiver) .get(receiver)
.ok_or(format!("Identity '{}' not exist", 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 // Memberships
smiths_memberships.insert( smiths_memberships.insert(
...@@ -308,7 +308,7 @@ where ...@@ -308,7 +308,7 @@ where
let genesis_data = GenesisData { let genesis_data = GenesisData {
accounts, accounts,
certs_by_issuer, certs_by_receiver,
first_ud, first_ud,
first_ud_reeval, first_ud_reeval,
identities: identities_, identities: identities_,
...@@ -317,7 +317,7 @@ where ...@@ -317,7 +317,7 @@ where
memberships, memberships,
parameters, parameters,
session_keys_map, session_keys_map,
smiths_certs_by_issuer, smiths_certs_by_receiver,
smiths_memberships, smiths_memberships,
sudo_key, sudo_key,
}; };
......
...@@ -92,7 +92,7 @@ pub mod pallet { ...@@ -92,7 +92,7 @@ pub mod pallet {
#[pallet::genesis_config] #[pallet::genesis_config]
pub struct GenesisConfig<T: Config<I>, I: 'static = ()> { pub struct GenesisConfig<T: Config<I>, I: 'static = ()> {
pub apply_cert_period_at_genesis: bool, 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")] #[cfg(feature = "std")]
...@@ -100,7 +100,7 @@ pub mod pallet { ...@@ -100,7 +100,7 @@ pub mod pallet {
fn default() -> Self { fn default() -> Self {
Self { Self {
apply_cert_period_at_genesis: false, apply_cert_period_at_genesis: false,
certs_by_issuer: Default::default(), certs_by_receiver: Default::default(),
} }
} }
} }
...@@ -110,47 +110,36 @@ pub mod pallet { ...@@ -110,47 +110,36 @@ pub mod pallet {
fn build(&self) { fn build(&self) {
let mut cert_meta_by_issuer = let mut cert_meta_by_issuer =
BTreeMap::<T::IdtyIndex, IdtyCertMeta<T::BlockNumber>>::new(); BTreeMap::<T::IdtyIndex, IdtyCertMeta<T::BlockNumber>>::new();
let mut certs_by_receiver = BTreeMap::<T::IdtyIndex, Vec<T::IdtyIndex>>::new(); let mut certs_removable_on =
for (issuer, receivers) in &self.certs_by_issuer { BTreeMap::<T::BlockNumber, Vec<(T::IdtyIndex, T::IdtyIndex)>>::new();
for (receiver, issuers) in &self.certs_by_receiver {
// Forbid self-cert
assert!( assert!(
!receivers.contains_key(issuer), !issuers.contains_key(receiver),
"Identity cannot certify it-self." "Identity cannot certify it-self."
); );
assert!(
!receivers.len() >= T::MaxByIssuer::get() as usize,
"Identity n°{:?} exceed MaxByIssuer.",
issuer
);
cert_meta_by_issuer.insert( // We should insert cert_meta for receivers that have not issued any cert.
*issuer, cert_meta_by_issuer
IdtyCertMeta { .entry(*receiver)
issued_count: receivers.len() as u32, .or_insert(IdtyCertMeta {
issued_count: 0,
next_issuable_on: sp_runtime::traits::Zero::zero(), next_issuable_on: sp_runtime::traits::Zero::zero(),
received_count: 0, received_count: issuers.len() as u32,
}, });
);
for receiver in receivers.keys() {
certs_by_receiver
.entry(*receiver)
.or_default()
.push(*issuer);
}
}
// Write StorageCertsByReceiver for (issuer, removable_on) in issuers {
for (receiver, mut issuers) in certs_by_receiver { // Count issued certs
cert_meta_by_issuer cert_meta_by_issuer
.entry(receiver) .entry(*issuer)
.and_modify(|cert_meta| cert_meta.received_count = issuers.len() as u32); .or_insert(IdtyCertMeta {
issuers.sort(); issued_count: 0,
<StorageCertsByReceiver<T, I>>::insert(receiver, issuers); next_issuable_on: sp_runtime::traits::Zero::zero(),
} received_count: issuers.len() as u32,
// Write StorageCertsByIssuer })
let mut certs_removable_on = .issued_count += 1;
BTreeMap::<T::BlockNumber, Vec<(T::IdtyIndex, T::IdtyIndex)>>::new();
for (issuer, receivers) in &self.certs_by_issuer { // Prepare CertsRemovableOn
for (receiver, removable_on) in receivers {
certs_removable_on certs_removable_on
.entry(*removable_on) .entry(*removable_on)
.or_default() .or_default()
...@@ -166,23 +155,31 @@ pub mod pallet { ...@@ -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 // Write StorageIdtyCertMeta
for (issuer, cert_meta) in cert_meta_by_issuer { 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 // Write storage StorageCertsRemovableOn
for (removable_on, certs) in certs_removable_on { 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 { ...@@ -195,27 +192,11 @@ pub mod pallet {
pub type StorageIdtyCertMeta<T: Config<I>, I: 'static = ()> = pub type StorageIdtyCertMeta<T: Config<I>, I: 'static = ()> =
StorageMap<_, Twox64Concat, T::IdtyIndex, IdtyCertMeta<T::BlockNumber>, ValueQuery>; 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 /// Certifications by receiver
#[pallet::storage] #[pallet::storage]
#[pallet::getter(fn certs_by_receiver)] #[pallet::getter(fn certs_by_receiver)]
pub type StorageCertsByReceiver<T: Config<I>, I: 'static = ()> = pub type CertsByReceiver<T: Config<I>, I: 'static = ()> =
StorageMap<_, Twox64Concat, T::IdtyIndex, Vec<T::IdtyIndex>, ValueQuery>; StorageMap<_, Twox64Concat, T::IdtyIndex, Vec<(T::IdtyIndex, T::BlockNumber)>, ValueQuery>;
/// Certifications removable on /// Certifications removable on
#[pallet::storage] #[pallet::storage]
...@@ -310,8 +291,7 @@ pub mod pallet { ...@@ -310,8 +291,7 @@ pub mod pallet {
} }
}; };
let create = !StorageCertsByIssuer::<T, I>::contains_key(issuer, receiver); Self::do_add_cert(block_number, issuer, receiver)
Self::do_add_cert(block_number, create, issuer, receiver)
} }
/// Add a new certification or renew an existing one /// Add a new certification or renew an existing one
/// ///
...@@ -348,8 +328,7 @@ pub mod pallet { ...@@ -348,8 +328,7 @@ pub mod pallet {
return Err(Error::<T, I>::IssuedTooManyCert.into()); return Err(Error::<T, I>::IssuedTooManyCert.into());
} }
let create = !StorageCertsByIssuer::<T, I>::contains_key(issuer, receiver); Self::do_add_cert(block_number, issuer, receiver)
Self::do_add_cert(block_number, create, issuer, receiver)
} }
#[pallet::weight(1_000_000_000)] #[pallet::weight(1_000_000_000)]
...@@ -369,10 +348,8 @@ pub mod pallet { ...@@ -369,10 +348,8 @@ pub mod pallet {
idty_index: T::IdtyIndex, idty_index: T::IdtyIndex,
) -> DispatchResultWithPostInfo { ) -> DispatchResultWithPostInfo {
ensure_root(origin)?; ensure_root(origin)?;
if let Ok(issuers) = <StorageCertsByReceiver<T, I>>::try_get(idty_index) { for (issuer, _) in CertsByReceiver::<T, I>::get(idty_index) {
for issuer in issuers { Self::remove_cert_inner(issuer, idty_index, None);
Self::remove_cert_inner(issuer, idty_index, None);
}
} }
Ok(().into()) Ok(().into())
} }
...@@ -383,42 +360,42 @@ pub mod pallet { ...@@ -383,42 +360,42 @@ pub mod pallet {
impl<T: Config<I>, I: 'static> Pallet<T, I> { impl<T: Config<I>, I: 'static> Pallet<T, I> {
fn do_add_cert( fn do_add_cert(
block_number: T::BlockNumber, block_number: T::BlockNumber,
create: bool,
issuer: T::IdtyIndex, issuer: T::IdtyIndex,
receiver: T::IdtyIndex, receiver: T::IdtyIndex,
) -> DispatchResultWithPostInfo { ) -> DispatchResultWithPostInfo {
// Write StorageIdtyCertMeta for issuer // Write StorageCertsRemovableOn
let issuer_issued_count = let removable_on = block_number + T::ValidityPeriod::get();
StorageIdtyCertMeta::<T, I>::mutate(issuer, |issuer_idty_cert_meta| { <StorageCertsRemovableOn<T, I>>::append(removable_on, (issuer, receiver));
issuer_idty_cert_meta.issued_count =
issuer_idty_cert_meta.issued_count.saturating_add(1); // Write CertsByReceiver
issuer_idty_cert_meta.next_issuable_on = block_number + T::CertPeriod::get(); let mut created = false;
issuer_idty_cert_meta.issued_count 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 if created {
let receiver_received_count = // Write StorageIdtyCertMeta for issuer
<StorageIdtyCertMeta<T, I>>::mutate_exists(receiver, |cert_meta_opt| { let issuer_issued_count =
let cert_meta = cert_meta_opt.get_or_insert(IdtyCertMeta::default()); StorageIdtyCertMeta::<T, I>::mutate(issuer, |issuer_idty_cert_meta| {
cert_meta.received_count = cert_meta.received_count.saturating_add(1); issuer_idty_cert_meta.issued_count =
cert_meta.received_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 { Self::deposit_event(Event::NewCert {
issuer, issuer,
issuer_issued_count, issuer_issued_count,
...@@ -455,24 +432,23 @@ pub mod pallet { ...@@ -455,24 +432,23 @@ pub mod pallet {
) -> Weight { ) -> Weight {
let mut total_weight: Weight = 0; let mut total_weight: Weight = 0;
let mut removed = false; let mut removed = false;
<StorageCertsByIssuer<T, I>>::mutate_exists(issuer, receiver, |cert_val_opt| { CertsByReceiver::<T, I>::mutate_exists(receiver, |issuers_opt| {
if let Some(cert_val) = cert_val_opt { let issuers = issuers_opt.get_or_insert(Vec::with_capacity(0));
if Some(cert_val.removable_on) == block_number_opt || block_number_opt.is_none() 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; removed = true;
} }
} }
if removed {
cert_val_opt.take();
}
}); });
if removed { 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 = let issuer_issued_count =
<StorageIdtyCertMeta<T, I>>::mutate_exists(issuer, |cert_meta_opt| { <StorageIdtyCertMeta<T, I>>::mutate_exists(issuer, |cert_meta_opt| {
let cert_meta = cert_meta_opt.get_or_insert(IdtyCertMeta::default()); let cert_meta = cert_meta_opt.get_or_insert(IdtyCertMeta::default());
......
...@@ -92,7 +92,7 @@ impl frame_support::traits::EnsureOrigin<(Origin, IdtyIndex, IdtyIndex)> for Ens ...@@ -92,7 +92,7 @@ impl frame_support::traits::EnsureOrigin<(Origin, IdtyIndex, IdtyIndex)> for Ens
} }
parameter_types! { parameter_types! {
pub const MaxByIssuer: u32 = 3; pub const MaxByIssuer: u32 = 4;
pub const MinReceivedCertToBeAbleToIssueCert: u32 = 2; pub const MinReceivedCertToBeAbleToIssueCert: u32 = 2;
pub const CertPeriod: u64 = 2; pub const CertPeriod: u64 = 2;
pub const ValidityPeriod: u64 = 10; pub const ValidityPeriod: u64 = 10;
......
...@@ -26,7 +26,7 @@ use sp_std::collections::btree_map::BTreeMap; ...@@ -26,7 +26,7 @@ use sp_std::collections::btree_map::BTreeMap;
fn test_must_receive_cert_before_can_issue() { fn test_must_receive_cert_before_can_issue() {
new_test_ext(DefaultCertificationConfig { new_test_ext(DefaultCertificationConfig {
apply_cert_period_at_genesis: true, apply_cert_period_at_genesis: true,
certs_by_issuer: BTreeMap::new(), certs_by_receiver: BTreeMap::new(),
}) })
.execute_with(|| { .execute_with(|| {
assert_eq!( assert_eq!(
...@@ -40,15 +40,10 @@ fn test_must_receive_cert_before_can_issue() { ...@@ -40,15 +40,10 @@ fn test_must_receive_cert_before_can_issue() {
fn test_cannot_certify_self() { fn test_cannot_certify_self() {
new_test_ext(DefaultCertificationConfig { new_test_ext(DefaultCertificationConfig {
apply_cert_period_at_genesis: true, apply_cert_period_at_genesis: true,
certs_by_issuer: btreemap![ certs_by_receiver: btreemap![
1 => btreemap![ 0 => btreemap![
0 => 5, 1 => 5,
], 2 => 5,
2 => btreemap![
0 => 5,
],
3 => btreemap![
0 => 5,
], ],
], ],
}) })
...@@ -66,18 +61,18 @@ fn test_cannot_certify_self() { ...@@ -66,18 +61,18 @@ fn test_cannot_certify_self() {
fn test_genesis_build() { fn test_genesis_build() {
new_test_ext(DefaultCertificationConfig { new_test_ext(DefaultCertificationConfig {
apply_cert_period_at_genesis: true, apply_cert_period_at_genesis: true,
certs_by_issuer: btreemap![ certs_by_receiver: btreemap![
0 => btreemap![ 0 => btreemap![
1 => 10, 1 => 7,
2 => 5, 2 => 9,
], ],
1 => btreemap![ 1 => btreemap![
0 => 7, 0 => 10,
2 => 4, 2 => 3,
], ],
2 => btreemap![ 2 => btreemap![
0 => 9, 0 => 5,
1 => 3, 1 => 4,
], ],
], ],
}) })
...@@ -135,25 +130,42 @@ fn test_genesis_build() { ...@@ -135,25 +130,42 @@ fn test_genesis_build() {
fn test_cert_period() { fn test_cert_period() {
new_test_ext(DefaultCertificationConfig { new_test_ext(DefaultCertificationConfig {
apply_cert_period_at_genesis: true, apply_cert_period_at_genesis: true,
certs_by_issuer: btreemap![ certs_by_receiver: btreemap![
0 => btreemap![1 => 10], 0 => btreemap![
2 => btreemap![0 => 10], 1 => 10,
3 => btreemap![0 => 10], 2 => 10,
],
1 => btreemap![
0 => 10,
2 => 10,
],
2 => btreemap![
0 => 10,
1 => 10,
],
], ],
}) })
.execute_with(|| { .execute_with(|| {
assert_eq!( 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()) Err(Error::<Test, _>::NotRespectCertPeriod.into())
); );
run_to_block(CertPeriod::get()); 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); run_to_block(CertPeriod::get() + 1);
assert_eq!( assert_eq!(
DefaultCertification::add_cert(Origin::signed(0), 3), DefaultCertification::add_cert(Origin::signed(0), 4),
Err(Error::<Test, _>::NotRespectCertPeriod.into()) Err(Error::<Test, _>::NotRespectCertPeriod.into())
); );
run_to_block((2 * CertPeriod::get()) + 1); 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));
}); });
} }
...@@ -20,11 +20,6 @@ use codec::{Decode, Encode}; ...@@ -20,11 +20,6 @@ use codec::{Decode, Encode};
use frame_support::pallet_prelude::*; use frame_support::pallet_prelude::*;
use scale_info::TypeInfo; 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)] #[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
pub struct IdtyCertMeta<BlockNumber: Default> { pub struct IdtyCertMeta<BlockNumber: Default> {
pub issued_count: u32, pub issued_count: u32,
......
...@@ -270,8 +270,8 @@ pub fn new_test_ext( ...@@ -270,8 +270,8 @@ pub fn new_test_ext(
.unwrap(); .unwrap();
pallet_certification::GenesisConfig::<Test, Instance1> { pallet_certification::GenesisConfig::<Test, Instance1> {
certs_by_issuer: clique_wot(initial_identities_len, ValidityPeriod::get()),
apply_cert_period_at_genesis: true, apply_cert_period_at_genesis: true,
certs_by_receiver: clique_wot(initial_identities_len, ValidityPeriod::get()),
} }
.assimilate_storage(&mut t) .assimilate_storage(&mut t)
.unwrap(); .unwrap();
...@@ -292,8 +292,8 @@ pub fn new_test_ext( ...@@ -292,8 +292,8 @@ pub fn new_test_ext(
.unwrap(); .unwrap();
pallet_certification::GenesisConfig::<Test, Instance2> { pallet_certification::GenesisConfig::<Test, Instance2> {
certs_by_issuer: clique_wot(initial_smiths_len, SmithsValidityPeriod::get()),
apply_cert_period_at_genesis: true, apply_cert_period_at_genesis: true,
certs_by_receiver: clique_wot(initial_smiths_len, SmithsValidityPeriod::get()),
} }
.assimilate_storage(&mut t) .assimilate_storage(&mut t)
.unwrap(); .unwrap();
......
No preview for this file type
...@@ -231,8 +231,11 @@ impl ExtBuilder { ...@@ -231,8 +231,11 @@ impl ExtBuilder {
.unwrap(); .unwrap();
pallet_certification::GenesisConfig::<Runtime, Instance1> { pallet_certification::GenesisConfig::<Runtime, Instance1> {
certs_by_receiver: clique_wot(
initial_identities.len(),
parameters.cert_validity_period,
),
apply_cert_period_at_genesis: false, apply_cert_period_at_genesis: false,
certs_by_issuer: clique_wot(initial_identities.len(), parameters.cert_validity_period),
} }
.assimilate_storage(&mut t) .assimilate_storage(&mut t)
.unwrap(); .unwrap();
...@@ -254,7 +257,7 @@ impl ExtBuilder { ...@@ -254,7 +257,7 @@ impl ExtBuilder {
pallet_certification::GenesisConfig::<Runtime, Instance2> { pallet_certification::GenesisConfig::<Runtime, Instance2> {
apply_cert_period_at_genesis: false, apply_cert_period_at_genesis: false,
certs_by_issuer: clique_wot( certs_by_receiver: clique_wot(
initial_smiths.len(), initial_smiths.len(),
parameters.smith_cert_validity_period, parameters.smith_cert_validity_period,
), ),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment