From 98e0d7937e95f33abe604b308cfcb6bd30c62648 Mon Sep 17 00:00:00 2001 From: Kurdistan Tech Ministry Date: Sat, 24 Jan 2026 10:43:10 +0300 Subject: [PATCH] fix: correct Ed25519/Sr25519 key scheme detection for Asset Hub - Fix RuntimeResolver prefix matching order: check asset-hub-pezkuwichain BEFORE asset-hub-pezkuwi to avoid false matches - Fix zombienet SDK is_asset_hub_pezkuwi detection to exclude pezkuwichain - Add zombienet-local-21.toml and zombienet-mainnet-21.toml configs - Update .gitignore for sensitive mainnet files --- .gitignore | 9 + .../pezkuwi-teyrchain/src/chain_spec/mod.rs | 11 +- .../orchestrator/src/generators/chain_spec.rs | 4 +- .../crates/orchestrator/src/spawner.rs | 16 +- zombienet-local-21.toml | 175 +++++++++++++++ zombienet-mainnet-21.toml | 207 ++++++++++++++++++ 6 files changed, 411 insertions(+), 11 deletions(-) create mode 100644 zombienet-local-21.toml create mode 100644 zombienet-mainnet-21.toml diff --git a/.gitignore b/.gitignore index 4ec14b99..1d4c244b 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,12 @@ vendor/*/Cargo.lock # Generated chain specs chain-specs/ + +# Sensitive wallet data - NEVER commit +/res/ +tools/usdt-bridge/secrets/ +*.seed +*wallet*.json +founder_validators.json +founder_governance.json +mainnet/ diff --git a/pezcumulus/pezkuwi-teyrchain/src/chain_spec/mod.rs b/pezcumulus/pezkuwi-teyrchain/src/chain_spec/mod.rs index 843e00db..d80e9e40 100644 --- a/pezcumulus/pezkuwi-teyrchain/src/chain_spec/mod.rs +++ b/pezcumulus/pezkuwi-teyrchain/src/chain_spec/mod.rs @@ -247,16 +247,19 @@ impl LegacyRuntime { fn from_id(id: &str) -> LegacyRuntime { let id = id.replace('_', "-"); - if id.starts_with("asset-hub-pezkuwi") | id.starts_with("statemint") { - LegacyRuntime::AssetHubPezkuwi - } else if id.starts_with("asset-hub-dicle") + // NOTE: Check longer prefixes FIRST to avoid false matches. + // "asset-hub-pezkuwichain" starts with "asset-hub-pezkuwi", so we must check + // pezkuwichain before pezkuwi. + if id.starts_with("asset-hub-pezkuwichain") + | id.starts_with("asset-hub-dicle") | id.starts_with("statemine") - | id.starts_with("asset-hub-pezkuwichain") | id.starts_with("rockmine") | id.starts_with("asset-hub-zagros") | id.starts_with("westmint") { LegacyRuntime::AssetHub + } else if id.starts_with("asset-hub-pezkuwi") | id.starts_with("statemint") { + LegacyRuntime::AssetHubPezkuwi } else if id.starts_with("penpal") { LegacyRuntime::Penpal } else if id.starts_with("collectives-pezkuwi") || id.starts_with("collectives-zagros") { diff --git a/vendor/pezkuwi-zombienet-sdk/crates/orchestrator/src/generators/chain_spec.rs b/vendor/pezkuwi-zombienet-sdk/crates/orchestrator/src/generators/chain_spec.rs index af636ac3..e4daaac9 100644 --- a/vendor/pezkuwi-zombienet-sdk/crates/orchestrator/src/generators/chain_spec.rs +++ b/vendor/pezkuwi-zombienet-sdk/crates/orchestrator/src/generators/chain_spec.rs @@ -1349,10 +1349,12 @@ fn add_authorities( nodes: &[&NodeSpec], session_key: SessionKeyType, ) { + // NOTE: Check that it's "asset-hub-pezkuwi" (mainnet) but NOT "asset-hub-pezkuwichain" (testnet). + // "asset-hub-pezkuwichain" starts with "asset-hub-pezkuwi", so we must exclude it. let is_asset_hub_pezkuwi = chain_spec_json .get("id") .and_then(|v| v.as_str()) - .map(|id| id.starts_with("asset-hub-pezkuwi")) + .map(|id| id.starts_with("asset-hub-pezkuwi") && !id.starts_with("asset-hub-pezkuwichain")) .unwrap_or_default(); if let Some(val) = chain_spec_json.pointer_mut(runtime_config_ptr) { if let Some(session_keys) = val.pointer_mut("/session/keys") { diff --git a/vendor/pezkuwi-zombienet-sdk/crates/orchestrator/src/spawner.rs b/vendor/pezkuwi-zombienet-sdk/crates/orchestrator/src/spawner.rs index 280eac0e..6d673b20 100644 --- a/vendor/pezkuwi-zombienet-sdk/crates/orchestrator/src/spawner.rs +++ b/vendor/pezkuwi-zombienet-sdk/crates/orchestrator/src/spawner.rs @@ -65,8 +65,12 @@ where // Generate keystore for node let node_files_path = if let Some(para) = ctx.parachain { para.id.to_string() } else { node.name.clone() }; - let is_asset_hub_pezkuwi = - ctx.parachain_id.map(|id| id.starts_with("asset-hub-pezkuwi")).unwrap_or_default(); + // NOTE: Check that it's "asset-hub-pezkuwi" (mainnet) but NOT "asset-hub-pezkuwichain" (testnet). + // "asset-hub-pezkuwichain" starts with "asset-hub-pezkuwi", so we must exclude it. + let is_asset_hub_pezkuwi = ctx + .parachain_id + .map(|id| id.starts_with("asset-hub-pezkuwi") && !id.starts_with("asset-hub-pezkuwichain")) + .unwrap_or_default(); let keystore_key_types = node.keystore_key_types.iter().map(String::as_str).collect(); let key_filenames = generators::generate_node_keystore( &node.accounts, @@ -245,13 +249,13 @@ where let prometheus_uri = format!("http://{ip_to_use}:{prometheus_port_external}/metrics"); info!("🚀 {}, should be running now", node.name); info!( - "💻 {}: direct link (pjs) https://polkadot.js.org/apps/?rpc={ws_uri}#/explorer", + "💻 {}: direct link (apps) https://apps.pezkuwichain.io/?rpc={ws_uri}#/explorer", node.name ); info!( - "💻 {}: direct link (papi) https://dev.papi.how/explorer#networkId=custom&endpoint={ws_uri}", - node.name - ); + "💻 {}: direct link (explorer) https://explorer.pezkuwichain.io/?rpc={ws_uri}#/explorer", + node.name + ); info!("📊 {}: metrics link {prometheus_uri}", node.name); diff --git a/zombienet-local-21.toml b/zombienet-local-21.toml new file mode 100644 index 00000000..2051b245 --- /dev/null +++ b/zombienet-local-21.toml @@ -0,0 +1,175 @@ +# Pezkuwi Local Test Configuration - 21 Validators +# ================================================= +# Uses well-known keyring for automatic key injection +# For testing network topology before mainnet + +[settings] +timeout = 600 +provider = "native" +bootnode_spawn_timeout = 300 + +[relaychain] +default_command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi" +chain = "pezkuwichain-local" +default_args = [ + "--unsafe-force-node-key-generation", + "-lteyrchain=debug,babe=debug,grandpa=debug", +] + +# Using Substrate's well-known keyring names for automatic key injection +[[relaychain.nodes]] +name = "alice" +validator = true +rpc_port = 9944 + +[[relaychain.nodes]] +name = "bob" +validator = true +rpc_port = 9945 + +[[relaychain.nodes]] +name = "charlie" +validator = true +rpc_port = 9946 + +[[relaychain.nodes]] +name = "dave" +validator = true +rpc_port = 9947 + +[[relaychain.nodes]] +name = "eve" +validator = true +rpc_port = 9948 + +[[relaychain.nodes]] +name = "ferdie" +validator = true +rpc_port = 9949 + +[[relaychain.nodes]] +name = "one" +validator = true +rpc_port = 9950 + +[[relaychain.nodes]] +name = "two" +validator = true +rpc_port = 9951 + +# Additional validators (will use generated keys) +[[relaychain.nodes]] +name = "validator-9" +validator = true +rpc_port = 9952 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-10" +validator = true +rpc_port = 9953 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-11" +validator = true +rpc_port = 9954 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-12" +validator = true +rpc_port = 9955 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-13" +validator = true +rpc_port = 9956 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-14" +validator = true +rpc_port = 9957 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-15" +validator = true +rpc_port = 9958 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-16" +validator = true +rpc_port = 9959 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-17" +validator = true +rpc_port = 9960 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-18" +validator = true +rpc_port = 9961 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-19" +validator = true +rpc_port = 9962 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-20" +validator = true +rpc_port = 9963 +args = ["--unsafe-force-node-key-generation"] + +[[relaychain.nodes]] +name = "validator-21" +validator = true +rpc_port = 9964 +args = ["--unsafe-force-node-key-generation"] + +# Asset Hub Teyrchain +[[teyrchains]] +id = 1000 +chain = "asset-hub-pezkuwichain-local" +cumulus_based = true +add_to_genesis = true + +[[teyrchains.collators]] +name = "azad-collator" +command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi-teyrchain" +rpc_port = 10944 +args = ["--unsafe-force-node-key-generation", "-lteyrchain=debug"] + +[[teyrchains.collators]] +name = "beritan-collator" +command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi-teyrchain" +rpc_port = 10945 +args = ["--unsafe-force-node-key-generation", "-lteyrchain=debug"] + +# People Chain Teyrchain +[[teyrchains]] +id = 1004 +chain = "people-pezkuwichain-local" +cumulus_based = true +add_to_genesis = true + +[[teyrchains.collators]] +name = "erin-collator" +command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi-teyrchain" +rpc_port = 10948 +args = ["--unsafe-force-node-key-generation", "-lteyrchain=debug"] + +[[teyrchains.collators]] +name = "firaz-collator" +command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi-teyrchain" +rpc_port = 10949 +args = ["--unsafe-force-node-key-generation", "-lteyrchain=debug"] diff --git a/zombienet-mainnet-21.toml b/zombienet-mainnet-21.toml new file mode 100644 index 00000000..326e6d40 --- /dev/null +++ b/zombienet-mainnet-21.toml @@ -0,0 +1,207 @@ +# MAINNET CONFIG - 21 Validators + 4 Collators (2 Asset Hub + 2 People Chain) +# Uses "genesis" preset with real validator/collator keys +# For local testing before VPS deployment + +[settings] +timeout = 600 +provider = "native" +bootnode_spawn_timeout = 300 + +[relaychain] +default_command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi" +# Use "genesis" preset which has 21 real validators and real account addresses +chain = "pezkuwichain" +default_args = ["-lbabe=debug,grandpa=debug,teyrchain=debug", "--unsafe-force-node-key-generation"] + +# Validator 1: Satoshi-Qazi-Mohammed +[[relaychain.nodes]] +name = "validator-1" +validator = true +rpc_port = 9944 +prometheus_port = 9615 + +# Validator 2 +[[relaychain.nodes]] +name = "validator-2" +validator = true +rpc_port = 9945 +prometheus_port = 9616 + +# Validator 3 +[[relaychain.nodes]] +name = "validator-3" +validator = true +rpc_port = 9946 +prometheus_port = 9617 + +# Validator 4 +[[relaychain.nodes]] +name = "validator-4" +validator = true +rpc_port = 9947 +prometheus_port = 9618 + +# Validator 5 +[[relaychain.nodes]] +name = "validator-5" +validator = true +rpc_port = 9948 +prometheus_port = 9619 + +# Validator 6 +[[relaychain.nodes]] +name = "validator-6" +validator = true +rpc_port = 9949 +prometheus_port = 9620 + +# Validator 7 +[[relaychain.nodes]] +name = "validator-7" +validator = true +rpc_port = 9950 +prometheus_port = 9621 + +# Validator 8 +[[relaychain.nodes]] +name = "validator-8" +validator = true +rpc_port = 9951 +prometheus_port = 9622 + +# Validator 9 +[[relaychain.nodes]] +name = "validator-9" +validator = true +rpc_port = 9952 +prometheus_port = 9623 + +# Validator 10 +[[relaychain.nodes]] +name = "validator-10" +validator = true +rpc_port = 9953 +prometheus_port = 9624 + +# Validator 11 +[[relaychain.nodes]] +name = "validator-11" +validator = true +rpc_port = 9954 +prometheus_port = 9625 + +# Validator 12 +[[relaychain.nodes]] +name = "validator-12" +validator = true +rpc_port = 9955 +prometheus_port = 9626 + +# Validator 13 +[[relaychain.nodes]] +name = "validator-13" +validator = true +rpc_port = 9956 +prometheus_port = 9627 + +# Validator 14 +[[relaychain.nodes]] +name = "validator-14" +validator = true +rpc_port = 9957 +prometheus_port = 9628 + +# Validator 15 +[[relaychain.nodes]] +name = "validator-15" +validator = true +rpc_port = 9958 +prometheus_port = 9629 + +# Validator 16 +[[relaychain.nodes]] +name = "validator-16" +validator = true +rpc_port = 9959 +prometheus_port = 9630 + +# Validator 17 +[[relaychain.nodes]] +name = "validator-17" +validator = true +rpc_port = 9960 +prometheus_port = 9631 + +# Validator 18 +[[relaychain.nodes]] +name = "validator-18" +validator = true +rpc_port = 9961 +prometheus_port = 9632 + +# Validator 19 +[[relaychain.nodes]] +name = "validator-19" +validator = true +rpc_port = 9962 +prometheus_port = 9633 + +# Validator 20 +[[relaychain.nodes]] +name = "validator-20" +validator = true +rpc_port = 9963 +prometheus_port = 9634 + +# Validator 21 +[[relaychain.nodes]] +name = "validator-21" +validator = true +rpc_port = 9964 +prometheus_port = 9635 + +# Asset Hub Teyrchain (ID: 1000) - 2 Collators +[[teyrchains]] +id = 1000 +chain = "asset-hub-pezkuwichain" +cumulus_based = true +add_to_genesis = true + +# Azad - Asset Hub Collator 1 +[[teyrchains.collators]] +name = "azad" +command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi-teyrchain" +rpc_port = 10944 +prometheus_port = 10615 +args = ["--force-authoring", "-lteyrchain=debug"] + +# Beritan - Asset Hub Collator 2 +[[teyrchains.collators]] +name = "beritan" +command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi-teyrchain" +rpc_port = 10945 +prometheus_port = 10616 +args = ["--force-authoring", "-lteyrchain=debug"] + +# People Chain Teyrchain (ID: 1004) - 2 Collators +[[teyrchains]] +id = 1004 +chain = "people-pezkuwichain" +cumulus_based = true +add_to_genesis = true + +# Erin - People Chain Collator 1 +[[teyrchains.collators]] +name = "erin" +command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi-teyrchain" +rpc_port = 10948 +prometheus_port = 10619 +args = ["--force-authoring", "-lteyrchain=debug"] + +# Firaz - People Chain Collator 2 +[[teyrchains.collators]] +name = "firaz" +command = "/home/mamostehp/pezkuwi-sdk/target/release/pezkuwi-teyrchain" +rpc_port = 10949 +prometheus_port = 10620 +args = ["--force-authoring", "-lteyrchain=debug"]