diff --git a/node/src/chain_spec/gtest.rs b/node/src/chain_spec/gtest.rs index 791749e4e0bfa2185fa7e721fa1e0ce34e5e2541..d458907219a535b592cd010264cab1b392404e83 100644 --- a/node/src/chain_spec/gtest.rs +++ b/node/src/chain_spec/gtest.rs @@ -95,7 +95,7 @@ pub fn development_chain_spec() -> Result<ChainSpec, String> { // return chainspecs Ok(ChainSpec::from_genesis( // Name - "Ğtest Development", + "ĞTest Development", // ID "gtest_dev", // chain type @@ -139,7 +139,7 @@ pub fn development_chain_spec() -> Result<ChainSpec, String> { // generated genesis Ok(ChainSpec::from_genesis( // Name - "Ğtest Development", + "ĞTest Development", // ID "gtest_dev", // chain type @@ -192,7 +192,7 @@ pub fn local_testnet_config( Ok(ChainSpec::from_genesis( // Name - "Ğtest Local Testnet", + "ĞTest Local Testnet", // ID "gtest_local", ChainType::Local, diff --git a/node/src/chain_spec/gtest_genesis.rs b/node/src/chain_spec/gtest_genesis.rs index dd4d6882c687b86dc9a14c50d5bc5e823e93f0fd..0aea4611e8b52f4342a487c16fe461856e66a34d 100644 --- a/node/src/chain_spec/gtest_genesis.rs +++ b/node/src/chain_spec/gtest_genesis.rs @@ -185,7 +185,7 @@ pub fn build_genesis( for (pubkey, balance) in &genesis_data.wallets { // check existential deposit if balance < &EXISTENTIAL_DEPOSIT { - log::warn!("wallet {pubkey} has {balance} which is below {EXISTENTIAL_DEPOSIT}"); + log::warn!("wallet {pubkey} has {balance} cǦT which is below {EXISTENTIAL_DEPOSIT}"); fatal = true; } @@ -193,6 +193,7 @@ pub fn build_genesis( monetary_mass += balance; wallet_index += 1; + // json prevents duplicate wallets accounts.insert( pubkey.clone(), GenesisAccountData { @@ -210,7 +211,33 @@ pub fn build_genesis( return Err(format!("Identity name '{}' is invalid", &name)); } + // check existential deposit + if identity.balance < EXISTENTIAL_DEPOSIT { + if identity.membership_expire_on != 0 { + log::warn!( + "expired identity {name} has {} cǦT which is below {EXISTENTIAL_DEPOSIT}", + identity.balance + ); + fatal = true; + } else { + // member identities can still be below existential deposit thanks to sufficient + log::info!( + "identity {name} has {} cǦT which is below {EXISTENTIAL_DEPOSIT}", + identity.balance + ); + } + } + // Money + // check that wallet with same owner_key does not exist + if accounts.get(&identity.owner_key).is_some() { + log::warn!( + "{name} owner_key {} already exists as a simple wallet", + identity.owner_key + ); + fatal = true; + } + // insert as an account accounts.insert( identity.owner_key.clone(), GenesisAccountData { @@ -274,7 +301,8 @@ pub fn build_genesis( if let Some(identity) = &genesis_data.identities.get(name) { technical_committee_members.push(identity.owner_key.clone()); } else { - return Err(format!("Identity '{}' not exist", name)); + log::error!("Identity '{}' does not exist", name); + fatal = true; } } @@ -282,72 +310,73 @@ pub fn build_genesis( for (_, identity) in &genesis_data.identities { let mut certs = BTreeMap::new(); for (issuer, expire_on) in &identity.certs_received { - let issuer_index = &genesis_data - .identities - .get(issuer) - .ok_or(format!("Identity '{}' not exist", issuer))? - .index; - certs.insert(*issuer_index, Some(expire_on.clone())); - counter_cert += 1; + if let Some(issuer) = &genesis_data.identities.get(issuer) { + certs.insert(issuer.index, Some(expire_on.clone())); + counter_cert += 1; + } else { + log::error!("Identity '{}' does not exist", issuer); + fatal = true; + }; } certs_by_receiver.insert(identity.index, certs); } // SMITHS SUB-WOT // for (name, smith_data) in &genesis_data.smiths { - let identity = &genesis_data - .identities - .get(&name.clone()) - .ok_or(format!("Identity '{}' not exist", &name))?; - - // Initial authorities and session keys - let session_keys_bytes = if let Some(declared_session_keys) = &smith_data.session_keys { - counter_online_authorities += 1; - // insert authority as online - initial_authorities.insert(identity.index, (identity.owner_key.clone(), true)); - // decode session keys or force to given value - match maybe_force_authority { - Some(ref bytes) => bytes.clone(), - None => hex::decode(&declared_session_keys[2..]) - .map_err(|_| format!("invalid session keys for idty {}", &name))?, - } - } else { - // still authority but offline - initial_authorities.insert(identity.index, (identity.owner_key.clone(), false)); - // fake session keys - let mut fake_bytes = Vec::with_capacity(128); - for _ in 0..4 { - fake_bytes.extend_from_slice(identity.owner_key.as_ref()) - } - fake_bytes - }; + // check that smith exists + if let Some(identity) = &genesis_data.identities.get(&name.clone()) { + // Initial authorities and session keys + let session_keys_bytes = if let Some(declared_session_keys) = &smith_data.session_keys { + counter_online_authorities += 1; + // insert authority as online + initial_authorities.insert(identity.index, (identity.owner_key.clone(), true)); + // decode session keys or force to given value + match maybe_force_authority { + Some(ref bytes) => bytes.clone(), + None => hex::decode(&declared_session_keys[2..]) + .map_err(|_| format!("invalid session keys for idty {}", &name))?, + } + } else { + // still authority but offline + initial_authorities.insert(identity.index, (identity.owner_key.clone(), false)); + // fake session keys + let mut fake_bytes = Vec::with_capacity(128); + for _ in 0..4 { + fake_bytes.extend_from_slice(identity.owner_key.as_ref()) + } + fake_bytes + }; + + // insert session keys to map + session_keys_map.insert( + identity.owner_key.clone(), + SessionKeys::decode(&mut &session_keys_bytes[..]).unwrap(), + ); - // insert session keys to map - session_keys_map.insert( - identity.owner_key.clone(), - SessionKeys::decode(&mut &session_keys_bytes[..]).unwrap(), - ); + // smith certifications + let mut certs = BTreeMap::new(); + for issuer in &smith_data.certs_received { + let issuer_index = &genesis_data + .identities + .get(issuer) + .ok_or(format!("Identity '{}' does not exist", issuer))? + .index; + certs.insert(*issuer_index, Some(GENESIS_SMITH_CERTS_EXPIRE_ON)); + counter_smith_cert += 1; + } + smith_certs_by_receiver.insert(identity.index, certs); - // smith certifications - let mut certs = BTreeMap::new(); - for issuer in &smith_data.certs_received { - let issuer_index = &genesis_data - .identities - .get(issuer) - .ok_or(format!("Identity '{}' does not exist", issuer))? - .index; - certs.insert(*issuer_index, Some(GENESIS_SMITH_CERTS_EXPIRE_ON)); - counter_smith_cert += 1; + // smith memberships + smith_memberships.insert( + identity.index, + MembershipData { + expire_on: GENESIS_SMITH_MEMBERSHIP_EXPIRE_ON, + }, + ); + } else { + log::error!("Smith '{}' does not correspond to exising identity", &name); + fatal = true; } - smith_certs_by_receiver.insert(identity.index, certs); - - // smith memberships - smith_memberships.insert( - identity.index, - MembershipData { - expire_on: GENESIS_SMITH_MEMBERSHIP_EXPIRE_ON, - }, - ); } // Verify certifications coherence (can be ignored for old users) @@ -394,30 +423,9 @@ pub fn build_genesis( fatal = true; } - // some more checks - assert_eq!(identities.len(), memberships.len()); - assert_eq!(smith_memberships.len(), initial_authorities.len()); - assert_eq!(smith_memberships.len(), session_keys_map.len()); - assert_eq!( - identity_index.len(), - identities.len() + inactive_identities.len() - ); - assert_eq!( - accounts.len(), - identity_index.len() + &genesis_data.wallets.len() - ); - // no inactive tech comm - for tech_com_member in &genesis_data.technical_committee { - assert!(!inactive_identities.values().any(|&v| v == tech_com_member)); - } - // no inactive smith - for (smith, _) in &genesis_data.smiths { - assert!(!inactive_identities.values().any(|&v| v == smith)); - } - // give genesis info log::info!( - "inserted genesis with: + "prepared genesis with: - {} accounts ({} identities, {} simple wallets) - {} total identities ({} active, {} inactive) - {} smiths @@ -438,8 +446,30 @@ pub fn build_genesis( technical_committee_members.len(), ); + // some more checks + assert_eq!(identities.len(), memberships.len()); + assert_eq!(smith_memberships.len(), initial_authorities.len()); + assert_eq!(smith_memberships.len(), session_keys_map.len()); + assert_eq!( + identity_index.len(), + identities.len() + inactive_identities.len() + ); + assert_eq!( + accounts.len(), + identity_index.len() + &genesis_data.wallets.len() + ); + // no inactive tech comm + for tech_com_member in &genesis_data.technical_committee { + assert!(!inactive_identities.values().any(|&v| v == tech_com_member)); + } + // no inactive smith + for (smith, _) in &genesis_data.smiths { + assert!(!inactive_identities.values().any(|&v| v == smith)); + } + // check the logs to see all the fatal error preventing from starting gtest currency if fatal { + log::error!("some previously logged error prevent from building a sane genesis"); panic!(); }