Skip to content
Snippets Groups Projects
Select Git revision
  • dac7547f14ef798f8de6030b1cfeb865f13c4b1e
  • master default protected
  • fix_picked_up_file_in_runtime_release
  • network/gtest-1000 protected
  • upgradable-multisig
  • runtime/gtest-1000
  • network/gdev-800 protected
  • cgeek/issue-297-cpu
  • gdev-800-tests
  • update-docker-compose-rpc-squid-names
  • fix-252
  • 1000i100-test
  • hugo/tmp-0.9.1
  • network/gdev-803 protected
  • hugo/endpoint-gossip
  • network/gdev-802 protected
  • hugo/distance-precompute
  • network/gdev-900 protected
  • tuxmain/anonymous-tx
  • debug/podman
  • hugo/195-doc
  • gtest-1000-0.11.1 protected
  • gtest-1000-0.11.0 protected
  • gtest-1000 protected
  • gdev-900-0.10.1 protected
  • gdev-900-0.10.0 protected
  • gdev-900-0.9.2 protected
  • gdev-800-0.8.0 protected
  • gdev-900-0.9.1 protected
  • gdev-900-0.9.0 protected
  • gdev-803 protected
  • gdev-802 protected
  • runtime-801 protected
  • gdev-800 protected
  • runtime-800-bis protected
  • runtime-800 protected
  • runtime-800-backup protected
  • runtime-701 protected
  • runtime-700 protected
  • runtime-600 protected
  • runtime-500 protected
41 results

gtest.rs

