From f5ce512f52542428b479ffe1a4f6f7efe271798e Mon Sep 17 00:00:00 2001 From: Ian Clarke Date: Thu, 4 Sep 2025 19:11:59 +0200 Subject: [PATCH 1/2] Update dependencies: freenet-stdlib 0.1.14, rand 0.9, tokio-tungstenite 0.27 - Update freenet-stdlib from 0.1.13 to 0.1.14 - Update rand from 0.8 to 0.9 - Update tokio-tungstenite from 0.26.1 to 0.27.0 - Update all standalone workspaces to use freenet-stdlib 0.1.14 - Fix all rand 0.9 API migrations: - Replace from_entropy() with from_rng(OsRng) or seed_from_u64() - Replace gen() with random() - Replace gen_range() with random_range() - Replace thread_rng() with rng() - Use TransportKeypair::new() instead of new_with_rng() - Use rsa::rand_core::OsRng for RSA operations These three dependencies need to be updated together as freenet-stdlib 0.1.14 was specifically released to support rand 0.9 and tokio-tungstenite 0.27. This supersedes the individual dependabot PRs #1717, #1673, and #1778. --- Cargo.lock | 28 +++++++++---------- Cargo.toml | 4 +-- apps/freenet-email-app/Cargo.toml | 4 +-- apps/freenet-microblogging/Cargo.toml | 2 +- apps/freenet-ping/Cargo.toml | 2 +- apps/freenet-ping/app/Cargo.toml | 6 ++-- apps/freenet-ping/app/tests/common/mod.rs | 6 ++-- crates/core/Cargo.toml | 2 +- crates/core/src/client_events/mod.rs | 10 ++++--- crates/core/src/config/mod.rs | 2 +- crates/core/src/node/mod.rs | 2 +- .../core/src/node/network_bridge/in_memory.rs | 8 +++--- crates/core/src/node/testing_impl.rs | 2 +- crates/core/src/ring/connection_manager.rs | 8 +++--- crates/core/src/ring/location.rs | 6 ++-- crates/core/src/ring/mod.rs | 8 ++---- crates/core/src/router/mod.rs | 8 +++--- crates/core/src/topology/small_world_rand.rs | 4 +-- .../core/src/transport/connection_handler.rs | 9 ++++-- crates/core/src/transport/crypto.rs | 7 +++-- crates/core/src/transport/packet_data.rs | 15 +++++----- crates/core/src/util/mod.rs | 10 +++---- crates/core/src/wasm_runtime/native_api.rs | 4 +-- crates/core/tests/connectivity.rs | 14 +++++----- crates/core/tests/operations.rs | 4 +-- crates/fdev/Cargo.toml | 2 +- crates/fdev/src/testing.rs | 4 +-- modules/antiflood-tokens/Cargo.toml | 2 +- modules/identity-management/Cargo.toml | 4 +-- tests/test-app-1/Cargo.toml | 2 +- tests/test-contract-1/Cargo.toml | 2 +- tests/test-contract-2/Cargo.toml | 2 +- tests/test-contract-metering/Cargo.toml | 2 +- tests/test-delegate-1/Cargo.toml | 2 +- tests/test-delegate-integration/Cargo.toml | 2 +- 35 files changed, 102 insertions(+), 97 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6630a36d..68e556e12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1437,7 +1437,7 @@ dependencies = [ "glob", "http 1.3.1", "prettytable-rs", - "rand 0.8.5", + "rand 0.9.1", "reqwest", "semver", "serde", @@ -1446,7 +1446,7 @@ dependencies = [ "tar", "thiserror 2.0.16", "tokio", - "tokio-tungstenite 0.26.2", + "tokio-tungstenite 0.27.0", "toml", "tracing", "tracing-subscriber", @@ -1571,7 +1571,7 @@ dependencies = [ "parking_lot", "pav_regression", "pkcs8", - "rand 0.8.5", + "rand 0.9.1", "redb", "reqwest", "rsa", @@ -1588,7 +1588,7 @@ dependencies = [ "testresult", "thiserror 2.0.16", "tokio", - "tokio-tungstenite 0.26.2", + "tokio-tungstenite 0.27.0", "toml", "tower-http", "tracing", @@ -1626,13 +1626,13 @@ dependencies = [ "freenet-stdlib", "futures 0.3.31", "humantime", - "rand 0.8.5", + "rand 0.9.1", "serde", "serde_json", "tempfile", "testresult", "tokio", - "tokio-tungstenite 0.26.2", + "tokio-tungstenite 0.27.0", "tracing", "tracing-subscriber", ] @@ -1660,9 +1660,9 @@ dependencies = [ [[package]] name = "freenet-stdlib" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef791f340c26ee1dc720e8b68960fc405dfc3cd52fd2e9868da8f5d87233fb4f" +checksum = "087695bd49a28e00d95260dec3ce66eec0955efd258b494d353f9d4e2ce93a22" dependencies = [ "arbitrary", "bincode", @@ -1683,7 +1683,7 @@ dependencies = [ "serde_with", "thiserror 1.0.69", "tokio", - "tokio-tungstenite 0.26.2", + "tokio-tungstenite 0.27.0", "tracing", "tracing-subscriber", "wasm-bindgen", @@ -5220,14 +5220,14 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.26.2" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" dependencies = [ "futures-util", "log", "tokio", - "tungstenite 0.26.2", + "tungstenite 0.27.0", ] [[package]] @@ -5514,9 +5514,9 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.26.2" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" dependencies = [ "bytes 1.10.1", "data-encoding", diff --git a/Cargo.toml b/Cargo.toml index b105d84fb..8c8fbd939 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ ctrlc = { version = "3" } dashmap = "^6.1" either = "1" futures = "0.3" -rand = { version = "0.8" } +rand = { version = "0.9" } semver = { version = "1", features = ["serde"] } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -33,7 +33,7 @@ tracing-subscriber = "0.3" wasmer = "5.0.4" wasmer-compiler-singlepass = "5.0.4" -freenet-stdlib = { version = "0.1.13" } +freenet-stdlib = { version = "0.1.14" } [profile.dev.package."*"] opt-level = 3 diff --git a/apps/freenet-email-app/Cargo.toml b/apps/freenet-email-app/Cargo.toml index 2947aa428..a030aa459 100644 --- a/apps/freenet-email-app/Cargo.toml +++ b/apps/freenet-email-app/Cargo.toml @@ -19,6 +19,6 @@ rsa = { version = "0.9.2", default-features = false, features = ["serde", "pem", serde = "1" serde_json = "1" -# freenet-stdlib = { version = "0.0.7" } -freenet-stdlib = { version = "0.1.6" } +# freenet-stdlib = { version = "0.1.14" } +freenet-stdlib = { version = "0.1.14" } freenet-aft-interface = { path = "../../modules/antiflood-tokens/interfaces" } diff --git a/apps/freenet-microblogging/Cargo.toml b/apps/freenet-microblogging/Cargo.toml index b06994ef7..091a7a46b 100644 --- a/apps/freenet-microblogging/Cargo.toml +++ b/apps/freenet-microblogging/Cargo.toml @@ -14,7 +14,7 @@ panic = 'abort' strip = true [workspace.dependencies] -freenet-stdlib = { version = "0.1.6", default-features = false, features = ["contract"] } +freenet-stdlib = { version = "0.1.14", default-features = false, features = ["contract"] } #[target.wasm32-unknown-unknown] #rustflags = ["-C", "link-arg=--import-memory"] diff --git a/apps/freenet-ping/Cargo.toml b/apps/freenet-ping/Cargo.toml index 1541a63f5..2c0d2e32f 100644 --- a/apps/freenet-ping/Cargo.toml +++ b/apps/freenet-ping/Cargo.toml @@ -4,7 +4,7 @@ members = ["contracts/ping", "app", "types"] [workspace.dependencies] # freenet-stdlib = { path = "./../../stdlib/rust", features = ["contract"] } -freenet-stdlib = { version = "0.1.11" } +freenet-stdlib = { version = "0.1.14" } freenet-ping-types = { path = "types", default-features = false } chrono = { version = "0.4", default-features = false } testresult = "0.4" diff --git a/apps/freenet-ping/app/Cargo.toml b/apps/freenet-ping/app/Cargo.toml index ce66e0594..791c8630c 100644 --- a/apps/freenet-ping/app/Cargo.toml +++ b/apps/freenet-ping/app/Cargo.toml @@ -10,15 +10,15 @@ testing = ["freenet-stdlib/testing", "freenet/testing"] anyhow = "1.0" chrono = { workspace = true, features = ["default"] } clap = { version = "4.5", features = ["derive"] } -freenet-stdlib = { version = "0.1.13", features = ["net"] } +freenet-stdlib = { version = "0.1.14", features = ["net"] } freenet-ping-types = { path = "../types", features = ["std", "clap"] } futures = "0.3.31" -rand = "0.8.5" +rand = "0.9.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" tempfile = "3.21.0" tokio = { version = "1.47", features = ["full"] } -tokio-tungstenite = "0.26.1" +tokio-tungstenite = "0.27.0" tracing = { version = "0.1", features = ["log"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] } humantime = "2.2.0" diff --git a/apps/freenet-ping/app/tests/common/mod.rs b/apps/freenet-ping/app/tests/common/mod.rs index 5ace4b10d..a8cfbeeb6 100644 --- a/apps/freenet-ping/app/tests/common/mod.rs +++ b/apps/freenet-ping/app/tests/common/mod.rs @@ -103,7 +103,7 @@ pub async fn base_node_test_config_with_rng( tempfile::Builder::new().prefix(data_dir_suffix).tempdir()? }; - let key = TransportKeypair::new_with_rng(rng); + let key = TransportKeypair::new(); let transport_keypair = temp_dir.path().join("private.pem"); key.save(&transport_keypair)?; key.public().save(temp_dir.path().join("public.pem"))?; @@ -119,7 +119,7 @@ pub async fn base_node_test_config_with_rng( is_gateway, skip_load_from_network: true, gateways: Some(gateways), - location: Some(rng.gen()), + location: Some(rng.random()), ignore_protocol_checking: true, address: Some(Ipv4Addr::LOCALHOST.into()), network_port: public_port, // if None, node will pick a free one or use default @@ -150,7 +150,7 @@ pub fn gw_config_from_path_with_rng( ) -> Result { Ok(InlineGwConfig { address: (Ipv4Addr::LOCALHOST, port).into(), - location: Some(rng.gen()), + location: Some(rng.random()), public_key_path: path.join("public.pem"), }) } diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 8f3cc2366..0b146134a 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -52,7 +52,7 @@ stretto = { features = ["async", "sync"], version = "0.8" } tar = { version = "0.4" } thiserror = "2" tokio = { features = ["fs", "macros", "rt-multi-thread", "sync", "process"], version = "1" } -tokio-tungstenite = "0.26.1" +tokio-tungstenite = "0.27.0" tower-http = { features = ["fs", "trace"], version = "0.6" } ulid = { features = ["serde"], version = "1.1" } wasmer = { features = ["sys"], workspace = true } diff --git a/crates/core/src/client_events/mod.rs b/crates/core/src/client_events/mod.rs index bb6e8aebd..28f976c0b 100644 --- a/crates/core/src/client_events/mod.rs +++ b/crates/core/src/client_events/mod.rs @@ -71,7 +71,7 @@ impl AuthToken { pub fn generate() -> AuthToken { use rand::Rng; - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut token = [0u8; 32]; rng.fill(&mut token); let token_str = bs58::encode(token).into_string(); @@ -767,7 +767,7 @@ pub(crate) mod test { prelude::*, }; use futures::{FutureExt, StreamExt}; - use rand::{seq::SliceRandom, SeedableRng}; + use rand::SeedableRng; use tokio::net::TcpStream; use tokio::sync::watch::Receiver; use tokio::sync::Mutex; @@ -1181,13 +1181,15 @@ pub(crate) mod test { } } + use rand::prelude::IndexedRandom; + impl RandomEventGenerator for rand::rngs::SmallRng { fn gen_u8(&mut self) -> u8 { - ::gen(self) + ::random(self) } fn gen_range(&mut self, range: std::ops::Range) -> usize { - ::gen_range(self, range) + ::random_range(self, range) } fn choose<'a, T>(&mut self, vec: &'a [T]) -> Option<&'a T> { diff --git a/crates/core/src/config/mod.rs b/crates/core/src/config/mod.rs index a91658d08..bca39b504 100644 --- a/crates/core/src/config/mod.rs +++ b/crates/core/src/config/mod.rs @@ -1080,7 +1080,7 @@ mod tests { let url = server.url_str("/gateways"); - let key = rsa::RsaPrivateKey::new(&mut rand::thread_rng(), 256).unwrap(); + let key = rsa::RsaPrivateKey::new(&mut rsa::rand_core::OsRng, 256).unwrap(); let key = key .to_public_key() .to_public_key_pem(pkcs8::LineEnding::default()) diff --git a/crates/core/src/node/mod.rs b/crates/core/src/node/mod.rs index 88c7b8e6f..d4b16a9e6 100644 --- a/crates/core/src/node/mod.rs +++ b/crates/core/src/node/mod.rs @@ -913,7 +913,7 @@ impl PeerId { pub fn random() -> Self { use rand::Rng; let mut addr = [0; 4]; - rand::thread_rng().fill(&mut addr[..]); + rand::rng().fill(&mut addr[..]); let port = crate::util::get_free_port().unwrap(); let pub_key = PEER_ID.with(|peer_id| { diff --git a/crates/core/src/node/network_bridge/in_memory.rs b/crates/core/src/node/network_bridge/in_memory.rs index cf9cea777..9ecd5e84c 100644 --- a/crates/core/src/node/network_bridge/in_memory.rs +++ b/crates/core/src/node/network_bridge/in_memory.rs @@ -119,7 +119,7 @@ impl InMemoryTransport { let ip = interface_peer.clone(); GlobalExecutor::spawn(async move { const MAX_DELAYED_MSG: usize = 10; - let mut rng = StdRng::from_entropy(); + let mut rng = StdRng::seed_from_u64(rand::random()); // delayed messages per target let mut delayed: HashMap<_, Vec<_>> = HashMap::with_capacity(MAX_DELAYED_MSG); let last_drain = Instant::now(); @@ -131,7 +131,7 @@ impl InMemoryTransport { ip, msg.origin ); - if rng.gen_bool(0.5) && delayed.len() < MAX_DELAYED_MSG && add_noise { + if rng.random_bool(0.5) && delayed.len() < MAX_DELAYED_MSG && add_noise { delayed .entry(msg.target.clone()) .or_default() @@ -140,7 +140,7 @@ impl InMemoryTransport { } else { let mut queue = msg_stack_queue_cp.lock().await; queue.push(msg); - if add_noise && rng.gen_bool(0.2) { + if add_noise && rng.random_bool(0.2) { queue.shuffle(&mut rng); } } @@ -157,7 +157,7 @@ impl InMemoryTransport { tokio::time::sleep(Duration::from_millis(10)).await } } - if (last_drain.elapsed() > Duration::from_millis(rng.gen_range(1_000..5_000)) + if (last_drain.elapsed() > Duration::from_millis(rng.random_range(1_000..5_000)) && !delayed.is_empty()) || delayed.len() == MAX_DELAYED_MSG { diff --git a/crates/core/src/node/testing_impl.rs b/crates/core/src/node/testing_impl.rs index 96bcb32e2..5998fe443 100644 --- a/crates/core/src/node/testing_impl.rs +++ b/crates/core/src/node/testing_impl.rs @@ -1,7 +1,7 @@ use either::Either; use freenet_stdlib::prelude::*; use futures::Future; -use rand::seq::SliceRandom; +use rand::prelude::IndexedRandom; use std::{ collections::{HashMap, HashSet}, net::Ipv6Addr, diff --git a/crates/core/src/ring/connection_manager.rs b/crates/core/src/ring/connection_manager.rs index 7d536429e..fc0a9b475 100644 --- a/crates/core/src/ring/connection_manager.rs +++ b/crates/core/src/ring/connection_manager.rs @@ -1,4 +1,5 @@ use parking_lot::Mutex; +use rand::prelude::IndexedRandom; use crate::topology::{Limits, TopologyManager}; @@ -336,13 +337,13 @@ impl ConnectionManager { if amount == 0 { return None; } - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut attempts = 0; loop { if attempts >= amount * 2 { return None; } - let selected = rng.gen_range(0..amount); + let selected = rng.random_range(0..amount); let (peer, loc) = peers.iter().nth(selected).expect("infallible"); if !filter_fn(peer) { attempts += 1; @@ -364,10 +365,9 @@ impl ConnectionManager { skip_list: impl Contains, router: &Router, ) -> Option { - use rand::seq::SliceRandom; let connections = self.connections_by_location.read(); let peers = connections.values().filter_map(|conns| { - let conn = conns.choose(&mut rand::thread_rng())?; + let conn = conns.choose(&mut rand::rng())?; if let Some(requester) = requesting { if requester == &conn.location.peer { return None; diff --git a/crates/core/src/ring/location.rs b/crates/core/src/ring/location.rs index 6f8807628..f6ceb6edd 100644 --- a/crates/core/src/ring/location.rs +++ b/crates/core/src/ring/location.rs @@ -51,8 +51,8 @@ impl Location { /// Returns a new random location. pub fn random() -> Self { use rand::prelude::*; - let mut rng = rand::thread_rng(); - Location(rng.gen_range(0.0..=1.0)) + let mut rng = rand::rng(); + Location(rng.random_range(0.0..=1.0)) } /// Compute the distance between two locations. @@ -259,7 +259,7 @@ mod test { // Generate 100 random IP addresses wih seeded RNG let ips = (0..100) .map(|_| { - let ip = Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen()); + let ip = Ipv4Addr::new(rng.random(), rng.random(), rng.random(), rng.random()); SocketAddr::new(IpAddr::V4(ip), 12345) }) .collect::>(); diff --git a/crates/core/src/ring/mod.rs b/crates/core/src/ring/mod.rs index 093ea08a5..e959f614f 100644 --- a/crates/core/src/ring/mod.rs +++ b/crates/core/src/ring/mod.rs @@ -22,7 +22,7 @@ use either::Either; use freenet_stdlib::prelude::ContractKey; use itertools::Itertools; use parking_lot::RwLock; -use rand::Rng; +use rand::{prelude::IndexedRandom, Rng}; use crate::message::TransactionType; use crate::topology::rate::Rate; @@ -287,8 +287,7 @@ impl Ring { // Get all connected peers through the connection manager let connections = self.connection_manager.get_connections_by_location(); let peers = connections.values().filter_map(|conns| { - use rand::seq::SliceRandom; - let conn = conns.choose(&mut rand::thread_rng())?; + let conn = conns.choose(&mut rand::rng())?; (!skip_list.has_element(conn.location.peer.clone())).then_some(&conn.location) }); @@ -355,7 +354,6 @@ impl Ring { location: Location, skip_list: HashSet, ) -> Option { - use rand::seq::SliceRandom; self.connection_manager .get_connections_by_location() .iter() @@ -364,7 +362,7 @@ impl Ring { }) .find_map(|(_, conns)| { for _ in 0..conns.len() { - let conn = conns.choose(&mut rand::thread_rng()).unwrap(); + let conn = conns.choose(&mut rand::rng()).unwrap(); let selected = (!skip_list.contains(&conn.location.peer)).then_some(conn.location.clone()); if selected.is_some() { diff --git a/crates/core/src/router/mod.rs b/crates/core/src/router/mod.rs index ddf25d3f7..191963dd3 100644 --- a/crates/core/src/router/mod.rs +++ b/crates/core/src/router/mod.rs @@ -380,16 +380,16 @@ mod tests { // Create NUM_EVENTS random events let mut events = vec![]; - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); for _ in 0..NUM_EVENTS { - let peer = peers[rng.gen_range(0..NUM_PEERS)].clone(); + let peer = peers[rng.random_range(0..NUM_PEERS)].clone(); let contract_location = Location::random(); let simulated_prediction = simulate_prediction(&mut rng, peer.clone(), contract_location); let event = RouteEvent { peer, contract_location, - outcome: if rng.gen_range(0.0..1.0) > simulated_prediction.failure_probability { + outcome: if rng.random_range(0.0..1.0) > simulated_prediction.failure_probability { RouteOutcome::Success { time_to_response_start: Duration::from_secs_f64( simulated_prediction.time_to_response_start, @@ -523,7 +523,7 @@ mod tests { let time_to_response_start = 2.0 * distance.as_f64(); let failure_prob = distance.as_f64(); let transfer_speed = 100.0 - (100.0 * distance.as_f64()); - let payload_size = random.gen_range(100..1000); + let payload_size = random.random_range(100..1000); let transfer_time = transfer_speed * (payload_size as f64); RoutingPrediction { failure_probability: failure_prob, diff --git a/crates/core/src/topology/small_world_rand.rs b/crates/core/src/topology/small_world_rand.rs index 81d7a5d2c..90d065aac 100644 --- a/crates/core/src/topology/small_world_rand.rs +++ b/crates/core/src/topology/small_world_rand.rs @@ -1,6 +1,6 @@ #[cfg(test)] pub(super) mod test_utils { - use rand::Rng; + use rand::random; use crate::ring::Distance; @@ -9,7 +9,7 @@ pub(super) mod test_utils { let d_max = 0.5; // Generate a uniform random number between 0 and 1 - let u: f64 = rand::thread_rng().gen_range(0.0..1.0); + let u: f64 = random(); // Correct Inverse CDF: F^{-1}(u) = d_min * (d_max / d_min).powf(u) let d = d_min.as_f64() * (d_max / d_min.as_f64()).powf(u); diff --git a/crates/core/src/transport/connection_handler.rs b/crates/core/src/transport/connection_handler.rs index f38a68024..1d7b519b8 100644 --- a/crates/core/src/transport/connection_handler.rs +++ b/crates/core/src/transport/connection_handler.rs @@ -171,7 +171,10 @@ impl OutboundConnectionHandler { // in RemoteConnection. The bandwidth_limit parameter is still passed to RemoteConnection // for this purpose (default: 3 MB/s). task::spawn(bw_tracker.rate_limiter(None, socket)); - task::spawn(RANDOM_U64.scope(StdRng::from_entropy().gen(), transport.listen())); + task::spawn(RANDOM_U64.scope( + StdRng::seed_from_u64(rand::random()).random(), + transport.listen(), + )); Ok((connection_handler, new_connection_notifier)) } @@ -1239,7 +1242,7 @@ mod test { match &self.packet_drop_policy { PacketDropPolicy::ReceiveAll => {} PacketDropPolicy::Factor(factor) => { - if *factor > self.rng.try_lock().unwrap().gen::() { + if *factor > self.rng.try_lock().unwrap().random::() { tracing::trace!(id=%packet_idx, %self.this, "drop packet"); return Ok(buf.len()); } @@ -1918,7 +1921,7 @@ mod test { let mut test_no = 0; for _ in 0..2 { for factor in std::iter::repeat(()) - .map(|_| rng.gen::()) + .map(|_| rng.random::()) .filter(|x| *x > 0.05 && *x < 0.25) .take(3) { diff --git a/crates/core/src/transport/crypto.rs b/crates/core/src/transport/crypto.rs index 1442a1474..79cb3673b 100644 --- a/crates/core/src/transport/crypto.rs +++ b/crates/core/src/transport/crypto.rs @@ -1,7 +1,10 @@ use std::path::Path; -use rand::rngs::OsRng; -use rsa::{pkcs8, rand_core::CryptoRngCore, Pkcs1v15Encrypt, RsaPrivateKey, RsaPublicKey}; +use rsa::{ + pkcs8, + rand_core::{CryptoRngCore, OsRng}, + Pkcs1v15Encrypt, RsaPrivateKey, RsaPublicKey, +}; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] diff --git a/crates/core/src/transport/packet_data.rs b/crates/core/src/transport/packet_data.rs index 218f12c00..981c51a6f 100644 --- a/crates/core/src/transport/packet_data.rs +++ b/crates/core/src/transport/packet_data.rs @@ -2,10 +2,10 @@ use std::marker::PhantomData; use std::{cell::RefCell, sync::Arc}; use aes_gcm::{ - aead::{generic_array::GenericArray, rand_core::SeedableRng, AeadInPlace}, + aead::{generic_array::GenericArray, AeadInPlace}, Aes128Gcm, }; -use rand::{prelude::SmallRng, thread_rng, Rng}; +use rand::{prelude::SmallRng, rng, Rng, SeedableRng}; use crate::transport::crypto::TransportPublicKey; @@ -26,7 +26,7 @@ const UDP_HEADER_SIZE: usize = 8; thread_local! { // This must be very fast, but doesn't need to be cryptographically secure. static RNG: RefCell = RefCell::new( - SmallRng::from_rng(thread_rng()).expect("failed to create RNG") + SmallRng::from_rng(&mut rng()) ); } @@ -151,7 +151,7 @@ impl PacketData { _check_valid_size::(); debug_assert!(self.size <= MAX_DATA_SIZE); - let nonce: [u8; NONCE_SIZE] = RNG.with(|rng| rng.borrow_mut().gen()); + let nonce: [u8; NONCE_SIZE] = RNG.with(|rng| rng.borrow_mut().random()); let mut buffer = [0u8; N]; buffer[..NONCE_SIZE].copy_from_slice(&nonce); @@ -261,15 +261,14 @@ impl PartialEq for PacketData { #[cfg(test)] mod tests { use super::*; - use aes_gcm::aead::rand_core::RngCore; + use aes_gcm::KeyInit; - use rand::rngs::OsRng; #[test] fn test_encryption_decryption() { // Generate a random 128-bit (16 bytes) key let mut key = [0u8; 16]; - OsRng.fill_bytes(&mut key); + rand::rng().fill(&mut key); // Create a key object for AES-GCM let key = GenericArray::from_slice(&key); @@ -290,7 +289,7 @@ mod tests { fn test_encryption_decryption_corrupted() { // Generate a random 128-bit (16 bytes) key let mut key = [0u8; 16]; - OsRng.fill_bytes(&mut key); + rand::rng().fill(&mut key); // Create a key object for AES-GCM let key = GenericArray::from_slice(&key); diff --git a/crates/core/src/util/mod.rs b/crates/core/src/util/mod.rs index c3f95a1fb..68ce10da6 100644 --- a/crates/core/src/util/mod.rs +++ b/crates/core/src/util/mod.rs @@ -177,7 +177,7 @@ pub fn get_free_port() -> Result { fn get_dynamic_port() -> u16 { const FIRST_DYNAMIC_PORT: u16 = 49152; const LAST_DYNAMIC_PORT: u16 = 65535; - rand::thread_rng().gen_range(FIRST_DYNAMIC_PORT..LAST_DYNAMIC_PORT) + rand::rng().random_range(FIRST_DYNAMIC_PORT..LAST_DYNAMIC_PORT) } // This is extremely inefficient for large sizes but is not what @@ -207,7 +207,7 @@ where return None; } let pick = loop { - let pick = self.rng.gen_range(0..self.size); + let pick = self.rng.random_range(0..self.size); if !self.done.contains(&pick) { self.done.insert(pick); break pick; @@ -240,7 +240,7 @@ where assert!(matches!(upper, Some(s) if s == size)); Shuffle { inner: self, - rng: StdRng::from_entropy(), + rng: StdRng::seed_from_u64(rand::random()), memorized: BTreeMap::new(), done: HashSet::with_capacity(size), done_counter: 0, @@ -312,7 +312,7 @@ pub(crate) mod test { #[inline] #[allow(unused_braces)] pub(crate) fn $name() -> [u8; $size] { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut rnd_bytes = [0u8; $size]; rng.fill(rnd_bytes.as_mut_slice()); rnd_bytes @@ -322,7 +322,7 @@ pub(crate) mod test { #[inline] #[allow(unused_braces)] pub(crate) fn $name() -> Vec { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut rnd_bytes = vec![0u8; $size]; rng.fill(rnd_bytes.as_mut_slice()); rnd_bytes diff --git a/crates/core/src/wasm_runtime/native_api.rs b/crates/core/src/wasm_runtime/native_api.rs index f7b5cb5ae..94b2d2544 100644 --- a/crates/core/src/wasm_runtime/native_api.rs +++ b/crates/core/src/wasm_runtime/native_api.rs @@ -48,7 +48,7 @@ pub(crate) mod log { } pub(crate) mod rand { - use ::rand::{thread_rng, RngCore}; + use ::rand::{rng, RngCore}; use super::*; @@ -67,7 +67,7 @@ pub(crate) mod rand { let info = MEM_ADDR.get(&id).expect("instance mem space not recorded"); let ptr = compute_ptr::(ptr, info.start_ptr); let slice = unsafe { &mut *std::ptr::slice_from_raw_parts_mut(ptr, len as usize) }; - let mut rng = thread_rng(); + let mut rng = rng(); rng.fill_bytes(slice); } } diff --git a/crates/core/tests/connectivity.rs b/crates/core/tests/connectivity.rs index f9b855c8e..5de6cc3c6 100644 --- a/crates/core/tests/connectivity.rs +++ b/crates/core/tests/connectivity.rs @@ -51,7 +51,7 @@ async fn test_gateway_reconnection() -> TestResult { // Gateway configuration let temp_dir_gw = tempfile::tempdir()?; - let gateway_key = TransportKeypair::new_with_rng(&mut *RNG.lock().unwrap()); + let gateway_key = TransportKeypair::new(); let gateway_transport_keypair = temp_dir_gw.path().join("private.pem"); gateway_key.save(&gateway_transport_keypair)?; gateway_key @@ -73,7 +73,7 @@ async fn test_gateway_reconnection() -> TestResult { is_gateway: true, skip_load_from_network: true, gateways: Some(vec![]), - location: Some(RNG.lock().unwrap().gen()), + location: Some(RNG.lock().unwrap().random()), ignore_protocol_checking: true, address: Some(Ipv4Addr::LOCALHOST.into()), network_port: Some(gateway_port), @@ -93,13 +93,13 @@ async fn test_gateway_reconnection() -> TestResult { // Peer configuration let temp_dir_peer = tempfile::tempdir()?; - let peer_key = TransportKeypair::new_with_rng(&mut *RNG.lock().unwrap()); + let peer_key = TransportKeypair::new(); let peer_transport_keypair = temp_dir_peer.path().join("private.pem"); peer_key.save(&peer_transport_keypair)?; let gateway_info = InlineGwConfig { address: (Ipv4Addr::LOCALHOST, gateway_port).into(), - location: Some(RNG.lock().unwrap().gen()), + location: Some(RNG.lock().unwrap().random()), public_key_path: temp_dir_gw.path().join("public.pem"), }; @@ -114,7 +114,7 @@ async fn test_gateway_reconnection() -> TestResult { is_gateway: false, skip_load_from_network: true, gateways: Some(vec![serde_json::to_string(&gateway_info)?]), - location: Some(RNG.lock().unwrap().gen()), + location: Some(RNG.lock().unwrap().random()), ignore_protocol_checking: true, address: Some(Ipv4Addr::LOCALHOST.into()), network_port: None, @@ -321,7 +321,7 @@ async fn test_basic_gateway_connectivity() -> TestResult { // Create a simple gateway configuration let temp_dir = tempfile::tempdir()?; - let key = TransportKeypair::new_with_rng(&mut *RNG.lock().unwrap()); + let key = TransportKeypair::new(); let transport_keypair = temp_dir.path().join("private.pem"); key.save(&transport_keypair)?; @@ -336,7 +336,7 @@ async fn test_basic_gateway_connectivity() -> TestResult { is_gateway: true, skip_load_from_network: true, gateways: Some(vec![]), - location: Some(RNG.lock().unwrap().gen()), + location: Some(RNG.lock().unwrap().random()), ignore_protocol_checking: true, address: Some(Ipv4Addr::LOCALHOST.into()), network_port: Some(gateway_port), diff --git a/crates/core/tests/operations.rs b/crates/core/tests/operations.rs index 9d2977505..973c496f8 100644 --- a/crates/core/tests/operations.rs +++ b/crates/core/tests/operations.rs @@ -51,7 +51,7 @@ async fn base_node_test_config( } let temp_dir = tempfile::tempdir()?; - let key = TransportKeypair::new_with_rng(&mut *RNG.lock().unwrap()); + let key = TransportKeypair::new(); let transport_keypair = temp_dir.path().join("private.pem"); key.save(&transport_keypair)?; key.public().save(temp_dir.path().join("public.pem"))?; @@ -66,7 +66,7 @@ async fn base_node_test_config( is_gateway, skip_load_from_network: true, gateways: Some(gateways), - location: Some(RNG.lock().unwrap().gen()), + location: Some(RNG.lock().unwrap().random()), ignore_protocol_checking: true, address: Some(Ipv4Addr::LOCALHOST.into()), network_port: public_port, diff --git a/crates/fdev/Cargo.toml b/crates/fdev/Cargo.toml index 2f023769d..58d264f31 100644 --- a/crates/fdev/Cargo.toml +++ b/crates/fdev/Cargo.toml @@ -29,7 +29,7 @@ semver = { workspace = true } tar = "0.4" thiserror = "2" tokio = { version = "1", features = ["rt-multi-thread", "sync", "macros", "signal", "parking_lot", "process"] } -tokio-tungstenite = "0.26.1" +tokio-tungstenite = "0.27.0" toml = { version = "0.9", features = ["default", "preserve_order"] } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } diff --git a/crates/fdev/src/testing.rs b/crates/fdev/src/testing.rs index 89588e828..a4a88eb61 100644 --- a/crates/fdev/src/testing.rs +++ b/crates/fdev/src/testing.rs @@ -83,14 +83,14 @@ impl TestConfig { fn seed(&self) -> u64 { use rand::RngCore; - self.seed.unwrap_or_else(|| rand::rngs::OsRng.next_u64()) + self.seed.unwrap_or_else(|| rand::rng().next_u64()) } } fn randomize_test_name() -> String { const ALPHABET: &str = "abcdefghijklmnopqrstuvwxyz"; use rand::seq::IteratorRandom; - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut name = String::with_capacity(16); for _ in 0..16 { name.push(ALPHABET.chars().choose(&mut rng).expect("non empty")); diff --git a/modules/antiflood-tokens/Cargo.toml b/modules/antiflood-tokens/Cargo.toml index a40be4a26..82193e46c 100644 --- a/modules/antiflood-tokens/Cargo.toml +++ b/modules/antiflood-tokens/Cargo.toml @@ -6,7 +6,7 @@ resolver = "2" bincode = { version = "1" } bs58 = "0.5" chrono = { version = "0.4", default-features = false } -freenet-stdlib = { version = "0.1.6" } +freenet-stdlib = { version = "0.1.14" } rsa = { version = "0.9", default-features = false, features = ["serde", "pem"] } serde = { version = "1" } serde_json = { version = "1" } diff --git a/modules/identity-management/Cargo.toml b/modules/identity-management/Cargo.toml index c7c05c383..d4725624f 100644 --- a/modules/identity-management/Cargo.toml +++ b/modules/identity-management/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] anyhow = "1" p384 = { version = "0.13", default-features = false, features = ["serde", "pem", "pkcs8", "arithmetic"] } -freenet-stdlib = { version = "0.1.6" } +freenet-stdlib = { version = "0.1.14" } serde = "1" serde_json = "1" @@ -16,7 +16,7 @@ serde_json = "1" p384 = { version = "0.13", default-features = true } ecdsa = "0.16" pico-args = "0.5" -rand = "0.8" +rand = "0.9" [lib] crate-type = ["cdylib", "rlib"] diff --git a/tests/test-app-1/Cargo.toml b/tests/test-app-1/Cargo.toml index 470ab32c4..0db78ee08 100644 --- a/tests/test-app-1/Cargo.toml +++ b/tests/test-app-1/Cargo.toml @@ -14,4 +14,4 @@ panic = 'abort' strip = true [workspace.dependencies] -freenet-stdlib = { version = "0.1.6", default-features = false } +freenet-stdlib = { version = "0.1.14", default-features = false } diff --git a/tests/test-contract-1/Cargo.toml b/tests/test-contract-1/Cargo.toml index 888760e0d..4290cce35 100644 --- a/tests/test-contract-1/Cargo.toml +++ b/tests/test-contract-1/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -freenet-stdlib = { version = "0.1.6", features = ["contract"] } +freenet-stdlib = { version = "0.1.14", features = ["contract"] } [features] default = ["freenet-main-contract"] diff --git a/tests/test-contract-2/Cargo.toml b/tests/test-contract-2/Cargo.toml index 89e5634ed..227f77e77 100644 --- a/tests/test-contract-2/Cargo.toml +++ b/tests/test-contract-2/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -freenet-stdlib = { version = "0.1.6", features = ["contract"] } +freenet-stdlib = { version = "0.1.14", features = ["contract"] } [features] default = ["freenet-main-contract"] diff --git a/tests/test-contract-metering/Cargo.toml b/tests/test-contract-metering/Cargo.toml index 85b92a1cb..4f491abc8 100644 --- a/tests/test-contract-metering/Cargo.toml +++ b/tests/test-contract-metering/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -freenet-stdlib = { version = "0.1.9", features = ["contract"] } +freenet-stdlib = { version = "0.1.14", features = ["contract"] } serde = { version = "1", features = ["derive"] } [features] diff --git a/tests/test-delegate-1/Cargo.toml b/tests/test-delegate-1/Cargo.toml index c98674367..caf8f8287 100644 --- a/tests/test-delegate-1/Cargo.toml +++ b/tests/test-delegate-1/Cargo.toml @@ -11,7 +11,7 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -freenet-stdlib = { version = "0.1.6", features = ["contract"]} +freenet-stdlib = { version = "0.1.14", features = ["contract"]} serde = "1" serde_json = "1" bincode = "1" diff --git a/tests/test-delegate-integration/Cargo.toml b/tests/test-delegate-integration/Cargo.toml index c66192962..491dcdd34 100644 --- a/tests/test-delegate-integration/Cargo.toml +++ b/tests/test-delegate-integration/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -freenet-stdlib = { version = "0.1.9", features = ["contract"]} +freenet-stdlib = { version = "0.1.14", features = ["contract"]} serde = "1" serde_json = "1" bincode = "1" From cbfb9ec64177d1f3d1b8316f4a7b023c841849a4 Mon Sep 17 00:00:00 2001 From: Ian Clarke Date: Sat, 6 Sep 2025 00:24:31 +0200 Subject: [PATCH 2/2] fix: Use correct rand 0.9 API for generating random bytes In rand 0.9, gen() was renamed to random() to avoid conflict with the new gen keyword in Rust 2024. Fixed the usage to properly call random() on the Rng trait. This was causing the simulate_send_short_message test to timeout. [AI-assisted debugging and fix] --- crates/core/src/transport/connection_handler.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/core/src/transport/connection_handler.rs b/crates/core/src/transport/connection_handler.rs index 74c22b49c..f19ea9eba 100644 --- a/crates/core/src/transport/connection_handler.rs +++ b/crates/core/src/transport/connection_handler.rs @@ -172,7 +172,10 @@ impl OutboundConnectionHandler { // for this purpose (default: 3 MB/s). task::spawn(bw_tracker.rate_limiter(None, socket)); task::spawn(RANDOM_U64.scope( - StdRng::seed_from_u64(rand::random()).random(), + { + let mut rng = StdRng::seed_from_u64(rand::random()); + rng.random() + }, transport.listen(), ));