From 6f53c20e10893783d6b2f0ff7d5bdab8e05b2111 Mon Sep 17 00:00:00 2001 From: "emlautarom1-agent[bot]" <292495798+emlautarom1-agent[bot]@users.noreply.github.com> Date: Fri, 3 Jul 2026 14:07:16 -0300 Subject: [PATCH 1/4] feat(cluster): add load_cluster_lock (backport Charon #4130) Introduces cluster::load::load_cluster_lock, mirroring Charon's cluster.LoadClusterLock which replaced the manifest-DAG loading path when the manifest was removed (#4130). Reads and JSON-decodes the cluster lock file, then verifies hashes and signatures; with no_verify both checks still run but failures are downgraded to warnings. --- Cargo.lock | 1 + crates/cluster/Cargo.toml | 1 + crates/cluster/src/lib.rs | 2 + crates/cluster/src/load.rs | 215 +++++++++++++++++++++++++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 crates/cluster/src/load.rs diff --git a/Cargo.lock b/Cargo.lock index e5b23edc..b858d407 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5155,6 +5155,7 @@ dependencies = [ "test-case", "thiserror 2.0.18", "tokio", + "tracing", "uuid", "wiremock", ] diff --git a/crates/cluster/Cargo.toml b/crates/cluster/Cargo.toml index 32bdb442..494da81c 100644 --- a/crates/cluster/Cargo.toml +++ b/crates/cluster/Cargo.toml @@ -28,6 +28,7 @@ pluto-k1util.workspace = true pluto-ssz.workspace = true k256.workspace = true tokio.workspace = true +tracing.workspace = true reqwest = { workspace = true, features = ["json"] } # Workaround to use test code from different crate. # See: https://github.com/NethermindEth/pluto/pull/285 diff --git a/crates/cluster/src/lib.rs b/crates/cluster/src/lib.rs index b3b08b3c..9b50a68d 100644 --- a/crates/cluster/src/lib.rs +++ b/crates/cluster/src/lib.rs @@ -17,6 +17,8 @@ pub mod distvalidator; pub mod eip712sigs; /// General helper utilities. pub mod helpers; +/// Loading and verification of a cluster [`Lock`](lock::Lock) from disk. +pub mod load; /// `Lock` type representing the finalized cluster configuration, including /// distributed validators and node signatures. pub mod lock; diff --git a/crates/cluster/src/load.rs b/crates/cluster/src/load.rs new file mode 100644 index 00000000..f98fa402 --- /dev/null +++ b/crates/cluster/src/load.rs @@ -0,0 +1,215 @@ +//! Loading and verification of a cluster [`Lock`] from disk. +//! +//! Mirrors Charon's `cluster.LoadClusterLock` (`cluster/load.go`), which +//! replaced the manifest-DAG loading path when the cluster manifest was +//! removed (Charon #4130). Charon v1.7.1 obtained the cluster by materialising +//! a manifest DAG; this function reads and verifies the cluster lock file +//! directly. + +use std::path::Path; + +use pluto_eth1wrap::EthClient; +use tracing::warn; + +use crate::lock::{Lock, LockError}; + +/// Errors returned by [`load_cluster_lock`]. +#[derive(Debug, thiserror::Error)] +pub enum LoadError { + /// The cluster-lock file could not be read from disk. + #[error("read cluster-lock.json {path}: {source}")] + Read { + /// Path that failed to read. + path: String, + /// Underlying I/O error. + #[source] + source: std::io::Error, + }, + + /// The cluster-lock file could not be JSON-decoded. + #[error("unmarshal cluster-lock.json: {0}")] + Parse(#[source] serde_json::Error), + + /// Cluster-lock hash verification failed. Re-run with `no_verify` to bypass + /// this check at your own risk. + #[error( + "verify cluster lock hashes (run with no_verify to bypass verification at your own risk): {0}" + )] + VerifyHashes(#[source] LockError), + + /// Cluster-lock signature verification failed. Re-run with `no_verify` to + /// bypass this check at your own risk. + #[error( + "verify cluster lock signatures (run with no_verify to bypass verification at your own risk): {0}" + )] + VerifySignatures(#[source] LockError), +} + +/// Reads the cluster lock file at `lock_file_path`, JSON-decodes it into a +/// [`Lock`], and verifies its hashes and signatures. +/// +/// When `no_verify` is set, verification failures are logged as warnings +/// instead of being returned as errors (mirrors Charon's `--no-verify`): both +/// [`Lock::verify_hashes`] and [`Lock::verify_signatures`] still run. +/// +/// `eth1` backs EIP-1271 smart-contract operator-signature verification. Pass a +/// no-op client (from `EthClient::new("")`) to skip only the contract-based +/// checks; BLS-aggregate and node signatures are still verified. +/// +/// Mirrors Charon's `cluster.LoadClusterLock`. +pub async fn load_cluster_lock( + lock_file_path: impl AsRef, + no_verify: bool, + eth1: &EthClient, +) -> Result { + let path = lock_file_path.as_ref(); + + let contents = tokio::fs::read_to_string(path) + .await + .map_err(|source| LoadError::Read { + path: path.display().to_string(), + source, + })?; + + let lock: Lock = serde_json::from_str(&contents).map_err(LoadError::Parse)?; + + match lock.verify_hashes() { + Ok(()) => {} + Err(err) if no_verify => { + warn!(%err, "Ignoring failed cluster lock hashes verification due to no_verify flag"); + } + Err(err) => return Err(LoadError::VerifyHashes(err)), + } + + match lock.verify_signatures(eth1).await { + Ok(()) => {} + Err(err) if no_verify => { + warn!(%err, "Ignoring failed cluster lock signatures verification due to no_verify flag"); + } + Err(err) => return Err(LoadError::VerifySignatures(err)), + } + + Ok(lock) +} + +#[cfg(test)] +mod tests { + use std::io::Write; + + use tempfile::NamedTempFile; + + use super::*; + + const LOCK_V1_10_0: &str = include_str!("testdata/cluster_lock_v1_10_0.json"); + + /// A no-op execution-layer client: BLS-aggregate and node signatures are + /// still verified, only EIP-1271 contract-based operator signatures are + /// skipped. + async fn noop_eth1() -> EthClient { + EthClient::new("").await.expect("noop eth1 client") + } + + /// Writes `contents` to a temporary file that `load_cluster_lock` can read + /// by path. + fn write_lock(contents: &str) -> NamedTempFile { + let mut file = NamedTempFile::new().expect("create temp lock file"); + file.write_all(contents.as_bytes()) + .expect("write temp lock file"); + file.flush().expect("flush temp lock file"); + file + } + + /// Ports Charon's `TestLoadClusterLock`: the lock is read and parsed and + /// its fields are populated (verification skipped via `no_verify`). + #[tokio::test] + async fn load_cluster_lock_reads_and_parses() { + let file = write_lock(LOCK_V1_10_0); + let eth1 = noop_eth1().await; + + let lock = load_cluster_lock(file.path(), true, ð1) + .await + .expect("load lock"); + + assert_eq!(lock.definition.name, "test definition"); + assert_eq!(lock.definition.version, "v1.10.0"); + assert_eq!(lock.threshold, 3); + assert_eq!(lock.distributed_validators.len(), 2); + assert_eq!(lock.node_signatures.len(), 2); + assert_eq!( + lock.lock_hash, + hex::decode("015036f659bd05894dfb531bf0ab3fdb32a05584ec037fc8262843d14e1aae60") + .unwrap() + ); + } + + /// With verification enabled, a corrupted lock hash is rejected. + #[tokio::test] + async fn load_cluster_lock_rejects_tampered_hash() { + let mut lock: Lock = serde_json::from_str(LOCK_V1_10_0).unwrap(); + lock.lock_hash[0] ^= 0xff; + let file = write_lock(&serde_json::to_string(&lock).unwrap()); + let eth1 = noop_eth1().await; + + let err = load_cluster_lock(file.path(), false, ð1) + .await + .expect_err("tampered hash must fail verification"); + + assert!(matches!(err, LoadError::VerifyHashes(_)), "got {err:?}"); + } + + /// With `no_verify`, the same corrupted lock is loaded regardless (the + /// verification failure is downgraded to a warning). + #[tokio::test] + async fn load_cluster_lock_no_verify_ignores_tampered_hash() { + let mut lock: Lock = serde_json::from_str(LOCK_V1_10_0).unwrap(); + lock.lock_hash[0] ^= 0xff; + let file = write_lock(&serde_json::to_string(&lock).unwrap()); + let eth1 = noop_eth1().await; + + let loaded = load_cluster_lock(file.path(), true, ð1) + .await + .expect("no_verify should ignore verification failures"); + + assert_eq!(loaded.definition.version, "v1.10.0"); + } + + /// A missing file surfaces a read error rather than a parse/verify error. + #[tokio::test] + async fn load_cluster_lock_missing_file() { + let eth1 = noop_eth1().await; + + let err = load_cluster_lock("/nonexistent/cluster-lock.json", false, ð1) + .await + .expect_err("missing file must fail"); + + assert!(matches!(err, LoadError::Read { .. }), "got {err:?}"); + } + + /// Malformed JSON surfaces a parse error. + #[tokio::test] + async fn load_cluster_lock_malformed_json() { + let file = write_lock("{ not valid json"); + let eth1 = noop_eth1().await; + + let err = load_cluster_lock(file.path(), false, ð1) + .await + .expect_err("malformed json must fail"); + + assert!(matches!(err, LoadError::Parse(_)), "got {err:?}"); + } + + /// A freshly generated, self-consistent lock verifies end-to-end with + /// `no_verify=false` against a no-op execution-layer client. + #[tokio::test] + async fn load_cluster_lock_verifies_generated_lock() { + let (lock, ..) = crate::test_cluster::new_for_test(1, 2, 3, 1); + let file = write_lock(&serde_json::to_string(&lock).expect("serialize generated lock")); + let eth1 = noop_eth1().await; + + let loaded = load_cluster_lock(file.path(), false, ð1) + .await + .expect("generated lock should verify"); + + assert_eq!(loaded.lock_hash, lock.lock_hash); + } +} From 34952f85a1763f3cfc8511043526ec0daa7494e6 Mon Sep 17 00:00:00 2001 From: Lautaro Emanuel Date: Fri, 3 Jul 2026 22:03:40 -0300 Subject: [PATCH 2/4] Extend `load_cluster_lock_reads_and_parses` test --- crates/cluster/src/load.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/crates/cluster/src/load.rs b/crates/cluster/src/load.rs index f98fa402..791e0d55 100644 --- a/crates/cluster/src/load.rs +++ b/crates/cluster/src/load.rs @@ -140,6 +140,21 @@ mod tests { hex::decode("015036f659bd05894dfb531bf0ab3fdb32a05584ec037fc8262843d14e1aae60") .unwrap() ); + // Verify first operator + assert_eq!( + lock.operators[0].address.to_uppercase(), + "0x094279db1944ebd7a19d0f7bbacbe0255aa5b7d4".to_uppercase() + ); + assert_eq!( + lock.operators[0].enr.to_uppercase(), + "enr://b0223beea5f4f74391f445d15afd4294040374f6924b98cbf8713f8d962d7c8d".to_uppercase() + ); + // Verify first distributed validator + assert_eq!( + lock.distributed_validators[0].public_key_hex().unwrap().to_uppercase(), + "0x1814be823350eab13935f31d84484517e924aef78ae151c00755925836b7075885650c30ec29a3703934bf50a28da102".to_uppercase() + ); + assert_eq!(lock.distributed_validators[0].pub_shares.len(), 2); } /// With verification enabled, a corrupted lock hash is rejected. From fd5038e4569b62687292c289dbc91d86928b5604 Mon Sep 17 00:00:00 2001 From: "emlautarom1-agent[bot]" <292495798+emlautarom1-agent[bot]@users.noreply.github.com> Date: Fri, 3 Jul 2026 22:24:13 -0300 Subject: [PATCH 3/4] feat(cluster): add load_cluster_lock_and_verify wrapper Mirrors Charon's cluster.LoadClusterLockAndVerify: reads and verifies a lock with a default no-op execution-layer client, for standalone tools that have no execution-layer endpoint to inject. --- crates/cluster/src/load.rs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/crates/cluster/src/load.rs b/crates/cluster/src/load.rs index 791e0d55..1612cbf5 100644 --- a/crates/cluster/src/load.rs +++ b/crates/cluster/src/load.rs @@ -8,7 +8,7 @@ use std::path::Path; -use pluto_eth1wrap::EthClient; +use pluto_eth1wrap::{EthClient, EthClientError}; use tracing::warn; use crate::lock::{Lock, LockError}; @@ -43,6 +43,10 @@ pub enum LoadError { "verify cluster lock signatures (run with no_verify to bypass verification at your own risk): {0}" )] VerifySignatures(#[source] LockError), + + /// The execution-layer client could not be constructed. + #[error("build execution-layer client: {0}")] + Eth1(#[source] EthClientError), } /// Reads the cluster lock file at `lock_file_path`, JSON-decodes it into a @@ -92,6 +96,23 @@ pub async fn load_cluster_lock( Ok(lock) } +/// Reads and verifies the cluster lock at `lock_file_path` with a default no-op +/// execution-layer client (no configured endpoint) and verification enabled. +/// +/// Convenient for standalone tools that only need a verified lock and have no +/// execution-layer endpoint to inject. EIP-1271 smart-contract operator +/// signatures are skipped; BLS-aggregate and node signatures are still +/// verified. +/// +/// Mirrors Charon's `cluster.LoadClusterLockAndVerify`. +pub async fn load_cluster_lock_and_verify( + lock_file_path: impl AsRef, +) -> Result { + let eth1 = EthClient::new("").await.map_err(LoadError::Eth1)?; + + load_cluster_lock(lock_file_path, false, ð1).await +} + #[cfg(test)] mod tests { use std::io::Write; @@ -227,4 +248,18 @@ mod tests { assert_eq!(loaded.lock_hash, lock.lock_hash); } + + /// The convenience wrapper reads and verifies a self-consistent lock using + /// its built-in no-op execution-layer client. + #[tokio::test] + async fn load_cluster_lock_and_verify_generated_lock() { + let (lock, ..) = crate::test_cluster::new_for_test(1, 2, 3, 1); + let file = write_lock(&serde_json::to_string(&lock).expect("serialize generated lock")); + + let loaded = load_cluster_lock_and_verify(file.path()) + .await + .expect("generated lock should verify"); + + assert_eq!(loaded.lock_hash, lock.lock_hash); + } } From 35fa1da9a822cd004763b00f6731ce09c9f891e9 Mon Sep 17 00:00:00 2001 From: Lautaro Emanuel Date: Tue, 7 Jul 2026 08:14:37 -0300 Subject: [PATCH 4/4] Update lockfile --- Cargo.lock | 342 +++++++++++++++++++++++++++-------------------------- 1 file changed, 175 insertions(+), 167 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e5a0adf..a69d5dd2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,13 +92,13 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.2.34" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84e0378e959aa6a885897522080a990e80eb317f1e9a222a604492ea50e13096" +checksum = "3b5cc30538e90795a57647bef8d8864aad6e8d86190617009b4ef8d8b647b49a" dependencies = [ "alloy-primitives", "num_enum", - "strum", + "phf", ] [[package]] @@ -419,9 +419,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc90b1e703d3c03f4ff7f48e82dd0bc1c8211ab7d079cd836a06fcfeb06651cb" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -430,9 +430,9 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36834a5c0a2fa56e171bf256c34d70fca07d0c0031583edea1c4946b7889c9e" +checksum = "9d4311c03125e8a18296504560b9de3d75ecbd0dcda7f71e6cf2a196d57e6fba" dependencies = [ "proc-macro2", "quote", @@ -817,6 +817,23 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -847,6 +864,16 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.118", +] + [[package]] name = "ark-ff-macros" version = "0.3.0" @@ -885,6 +912,19 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "ark-serialize" version = "0.3.0" @@ -918,6 +958,30 @@ dependencies = [ "num-bigint", ] +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint", + "serde_with", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "ark-std" version = "0.3.0" @@ -948,6 +1012,16 @@ dependencies = [ "rand 0.8.6", ] +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.6", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -956,9 +1030,9 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "asn1-rs" @@ -1587,9 +1661,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.65" +version = "1.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" dependencies = [ "find-msvc-tools", "jobserver", @@ -1954,18 +2028,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1973,27 +2047,27 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -2186,7 +2260,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.118", ] [[package]] @@ -2520,9 +2594,9 @@ dependencies = [ [[package]] name = "ethereum_serde_utils" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc1355dbb41fbbd34ec28d4fb2a57d9a70c67ac3c19f6a5ca4d4a176b9e997a" +checksum = "38df44a7a271ab43835678f9215b53cc2523e4714a215da6643d83dc110245da" dependencies = [ "alloy-primitives", "hex", @@ -2571,13 +2645,13 @@ dependencies = [ [[package]] name = "fastbloom" -version = "0.14.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" +checksum = "ef975e30683b2d965054bb0a836f8973857c4ebf6acf274fe46617cd285060d8" dependencies = [ - "getrandom 0.3.4", + "foldhash 0.2.0", "libm", - "rand 0.9.4", + "portable-atomic", "siphasher", ] @@ -2616,7 +2690,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee93edf3c501f0035bbeffeccfed0b79e14c311f12195ec0e661e114a0f60da4" dependencies = [ "portable-atomic", - "rand 0.10.1", + "rand 0.10.2", "web-time", ] @@ -2896,11 +2970,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi 5.3.0", "wasip2", - "wasm-bindgen", ] [[package]] @@ -2910,9 +2982,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", "rand_core 0.10.1", + "wasm-bindgen", ] [[package]] @@ -3687,11 +3761,11 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] @@ -4555,9 +4629,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", @@ -4930,9 +5004,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.6" +version = "2.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +checksum = "47627dd7305c6a2d6c8c6bcd24c5a4c17dbbf425f4f9c5313e724b38fc9782e9" dependencies = [ "memchr", "ucd-trie", @@ -4949,6 +5023,24 @@ dependencies = [ "indexmap 2.14.0", ] +[[package]] +name = "phf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "010378780309880b08997fae13be7834dba947d36393bd372f2b1556deb2a2f6" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.13" @@ -5964,16 +6056,17 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.15" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "aws-lc-rs", "bytes", "fastbloom", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.4", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", @@ -5987,16 +6080,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2 0.6.4", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6051,9 +6144,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20 0.10.1", "getrandom 0.4.3", @@ -6105,6 +6198,15 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rand_xorshift" version = "0.4.0" @@ -6116,9 +6218,9 @@ dependencies = [ [[package]] name = "rapidhash" -version = "4.4.2" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b266a82f4aa99bb5c25e28d11cc44ace63d91adbcbcee4d323e2ae3d49ef37" +checksum = "5da7e78a036ce858e8d55b7e7dc8ba3a88b78350fd2155d3591bbd966b58589e" dependencies = [ "rustversion", ] @@ -6355,14 +6457,15 @@ dependencies = [ [[package]] name = "ruint" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0298da754d1395046b0afdc2f20ee76d29a8ae310cd30ffa84ed42acba9cb12a" +checksum = "45caf26f647c19115bf9c453c70ffe4a4a3a6390dceebd942610584f99b8ddce" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "ark-ff 0.5.0", + "ark-ff 0.6.0", "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", @@ -6389,9 +6492,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc-hex" @@ -6531,9 +6634,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rusty-fork" @@ -7104,27 +7207,6 @@ dependencies = [ "syn 2.0.118", ] -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.118", -] - [[package]] name = "subtle" version = "2.6.1" @@ -8243,7 +8325,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" dependencies = [ "windows-core 0.57.0", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -8276,7 +8358,7 @@ dependencies = [ "windows-implement 0.57.0", "windows-interface 0.57.0", "windows-result 0.1.2", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -8380,7 +8462,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -8407,7 +8489,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -8416,16 +8498,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -8443,31 +8516,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -8485,96 +8541,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" version = "0.7.15" @@ -8753,18 +8761,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +checksum = "75726053136156d419e285b9b7eddaaea9e3fea6ce32eed44a89901f0bd98de1" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +checksum = "4714fd92cf900833d49538023a9b3915155210801d1c1169eba513b2addefd71" dependencies = [ "proc-macro2", "quote",