diff --git a/node/src/chain_spec.rs b/node/src/chain_spec.rs index 4eed2a351e05f838379b50df91add8666a267363..435415335fce6553d02e11bf8943d56791d7a979 100644 --- a/node/src/chain_spec.rs +++ b/node/src/chain_spec.rs @@ -50,9 +50,14 @@ where fn clique_wot( initial_identities_len: usize, -) -> BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, Option<common_runtime::BlockNumber>>> { +) -> ( + BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, Option<common_runtime::BlockNumber>>>, + u32, +) { let mut certs_by_issuer = BTreeMap::new(); + let mut count: u32 = 0; for i in 1..=initial_identities_len { + count += initial_identities_len as u32; certs_by_issuer.insert( i as IdtyIndex, (1..=initial_identities_len) @@ -66,5 +71,5 @@ fn clique_wot( .collect(), ); } - certs_by_issuer + (certs_by_issuer, count) } diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs index e7afbff621033b439b64a901bcef243d590ff92f..b3352cf2ad78b0bfded11585d786df9db17caeb4 100644 --- a/node/src/chain_spec/gdev.rs +++ b/node/src/chain_spec/gdev.rs @@ -149,7 +149,7 @@ pub fn benchmark_chain_spec() -> Result<ChainSpec, String> { get_local_chain_parameters(), // Sudo account get_account_id_from_seed::<sr25519::Public>("Alice"), - true, + get_parameters, ) .expect("Genesis Data must be buildable"); genesis_data_to_gdev_genesis_conf(genesis_data, wasm_binary) @@ -256,7 +256,7 @@ pub fn local_testnet_config( get_local_chain_parameters(), // Sudo account get_account_id_from_seed::<sr25519::Public>("Alice"), - true, + get_parameters, ) .expect("Genesis Data must be buildable"); genesis_data_to_gdev_genesis_conf(genesis_data, wasm_binary) @@ -390,7 +390,7 @@ fn genesis_data_to_gdev_genesis_conf( } } -fn get_local_chain_parameters() -> GenesisParameters { +fn get_local_chain_parameters() -> Option<GenesisParameters> { let babe_epoch_duration = get_env("DUNITER_BABE_EPOCH_DURATION", 30) as u64; let cert_validity_period = get_env("DUNITER_CERT_VALIDITY_PERIOD", 1_000); let membership_period = get_env("DUNITER_MEMBERSHIP_PERIOD", 1_000); @@ -398,7 +398,7 @@ fn get_local_chain_parameters() -> GenesisParameters { let smith_membership_period = get_env("DUNITER_SMITH_MEMBERSHIP_PERIOD", 1_000); let ud_creation_period = get_env("DUNITER_UD_CREATION_PERIOD", 60_000); let ud_reeval_period = get_env("DUNITER_UD_REEEVAL_PERIOD", 1_200_000); - GenesisParameters { + Some(GenesisParameters { babe_epoch_duration, cert_period: 15, cert_max_by_issuer: 10, @@ -421,7 +421,7 @@ fn get_local_chain_parameters() -> GenesisParameters { wot_first_cert_issuable_on: 20, wot_min_cert_for_create_idty_right: 2, wot_min_cert_for_membership: 2, - } + }) } /// get environment variable diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs index eab84d0ab8bf53b3ffe56874a7e4af99abf7477b..0998c5eea7572a6556ce579cbce43fb5faa5cb5e 100644 --- a/node/src/chain_spec/gen_genesis_data.rs +++ b/node/src/chain_spec/gen_genesis_data.rs @@ -229,14 +229,6 @@ struct CliqueSmith { session_keys: Option<String>, } -struct GenesisMemberIdentity { - index: u32, - owned_key: AccountId, - old_owned_key: Option<AccountId>, - name: String, - active: bool, -} - struct SmithWoT<SK: Decode> { smith_certs_by_receiver: BTreeMap<u32, BTreeMap<u32, Option<u32>>>, smith_memberships: BTreeMap<u32, sp_membership::MembershipData<u32>>, @@ -244,6 +236,20 @@ struct SmithWoT<SK: Decode> { BTreeMap<<<MultiSignature as Verify>::Signer as IdentifyAccount>::AccountId, SK>, } +struct GenesisInfo<'a> { + accounts: &'a BTreeMap<AccountId32, GenesisAccountData<u64>>, + genesis_data_wallets_count: &'a usize, + inactive_identities: &'a HashMap<u32, String>, + identities: &'a Vec<GenesisIdentity>, + identity_index: &'a HashMap<u32, String>, + smith_memberships: &'a BTreeMap<u32, MembershipData>, + counter_online_authorities: &'a u32, + counter_cert: &'a u32, + counter_smith_cert: &'a u32, + technical_committee_members: &'a Vec<AccountId32>, + common_parameters: &'a CommonParameters, +} + /// generate genesis data from a json file /// takes DUNITER_GENESIS_CONFIG env var if present or duniter-gen-conf.json by default // this function is targeting dev chainspecs, do not use in production network @@ -495,67 +501,21 @@ where ); }); - // give genesis info - log::info!( - "prepared genesis with: - - {} accounts ({} identities, {} simple wallets) - - {} total identities ({} active, {} inactive) - - {} smiths - - {} initial online authorities - - {} certifications - - {} smith certifications - - {} members in technical committee", - accounts.len(), - identities.len() - inactive_identities.len(), - genesis_data_wallets_count, - identity_index.len(), - identities.len() - inactive_identities.len(), - inactive_identities.len(), - smith_memberships.len(), - counter_online_authorities, - counter_cert, - counter_smith_cert, - technical_committee_members.len(), - ); + let genesis_info = GenesisInfo { + accounts: &accounts, + genesis_data_wallets_count: &genesis_data_wallets_count, + identities: &identities, + inactive_identities: &inactive_identities, + identity_index: &identity_index, + smith_memberships: &smith_memberships, + counter_online_authorities: &counter_online_authorities, + counter_cert: &counter_cert, + counter_smith_cert: &counter_smith_cert, + technical_committee_members: &technical_committee_members, + common_parameters: &common_parameters, + }; - // give genesis info - log::info!( - "currency parameters: - - existential deposit: {} {} - - currency decimals: {} - - membership validity: {} days - - certification period: {} days - - certification validity duration: {} days - - smith membership validity: {} days - - smith certification validity: {} days - - required certifications: {} - - smith required certifications: {} - - max certifications by issuer: {} - - money growth rate: {}% every {} days - - UD creation period: {} days - - distance percent of required referees: {}% - - distance max depth: {}", - common_parameters.existential_deposit, - common_parameters.currency_name, - common_parameters.decimals, - common_parameters.membership_period as f32 / DAYS as f32, - common_parameters.cert_period as f32 / DAYS as f32, - common_parameters.cert_validity_period as f32 / DAYS as f32, - common_parameters.smith_membership_period as f32 / DAYS as f32, - common_parameters.smith_certs_validity_period as f32 / DAYS as f32, - common_parameters.min_cert, - common_parameters.smith_min_cert, - common_parameters.cert_max_by_issuer, - f32::sqrt(common_parameters.c2.deconstruct() as f32 / 1_000_000_000f32) * 100f32, - common_parameters.ud_reeval_period as f32 / DAYS as f32, - common_parameters.ud_creation_period as f32 / DAYS as f32, - common_parameters - .distance_min_accessible_referees - .deconstruct() as f32 - / 1_000_000_000f32 - * 100f32, - common_parameters.max_depth, - ); + dump_genesis_info(genesis_info); if parameters.is_some() { let g1_duniter_v1_c = 0.0488; @@ -748,16 +708,7 @@ where certs_by_receiver, first_ud, first_ud_reeval, - identities: identities - .into_iter() - .map(|i| GenesisIdentity { - idty_index: i.index, - name: i.name, - owner_key: i.owned_key, - old_owner_key: i.old_owned_key, - active: i.active, - }) - .collect(), + identities, initial_authorities, initial_monetary_mass: genesis_data.initial_monetary_mass, memberships, @@ -774,6 +725,70 @@ where Ok(genesis_data) } +fn dump_genesis_info(info: GenesisInfo) { + // give genesis info + log::info!( + "prepared genesis with: + - {} accounts ({} identities, {} simple wallets) + - {} total identities ({} active, {} inactive) + - {} smiths + - {} initial online authorities + - {} certifications + - {} smith certifications + - {} members in technical committee", + info.accounts.len(), + info.identities.len() - info.inactive_identities.len(), + info.genesis_data_wallets_count, + info.identity_index.len(), + info.identities.len() - info.inactive_identities.len(), + info.inactive_identities.len(), + info.smith_memberships.len(), + info.counter_online_authorities, + info.counter_cert, + info.counter_smith_cert, + info.technical_committee_members.len(), + ); + + // give genesis info + log::info!( + "currency parameters: + - existential deposit: {} {} + - currency decimals: {} + - membership validity: {} days + - certification period: {} days + - certification validity duration: {} days + - smith membership validity: {} days + - smith certification validity: {} days + - required certifications: {} + - smith required certifications: {} + - max certifications by issuer: {} + - money growth rate: {}% every {} days + - UD creation period: {} days + - distance percent of required referees: {}% + - distance max depth: {}", + info.common_parameters.existential_deposit, + info.common_parameters.currency_name, + info.common_parameters.decimals, + info.common_parameters.membership_period as f32 / DAYS as f32, + info.common_parameters.cert_period as f32 / DAYS as f32, + info.common_parameters.cert_validity_period as f32 / DAYS as f32, + info.common_parameters.smith_membership_period as f32 / DAYS as f32, + info.common_parameters.smith_certs_validity_period as f32 / DAYS as f32, + info.common_parameters.min_cert, + info.common_parameters.smith_min_cert, + info.common_parameters.cert_max_by_issuer, + f32::sqrt(info.common_parameters.c2.deconstruct() as f32 / 1_000_000_000f32) * 100f32, + info.common_parameters.ud_reeval_period as f32 / DAYS as f32, + info.common_parameters.ud_creation_period as f32 / DAYS as f32, + info.common_parameters + .distance_min_accessible_referees + .deconstruct() as f32 + / 1_000_000_000f32 + * 100f32, + info.common_parameters.max_depth, + ); +} + fn smiths_and_technical_committee_checks( inactive_identities: &HashMap<u32, String>, technical_committee: &Vec<String>, @@ -1138,9 +1153,9 @@ fn feed_identities( inactive_identities: &mut HashMap<u32, String>, memberships: &mut BTreeMap<u32, MembershipData>, identities_v2: &HashMap<String, IdentityV2>, -) -> Result<(bool, Vec<GenesisMemberIdentity>), String> { +) -> Result<(bool, Vec<GenesisIdentity>), String> { let mut fatal = false; - let mut identities: Vec<GenesisMemberIdentity> = Vec::new(); + let mut identities: Vec<GenesisIdentity> = Vec::new(); for (name, identity) in identities_v2 { // identity name if !validate_idty_name(name) { @@ -1204,15 +1219,15 @@ fn feed_identities( if expired { inactive_identities.insert(identity.index, name.clone()); }; - identities.push(GenesisMemberIdentity { + identities.push(GenesisIdentity { // N.B.: every **non-expired** identity on Genesis is considered to have: // - removable_on: 0, // - next_creatable_identity_on: 0, // - status: IdtyStatus::Validated, - index: identity.index, + idty_index: identity.index, name: name.to_owned().clone(), - owned_key: identity.owner_key.clone(), - old_owned_key: identity.old_owner_key.clone(), + owner_key: identity.owner_key.clone(), + old_owner_key: identity.old_owner_key.clone(), // but expired identities will just have their pseudonym reserved in the storage active: !expired, }); @@ -1228,7 +1243,7 @@ fn feed_identities( } } // sort the identities by index for reproducibility (should have been a vec in json) - identities.sort_unstable_by(|a, b| a.index.cmp(&b.index)); + identities.sort_unstable_by(|a, b| a.idty_index.cmp(&b.idty_index)); Ok((fatal, identities)) } @@ -1421,9 +1436,9 @@ pub fn generate_genesis_data_for_local_chain<P, SK, SessionKeys: Encode, SKP>( initial_smiths_len: usize, initial_identities_len: usize, treasury_balance: u64, - parameters: P, + parameters: Option<P>, root_key: AccountId, - _enable_println: bool, + get_common_parameters: fn(&Option<P>) -> CommonParameters, ) -> Result<GenesisData<P, SK>, String> where P: Default + DeserializeOwned, @@ -1435,6 +1450,7 @@ where assert!(initial_authorities_len <= initial_smiths_len); let ud = 1_000; let idty_index_start: u32 = 1; + let common_parameters = get_common_parameters(¶meters); let initial_smiths = (0..initial_smiths_len) .map(|i| get_authority_keys_from_seed(NAMES[i])) @@ -1457,7 +1473,7 @@ where session_keys_map.insert(x.0.clone(), sk); }); - let identities_ = initial_identities + let identities: Vec<GenesisIdentity> = initial_identities .iter() .enumerate() .map(|(i, (name, owner_key))| GenesisIdentity { @@ -1469,55 +1485,102 @@ where }) .collect(); + let (certs_by_receiver, counter_cert) = clique_wot(initial_identities.len()); + + let accounts = initial_identities + .iter() + .enumerate() + .map(|(i, (_, owner_key))| { + ( + owner_key.clone(), + GenesisAccountData { + random_id: H256(blake2_256( + &(i as u32 + idty_index_start, owner_key).encode(), + )), + balance: ud, + is_identity: true, + }, + ) + }) + .collect(); + + let identity_index = identities + .iter() + .map(|i| (i.idty_index, i.name.clone())) + .collect(); + + let genesis_data_wallets_count = 0; + let inactive_identities = HashMap::new(); + + let smith_memberships = (1..=initial_smiths_len) + .map(|i| (i as u32, MembershipData { expire_on: 0 })) + .collect(); + + let (smith_certs_by_receiver, counter_smith_cert) = clique_wot(initial_smiths_len); + + let initial_authorities: BTreeMap< + u32, + ( + <<MultiSignature as Verify>::Signer as IdentifyAccount>::AccountId, + bool, + ), + > = initial_smiths + .iter() + .enumerate() + .map(|(i, keys)| { + ( + i as u32 + idty_index_start, + (keys.0.clone(), i < initial_authorities_len), + ) + }) + .collect(); + + let counter_online_authorities = initial_authorities + .iter() + .filter(|(_, authority)| authority.1) + .count() as u32; + + let technical_committee_members = initial_smiths + .iter() + .map(|x| x.0.clone()) + .collect::<Vec<_>>(); + + let genesis_info = GenesisInfo { + accounts: &accounts, + genesis_data_wallets_count: &genesis_data_wallets_count, + identities: &identities, + inactive_identities: &inactive_identities, + identity_index: &identity_index, + smith_memberships: &smith_memberships, + counter_online_authorities: &counter_online_authorities, + counter_cert: &counter_cert, + counter_smith_cert: &counter_smith_cert, + technical_committee_members: &technical_committee_members, + common_parameters: &common_parameters, + }; + + dump_genesis_info(genesis_info); + let genesis_data = GenesisData { - accounts: initial_identities - .iter() - .enumerate() - .map(|(i, (_, owner_key))| { - ( - owner_key.clone(), - GenesisAccountData { - random_id: H256(blake2_256( - &(i as u32 + idty_index_start, owner_key).encode(), - )), - balance: ud, - is_identity: true, - }, - ) - }) - .collect(), + accounts, // Treasury balance is created out of nothing for local blockchain treasury_balance, - certs_by_receiver: clique_wot(initial_identities.len()), + certs_by_receiver, first_ud: None, first_ud_reeval: None, - identities: identities_, - initial_authorities: initial_smiths - .iter() - .enumerate() - .map(|(i, keys)| { - ( - i as u32 + idty_index_start, - (keys.0.clone(), i < initial_authorities_len), - ) - }) - .collect(), + identities, + initial_authorities, initial_monetary_mass: initial_identities_len as u64 * ud, memberships: (1..=initial_identities.len()) .map(|i| (i as u32, MembershipData { expire_on: 0 })) .collect(), - parameters: Some(parameters), + parameters, common_parameters: None, session_keys_map, - smith_certs_by_receiver: clique_wot(initial_smiths_len), - smith_memberships: (1..=initial_smiths_len) - .map(|i| (i as u32, MembershipData { expire_on: 0 })) - .collect(), + smith_certs_by_receiver, + smith_memberships, sudo_key: Some(root_key), - technical_committee_members: initial_smiths - .iter() - .map(|x| x.0.clone()) - .collect::<Vec<_>>(), + technical_committee_members, ud, };