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
This commit is contained in:
2026-01-24 10:43:10 +03:00
parent e438a9dd44
commit 98e0d7937e
6 changed files with 411 additions and 11 deletions
+9
View File
@@ -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/
@@ -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") {
@@ -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") {
@@ -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);
+175
View File
@@ -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"]
+207
View File
@@ -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"]