From 71540b54ec975449af64ee1f5dd2c9582975e39e Mon Sep 17 00:00:00 2001 From: Ruediger Klaehn Date: Wed, 8 Oct 2025 14:50:27 +0300 Subject: [PATCH 1/5] Remove endpoint from protocol constructor. It was only needed for creating tickets, which is used almost nowhere. If you want to create a BlobTicket, just do it manually. --- examples/custom-protocol.rs | 2 +- examples/limit.rs | 2 +- examples/mdns-discovery.rs | 2 +- examples/random_store.rs | 2 +- examples/transfer-collection.rs | 2 +- examples/transfer.rs | 2 +- src/net_protocol.rs | 22 ++-------------------- src/tests.rs | 10 +++++----- 8 files changed, 13 insertions(+), 31 deletions(-) diff --git a/examples/custom-protocol.rs b/examples/custom-protocol.rs index c021b7f0a..2ba2899ba 100644 --- a/examples/custom-protocol.rs +++ b/examples/custom-protocol.rs @@ -100,7 +100,7 @@ async fn listen(text: Vec) -> Result<()> { proto.insert_and_index(text).await?; } // Build the iroh-blobs protocol handler, which is used to download blobs. - let blobs = BlobsProtocol::new(&store, endpoint.clone(), None); + let blobs = BlobsProtocol::new(&store, None); // create a router that handles both our custom protocol and the iroh-blobs protocol. let node = Router::builder(endpoint) diff --git a/examples/limit.rs b/examples/limit.rs index 830e75836..0b7837964 100644 --- a/examples/limit.rs +++ b/examples/limit.rs @@ -359,7 +359,7 @@ async fn setup(store: MemStore, events: EventSender) -> Result<(Router, NodeAddr .await?; let _ = endpoint.home_relay().initialized().await; let addr = endpoint.node_addr().initialized().await; - let blobs = BlobsProtocol::new(&store, endpoint.clone(), Some(events)); + let blobs = BlobsProtocol::new(&store, Some(events)); let router = Router::builder(endpoint) .accept(iroh_blobs::ALPN, blobs) .spawn(); diff --git a/examples/mdns-discovery.rs b/examples/mdns-discovery.rs index b42f88f47..045e2b8ea 100644 --- a/examples/mdns-discovery.rs +++ b/examples/mdns-discovery.rs @@ -68,7 +68,7 @@ async fn accept(path: &Path) -> Result<()> { .await?; let builder = Router::builder(endpoint.clone()); let store = MemStore::new(); - let blobs = BlobsProtocol::new(&store, endpoint.clone(), None); + let blobs = BlobsProtocol::new(&store, None); let builder = builder.accept(iroh_blobs::ALPN, blobs.clone()); let node = builder.spawn(); diff --git a/examples/random_store.rs b/examples/random_store.rs index d3f9a0fc4..ea19baf4f 100644 --- a/examples/random_store.rs +++ b/examples/random_store.rs @@ -238,7 +238,7 @@ async fn provide(args: ProvideArgs) -> anyhow::Result<()> { .bind() .await?; let (dump_task, events_tx) = dump_provider_events(args.allow_push); - let blobs = iroh_blobs::BlobsProtocol::new(&store, endpoint.clone(), Some(events_tx)); + let blobs = iroh_blobs::BlobsProtocol::new(&store, Some(events_tx)); let router = iroh::protocol::Router::builder(endpoint.clone()) .accept(iroh_blobs::ALPN, blobs) .spawn(); diff --git a/examples/transfer-collection.rs b/examples/transfer-collection.rs index b9063e550..787e0d0ce 100644 --- a/examples/transfer-collection.rs +++ b/examples/transfer-collection.rs @@ -38,7 +38,7 @@ impl Node { // this BlobsProtocol accepts connections from other nodes and serves blobs from the store // we pass None to skip subscribing to request events - let blobs = BlobsProtocol::new(&store, endpoint.clone(), None); + let blobs = BlobsProtocol::new(&store, None); // Routers group one or more protocols together to accept connections from other nodes, // here we're only using one, but could add more in a real world use case as needed let router = Router::builder(endpoint) diff --git a/examples/transfer.rs b/examples/transfer.rs index 48fba6ba3..76e768d2b 100644 --- a/examples/transfer.rs +++ b/examples/transfer.rs @@ -12,7 +12,7 @@ async fn main() -> anyhow::Result<()> { // We initialize an in-memory backing store for iroh-blobs let store = MemStore::new(); // Then we initialize a struct that can accept blobs requests over iroh connections - let blobs = BlobsProtocol::new(&store, endpoint.clone(), None); + let blobs = BlobsProtocol::new(&store, None); // Grab all passed in arguments, the first one is the binary itself, so we skip it. let args: Vec = std::env::args().skip(1).collect(); diff --git a/src/net_protocol.rs b/src/net_protocol.rs index 47cda5344..69bcfadee 100644 --- a/src/net_protocol.rs +++ b/src/net_protocol.rs @@ -41,16 +41,14 @@ use std::{fmt::Debug, ops::Deref, sync::Arc}; use iroh::{ endpoint::Connection, protocol::{AcceptError, ProtocolHandler}, - Endpoint, Watcher, }; use tracing::error; -use crate::{api::Store, provider::events::EventSender, ticket::BlobTicket, HashAndFormat}; +use crate::{api::Store, provider::events::EventSender}; #[derive(Debug)] pub(crate) struct BlobsInner { pub(crate) store: Store, - pub(crate) endpoint: Endpoint, pub(crate) events: EventSender, } @@ -69,11 +67,10 @@ impl Deref for BlobsProtocol { } impl BlobsProtocol { - pub fn new(store: &Store, endpoint: Endpoint, events: Option) -> Self { + pub fn new(store: &Store, events: Option) -> Self { Self { inner: Arc::new(BlobsInner { store: store.clone(), - endpoint, events: events.unwrap_or(EventSender::DEFAULT), }), } @@ -82,21 +79,6 @@ impl BlobsProtocol { pub fn store(&self) -> &Store { &self.inner.store } - - pub fn endpoint(&self) -> &Endpoint { - &self.inner.endpoint - } - - /// Create a ticket for content on this node. - /// - /// Note that this does not check whether the content is partially or fully available. It is - /// just a convenience method to create a ticket from content and the address of this node. - pub async fn ticket(&self, content: impl Into) -> anyhow::Result { - let content = content.into(); - let addr = self.inner.endpoint.node_addr().initialized().await; - let ticket = BlobTicket::new(addr, content.hash, content.format); - Ok(ticket) - } } impl ProtocolHandler for BlobsProtocol { diff --git a/src/tests.rs b/src/tests.rs index 9cfa4edc9..8472fe9e5 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -494,7 +494,7 @@ pub async fn node_test_setup_with_events_fs( ) -> TestResult<(Router, FsStore, PathBuf)> { let store = crate::store::fs::FsStore::load(&db_path).await?; let ep = Endpoint::builder().bind().await?; - let blobs = BlobsProtocol::new(&store, ep.clone(), Some(events)); + let blobs = BlobsProtocol::new(&store, Some(events)); let router = Router::builder(ep).accept(crate::ALPN, blobs).spawn(); Ok((router, store, db_path)) } @@ -508,7 +508,7 @@ pub async fn node_test_setup_with_events_mem( ) -> TestResult<(Router, MemStore)> { let store = MemStore::new(); let ep = Endpoint::builder().bind().await?; - let blobs = BlobsProtocol::new(&store, ep.clone(), Some(events)); + let blobs = BlobsProtocol::new(&store, Some(events)); let router = Router::builder(ep).accept(crate::ALPN, blobs).spawn(); Ok((router, store)) } @@ -604,7 +604,7 @@ async fn node_serve_hash_seq() -> TestResult<()> { let root_tt = store.add_bytes(hash_seq).await?; let root = root_tt.hash; let endpoint = Endpoint::builder().discovery_n0().bind().await?; - let blobs = crate::net_protocol::BlobsProtocol::new(&store, endpoint.clone(), None); + let blobs = crate::net_protocol::BlobsProtocol::new(&store, None); let r1 = Router::builder(endpoint) .accept(crate::protocol::ALPN, blobs) .spawn(); @@ -635,7 +635,7 @@ async fn node_serve_blobs() -> TestResult<()> { tts.push(store.add_bytes(test_data(size)).await?); } let endpoint = Endpoint::builder().discovery_n0().bind().await?; - let blobs = crate::net_protocol::BlobsProtocol::new(&store, endpoint.clone(), None); + let blobs = crate::net_protocol::BlobsProtocol::new(&store, None); let r1 = Router::builder(endpoint) .accept(crate::protocol::ALPN, blobs) .spawn(); @@ -675,7 +675,7 @@ async fn node_smoke(store: &Store) -> TestResult<()> { let tt = store.add_bytes(b"hello world".to_vec()).temp_tag().await?; let hash = *tt.hash(); let endpoint = Endpoint::builder().discovery_n0().bind().await?; - let blobs = crate::net_protocol::BlobsProtocol::new(store, endpoint.clone(), None); + let blobs = crate::net_protocol::BlobsProtocol::new(store, None); let r1 = Router::builder(endpoint) .accept(crate::protocol::ALPN, blobs) .spawn(); From a4fc497728491f40bdd5c9070d977f4581151301 Mon Sep 17 00:00:00 2001 From: Ruediger Klaehn Date: Wed, 8 Oct 2025 15:24:37 +0300 Subject: [PATCH 2/5] Remove .ticket from docs --- README.md | 7 +++++-- src/get.rs | 8 +------- src/net_protocol.rs | 6 ++++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 2f374e8fb..678e87833 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ async fn main() -> anyhow::Result<()> { // create a protocol handler using an in-memory blob store. let store = MemStore::new(); - let blobs = BlobsProtocol::new(&store, endpoint.clone(), None); + let blobs = BlobsProtocol::new(&store, None); // build the router let router = Router::builder(endpoint) @@ -52,7 +52,10 @@ async fn main() -> anyhow::Result<()> { .spawn(); let tag = blobs.add_slice(b"Hello world").await?; - println!("We are now serving {}", blobs.ticket(tag).await?); + let _ = endpoint.online().await; + let addr = endpoint.node_addr().initialized().await; + let ticket = BlobTicket::new(addr, tag.hash, tag.format); + println!("We are now serving {}", ticket); // wait for control-c tokio::signal::ctrl_c().await; diff --git a/src/get.rs b/src/get.rs index d13092a85..15f40ea1b 100644 --- a/src/get.rs +++ b/src/get.rs @@ -633,8 +633,7 @@ pub mod fsm { /// /// This is similar to [`bao_tree::io::DecodeError`], but takes into account /// that we are reading from a [`RecvStream`], so read errors will be - /// propagated as [`DecodeError::Read`], containing a [`ReadError`]. - /// This carries more concrete information about the error than an [`io::Error`]. + /// propagated as [`DecodeError::Read`], containing a [`io::Error`]. /// /// When the provider finds that it does not have a chunk that we requested, /// or that the chunk is invalid, it will stop sending data without producing @@ -646,11 +645,6 @@ pub mod fsm { /// variants indicate that the provider has sent us invalid data. A well-behaved /// provider should never do this, so this is an indication that the provider is /// not behaving correctly. - /// - /// The [`DecodeError::DecodeIo`] variant is just a fallback for any other io error that - /// is not actually a [`DecodeError::Read`]. - /// - /// [`ReadError`]: endpoint::ReadError #[common_fields({ backtrace: Option, #[snafu(implicit)] diff --git a/src/net_protocol.rs b/src/net_protocol.rs index 69bcfadee..895ed259b 100644 --- a/src/net_protocol.rs +++ b/src/net_protocol.rs @@ -19,15 +19,17 @@ //! let endpoint = Endpoint::builder().discovery_n0().bind().await?; //! //! // create a blobs protocol handler -//! let blobs = BlobsProtocol::new(&store, endpoint.clone(), None); +//! let blobs = BlobsProtocol::new(&store, None); //! //! // create a router and add the blobs protocol handler //! let router = Router::builder(endpoint) //! .accept(iroh_blobs::ALPN, blobs.clone()) //! .spawn(); //! +//! endpoint.online().await; +//! let addr = endpoint.node_addr().initialized().await; //! // this data is now globally available using the ticket -//! let ticket = blobs.ticket(t).await?; +//! let ticket = BlobTicket::new(addr, t.hash, t.format).await?; //! println!("ticket: {}", ticket); //! //! // wait for control-c to exit From 06d950e4735413c29f2aed9e3b1b009d87f6ece9 Mon Sep 17 00:00:00 2001 From: Ruediger Klaehn Date: Wed, 8 Oct 2025 15:30:09 +0300 Subject: [PATCH 3/5] Make the accessors on TempTag return copies, not references. For consistency. --- examples/expiring-tags.rs | 4 ++-- examples/transfer-collection.rs | 6 +++--- src/api/blobs.rs | 8 ++++---- src/api/remote.rs | 2 +- src/format/collection.rs | 2 +- src/store/fs.rs | 22 +++++++++++----------- src/store/gc.rs | 26 +++++++++++++------------- src/store/mem.rs | 2 +- src/tests.rs | 8 ++++---- src/util/temp_tag.rs | 13 ++++--------- tests/blobs.rs | 2 +- 11 files changed, 45 insertions(+), 50 deletions(-) diff --git a/examples/expiring-tags.rs b/examples/expiring-tags.rs index 9c30d1b79..e19771e80 100644 --- a/examples/expiring-tags.rs +++ b/examples/expiring-tags.rs @@ -162,14 +162,14 @@ async fn main() -> anyhow::Result<()> { let expires_at = SystemTime::now() .checked_add(Duration::from_secs(10)) .unwrap(); - create_expiring_tag(&store, &[*a.hash(), *b.hash()], "expiring", expires_at).await?; + create_expiring_tag(&store, &[a.hash(), b.hash()], "expiring", expires_at).await?; // add a single blob and tag it with an expiry date 60 seconds in the future let c = batch.add_bytes("blob 3".as_bytes()).await?; let expires_at = SystemTime::now() .checked_add(Duration::from_secs(60)) .unwrap(); - create_expiring_tag(&store, &[*c.hash()], "expiring", expires_at).await?; + create_expiring_tag(&store, &[c.hash()], "expiring", expires_at).await?; // batch goes out of scope, so data is only protected by the tags we created } diff --git a/examples/transfer-collection.rs b/examples/transfer-collection.rs index 787e0d0ce..d935d59e8 100644 --- a/examples/transfer-collection.rs +++ b/examples/transfer-collection.rs @@ -80,14 +80,14 @@ impl Node { let collection_items = collection_items .iter() - .map(|(name, tag)| (name.to_string(), *tag.hash())) + .map(|(name, tag)| (name.to_string(), tag.hash())) .collect::>(); let collection = Collection::from_iter(collection_items); let tt = collection.store(&self.store).await?; - self.store.tags().create(*tt.hash_and_format()).await?; - Ok(*tt.hash()) + self.store.tags().create(tt.hash_and_format()).await?; + Ok(tt.hash()) } /// retrieve an entire collection from a given hash and provider diff --git a/src/api/blobs.rs b/src/api/blobs.rs index d04d449c8..82233e711 100644 --- a/src/api/blobs.rs +++ b/src/api/blobs.rs @@ -656,9 +656,9 @@ impl<'a> AddProgress<'a> { pub async fn with_named_tag(self, name: impl AsRef<[u8]>) -> RequestResult { let blobs = self.blobs.clone(); let tt = self.temp_tag().await?; - let haf = *tt.hash_and_format(); + let haf = tt.hash_and_format(); let tags = Tags::ref_from_sender(&blobs.client); - tags.set(name, *tt.hash_and_format()).await?; + tags.set(name, haf).await?; drop(tt); Ok(haf) } @@ -666,10 +666,10 @@ impl<'a> AddProgress<'a> { pub async fn with_tag(self) -> RequestResult { let blobs = self.blobs.clone(); let tt = self.temp_tag().await?; - let hash = *tt.hash(); + let hash = tt.hash(); let format = tt.format(); let tags = Tags::ref_from_sender(&blobs.client); - let name = tags.create(*tt.hash_and_format()).await?; + let name = tags.create(tt.hash_and_format()).await?; drop(tt); Ok(TagInfo { name, hash, format }) } diff --git a/src/api/remote.rs b/src/api/remote.rs index 7c1d6ef99..a71b5c001 100644 --- a/src/api/remote.rs +++ b/src/api/remote.rs @@ -1088,7 +1088,7 @@ mod tests { let store = FsStore::load(td.path().join("blobs.db")).await?; let blobs = store.blobs(); let tt = blobs.add_slice(b"test").temp_tag().await?; - let hash = *tt.hash(); + let hash = tt.hash(); let info = store.remote().local(hash).await?; assert_eq!(info.bitfield.ranges, ChunkRanges::all()); assert_eq!(info.local_bytes(), 4); diff --git a/src/format/collection.rs b/src/format/collection.rs index 9716faf86..fd8884fd9 100644 --- a/src/format/collection.rs +++ b/src/format/collection.rs @@ -191,7 +191,7 @@ impl Collection { let (links, meta) = self.into_parts(); let meta_bytes = postcard::to_stdvec(&meta)?; let meta_tag = db.add_bytes(meta_bytes).temp_tag().await?; - let links_bytes = std::iter::once(*meta_tag.hash()) + let links_bytes = std::iter::once(meta_tag.hash()) .chain(links) .collect::(); let links_tag = db diff --git a/src/store/fs.rs b/src/store/fs.rs index 46d391178..f2a4ce20f 100644 --- a/src/store/fs.rs +++ b/src/store/fs.rs @@ -1602,7 +1602,7 @@ pub mod tests { let stream = bytes_to_stream(expected.clone(), 1023); let obs = store.observe(expected_hash); let tt = store.add_stream(stream).await.temp_tag().await?; - assert_eq!(expected_hash, *tt.hash()); + assert_eq!(expected_hash, tt.hash()); // we must at some point see completion, otherwise the test will hang obs.await_completion().await?; let actual = store.get_bytes(expected_hash).await?; @@ -2043,8 +2043,8 @@ pub mod tests { .await? .collect::>() .await; - assert!(tts.contains(tt1.hash_and_format())); - assert!(tts.contains(tt2.hash_and_format())); + assert!(tts.contains(&tt1.hash_and_format())); + assert!(tts.contains(&tt2.hash_and_format())); drop(batch); store.sync_db().await?; store.wait_idle().await?; @@ -2055,8 +2055,8 @@ pub mod tests { .collect::>() .await; // temp tag went out of scope, so it does not work anymore - assert!(!tts.contains(tt1.hash_and_format())); - assert!(!tts.contains(tt2.hash_and_format())); + assert!(!tts.contains(&tt1.hash_and_format())); + assert!(!tts.contains(&tt2.hash_and_format())); drop(tt1); drop(tt2); Ok(()) @@ -2089,29 +2089,29 @@ pub mod tests { let data = vec![0u8; size]; let data = Bytes::from(data); let tt = store.add_bytes(data.clone()).temp_tag().await?; - data_by_hash.insert(*tt.hash(), data); + data_by_hash.insert(tt.hash(), data); hashes.push(tt); } store.sync_db().await?; for tt in &hashes { - let hash = *tt.hash(); + let hash = tt.hash(); let path = testdir.path().join(format!("{hash}.txt")); store.export(hash, path).await?; } for tt in &hashes { let hash = tt.hash(); let data = store - .export_bao(*hash, ChunkRanges::all()) + .export_bao(hash, ChunkRanges::all()) .data_to_vec() .await .unwrap(); - assert_eq!(data, data_by_hash[hash].to_vec()); + assert_eq!(data, data_by_hash[&hash].to_vec()); let bao = store - .export_bao(*hash, ChunkRanges::all()) + .export_bao(hash, ChunkRanges::all()) .bao_to_vec() .await .unwrap(); - bao_by_hash.insert(*hash, bao); + bao_by_hash.insert(hash, bao); } store.dump().await?; diff --git a/src/store/gc.rs b/src/store/gc.rs index abb9903e4..ca8404c92 100644 --- a/src/store/gc.rs +++ b/src/store/gc.rs @@ -263,15 +263,15 @@ mod tests { let ft = blobs.add_slice("f").temp_tag().await?; let gt = blobs.add_slice("g").temp_tag().await?; let ht = blobs.add_slice("h").with_named_tag("h").await?; - let a = *at.hash(); - let b = *bt.hash(); - let c = *ct.hash(); - let d = *dt.hash(); - let e = *et.hash(); - let f = *ft.hash(); - let g = *gt.hash(); + let a = at.hash(); + let b = bt.hash(); + let c = ct.hash(); + let d = dt.hash(); + let e = et.hash(); + let f = ft.hash(); + let g = gt.hash(); let h = ht.hash; - store.tags().set("c", *ct.hash_and_format()).await?; + store.tags().set("c", ct.hash_and_format()).await?; let dehs = [d, e].into_iter().collect::(); let hehs = blobs .add_bytes_with_opts(AddBytesOptions { @@ -287,7 +287,7 @@ mod tests { }) .temp_tag() .await?; - store.tags().set("fg", *fghs.hash_and_format()).await?; + store.tags().set("fg", fghs.hash_and_format()).await?; drop(fghs); drop(bt); store.tags().delete("h").await?; @@ -335,11 +335,11 @@ mod tests { .temp_tag() .await?; let ah = a.hash(); - let data_path = options.data_path(ah); - let outboard_path = options.outboard_path(ah); + let data_path = options.data_path(&ah); + let outboard_path = options.outboard_path(&ah); assert!(data_path.exists()); assert!(outboard_path.exists()); - assert!(store.has(*ah).await?); + assert!(store.has(ah).await?); drop(a); gc_run_once(store, &mut live).await?; assert!(!data_path.exists()); @@ -410,7 +410,7 @@ mod tests { async fn gc_check_deletion(store: &Store) -> TestResult { let temp_tag = store.add_bytes(b"foo".to_vec()).temp_tag().await?; - let hash = *temp_tag.hash(); + let hash = temp_tag.hash(); assert_eq!(store.get_bytes(hash).await?.as_ref(), b"foo"); drop(temp_tag); let mut live = HashSet::new(); diff --git a/src/store/mem.rs b/src/store/mem.rs index 5e3c0af23..76bc0e6e4 100644 --- a/src/store/mem.rs +++ b/src/store/mem.rs @@ -1087,7 +1087,7 @@ mod tests { async fn smoke() -> TestResult<()> { let store = MemStore::new(); let tt = store.add_bytes(vec![0u8; 1024 * 64]).temp_tag().await?; - let hash = *tt.hash(); + let hash = tt.hash(); println!("hash: {hash:?}"); let mut stream = store.export_bao(hash, ChunkRanges::all()).stream(); while let Some(item) = stream.next().await { diff --git a/src/tests.rs b/src/tests.rs index 8472fe9e5..651515e38 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -435,7 +435,7 @@ pub async fn add_test_hash_seq( for size in sizes { tts.push(batch.add_bytes(test_data(size)).await?); } - let hash_seq = tts.iter().map(|tt| *tt.hash()).collect::(); + let hash_seq = tts.iter().map(|tt| tt.hash()).collect::(); let root = batch .add_bytes_with_opts((hash_seq, BlobFormat::HashSeq)) .with_named_tag("hs") @@ -461,7 +461,7 @@ pub async fn add_test_hash_seq_incomplete( blobs.import_bao_bytes(hash, ranges, bao).await?; } } - let hash_seq = tts.iter().map(|tt| *tt.hash()).collect::(); + let hash_seq = tts.iter().map(|tt| tt.hash()).collect::(); let hash_seq_bytes = Bytes::from(hash_seq); let ranges = present(0); let (root, bao) = create_n0_bao(&hash_seq_bytes, &ranges)?; @@ -673,7 +673,7 @@ async fn node_smoke_mem() -> TestResult<()> { async fn node_smoke(store: &Store) -> TestResult<()> { let tt = store.add_bytes(b"hello world".to_vec()).temp_tag().await?; - let hash = *tt.hash(); + let hash = tt.hash(); let endpoint = Endpoint::builder().discovery_n0().bind().await?; let blobs = crate::net_protocol::BlobsProtocol::new(store, None); let r1 = Router::builder(endpoint) @@ -701,7 +701,7 @@ async fn test_export_chunk() -> TestResult { for size in [1024 * 18 + 1] { let data = vec![0u8; size]; let tt = store.add_slice(&data).temp_tag().await?; - let hash = *tt.hash(); + let hash = tt.hash(); let c = blobs.export_chunk(hash, 0).await; println!("{c:?}"); let c = blobs.export_chunk(hash, 1000000).await; diff --git a/src/util/temp_tag.rs b/src/util/temp_tag.rs index feb333bba..8126e3413 100644 --- a/src/util/temp_tag.rs +++ b/src/util/temp_tag.rs @@ -98,13 +98,8 @@ impl TempTag { } /// The hash of the pinned item - pub fn inner(&self) -> &HashAndFormat { - &self.inner - } - - /// The hash of the pinned item - pub fn hash(&self) -> &Hash { - &self.inner.hash + pub fn hash(&self) -> Hash { + self.inner.hash } /// The format of the pinned item @@ -113,8 +108,8 @@ impl TempTag { } /// The hash and format of the pinned item - pub fn hash_and_format(&self) -> &HashAndFormat { - &self.inner + pub fn hash_and_format(&self) -> HashAndFormat { + self.inner } /// Keep the item alive until the end of the process diff --git a/tests/blobs.rs b/tests/blobs.rs index 92ba46f7c..16f626cc9 100644 --- a/tests/blobs.rs +++ b/tests/blobs.rs @@ -69,7 +69,7 @@ async fn blobs_smoke(path: &Path, blobs: &Blobs) -> TestResult<()> { break; } } - let actual_hash = res.as_ref().map(|x| *x.hash()); + let actual_hash = res.as_ref().map(|x| x.hash()); let expected_hash = Hash::new(&expected); assert_eq!(actual_hash, Some(expected_hash)); } From c8d5ae58fcde5a427c07bc91bf5da6cbe214af24 Mon Sep 17 00:00:00 2001 From: Ruediger Klaehn Date: Wed, 8 Oct 2025 16:49:51 +0300 Subject: [PATCH 4/5] Use latest iroh --- Cargo.lock | 258 ++++++++++++++++++++++++++++---------------- src/net_protocol.rs | 6 +- 2 files changed, 170 insertions(+), 94 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7161a4701..b4a31d111 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -33,13 +33,13 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" -version = "0.5.2" +version = "0.6.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +checksum = "ac8202ab55fcbf46ca829833f347a82a2a4ce0596f0304ac322c2d100030cd56" dependencies = [ "bytes", - "crypto-common", - "generic-array", + "crypto-common 0.2.0-rc.4", + "inout", ] [[package]] @@ -277,9 +277,9 @@ dependencies = [ [[package]] name = "base16ct" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +checksum = "d8b59d472eab27ade8d770dcb11da7201c11234bef9f82ce7aa517be028d462b" [[package]] name = "base32" @@ -348,6 +348,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.11.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9ef36a6fcdb072aa548f3da057640ec10859eb4e91ddf526ee648d50c76a949" +dependencies = [ + "hybrid-array", + "zeroize", +] + [[package]] name = "bounded-integer" version = "0.5.8" @@ -410,13 +420,14 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chacha20" -version = "0.9.1" +version = "0.10.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +checksum = "9bd162f2b8af3e0639d83f28a637e4e55657b7a74508dba5a9bf4da523d5c9e9" dependencies = [ "cfg-if", "cipher", "cpufeatures", + "zeroize", ] [[package]] @@ -436,11 +447,12 @@ dependencies = [ [[package]] name = "cipher" -version = "0.4.4" +version = "0.5.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "1e12a13eb01ded5d32ee9658d94f553a19e804204f2dc811df69ab4d9e0cb8c7" dependencies = [ - "crypto-common", + "block-buffer 0.11.0-rc.5", + "crypto-common 0.2.0-rc.4", "inout", "zeroize", ] @@ -545,9 +557,9 @@ checksum = "60c92cd5ec953d0542f48d2a90a25aa2828ab1c03217c1ca077000f3af15997d" [[package]] name = "const-oid" -version = "0.9.6" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "0dabb6555f92fb9ee4140454eb5dcd14c7960e1225c6d1a6cc361f032947713e" [[package]] name = "constant_time_eq" @@ -652,15 +664,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", - "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8235645834fbc6832939736ce2f2d08192652269e11010a6240f61b908a1c6" +dependencies = [ + "hybrid-array", + "rand_core 0.9.3", +] + [[package]] name = "crypto_box" -version = "0.9.1" +version = "0.10.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16182b4f39a82ec8a6851155cc4c0cda3065bb1db33651726a29e1951de0f009" +checksum = "2bda4de3e070830cf3a27a394de135b6709aefcc54d1e16f2f029271254a6ed9" dependencies = [ "aead", "chacha20", @@ -674,14 +695,14 @@ dependencies = [ [[package]] name = "crypto_secretbox" -version = "0.1.1" +version = "0.2.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" +checksum = "54532aae6546084a52cef855593daf9555945719eeeda9974150e0def854873e" dependencies = [ "aead", "chacha20", "cipher", - "generic-array", + "hybrid-array", "poly1305", "salsa20", "subtle", @@ -690,16 +711,16 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.3" +version = "5.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +checksum = "6f9200d1d13637f15a6acb71e758f64624048d85b31a5fdbfd8eca1e2687d0b7" dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.11.0-rc.3", "fiat-crypto", - "rand_core 0.6.4", + "rand_core 0.9.3", "rustc_version", "serde", "subtle", @@ -725,9 +746,9 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "der" -version = "0.7.10" +version = "0.8.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "e9d8dd2f26c86b27a2a8ea2767ec7f9df7a89516e4794e54ac01ee618dda3aa4" dependencies = [ "const-oid", "der_derive", @@ -737,9 +758,9 @@ dependencies = [ [[package]] name = "der_derive" -version = "0.7.3" +version = "0.8.0-rc.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" +checksum = "be645fee2afe89d293b96c19e4456e6ac69520fc9c6b8a58298550138e361ffe" dependencies = [ "proc-macro2", "quote", @@ -821,11 +842,21 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "crypto-common 0.1.6", "subtle", ] +[[package]] +name = "digest" +version = "0.11.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac89f8a64533a9b0eaa73a68e424db0fb1fd6271c74cc0125336a05f090568d" +dependencies = [ + "block-buffer 0.11.0-rc.5", + "crypto-common 0.2.0-rc.4", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -865,9 +896,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ed25519" -version = "2.2.3" +version = "3.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "9ef49c0b20c0ad088893ad2a790a29c06a012b3f05bcfc66661fd22a94b32129" dependencies = [ "pkcs8", "serde", @@ -876,15 +907,16 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.2.0" +version = "3.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +checksum = "ad207ed88a133091f83224265eac21109930db09bedcad05d5252f2af2de20a1" dependencies = [ "curve25519-dalek", "ed25519", - "rand_core 0.6.4", + "rand_core 0.9.3", "serde", - "sha2", + "sha2 0.11.0-rc.2", + "signature", "subtle", "zeroize", ] @@ -963,9 +995,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fiat-crypto" -version = "0.2.9" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" [[package]] name = "fnv" @@ -1156,7 +1188,6 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", - "zeroize", ] [[package]] @@ -1334,7 +1365,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -1405,6 +1436,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hybrid-array" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f471e0a81b2f90ffc0cb2f951ae04da57de8baa46fa99112b062a5173a5088d0" +dependencies = [ + "typenum", + "zeroize", +] + [[package]] name = "hyper" version = "1.6.0" @@ -1631,11 +1672,11 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.4" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "c7357b6e7aa75618c7864ebd0634b115a7218b0615f4cb1df33ac3eca23943d4" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -1701,7 +1742,7 @@ dependencies = [ [[package]] name = "iroh" version = "0.92.0" -source = "git+https://github.com/n0-computer/iroh?branch=main#60d5310dfe42179f6b3a20e38da4e7144008e541" +source = "git+https://github.com/n0-computer/iroh?branch=main#b6c60d39ca2234fbe5fa45812d6733a2ba96fad2" dependencies = [ "aead", "backon", @@ -1720,7 +1761,7 @@ dependencies = [ "igd-next", "instant", "iroh-base", - "iroh-metrics", + "iroh-metrics 0.36.1", "iroh-quinn", "iroh-quinn-proto", "iroh-quinn-udp", @@ -1733,8 +1774,9 @@ dependencies = [ "netwatch", "pin-project", "pkarr", + "pkcs8", "portmapper", - "rand 0.8.5", + "rand 0.9.2", "reqwest", "ring", "rustls", @@ -1743,7 +1785,6 @@ dependencies = [ "serde", "smallvec", "snafu", - "spki", "strum", "stun-rs", "surge-ping", @@ -1762,7 +1803,7 @@ dependencies = [ [[package]] name = "iroh-base" version = "0.92.0" -source = "git+https://github.com/n0-computer/iroh?branch=main#60d5310dfe42179f6b3a20e38da4e7144008e541" +source = "git+https://github.com/n0-computer/iroh?branch=main#b6c60d39ca2234fbe5fa45812d6733a2ba96fad2" dependencies = [ "curve25519-dalek", "data-encoding", @@ -1771,7 +1812,7 @@ dependencies = [ "n0-snafu", "nested_enum_utils", "postcard", - "rand_core 0.6.4", + "rand_core 0.9.3", "serde", "snafu", "url", @@ -1798,7 +1839,7 @@ dependencies = [ "iroh", "iroh-base", "iroh-io", - "iroh-metrics", + "iroh-metrics 0.35.0", "iroh-quinn", "iroh-test", "irpc", @@ -1848,7 +1889,7 @@ version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8922c169f1b84d39d325c02ef1bbe1419d4de6e35f0403462b3c7e60cc19634" dependencies = [ - "iroh-metrics-derive", + "iroh-metrics-derive 0.2.0", "itoa", "postcard", "serde", @@ -1856,6 +1897,21 @@ dependencies = [ "tracing", ] +[[package]] +name = "iroh-metrics" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090161e84532a0cb78ab13e70abb882b769ec67cf5a2d2dcea39bd002e1f7172" +dependencies = [ + "iroh-metrics-derive 0.3.0", + "itoa", + "postcard", + "ryu", + "serde", + "snafu", + "tracing", +] + [[package]] name = "iroh-metrics-derive" version = "0.2.0" @@ -1868,6 +1924,18 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "iroh-metrics-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a39de3779d200dadde3a27b9fbdb34389a2af1b85ea445afca47bf4d7672573" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "iroh-quinn" version = "0.14.0" @@ -1926,7 +1994,7 @@ dependencies = [ [[package]] name = "iroh-relay" version = "0.92.0" -source = "git+https://github.com/n0-computer/iroh?branch=main#60d5310dfe42179f6b3a20e38da4e7144008e541" +source = "git+https://github.com/n0-computer/iroh?branch=main#b6c60d39ca2234fbe5fa45812d6733a2ba96fad2" dependencies = [ "blake3", "bytes", @@ -1940,10 +2008,10 @@ dependencies = [ "hyper", "hyper-util", "iroh-base", - "iroh-metrics", + "iroh-metrics 0.36.1", "iroh-quinn", "iroh-quinn-proto", - "lru", + "lru 0.16.1", "n0-future 0.1.3", "n0-snafu", "nested_enum_utils", @@ -1951,7 +2019,7 @@ dependencies = [ "pin-project", "pkarr", "postcard", - "rand 0.8.5", + "rand 0.9.2", "reqwest", "rustls", "rustls-pki-types", @@ -2126,6 +2194,12 @@ name = "lru" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" + +[[package]] +name = "lru" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe949189f46fabb938b3a9a0be30fdd93fd8a09260da863399a8cf3db756ec8" dependencies = [ "hashbrown", ] @@ -2534,12 +2608,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "openssl-probe" version = "0.1.6" @@ -2593,9 +2661,9 @@ dependencies = [ [[package]] name = "pem-rfc7468" -version = "0.7.0" +version = "1.0.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +checksum = "a8e58fab693c712c0d4e88f8eb3087b6521d060bcaf76aeb20cb192d809115ba" dependencies = [ "base64ct", ] @@ -2647,7 +2715,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" dependencies = [ "pest", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -2694,9 +2762,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkarr" -version = "3.9.1" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e80bbe1ea7bd30855c856cd796e67212eade4c275ab8554ce5458d7c75b4a63b" +checksum = "792c1328860f6874e90e3b387b4929819cc7783a6bd5a4728e918706eb436a48" dependencies = [ "async-compat", "base32", @@ -2707,9 +2775,9 @@ dependencies = [ "ed25519-dalek", "futures-buffered", "futures-lite", - "getrandom 0.2.16", + "getrandom 0.3.3", "log", - "lru", + "lru 0.13.0", "ntimestamp", "reqwest", "self_cell", @@ -2725,9 +2793,9 @@ dependencies = [ [[package]] name = "pkcs8" -version = "0.10.2" +version = "0.11.0-rc.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "93eac55f10aceed84769df670ea4a32d2ffad7399400d41ee1c13b1cd8e1b478" dependencies = [ "der", "spki", @@ -2777,12 +2845,11 @@ dependencies = [ [[package]] name = "poly1305" -version = "0.8.0" +version = "0.9.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +checksum = "fb78a635f75d76d856374961deecf61031c0b6f928c83dc9c0924ab6c019c298" dependencies = [ "cpufeatures", - "opaque-debug", "universal-hash", ] @@ -2794,9 +2861,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portmapper" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f99e8cd25cd8ee09fc7da59357fd433c0a19272956ebb4ad7443b21842988d" +checksum = "90f7313cafd74e95e6a358c1d0a495112f175502cc2e69870d0a5b12b6553059" dependencies = [ "base64", "bytes", @@ -2805,7 +2872,7 @@ dependencies = [ "futures-util", "hyper-util", "igd-next", - "iroh-metrics", + "iroh-metrics 0.36.1", "libc", "nested_enum_utils", "netwatch", @@ -3447,10 +3514,11 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "salsa20" -version = "0.10.2" +version = "0.11.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +checksum = "d3ff3b81c8a6e381bc1673768141383f9328048a60edddcfc752a8291a138443" dependencies = [ + "cfg-if", "cipher", ] @@ -3589,9 +3657,9 @@ dependencies = [ [[package]] name = "serdect" -version = "0.2.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +checksum = "d3ef0e35b322ddfaecbc60f34ab448e157e48531288ee49fafbb053696b8ffe2" dependencies = [ "base16ct", "serde", @@ -3605,7 +3673,7 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -3622,7 +3690,18 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.11.0-rc.3", ] [[package]] @@ -3651,12 +3730,9 @@ dependencies = [ [[package]] name = "signature" -version = "2.2.0" +version = "3.0.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "rand_core 0.6.4", -] +checksum = "fc280a6ff65c79fbd6622f64d7127f32b85563bca8c53cd2e9141d6744a9056d" [[package]] name = "simdutf8" @@ -3753,9 +3829,9 @@ checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" [[package]] name = "spki" -version = "0.7.3" +version = "0.8.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +checksum = "8baeff88f34ed0691978ec34440140e1572b68c7dd4a495fd14a3dc1944daa80" dependencies = [ "base64ct", "der", @@ -4396,11 +4472,11 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" -version = "0.5.1" +version = "0.6.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +checksum = "a55be643b40a21558f44806b53ee9319595bc7ca6896372e4e08e5d7d83c9cd6" dependencies = [ - "crypto-common", + "crypto-common 0.2.0-rc.4", "subtle", ] diff --git a/src/net_protocol.rs b/src/net_protocol.rs index 895ed259b..18ae31c00 100644 --- a/src/net_protocol.rs +++ b/src/net_protocol.rs @@ -50,14 +50,14 @@ use crate::{api::Store, provider::events::EventSender}; #[derive(Debug)] pub(crate) struct BlobsInner { - pub(crate) store: Store, - pub(crate) events: EventSender, + store: Store, + events: EventSender, } /// A protocol handler for the blobs protocol. #[derive(Debug, Clone)] pub struct BlobsProtocol { - pub(crate) inner: Arc, + inner: Arc, } impl Deref for BlobsProtocol { From e2404b988845d71b2e7213fd1583f30f42ff1e97 Mon Sep 17 00:00:00 2001 From: Ruediger Klaehn Date: Wed, 8 Oct 2025 17:32:17 +0300 Subject: [PATCH 5/5] Update to latest iroh - rand update - .initialized().await removal --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 15 ++-- examples/common/mod.rs | 3 +- examples/limit.rs | 10 +-- examples/mdns-discovery.rs | 2 +- examples/random_store.rs | 20 +++--- examples/transfer-collection.rs | 7 +- .../store/fs/util/entity_manager.txt | 1 + src/api/downloader.rs | 45 ++++++------ src/get/request.rs | 2 +- src/net_protocol.rs | 10 +-- src/store/fs.rs | 2 +- src/test.rs | 4 +- src/tests.rs | 71 +++++++++++-------- src/ticket.rs | 2 +- src/util/connection_pool.rs | 4 +- 17 files changed, 107 insertions(+), 95 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b4a31d111..6d93ad87a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1848,7 +1848,7 @@ dependencies = [ "nested_enum_utils", "postcard", "proptest", - "rand 0.8.5", + "rand 0.9.2", "range-collections", "redb", "ref-cast", diff --git a/Cargo.toml b/Cargo.toml index 9b0be2b80..38fedb61c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ tokio = { version = "1.43.0", features = ["full"] } tokio-util = { version = "0.7.13", features = ["full"] } tracing = "0.1.41" iroh-io = "0.6.1" -rand = "0.8.5" +rand = "0.9.2" hex = "0.4.3" serde = "1.0.217" postcard = { version = "1.1.1", features = ["experimental-derive", "use-std"] } diff --git a/README.md b/README.md index 678e87833..a3a26f23c 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Here is a basic example of how to set up `iroh-blobs` with `iroh`: ```rust,no_run use iroh::{protocol::Router, Endpoint}; -use iroh_blobs::{store::mem::MemStore, BlobsProtocol}; +use iroh_blobs::{store::mem::MemStore, BlobsProtocol, ticket::BlobTicket}; #[tokio::main] async fn main() -> anyhow::Result<()> { @@ -44,17 +44,18 @@ async fn main() -> anyhow::Result<()> { // create a protocol handler using an in-memory blob store. let store = MemStore::new(); - let blobs = BlobsProtocol::new(&store, None); + let tag = store.add_slice(b"Hello world").await?; + + let _ = endpoint.online().await; + let addr = endpoint.node_addr(); + let ticket = BlobTicket::new(addr, tag.hash, tag.format); // build the router + let blobs = BlobsProtocol::new(&store, None); let router = Router::builder(endpoint) - .accept(iroh_blobs::ALPN, blobs.clone()) + .accept(iroh_blobs::ALPN, blobs) .spawn(); - let tag = blobs.add_slice(b"Hello world").await?; - let _ = endpoint.online().await; - let addr = endpoint.node_addr().initialized().await; - let ticket = BlobTicket::new(addr, tag.hash, tag.format); println!("We are now serving {}", ticket); // wait for control-c diff --git a/examples/common/mod.rs b/examples/common/mod.rs index c915d7ef3..08f6c795d 100644 --- a/examples/common/mod.rs +++ b/examples/common/mod.rs @@ -9,13 +9,12 @@ pub fn get_or_generate_secret_key() -> Result { use std::{env, str::FromStr}; use anyhow::Context; - use rand::thread_rng; if let Ok(secret) = env::var("IROH_SECRET") { // Parse the secret key from string SecretKey::from_str(&secret).context("Invalid secret key format") } else { // Generate a new random key - let secret_key = SecretKey::generate(&mut thread_rng()); + let secret_key = SecretKey::generate(&mut rand::rng()); println!( "Generated new secret key: {}", hex::encode(secret_key.to_bytes()) diff --git a/examples/limit.rs b/examples/limit.rs index 0b7837964..e44aeeb70 100644 --- a/examples/limit.rs +++ b/examples/limit.rs @@ -21,7 +21,7 @@ use std::{ use anyhow::Result; use clap::Parser; use common::setup_logging; -use iroh::{protocol::Router, NodeAddr, NodeId, SecretKey, Watcher}; +use iroh::{protocol::Router, NodeAddr, NodeId, SecretKey}; use iroh_blobs::{ provider::events::{ AbortReason, ConnectMode, EventMask, EventSender, ProviderMessage, RequestMode, @@ -31,7 +31,7 @@ use iroh_blobs::{ ticket::BlobTicket, BlobFormat, BlobsProtocol, Hash, }; -use rand::thread_rng; +use rand::rng; use crate::common::get_or_generate_secret_key; @@ -255,7 +255,7 @@ async fn main() -> Result<()> { let mut allowed_nodes = allowed_nodes.into_iter().collect::>(); if secrets > 0 { println!("Generating {secrets} new secret keys for allowed nodes:"); - let mut rand = thread_rng(); + let mut rand = rng(); for _ in 0..secrets { let secret = SecretKey::generate(&mut rand); let public = secret.public(); @@ -357,8 +357,8 @@ async fn setup(store: MemStore, events: EventSender) -> Result<(Router, NodeAddr .secret_key(secret) .bind() .await?; - let _ = endpoint.home_relay().initialized().await; - let addr = endpoint.node_addr().initialized().await; + endpoint.online().await; + let addr = endpoint.node_addr(); let blobs = BlobsProtocol::new(&store, Some(events)); let router = Router::builder(endpoint) .accept(iroh_blobs::ALPN, blobs) diff --git a/examples/mdns-discovery.rs b/examples/mdns-discovery.rs index 045e2b8ea..4266b75af 100644 --- a/examples/mdns-discovery.rs +++ b/examples/mdns-discovery.rs @@ -87,7 +87,7 @@ async fn accept(path: &Path) -> Result<()> { } async fn connect(node_id: PublicKey, hash: Hash, out: Option) -> Result<()> { - let key = SecretKey::generate(rand::rngs::OsRng); + let key = SecretKey::generate(&mut rand::rng()); // todo: disable discovery publishing once https://github.com/n0-computer/iroh/issues/3401 is implemented let discovery = MdnsDiscovery::builder(); diff --git a/examples/random_store.rs b/examples/random_store.rs index ea19baf4f..7d9233f30 100644 --- a/examples/random_store.rs +++ b/examples/random_store.rs @@ -2,7 +2,7 @@ use std::{env, path::PathBuf, str::FromStr}; use anyhow::{Context, Result}; use clap::{Parser, Subcommand}; -use iroh::{SecretKey, Watcher}; +use iroh::{discovery::static_provider::StaticProvider, SecretKey}; use iroh_base::ticket::NodeTicket; use iroh_blobs::{ api::downloader::Shuffled, @@ -93,7 +93,7 @@ pub fn get_or_generate_secret_key() -> Result { SecretKey::from_str(&secret).context("Invalid secret key format") } else { // Generate a new random key - let secret_key = SecretKey::generate(&mut rand::thread_rng()); + let secret_key = SecretKey::generate(&mut rand::rng()); let secret_key_str = hex::encode(secret_key.to_bytes()); println!("Generated new random secret key"); println!("To reuse this key, set the IROH_SECRET={secret_key_str}"); @@ -204,12 +204,12 @@ async fn provide(args: ProvideArgs) -> anyhow::Result<()> { println!("Using store at: {}", path.display()); let mut rng = match args.common.seed { Some(seed) => StdRng::seed_from_u64(seed), - None => StdRng::from_entropy(), + None => StdRng::from_rng(&mut rand::rng()), }; let blobs = create_random_blobs( &store, args.num_blobs, - |_, rand| rand.gen_range(1..=args.blob_size), + |_, rand| rand.random_range(1..=args.blob_size), &mut rng, ) .await?; @@ -217,7 +217,7 @@ async fn provide(args: ProvideArgs) -> anyhow::Result<()> { &store, &blobs, args.hash_seqs, - |_, rand| rand.gen_range(1..=args.hash_seq_size), + |_, rand| rand.random_range(1..=args.hash_seq_size), &mut rng, ) .await?; @@ -242,7 +242,7 @@ async fn provide(args: ProvideArgs) -> anyhow::Result<()> { let router = iroh::protocol::Router::builder(endpoint.clone()) .accept(iroh_blobs::ALPN, blobs) .spawn(); - let addr = router.endpoint().node_addr().initialized().await; + let addr = router.endpoint().node_addr(); let ticket = NodeTicket::from(addr.clone()); println!("Node address: {addr:?}"); println!("ticket:\n{ticket}"); @@ -265,10 +265,14 @@ async fn request(args: RequestArgs) -> anyhow::Result<()> { .unwrap_or_else(|| tempdir.as_ref().unwrap().path().to_path_buf()); let store = FsStore::load(&path).await?; println!("Using store at: {}", path.display()); - let endpoint = iroh::Endpoint::builder().bind().await?; + let sp = StaticProvider::new(); + let endpoint = iroh::Endpoint::builder() + .discovery(sp.clone()) + .bind() + .await?; let downloader = store.downloader(&endpoint); for ticket in &args.nodes { - endpoint.add_node_addr(ticket.node_addr().clone())?; + sp.add_node_info(ticket.node_addr().clone()); } let nodes = args .nodes diff --git a/examples/transfer-collection.rs b/examples/transfer-collection.rs index d935d59e8..506a95ea0 100644 --- a/examples/transfer-collection.rs +++ b/examples/transfer-collection.rs @@ -8,9 +8,7 @@ use std::collections::HashMap; use anyhow::{Context, Result}; -use iroh::{ - discovery::static_provider::StaticProvider, protocol::Router, Endpoint, NodeAddr, Watcher, -}; +use iroh::{discovery::static_provider::StaticProvider, protocol::Router, Endpoint, NodeAddr}; use iroh_blobs::{ api::{downloader::Shuffled, Store, TempTag}, format::collection::Collection, @@ -54,7 +52,8 @@ impl Node { // get address of this node. Has the side effect of waiting for the node // to be online & ready to accept connections async fn node_addr(&self) -> Result { - let addr = self.router.endpoint().node_addr().initialized().await; + self.router.endpoint().online().await; + let addr = self.router.endpoint().node_addr(); Ok(addr) } diff --git a/proptest-regressions/store/fs/util/entity_manager.txt b/proptest-regressions/store/fs/util/entity_manager.txt index 94b6aa63c..7d4e8e8f3 100644 --- a/proptest-regressions/store/fs/util/entity_manager.txt +++ b/proptest-regressions/store/fs/util/entity_manager.txt @@ -5,3 +5,4 @@ # It is recommended to check this file in to source control so that # everyone who runs the test benefits from these saved cases. cc 0f2ebc49ab2f84e112f08407bb94654fbcb1f19050a4a8a6196383557696438a # shrinks to input = _TestCountersManagerProptestFsArgs { entries: [(15313427648878534792, 264348813928009031854006459208395772047), (1642534478798447378, 15989109311941500072752977306696275871), (8755041673862065815, 172763711808688570294350362332402629716), (4993597758667891804, 114145440157220458287429360639759690928), (15031383154962489250, 63217081714858286463391060323168548783), (17668469631267503333, 11878544422669770587175118199598836678), (10507570291819955314, 126584081645379643144412921692654648228), (3979008599365278329, 283717221942996985486273080647433218905), (8316838360288996639, 334043288511621783152802090833905919408), (15673798930962474157, 77551315511802713260542200115027244708), (12058791254144360414, 56638044274259821850511200885092637649), (8191628769638031337, 314181956273420400069887649110740549194), (6290369460137232066, 255779791286732775990301011955519176773), (11919824746661852269, 319400891587146831511371932480749645441), (12491631698789073154, 271279849791970841069522263758329847554), (53891048909263304, 12061234604041487609497959407391945555), (9486366498650667097, 311383186592430597410801882015456718030), (15696332331789302593, 306911490707714340526403119780178604150), (8699088947997536151, 312272624973367009520183311568498652066), (1144772544750976199, 200591877747619565555594857038887015), (5907208586200645081, 299942008952473970881666769409865744975), (3384528743842518913, 26230956866762934113564101494944411446), (13877357832690956494, 229457597607752760006918374695475345151), (2965687966026226090, 306489188264741716662410004273408761623), (13624286905717143613, 232801392956394366686194314010536008033), (3622356130274722018, 162030840677521022192355139208505458492), (17807768575470996347, 264107246314713159406963697924105744409), (5103434150074147746, 331686166459964582006209321975587627262), (5962771466034321974, 300961804728115777587520888809168362574), (2930645694242691907, 127752709774252686733969795258447263979), (16197574560597474644, 245410120683069493317132088266217906749), (12478835478062365617, 103838791113879912161511798836229961653), (5503595333662805357, 92368472243854403026472376408708548349), (18122734335129614364, 288955542597300001147753560885976966029), (12688080215989274550, 85237436689682348751672119832134138932), (4148468277722853958, 297778117327421209654837771300216669574), (8749445804640085302, 79595866493078234154562014325793780126), (12442730869682574563, 196176786402808588883611974143577417817), (6110644747049355904, 26592587989877021920275416199052685135), (5851164380497779369, 158876888501825038083692899057819261957), (9497384378514985275, 15279835675313542048650599472403150097), (10661092311826161857, 250089949043892591422587928179995867509), (10046856000675345423, 231369150063141386398059701278066296663)] } +cc 76888f93675aca856046821142e0f8dd6171ecbca2b2fb2612e2ccf8fb642b67 # shrinks to input = _TestCountersManagerProptestFsArgs { entries: [(4306300120905349883, 44028232064888275756989554345798606606), (13419562989696853297, 297225061196384743010175600480992461777), (4600545388725048575, 319024777944692442173521074338932622027), (11924469201417769946, 290126334103578499810346516670302802842), (2150076364877215359, 213957508179788124392023233632127334025), (2513497990495955776, 7425952384271563468605443743299630055), (14784519504379667574, 209102176380410663068514976101053847121), (3589018664409806533, 143539073128281654988615675279132949539), (12163255676316221910, 68261431317828245529088264283730310447), (15953238975034584216, 120566915371382433441278003421157478859), (6293912069208757821, 54376221216199661139416453798278484358), (18408187014091379100, 160227239986709222921681152272167766516), (18224691851384849998, 230951397761410506492316028434133464542), (17218108759165771012, 230831401271946284847544140042531898300), (15156861699203125197, 274419864858876512298091294679889505416), (13197866550741263112, 317569618673855709115791823801131083319), (5457536710317675425, 264100465594513117047187960359952352601), (6419381816113193473, 97830434597410923324208428511886405696), (5509774606527762921, 51377792339839665748346223023626770993), (3302884055341784375, 260024947302198645578544387819129813215), (7918740211035003255, 281378863798916751001154282897883115117), (2107923747770684554, 4222310695795814822585776810386837522), (1988849030739458584, 97044202427348897203209230721452399078), (17000851872752693509, 154967569583821344066124364203881263442), (7204118357407989275, 293489743217018103289756063378018736213), (8379490247240411923, 91291993991616380545421710143276496062), (6067846780114877285, 117378294706679402333724324394932467070), (6559069473214523762, 330533491611532325905048043451453362184), (1066716766275783661, 14900329515024496203681878322771717089), (3969544049792556621, 299925942970250984690757497097936404520), (1871651009149288279, 269532663769476813929854896620535419927), (9885923542173402939, 332347180744841318697161540487151553089), (8743551960605987234, 82895354018256482956918848969653357161), (18444906840677790884, 140951189435890586485485914583535891710), (13186290687428042898, 156781959554744750775008814037900689629), (11253344694094324994, 173003087909699540403477415680185472166), (15359595929118467798, 334133929399407497923349560480857143925), (450753775453578376, 185062409187456936422223327885008555109), (5812669297982828223, 304450764862712727874277633964000192257), (5446431204912329700, 63591795618582560687940570634859474113), (12639950240321649272, 229465965587199764990249271930115998317), (8666241046976392242, 127169189810538544860066577390902103071), (15875344269296451901, 59314152116324788008302123296358029667), (17554612189790211905, 271354287586940637417955997246049015908), (2654666284440384247, 236192749343056755001648024964710799784), (3653085434641832523, 222611620216912476618464093834705618103), (2117280733558696133, 160273208193736809842040581629127362879), (15052687776534295171, 145937384428000340885721647247111254565), (14037243134892329831, 48648195516567212103580801887048711483), (9467080097152043608, 266945396762492281384357764614500138375), (2706297963598729254, 301505662334146630272416432816290497813), (7293916663622670946, 238683745638275436602208159421396156156), (9244966065396610028, 33307016963739390689548576588029894837), (1752320522681001931, 67331614351445449534791948958610485134), (13095820849418318043, 167220720368084276476264354546008346754), (2689852485877961108, 295988764749889891843145129746265206397), (16677044930197861079, 238123490797857333537723337779861037465), (1921976638111110551, 198905043115016585827638257647548833710), (78362912300221566, 97081461393166374265589962390002181072), (3959569947932321574, 224306094090967444142819090846108416832), (11193248764198058671, 209017727259932159026175830711818202266), (6959892815010617835, 209133472960436703368896187256879102139), (10121904169365490638, 120711360828413383714152810706442997143), (15460955954420808897, 303801388017089859688481259123309944609)] } diff --git a/src/api/downloader.rs b/src/api/downloader.rs index 82cef8393..4a5a25dd6 100644 --- a/src/api/downloader.rs +++ b/src/api/downloader.rs @@ -515,7 +515,7 @@ impl Shuffled { impl ContentDiscovery for Shuffled { fn find_providers(&self, _: HashAndFormat) -> n0_future::stream::Boxed { let mut nodes = self.nodes.clone(); - nodes.shuffle(&mut rand::thread_rng()); + nodes.shuffle(&mut rand::rng()); n0_future::stream::iter(nodes).boxed() } } @@ -526,7 +526,6 @@ mod tests { use std::ops::Deref; use bao_tree::ChunkRanges; - use iroh::Watcher; use n0_future::StreamExt; use testresult::TestResult; @@ -544,18 +543,18 @@ mod tests { #[ignore = "todo"] async fn downloader_get_many_smoke() -> TestResult<()> { let testdir = tempfile::tempdir()?; - let (r1, store1, _) = node_test_setup_fs(testdir.path().join("a")).await?; - let (r2, store2, _) = node_test_setup_fs(testdir.path().join("b")).await?; - let (r3, store3, _) = node_test_setup_fs(testdir.path().join("c")).await?; + let (r1, store1, _, _) = node_test_setup_fs(testdir.path().join("a")).await?; + let (r2, store2, _, _) = node_test_setup_fs(testdir.path().join("b")).await?; + let (r3, store3, _, sp3) = node_test_setup_fs(testdir.path().join("c")).await?; let tt1 = store1.add_slice("hello world").await?; let tt2 = store2.add_slice("hello world 2").await?; - let node1_addr = r1.endpoint().node_addr().initialized().await; + let node1_addr = r1.endpoint().node_addr(); let node1_id = node1_addr.node_id; - let node2_addr = r2.endpoint().node_addr().initialized().await; + let node2_addr = r2.endpoint().node_addr(); let node2_id = node2_addr.node_id; let swarm = Downloader::new(&store3, r3.endpoint()); - r3.endpoint().add_node_addr(node1_addr.clone())?; - r3.endpoint().add_node_addr(node2_addr.clone())?; + sp3.add_node_info(node1_addr.clone()); + sp3.add_node_info(node2_addr.clone()); let request = GetManyRequest::builder() .hash(tt1.hash, ChunkRanges::all()) .hash(tt2.hash, ChunkRanges::all()) @@ -574,9 +573,9 @@ mod tests { async fn downloader_get_smoke() -> TestResult<()> { // tracing_subscriber::fmt::try_init().ok(); let testdir = tempfile::tempdir()?; - let (r1, store1, _) = node_test_setup_fs(testdir.path().join("a")).await?; - let (r2, store2, _) = node_test_setup_fs(testdir.path().join("b")).await?; - let (r3, store3, _) = node_test_setup_fs(testdir.path().join("c")).await?; + let (r1, store1, _, _) = node_test_setup_fs(testdir.path().join("a")).await?; + let (r2, store2, _, _) = node_test_setup_fs(testdir.path().join("b")).await?; + let (r3, store3, _, sp3) = node_test_setup_fs(testdir.path().join("c")).await?; let tt1 = store1.add_slice(vec![1; 10000000]).await?; let tt2 = store2.add_slice(vec![2; 10000000]).await?; let hs = [tt1.hash, tt2.hash].into_iter().collect::(); @@ -586,13 +585,13 @@ mod tests { format: crate::BlobFormat::HashSeq, }) .await?; - let node1_addr = r1.endpoint().node_addr().initialized().await; + let node1_addr = r1.endpoint().node_addr(); let node1_id = node1_addr.node_id; - let node2_addr = r2.endpoint().node_addr().initialized().await; + let node2_addr = r2.endpoint().node_addr(); let node2_id = node2_addr.node_id; let swarm = Downloader::new(&store3, r3.endpoint()); - r3.endpoint().add_node_addr(node1_addr.clone())?; - r3.endpoint().add_node_addr(node2_addr.clone())?; + sp3.add_node_info(node1_addr.clone()); + sp3.add_node_info(node2_addr.clone()); let request = GetRequest::builder() .root(ChunkRanges::all()) .next(ChunkRanges::all()) @@ -641,9 +640,9 @@ mod tests { #[tokio::test] async fn downloader_get_all() -> TestResult<()> { let testdir = tempfile::tempdir()?; - let (r1, store1, _) = node_test_setup_fs(testdir.path().join("a")).await?; - let (r2, store2, _) = node_test_setup_fs(testdir.path().join("b")).await?; - let (r3, store3, _) = node_test_setup_fs(testdir.path().join("c")).await?; + let (r1, store1, _, _) = node_test_setup_fs(testdir.path().join("a")).await?; + let (r2, store2, _, _) = node_test_setup_fs(testdir.path().join("b")).await?; + let (r3, store3, _, sp3) = node_test_setup_fs(testdir.path().join("c")).await?; let tt1 = store1.add_slice(vec![1; 10000000]).await?; let tt2 = store2.add_slice(vec![2; 10000000]).await?; let hs = [tt1.hash, tt2.hash].into_iter().collect::(); @@ -653,13 +652,13 @@ mod tests { format: crate::BlobFormat::HashSeq, }) .await?; - let node1_addr = r1.endpoint().node_addr().initialized().await; + let node1_addr = r1.endpoint().node_addr(); let node1_id = node1_addr.node_id; - let node2_addr = r2.endpoint().node_addr().initialized().await; + let node2_addr = r2.endpoint().node_addr(); let node2_id = node2_addr.node_id; let swarm = Downloader::new(&store3, r3.endpoint()); - r3.endpoint().add_node_addr(node1_addr.clone())?; - r3.endpoint().add_node_addr(node2_addr.clone())?; + sp3.add_node_info(node1_addr.clone()); + sp3.add_node_info(node2_addr.clone()); let request = GetRequest::all(root.hash); let mut progress = swarm .download_with_opts(DownloadOptions::new( diff --git a/src/get/request.rs b/src/get/request.rs index c1dc034d3..e55235cca 100644 --- a/src/get/request.rs +++ b/src/get/request.rs @@ -323,7 +323,7 @@ pub fn random_hash_seq_ranges(sizes: &[u64], mut rng: impl Rng) -> ChunkRangesSe .iter() .map(|size| ChunkNum::full_chunks(*size).0) .sum::(); - let random_chunk = rng.gen_range(0..total_chunks); + let random_chunk = rng.random_range(0..total_chunks); let mut remaining = random_chunk; let mut ranges = vec![]; ranges.push(ChunkRanges::empty()); diff --git a/src/net_protocol.rs b/src/net_protocol.rs index 18ae31c00..c6abc1f0e 100644 --- a/src/net_protocol.rs +++ b/src/net_protocol.rs @@ -7,7 +7,7 @@ //! ```rust //! # async fn example() -> anyhow::Result<()> { //! use iroh::{protocol::Router, Endpoint}; -//! use iroh_blobs::{store, BlobsProtocol}; +//! use iroh_blobs::{store, ticket::BlobTicket, BlobsProtocol}; //! //! // create a store //! let store = store::fs::FsStore::load("blobs").await?; @@ -17,19 +17,19 @@ //! //! // create an iroh endpoint //! let endpoint = Endpoint::builder().discovery_n0().bind().await?; +//! endpoint.online().await; +//! let addr = endpoint.node_addr(); //! //! // create a blobs protocol handler //! let blobs = BlobsProtocol::new(&store, None); //! //! // create a router and add the blobs protocol handler //! let router = Router::builder(endpoint) -//! .accept(iroh_blobs::ALPN, blobs.clone()) +//! .accept(iroh_blobs::ALPN, blobs) //! .spawn(); //! -//! endpoint.online().await; -//! let addr = endpoint.node_addr().initialized().await; //! // this data is now globally available using the ticket -//! let ticket = BlobTicket::new(addr, t.hash, t.format).await?; +//! let ticket = BlobTicket::new(addr, t.hash, t.format); //! println!("ticket: {}", ticket); //! //! // wait for control-c to exit diff --git a/src/store/fs.rs b/src/store/fs.rs index f2a4ce20f..8bf43f3d3 100644 --- a/src/store/fs.rs +++ b/src/store/fs.rs @@ -157,7 +157,7 @@ const MAX_EXTERNAL_PATHS: usize = 8; /// Create a 16 byte unique ID. fn new_uuid() -> [u8; 16] { use rand::RngCore; - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mut bytes = [0u8; 16]; rng.fill_bytes(&mut bytes); bytes diff --git a/src/test.rs b/src/test.rs index c0760a088..3ecb1c87a 100644 --- a/src/test.rs +++ b/src/test.rs @@ -17,7 +17,7 @@ pub async fn create_random_blobs( ) -> anyhow::Result> { // generate sizes and seeds, non-parrallelized so it is deterministic let sizes = (0..num_blobs) - .map(|n| (blob_size(n, &mut rand), rand.r#gen::())) + .map(|n| (blob_size(n, &mut rand), rand.random::())) .collect::>(); // generate random data and add it to the store let infos = stream::iter(sizes) @@ -45,7 +45,7 @@ pub async fn add_hash_sequences( let size = seq_size(n, &mut rand); let hs = (0..size) .map(|_| { - let j = rand.gen_range(0..tags.len()); + let j = rand.random_range(0..tags.len()); tags[j].hash }) .collect::(); diff --git a/src/tests.rs b/src/tests.rs index 651515e38..d5ec46f86 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -2,7 +2,7 @@ use std::{collections::HashSet, io, ops::Range, path::PathBuf}; use bao_tree::ChunkRanges; use bytes::Bytes; -use iroh::{protocol::Router, Endpoint, NodeId, Watcher}; +use iroh::{discovery::static_provider::StaticProvider, protocol::Router, Endpoint, NodeId}; use irpc::RpcMessage; use n0_future::{task::AbortOnDropHandle, StreamExt}; use tempfile::TempDir; @@ -226,7 +226,7 @@ async fn two_nodes_get_blobs( for size in sizes { tts.push(store1.add_bytes(test_data(size)).await?); } - let addr1 = r1.endpoint().node_addr().initialized().await; + let addr1 = r1.endpoint().node_addr(); let conn = r2.endpoint().connect(addr1, crate::ALPN).await?; for size in sizes { let hash = Hash::new(test_data(size)); @@ -259,7 +259,7 @@ async fn two_nodes_observe( let size = 1024 * 1024 * 8 + 1; let data = test_data(size); let (hash, bao) = create_n0_bao(&data, &ChunkRanges::all())?; - let addr1 = r1.endpoint().node_addr().initialized().await; + let addr1 = r1.endpoint().node_addr(); let conn = r2.endpoint().connect(addr1, crate::ALPN).await?; let mut stream = store2 .remote() @@ -308,7 +308,7 @@ async fn two_nodes_get_many( tts.push(store1.add_bytes(test_data(size)).await?); } let hashes = tts.iter().map(|tt| tt.hash).collect::>(); - let addr1 = r1.endpoint().node_addr().initialized().await; + let addr1 = r1.endpoint().node_addr(); let conn = r2.endpoint().connect(addr1, crate::ALPN).await?; store2 .remote() @@ -385,7 +385,7 @@ async fn two_nodes_push_blobs( for size in sizes { tts.push(store1.add_bytes(test_data(size)).await?); } - let addr2 = r2.endpoint().node_addr().initialized().await; + let addr2 = r2.endpoint().node_addr(); let conn = r1.endpoint().connect(addr2, crate::ALPN).await?; for size in sizes { let hash = Hash::new(test_data(size)); @@ -410,19 +410,23 @@ async fn two_nodes_push_blobs( async fn two_nodes_push_blobs_fs() -> TestResult<()> { tracing_subscriber::fmt::try_init().ok(); let testdir = tempfile::tempdir()?; - let (r1, store1, _) = node_test_setup_fs(testdir.path().join("a")).await?; + let (r1, store1, _, sp1) = node_test_setup_fs(testdir.path().join("a")).await?; let (events_tx, count_rx, _task) = event_handler([r1.endpoint().node_id()]); - let (r2, store2, _) = + let (r2, store2, _, sp2) = node_test_setup_with_events_fs(testdir.path().join("b"), events_tx).await?; + sp1.add_node_info(r2.endpoint().node_addr()); + sp2.add_node_info(r1.endpoint().node_addr()); two_nodes_push_blobs(r1, &store1, r2, &store2, count_rx).await } #[tokio::test] async fn two_nodes_push_blobs_mem() -> TestResult<()> { tracing_subscriber::fmt::try_init().ok(); - let (r1, store1) = node_test_setup_mem().await?; + let (r1, store1, sp1) = node_test_setup_mem().await?; let (events_tx, count_rx, _task) = event_handler([r1.endpoint().node_id()]); - let (r2, store2) = node_test_setup_with_events_mem(events_tx).await?; + let (r2, store2, sp2) = node_test_setup_with_events_mem(events_tx).await?; + sp1.add_node_info(r2.endpoint().node_addr()); + sp2.add_node_info(r1.endpoint().node_addr()); two_nodes_push_blobs(r1, &store1, r2, &store2, count_rx).await } @@ -484,39 +488,40 @@ async fn check_presence(store: &Store, sizes: &[usize]) -> TestResult<()> { Ok(()) } -pub async fn node_test_setup_fs(db_path: PathBuf) -> TestResult<(Router, FsStore, PathBuf)> { +pub async fn node_test_setup_fs( + db_path: PathBuf, +) -> TestResult<(Router, FsStore, PathBuf, StaticProvider)> { node_test_setup_with_events_fs(db_path, EventSender::DEFAULT).await } pub async fn node_test_setup_with_events_fs( db_path: PathBuf, events: EventSender, -) -> TestResult<(Router, FsStore, PathBuf)> { +) -> TestResult<(Router, FsStore, PathBuf, StaticProvider)> { let store = crate::store::fs::FsStore::load(&db_path).await?; - let ep = Endpoint::builder().bind().await?; + let sp = StaticProvider::new(); + let ep = Endpoint::builder().discovery(sp.clone()).bind().await?; let blobs = BlobsProtocol::new(&store, Some(events)); let router = Router::builder(ep).accept(crate::ALPN, blobs).spawn(); - Ok((router, store, db_path)) + Ok((router, store, db_path, sp)) } -pub async fn node_test_setup_mem() -> TestResult<(Router, MemStore)> { +pub async fn node_test_setup_mem() -> TestResult<(Router, MemStore, StaticProvider)> { node_test_setup_with_events_mem(EventSender::DEFAULT).await } pub async fn node_test_setup_with_events_mem( events: EventSender, -) -> TestResult<(Router, MemStore)> { +) -> TestResult<(Router, MemStore, StaticProvider)> { let store = MemStore::new(); - let ep = Endpoint::builder().bind().await?; + let sp = StaticProvider::new(); + let ep = Endpoint::builder().discovery(sp.clone()).bind().await?; let blobs = BlobsProtocol::new(&store, Some(events)); let router = Router::builder(ep).accept(crate::ALPN, blobs).spawn(); - Ok((router, store)) + Ok((router, store, sp)) } /// Sets up two nodes with a router and a blob store each. -/// -/// Note that this does not configure discovery, so nodes will only find each other -/// with full node addresses, not just node ids! async fn two_node_test_setup_fs() -> TestResult<( TempDir, (Router, FsStore, PathBuf), @@ -525,11 +530,11 @@ async fn two_node_test_setup_fs() -> TestResult<( let testdir = tempfile::tempdir().unwrap(); let db1_path = testdir.path().join("db1"); let db2_path = testdir.path().join("db2"); - Ok(( - testdir, - node_test_setup_fs(db1_path).await?, - node_test_setup_fs(db2_path).await?, - )) + let (r1, store1, p1, sp1) = node_test_setup_fs(db1_path).await?; + let (r2, store2, p2, sp2) = node_test_setup_fs(db2_path).await?; + sp1.add_node_info(r2.endpoint().node_addr()); + sp2.add_node_info(r1.endpoint().node_addr()); + Ok((testdir, (r1, store1, p1), (r2, store2, p2))) } /// Sets up two nodes with a router and a blob store each. @@ -537,7 +542,11 @@ async fn two_node_test_setup_fs() -> TestResult<( /// Note that this does not configure discovery, so nodes will only find each other /// with full node addresses, not just node ids! async fn two_node_test_setup_mem() -> TestResult<((Router, MemStore), (Router, MemStore))> { - Ok((node_test_setup_mem().await?, node_test_setup_mem().await?)) + let (r1, store1, sp1) = node_test_setup_mem().await?; + let (r2, store2, sp2) = node_test_setup_mem().await?; + sp1.add_node_info(r2.endpoint().node_addr()); + sp2.add_node_info(r1.endpoint().node_addr()); + Ok(((r1, store1), (r2, store2))) } async fn two_nodes_hash_seq( @@ -546,7 +555,7 @@ async fn two_nodes_hash_seq( r2: Router, store2: &Store, ) -> TestResult<()> { - let addr1 = r1.endpoint().node_addr().initialized().await; + let addr1 = r1.endpoint().node_addr(); let sizes = INTERESTING_SIZES; let root = add_test_hash_seq(store1, sizes).await?; let conn = r2.endpoint().connect(addr1, crate::ALPN).await?; @@ -574,7 +583,7 @@ async fn two_nodes_hash_seq_mem() -> TestResult<()> { async fn two_nodes_hash_seq_progress() -> TestResult<()> { tracing_subscriber::fmt::try_init().ok(); let (_testdir, (r1, store1, _), (r2, store2, _)) = two_node_test_setup_fs().await?; - let addr1 = r1.endpoint().node_addr().initialized().await; + let addr1 = r1.endpoint().node_addr(); let sizes = INTERESTING_SIZES; let root = add_test_hash_seq(&store1, sizes).await?; let conn = r2.endpoint().connect(addr1, crate::ALPN).await?; @@ -608,7 +617,7 @@ async fn node_serve_hash_seq() -> TestResult<()> { let r1 = Router::builder(endpoint) .accept(crate::protocol::ALPN, blobs) .spawn(); - let addr1 = r1.endpoint().node_addr().initialized().await; + let addr1 = r1.endpoint().node_addr(); info!("node addr: {addr1:?}"); let endpoint2 = Endpoint::builder().discovery_n0().bind().await?; let conn = endpoint2.connect(addr1, crate::protocol::ALPN).await?; @@ -639,7 +648,7 @@ async fn node_serve_blobs() -> TestResult<()> { let r1 = Router::builder(endpoint) .accept(crate::protocol::ALPN, blobs) .spawn(); - let addr1 = r1.endpoint().node_addr().initialized().await; + let addr1 = r1.endpoint().node_addr(); info!("node addr: {addr1:?}"); let endpoint2 = Endpoint::builder().discovery_n0().bind().await?; let conn = endpoint2.connect(addr1, crate::protocol::ALPN).await?; @@ -679,7 +688,7 @@ async fn node_smoke(store: &Store) -> TestResult<()> { let r1 = Router::builder(endpoint) .accept(crate::protocol::ALPN, blobs) .spawn(); - let addr1 = r1.endpoint().node_addr().initialized().await; + let addr1 = r1.endpoint().node_addr(); info!("node addr: {addr1:?}"); let endpoint2 = Endpoint::builder().discovery_n0().bind().await?; let conn = endpoint2.connect(addr1, crate::protocol::ALPN).await?; diff --git a/src/ticket.rs b/src/ticket.rs index 6cbb5b24d..9517c5c92 100644 --- a/src/ticket.rs +++ b/src/ticket.rs @@ -176,7 +176,7 @@ mod tests { fn make_ticket() -> BlobTicket { let hash = Hash::new(b"hi there"); - let peer = SecretKey::generate(rand::thread_rng()).public(); + let peer = SecretKey::generate(&mut rand::rng()).public(); let addr = SocketAddr::from_str("127.0.0.1:1234").unwrap(); let relay_url = None; BlobTicket { diff --git a/src/util/connection_pool.rs b/src/util/connection_pool.rs index 68b1476ff..33632b810 100644 --- a/src/util/connection_pool.rs +++ b/src/util/connection_pool.rs @@ -596,8 +596,8 @@ mod tests { .alpns(vec![ECHO_ALPN.to_vec()]) .bind() .await?; - endpoint.home_relay().initialized().await; - let addr = endpoint.node_addr().initialized().await; + endpoint.online().await; + let addr = endpoint.node_addr(); let router = iroh::protocol::Router::builder(endpoint) .accept(ECHO_ALPN, Echo) .spawn();