refactor: zombienet-sdk rebrand and subxt compatibility fixes

Zombienet-SDK changes:
- orchestrator: sc-chain-spec → pezsc-chain-spec
- orchestrator: sp-core → pezsp-core imports
- orchestrator: k8s-openapi v1_27 → v1_28
- provider: k8s-openapi v1_27 → v1_28
- sdk: k8s-openapi v1_27 → v1_28

Subxt vendor fixes:
- Enable std features (remove default-features = false)
- Fix lifetime annotations for Rust 2024 compatibility
- Fix ecdsa/sr25519 password type conversions
- Fix RecoveryId API change (i32::from → to_i32)

Dependencies:
- wasmtime: 35.0.0 → 37.0.0 (security fix)
- tracing-subscriber: 0.3.18 → 0.3.20 (security fix)
- thiserror: 1.0.64 → 2.0.17

Note: ring 0.16.20 vulnerability remains - requires libp2p 0.56
upgrade which needs extensive pezsc-network API changes.
This commit is contained in:
2025-12-23 04:44:44 +03:00
parent 53d5522bd5
commit 2cc5880fd9
16 changed files with 302 additions and 1628 deletions
Generated
+273 -1596
View File
File diff suppressed because it is too large Load Diff
+8 -8
View File
@@ -1508,15 +1508,15 @@ static_assertions = { version = "1.1.0", default-features = false }
static_init = { version = "1.0.3" } static_init = { version = "1.0.3" }
strum = { version = "0.26.3", default-features = false } strum = { version = "0.26.3", default-features = false }
# Pezkuwi-subxt (vendored from subxt with pezsp_runtime support) # Pezkuwi-subxt (vendored from subxt with pezsp_runtime support)
pezkuwi-subxt = { path = "vendor/pezkuwi-subxt/subxt", default-features = false } pezkuwi-subxt = { path = "vendor/pezkuwi-subxt/subxt" }
pezkuwi-subxt-codegen = { path = "vendor/pezkuwi-subxt/codegen" } pezkuwi-subxt-codegen = { path = "vendor/pezkuwi-subxt/codegen" }
pezkuwi-subxt-core = { path = "vendor/pezkuwi-subxt/core", default-features = false } pezkuwi-subxt-core = { path = "vendor/pezkuwi-subxt/core" }
pezkuwi-subxt-lightclient = { path = "vendor/pezkuwi-subxt/lightclient", default-features = false } pezkuwi-subxt-lightclient = { path = "vendor/pezkuwi-subxt/lightclient" }
pezkuwi-subxt-macro = { path = "vendor/pezkuwi-subxt/macro" } pezkuwi-subxt-macro = { path = "vendor/pezkuwi-subxt/macro" }
pezkuwi-subxt-metadata = { path = "vendor/pezkuwi-subxt/metadata", default-features = false } pezkuwi-subxt-metadata = { path = "vendor/pezkuwi-subxt/metadata" }
pezkuwi-subxt-rpcs = { path = "vendor/pezkuwi-subxt/rpcs", default-features = false } pezkuwi-subxt-rpcs = { path = "vendor/pezkuwi-subxt/rpcs" }
pezkuwi-subxt-signer = { path = "vendor/pezkuwi-subxt/signer", default-features = false } pezkuwi-subxt-signer = { path = "vendor/pezkuwi-subxt/signer" }
pezkuwi-subxt-utils-fetchmetadata = { path = "vendor/pezkuwi-subxt/utils/fetch-metadata", default-features = false } pezkuwi-subxt-utils-fetchmetadata = { path = "vendor/pezkuwi-subxt/utils/fetch-metadata" }
pezkuwi-subxt-utils-stripmetadata = { path = "vendor/pezkuwi-subxt/utils/strip-metadata" } pezkuwi-subxt-utils-stripmetadata = { path = "vendor/pezkuwi-subxt/utils/strip-metadata" }
support = { package = "zombienet-support", path = "vendor/pezkuwi-zombienet-sdk/crates/support" } support = { package = "zombienet-support", path = "vendor/pezkuwi-zombienet-sdk/crates/support" }
syn = { version = "2.0.87" } syn = { version = "2.0.87" }
@@ -1537,7 +1537,7 @@ test-teyrchain-adder = { path = "pezkuwi/teyrchain/test-teyrchains/adder" }
test-teyrchain-halt = { path = "pezkuwi/teyrchain/test-teyrchains/halt" } test-teyrchain-halt = { path = "pezkuwi/teyrchain/test-teyrchains/halt" }
test-teyrchain-undying = { path = "pezkuwi/teyrchain/test-teyrchains/undying" } test-teyrchain-undying = { path = "pezkuwi/teyrchain/test-teyrchains/undying" }
testnet-teyrchains-constants = { path = "pezcumulus/teyrchains/runtimes/constants", default-features = false } testnet-teyrchains-constants = { path = "pezcumulus/teyrchains/runtimes/constants", default-features = false }
thiserror = { version = "1.0.64" } thiserror = { version = "2.0.17", default-features = true }
thousands = { version = "0.2.0" } thousands = { version = "0.2.0" }
threadpool = { version = "1.7" } threadpool = { version = "1.7" }
tikv-jemalloc-ctl = { version = "0.6.0", features = ["stats"] } tikv-jemalloc-ctl = { version = "0.6.0", features = ["stats"] }
+1 -1
View File
@@ -53,7 +53,7 @@ scale-info = { workspace = true, default-features = false, features = ["bit-vec"
scale-value = { workspace = true, default-features = false } scale-value = { workspace = true, default-features = false }
serde = { workspace = true, default-features = false, features = ["derive"] } serde = { workspace = true, default-features = false, features = ["derive"] }
serde_json = { workspace = true, default-features = false, features = ["alloc", "raw_value"] } serde_json = { workspace = true, default-features = false, features = ["alloc", "raw_value"] }
thiserror = { workspace = true, default-features = false } thiserror = { workspace = true }
tracing = { workspace = true, default-features = false } tracing = { workspace = true, default-features = false }
# For ss58 encoding AccountId32 to serialize them properly: # For ss58 encoding AccountId32 to serialize them properly:
+1 -1
View File
@@ -50,7 +50,7 @@ impl<'info, KeyParts: IntoDecodableValues> StorageKey<'info, KeyParts> {
/// Iterate over the parts of this storage key. Each part of a storage key corresponds to a /// Iterate over the parts of this storage key. Each part of a storage key corresponds to a
/// single value that has been hashed. /// single value that has been hashed.
pub fn parts(&self) -> impl ExactSizeIterator<Item = StorageKeyPart<'info>> { pub fn parts(&self) -> impl ExactSizeIterator<Item = StorageKeyPart<'info>> + '_ {
let parts_len = self.info.parts().len(); let parts_len = self.info.parts().len();
(0..parts_len).map(move |index| StorageKeyPart { (0..parts_len).map(move |index| StorageKeyPart {
index, index,
+1 -1
View File
@@ -43,7 +43,7 @@ pezsp-crypto-hashing = { workspace = true }
scale-info = { workspace = true, default-features = false } scale-info = { workspace = true, default-features = false }
scale-info-legacy = { workspace = true, optional = true } scale-info-legacy = { workspace = true, optional = true }
scale-type-resolver = { workspace = true, optional = true } scale-type-resolver = { workspace = true, optional = true }
thiserror = { workspace = true, default-features = false } thiserror = { workspace = true }
[dev-dependencies] [dev-dependencies]
bitvec = { workspace = true, features = ["alloc"] } bitvec = { workspace = true, features = ["alloc"] }
+1 -1
View File
@@ -90,7 +90,7 @@ secp256k1 = { workspace = true, optional = true, features = [
] } ] }
secrecy = { workspace = true } secrecy = { workspace = true }
sha2 = { workspace = true } sha2 = { workspace = true }
thiserror = { workspace = true, default-features = false } thiserror = { workspace = true }
zeroize = { workspace = true } zeroize = { workspace = true }
# These are used if the pezkuwi-js-compat feature is enabled # These are used if the pezkuwi-js-compat feature is enabled
+2 -2
View File
@@ -68,7 +68,7 @@ impl Keypair {
Self::from_secret_key(seed)? Self::from_secret_key(seed)?
} else { } else {
let phrase = bip39::Mnemonic::from_str(phrase.expose_secret())?; let phrase = bip39::Mnemonic::from_str(phrase.expose_secret())?;
let pass_str = password.as_ref().map(|p| p.expose_secret()); let pass_str = password.as_ref().map(|p| p.expose_secret().as_str());
Self::from_phrase(&phrase, pass_str)? Self::from_phrase(&phrase, pass_str)?
}; };
@@ -197,7 +197,7 @@ pub(crate) mod internal {
let (recid, sig): (_, [u8; 64]) = recsig.serialize_compact(); let (recid, sig): (_, [u8; 64]) = recsig.serialize_compact();
let mut signature_bytes: [u8; 65] = [0; 65]; let mut signature_bytes: [u8; 65] = [0; 65];
signature_bytes[..64].copy_from_slice(&sig); signature_bytes[..64].copy_from_slice(&sig);
signature_bytes[64] = (i32::from(recid) & 0xFF) as u8; signature_bytes[64] = (recid.to_i32() & 0xFF) as u8;
signature_bytes signature_bytes
} }
+1 -1
View File
@@ -78,7 +78,7 @@ impl Keypair {
Self::from_secret_key(seed)? Self::from_secret_key(seed)?
} else { } else {
let phrase = bip39::Mnemonic::from_str(phrase.expose_secret())?; let phrase = bip39::Mnemonic::from_str(phrase.expose_secret())?;
let pass_str = password.as_ref().map(|p| p.expose_secret()); let pass_str = password.as_ref().map(|p| p.expose_secret().as_str());
Self::from_phrase(&phrase, pass_str)? Self::from_phrase(&phrase, pass_str)?
}; };
+5 -5
View File
@@ -74,9 +74,9 @@ where
/// Iterate through the extrinsics using metadata to dynamically decode and skip /// Iterate through the extrinsics using metadata to dynamically decode and skip
/// them, and return only those which should decode to the provided `E` type. /// them, and return only those which should decode to the provided `E` type.
/// If an error occurs, all subsequent iterations return `None`. /// If an error occurs, all subsequent iterations return `None`.
pub fn find<E: StaticExtrinsic>( pub fn find<'a, E: StaticExtrinsic + 'a>(
&self, &'a self,
) -> impl Iterator<Item = Result<FoundExtrinsic<T, C, E>, ExtrinsicError>> { ) -> impl Iterator<Item = Result<FoundExtrinsic<T, C, E>, ExtrinsicError>> + 'a {
self.inner.find::<E>().map(|res| { self.inner.find::<E>().map(|res| {
match res { match res {
Err(e) => Err(ExtrinsicError::from(e)), Err(e) => Err(ExtrinsicError::from(e)),
@@ -290,7 +290,7 @@ impl<T: Config> ExtrinsicEvents<T> {
/// ///
/// This works in the same way that [`events::Events::iter()`] does, with the /// This works in the same way that [`events::Events::iter()`] does, with the
/// exception that it filters out events not related to the submitted extrinsic. /// exception that it filters out events not related to the submitted extrinsic.
pub fn iter(&self) -> impl Iterator<Item = Result<events::EventDetails<T>, EventsError>> { pub fn iter(&self) -> impl Iterator<Item = Result<events::EventDetails<T>, EventsError>> + '_ {
self.events.iter().filter(|ev| { self.events.iter().filter(|ev| {
ev.as_ref() ev.as_ref()
.map(|ev| ev.phase() == events::Phase::ApplyExtrinsic(self.idx)) .map(|ev| ev.phase() == events::Phase::ApplyExtrinsic(self.idx))
@@ -302,7 +302,7 @@ impl<T: Config> ExtrinsicEvents<T> {
/// ///
/// This works in the same way that [`events::Events::find()`] does, with the /// This works in the same way that [`events::Events::find()`] does, with the
/// exception that it filters out events not related to the submitted extrinsic. /// exception that it filters out events not related to the submitted extrinsic.
pub fn find<Ev: events::StaticEvent>(&self) -> impl Iterator<Item = Result<Ev, EventsError>> { pub fn find<'a, Ev: events::StaticEvent + 'a>(&'a self) -> impl Iterator<Item = Result<Ev, EventsError>> + 'a {
self.iter().filter_map(|ev| ev.and_then(|ev| ev.as_event::<Ev>()).transpose()) self.iter().filter_map(|ev| ev.and_then(|ev| ev.as_event::<Ev>()).transpose())
} }
@@ -30,16 +30,13 @@ reqwest = { workspace = true }
serde = { workspace = true, features = ["derive"] } serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true, features = ["arbitrary_precision"] } serde_json = { workspace = true, features = ["arbitrary_precision"] }
sha2 = { workspace = true, default-features = false } sha2 = { workspace = true, default-features = false }
sp-core = { workspace = true } pezsp-core = { workspace = true }
thiserror = { workspace = true } thiserror = { workspace = true }
tokio = { workspace = true, features = ["time"] } tokio = { workspace = true, features = ["time"] }
tracing = { workspace = true } tracing = { workspace = true }
uuid = { workspace = true } uuid = { workspace = true }
# staging-chain-spec-builder = { workspace = true }
# parity-scale-codec = { version = "3.7.5", features = ["derive"] }
# sc-chain-spec = {workspace = true, default-features = false}
erased-serde = { workspace = true } erased-serde = { workspace = true }
sc-chain-spec = { workspace = true } pezsc-chain-spec = { workspace = true }
# Zombienet deps # Zombienet deps
configuration = { workspace = true } configuration = { workspace = true }
@@ -13,7 +13,7 @@ use provider::{
types::{GenerateFileCommand, GenerateFilesOptions, TransferedFile}, types::{GenerateFileCommand, GenerateFilesOptions, TransferedFile},
DynNamespace, ProviderError, DynNamespace, ProviderError,
}; };
use sc_chain_spec::{GenericChainSpec, GenesisConfigBuilderRuntimeCaller}; use pezsc_chain_spec::{GenericChainSpec, GenesisConfigBuilderRuntimeCaller};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::json; use serde_json::json;
use support::{constants::THIS_IS_A_BUG, fs::FileSystem, replacer::apply_replacements}; use support::{constants::THIS_IS_A_BUG, fs::FileSystem, replacer::apply_replacements};
@@ -1,4 +1,4 @@
use sp_core::{crypto::SecretStringError, ecdsa, ed25519, keccak_256, sr25519, Pair, H160, H256}; use pezsp_core::{crypto::SecretStringError, ecdsa, ed25519, keccak_256, sr25519, Pair, H160, H256};
use super::errors::GeneratorError; use super::errors::GeneratorError;
use crate::shared::types::{Accounts, NodeAccount}; use crate::shared::types::{Accounts, NodeAccount};
@@ -59,7 +59,7 @@ mod tests {
use super::*; use super::*;
#[test] #[test]
fn generate_for_alice() { fn generate_for_alice() {
use sp_core::crypto::Ss58Codec; use pezsp_core::crypto::Ss58Codec;
let s = "Alice"; let s = "Alice";
let seed = format!("//{s}"); let seed = format!("//{s}");
@@ -84,7 +84,7 @@ mod tests {
#[test] #[test]
fn generate_for_zombie() { fn generate_for_zombie() {
use sp_core::crypto::Ss58Codec; use pezsp_core::crypto::Ss58Codec;
let s = "Zombie"; let s = "Zombie";
let seed = format!("//{s}"); let seed = format!("//{s}");
@@ -1053,7 +1053,7 @@ pub enum ZombieRole {
// re-exports // re-exports
pub use network::{AddCollatorOptions, AddNodeOptions}; pub use network::{AddCollatorOptions, AddNodeOptions};
pub use network_helper::metrics; pub use network_helper::metrics;
pub use sc_chain_spec; pub use pezsc_chain_spec;
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
+1 -1
View File
@@ -19,7 +19,7 @@ erased-serde = { workspace = true }
flate2 = { workspace = true } flate2 = { workspace = true }
futures = { workspace = true } futures = { workspace = true }
hex = { workspace = true } hex = { workspace = true }
k8s-openapi = { workspace = true, features = ["v1_27"] } k8s-openapi = { workspace = true, features = ["v1_28"] }
kube = { workspace = true, features = ["runtime", "ws"] } kube = { workspace = true, features = ["runtime", "ws"] }
nix = { workspace = true, features = ["signal"] } nix = { workspace = true, features = ["signal"] }
regex = { workspace = true } regex = { workspace = true }
+1 -1
View File
@@ -27,7 +27,7 @@ provider = { workspace = true }
support = { workspace = true } support = { workspace = true }
[dev-dependencies] [dev-dependencies]
k8s-openapi = { workspace = true, features = ["v1_27"] } k8s-openapi = { workspace = true, features = ["v1_28"] }
kube = { workspace = true, features = ["runtime", "ws"] } kube = { workspace = true, features = ["runtime", "ws"] }
serde_json = { workspace = true } serde_json = { workspace = true }
tracing-subscriber = { workspace = true } tracing-subscriber = { workspace = true }