diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs index 437f691fe87f5e8441c8b741227e3b0f6f44911c..90241ff1ca64b78c4372b350ec595d3a0b4d30f0 100644 --- a/node/src/chain_spec/gen_genesis_data.rs +++ b/node/src/chain_spec/gen_genesis_data.rs @@ -17,7 +17,8 @@ use common_runtime::*; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use sp_core::{blake2_256, Decode, Encode, H256}; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::{BTreeMap, BTreeSet, HashMap}; +use std::ops::AddAssign; type MembershipData = sp_membership::MembershipData<u32>; @@ -216,8 +217,8 @@ where } // CERTIFICATIONS // - let mut certs_by_issuer = BTreeMap::new(); + let mut counter_by_receiver = HashMap::<_, u32>::new(); for (idty_name, identity) in &identities { let issuer_index = idty_index_of .get(&idty_name) @@ -228,12 +229,26 @@ where .get(receiver) .ok_or(format!("Identity '{}' not exist", receiver))?; issuer_certs.insert(*receiver_index, genesis_certs_expire_on); + counter_by_receiver + .entry(receiver) + .or_default() + .add_assign(1); } certs_by_issuer.insert(*issuer_index, issuer_certs); } + // TODO: move this check in the runtime genesis build + for (receiver, counter) in counter_by_receiver { + if counter < 5 { + return Err(format!( + "Identity '{}' not have enough certs ({}/5)", + receiver, counter + )); + } + } // SMITHSÂ SUB-WOT // + let mut counter_by_receiver = HashMap::<String, u32>::new(); let mut initial_authorities = BTreeMap::new(); let mut online_authorities_counter = 0; let mut session_keys_map = BTreeMap::new(); @@ -298,6 +313,10 @@ where .get(receiver) .ok_or(format!("Identity '{}' not exist", receiver))?; issuer_certs.insert(*receiver_index, genesis_smith_certs_expire_on); + counter_by_receiver + .entry(receiver.clone()) + .or_default() + .add_assign(1); } smiths_certs_by_issuer.insert(*idty_index, issuer_certs); @@ -310,6 +329,15 @@ where }, ); } + // TODO: move this check in the runtime genesis build + for (receiver, counter) in counter_by_receiver { + if counter < 3 { + return Err(format!( + "Identity '{}' not have enough certs ({}/3)", + receiver, counter + )); + } + } if maybe_force_authority.is_none() && online_authorities_counter == 0 { return Err("The session_keys field must be filled in for at least one smith.".to_owned());