Blame
  • gtest.rs 11.81 KiB
    // Copyright 2021 Axiom-Team
    //
    // This file is part of Substrate-Libre-Currency.
    //
    // Substrate-Libre-Currency is free software: you can redistribute it and/or modify
    // it under the terms of the GNU Affero General Public License as published by
    // the Free Software Foundation, version 3 of the License.
    //
    // Substrate-Libre-Currency is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    // GNU Affero General Public License for more details.
    //
    // You should have received a copy of the GNU Affero General Public License
    // along with Substrate-Libre-Currency. If not, see <https://www.gnu.org/licenses/>.
    
    use super::*;
    use common_runtime::constants::*;
    use common_runtime::entities::IdtyName;
    use gtest_runtime::{
        opaque::SessionKeys, AccountId, BabeConfig, BalancesConfig, GenesisConfig, IdentityConfig,
        IdtyRight, IdtyValue, ImOnlineId, MembershipConfig, SessionConfig, StrongCertConfig,
        SudoConfig, SystemConfig, UdAccountsStorageConfig, UniversalDividendConfig, WASM_BINARY,
    };
    use maplit::btreemap;
    use sc_service::ChainType;
    use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
    use sp_consensus_babe::AuthorityId as BabeId;
    use sp_core::sr25519;
    use sp_finality_grandpa::AuthorityId as GrandpaId;
    use sp_membership::MembershipData;
    use std::collections::BTreeMap;
    
    pub type AuthorityKeys = (
        AccountId,
        BabeId,
        GrandpaId,
        ImOnlineId,
        AuthorityDiscoveryId,
    );
    
    pub type ChainSpec = sc_service::GenericChainSpec<GenesisConfig>;
    
    const TOKEN_DECIMALS: usize = 2;
    const TOKEN_SYMBOL: &str = "ĞT";
    // The URL for the telemetry server.
    // const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/";
    
    /// Generate an authority keys.
    pub fn get_authority_keys_from_seed(s: &str) -> AuthorityKeys {
        (
            get_account_id_from_seed::<sr25519::Public>(s),
            get_from_seed::<BabeId>(s),
            get_from_seed::<GrandpaId>(s),
            get_from_seed::<ImOnlineId>(s),
            get_from_seed::<AuthorityDiscoveryId>(s),
        )
    }
    
    fn devnet_genesis(
        wasm_binary: &[u8],
        initial_authorities: Vec<AuthorityKeys>,
        initial_identities: BTreeMap<IdtyName, AccountId>,
        root_key: AccountId,
        _enable_println: bool,
    ) -> GenesisConfig {
        GenesisConfig {
            system: SystemConfig {
                // Add Wasm runtime to storage.
                code: wasm_binary.to_vec(),
            },
            authority_discovery: Default::default(),
            balances: BalancesConfig {
                // Configure endowed accounts with initial balance of INITIAL_BALANCE.
                balances: Vec::with_capacity(0),
            },
            babe: BabeConfig {
                authorities: Vec::with_capacity(0),
                epoch_config: Some(BABE_GENESIS_EPOCH_CONFIG),
            },
            grandpa: Default::default(),
            im_online: Default::default(),
            session: SessionConfig {
                keys: initial_authorities
                    .iter()
                    .map(|x| {
                        (
                            x.0.clone(),
                            x.0.clone(),
                            session_keys(x.1.clone(), x.2.clone(), x.3.clone(), x.4.clone()),
                        )
                    })
                    .collect::<Vec<_>>(),
            },
            sudo: SudoConfig {
                // Assign network admin rights.
                key: Some(root_key),
            },
            identity: IdentityConfig {
                identities: initial_identities
                    .iter()
                    .map(|(name, account)| IdtyValue {
                        data: Default::default(),
                        name: name.clone(),
                        next_creatable_identity_on: Default::default(),
                        owner_key: account.clone(),
                        removable_on: 0,
                        rights: vec![
                            (IdtyRight::CreateIdty, None),
                            (IdtyRight::StrongCert, None),
                            (IdtyRight::Ud, None),
                        ],
                        status: gtest_runtime::IdtyStatus::Validated,
                    })
                    .collect(),
            },
            membership: MembershipConfig {
                memberships: (1..=initial_identities.len())
                    .map(|i| {
                        (
                            i as u32,
                            MembershipData {
                                expire_on: gtest_runtime::MembershipPeriod::get(),
                                renewable_on: gtest_runtime::RenewablePeriod::get(),
                            },
                        )
                    })
                    .collect(),
            },
            strong_cert: StrongCertConfig {
                apply_cert_period_at_genesis: false,
                certs_by_issuer: clique_wot(
                    initial_identities.len(),
                    gtest_runtime::parameters::ValidityPeriod::get(),
                ),
            },
            ud_accounts_storage: UdAccountsStorageConfig {
                ud_accounts: initial_identities.values().cloned().collect(),
            },
            universal_dividend: UniversalDividendConfig {
                first_ud: 1_000,
                initial_monetary_mass: 0,
            },
        }
    }
    
    pub fn development_chain_spec() -> Result<ChainSpec, String> {
        let wasm_binary = WASM_BINARY.ok_or_else(|| "wasm not available".to_string())?;
    
        Ok(ChainSpec::from_genesis(
            // Name
            "Ğtest Development",
            // ID
            "gtest_dev",
            ChainType::Development,
            move || {
                devnet_genesis(
                    wasm_binary,
                    // Initial PoA authorities
                    vec![get_authority_keys_from_seed("Alice")],
                    // Inital identities
                    btreemap![
                        IdtyName::from("Alice") => get_account_id_from_seed::<sr25519::Public>("Alice"),
                        IdtyName::from("Bob") => get_account_id_from_seed::<sr25519::Public>("Bob"),
                        IdtyName::from("Charlie") => get_account_id_from_seed::<sr25519::Public>("Charlie"),
                    ],
                    // Sudo account
                    get_account_id_from_seed::<sr25519::Public>("Alice"),
                    true,
                )
            },
            // Bootnodes
            vec![],
            // Telemetry
            None,
            // Protocol ID
            None,
            // Properties
            Some(
                serde_json::json!({
                        "tokenDecimals": TOKEN_DECIMALS,
                        "tokenSymbol": TOKEN_SYMBOL,
                })
                .as_object()
                .expect("must be a map")
                .clone(),
            ),
            // Extensions
            None,
        ))
    }
    
    pub fn local_testnet_config(authorities_count: usize) -> Result<ChainSpec, String> {
        let wasm_binary = WASM_BINARY.ok_or_else(|| "wasm not available".to_string())?;
    
        let mut authorities = vec![
            get_authority_keys_from_seed("Alice"),
            get_authority_keys_from_seed("Bob"),
            get_authority_keys_from_seed("Charlie"),
            get_authority_keys_from_seed("Dave"),
            get_authority_keys_from_seed("Eve"),
            get_authority_keys_from_seed("Ferdie"),
        ];
        authorities.truncate(authorities_count);
    
        Ok(ChainSpec::from_genesis(
            // Name
            "Ğtest Local Testnet",
            // ID
            "gtest_local_testnet",
            ChainType::Local,
            move || {
                testnet_genesis(
                    wasm_binary,
                    // Initial authorities
                    authorities.clone(),
                    // Initial identities
                    btreemap![
                        IdtyName::from("Alice") => get_account_id_from_seed::<sr25519::Public>("Alice"),
                        IdtyName::from("Bob") => get_account_id_from_seed::<sr25519::Public>("Bob"),
                        IdtyName::from("Charlie") => get_account_id_from_seed::<sr25519::Public>("Charlie"),
                        IdtyName::from("Dave") => get_account_id_from_seed::<sr25519::Public>("Dave"),
                        IdtyName::from("Eve") => get_account_id_from_seed::<sr25519::Public>("Eve"),
                        IdtyName::from("Ferdie") => get_account_id_from_seed::<sr25519::Public>("Ferdie"),
                    ],
                    // Sudo account
                    get_account_id_from_seed::<sr25519::Public>("Alice"),
                    true,
                )
            },
            // Bootnodes
            vec![],
            // Telemetry
            None,
            // Protocol ID
            None,
            // Properties
            Some(
                serde_json::json!({
                        "tokenDecimals": TOKEN_DECIMALS,
                        "tokenSymbol": TOKEN_SYMBOL,
                })
                .as_object()
                .expect("must be a map")
                .clone(),
            ),
            // Extensions
            None,
        ))
    }
    
    fn session_keys(
        babe: BabeId,
        grandpa: GrandpaId,
        im_online: ImOnlineId,
        authority_discovery: AuthorityDiscoveryId,
    ) -> SessionKeys {
        SessionKeys {
            babe,
            grandpa,
            im_online,
            authority_discovery,
        }
    }
    
    fn testnet_genesis(
        wasm_binary: &[u8],
        initial_authorities: Vec<AuthorityKeys>,
        initial_identities: BTreeMap<IdtyName, AccountId>,
        root_key: AccountId,
        _enable_println: bool,
    ) -> GenesisConfig {
        GenesisConfig {
            system: SystemConfig {
                // Add Wasm runtime to storage.
                code: wasm_binary.to_vec(),
            },
            authority_discovery: Default::default(),
            balances: BalancesConfig {
                // Configure endowed accounts with initial balance of INITIAL_BALANCE.
                balances: Vec::with_capacity(0),
            },
            babe: BabeConfig {
                authorities: Vec::with_capacity(0),
                epoch_config: Some(BABE_GENESIS_EPOCH_CONFIG),
            },
            grandpa: Default::default(),
            im_online: Default::default(),
            session: SessionConfig {
                keys: initial_authorities
                    .iter()
                    .map(|x| {
                        (
                            x.0.clone(),
                            x.0.clone(),
                            session_keys(x.1.clone(), x.2.clone(), x.3.clone(), x.4.clone()),
                        )
                    })
                    .collect::<Vec<_>>(),
            },
            sudo: SudoConfig {
                // Assign network admin rights.
                key: Some(root_key),
            },
            identity: IdentityConfig {
                identities: initial_identities
                    .iter()
                    .map(|(name, account)| IdtyValue {
                        data: Default::default(),
                        name: name.clone(),
                        next_creatable_identity_on: Default::default(),
                        owner_key: account.clone(),
                        removable_on: 0,
                        rights: vec![
                            (IdtyRight::CreateIdty, None),
                            (IdtyRight::StrongCert, None),
                            (IdtyRight::Ud, None),
                        ],
                        status: gtest_runtime::IdtyStatus::Validated,
                    })
                    .collect(),
            },
            membership: MembershipConfig {
                memberships: (1..=initial_identities.len())
                    .map(|i| {
                        (
                            i as u32,
                            MembershipData {
                                expire_on: gtest_runtime::MembershipPeriod::get(),
                                renewable_on: gtest_runtime::RenewablePeriod::get(),
                            },
                        )
                    })
                    .collect(),
            },
            strong_cert: StrongCertConfig {
                apply_cert_period_at_genesis: false,
                certs_by_issuer: clique_wot(
                    initial_identities.len(),
                    gtest_runtime::parameters::ValidityPeriod::get(),
                ),
            },
            ud_accounts_storage: UdAccountsStorageConfig {
                ud_accounts: initial_identities.values().cloned().collect(),
            },
            universal_dividend: UniversalDividendConfig {
                first_ud: 1_000,
                initial_monetary_mass: 0,
            },
        }
    }