From 373ea6755848effc20711513d66f13b9d3c283ae Mon Sep 17 00:00:00 2001 From: aidan46 Date: Mon, 20 Jan 2025 13:18:24 +0800 Subject: [PATCH 1/8] feat: Add re-registration on expiry for p2p node --- storage-provider/server/src/p2p/mod.rs | 1 + storage-provider/server/src/p2p/register.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/storage-provider/server/src/p2p/mod.rs b/storage-provider/server/src/p2p/mod.rs index 83814adac..8b11a07b6 100644 --- a/storage-provider/server/src/p2p/mod.rs +++ b/storage-provider/server/src/p2p/mod.rs @@ -15,6 +15,7 @@ pub(crate) use bootstrap::BootstrapConfig; pub(crate) use register::RegisterConfig; const P2P_NAMESPACE: &str = "polka-storage"; +const TTL_24_HOURS: u64 = 86400; #[derive(Default, Debug, Clone, Copy, ValueEnum, Deserialize)] #[serde(rename_all = "lowercase")] diff --git a/storage-provider/server/src/p2p/register.rs b/storage-provider/server/src/p2p/register.rs index 4c809e2cd..a372d423e 100644 --- a/storage-provider/server/src/p2p/register.rs +++ b/storage-provider/server/src/p2p/register.rs @@ -10,6 +10,7 @@ use libp2p::{ use tokio::time::Duration; use super::P2PError; +use crate::p2p::TTL_24_HOURS; #[derive(NetworkBehaviour)] pub struct RegisterBehaviour { From d4b0ad1442a514fc247875263c72927bf36c6f44 Mon Sep 17 00:00:00 2001 From: aidan46 Date: Tue, 21 Jan 2025 18:05:24 +0800 Subject: [PATCH 2/8] fix: Registration ttl default --- storage-provider/server/src/p2p/mod.rs | 1 - storage-provider/server/src/p2p/register.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/storage-provider/server/src/p2p/mod.rs b/storage-provider/server/src/p2p/mod.rs index 8b11a07b6..83814adac 100644 --- a/storage-provider/server/src/p2p/mod.rs +++ b/storage-provider/server/src/p2p/mod.rs @@ -15,7 +15,6 @@ pub(crate) use bootstrap::BootstrapConfig; pub(crate) use register::RegisterConfig; const P2P_NAMESPACE: &str = "polka-storage"; -const TTL_24_HOURS: u64 = 86400; #[derive(Default, Debug, Clone, Copy, ValueEnum, Deserialize)] #[serde(rename_all = "lowercase")] diff --git a/storage-provider/server/src/p2p/register.rs b/storage-provider/server/src/p2p/register.rs index a372d423e..4c809e2cd 100644 --- a/storage-provider/server/src/p2p/register.rs +++ b/storage-provider/server/src/p2p/register.rs @@ -10,7 +10,6 @@ use libp2p::{ use tokio::time::Duration; use super::P2PError; -use crate::p2p::TTL_24_HOURS; #[derive(NetworkBehaviour)] pub struct RegisterBehaviour { From ec7beeca6b54c51f0212e0e9372babc0d5d6c852 Mon Sep 17 00:00:00 2001 From: aidan46 Date: Thu, 23 Jan 2025 13:01:42 +0800 Subject: [PATCH 3/8] fix: Cancellation tracker in p2p node --- storage-provider/server/src/p2p/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/storage-provider/server/src/p2p/mod.rs b/storage-provider/server/src/p2p/mod.rs index 83814adac..5a8621538 100644 --- a/storage-provider/server/src/p2p/mod.rs +++ b/storage-provider/server/src/p2p/mod.rs @@ -127,6 +127,8 @@ pub async fn run_bootstrap_node( }, _ = token.cancelled() => { tracing::info!("P2P node has been stopped by the cancellation token..."); + tracker.close(); + tracker.wait().await; }, } @@ -160,6 +162,8 @@ pub async fn run_register_node( }, _ = token.cancelled() => { tracing::info!("P2P node has been stopped by the cancellation token..."); + tracker.close(); + tracker.wait().await; }, } From 791f916c29204603edc58c81346eb2648f851b22 Mon Sep 17 00:00:00 2001 From: aidan46 Date: Tue, 21 Jan 2025 17:40:59 +0800 Subject: [PATCH 4/8] feat: Add peer discovery example --- Cargo.lock | 12 +++ Cargo.toml | 1 + peer-resolver/Cargo.toml | 19 ++++ peer-resolver/src/main.rs | 121 +++++++++++++++++++++++++ storage-provider/server/src/p2p/mod.rs | 4 - 5 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 peer-resolver/Cargo.toml create mode 100644 peer-resolver/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index f3450caad..8a238f833 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13587,6 +13587,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" +[[package]] +name = "peer-resolver" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "libp2p 0.54.1", + "tokio", + "tracing", + "tracing-subscriber 0.3.19", +] + [[package]] name = "pem" version = "1.1.1" diff --git a/Cargo.toml b/Cargo.toml index d3b18cc73..e53b92105 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ members = [ "pallets/proofs", "pallets/randomness", "pallets/storage-provider", + "peer-resolver", "primitives", "runtime", "storage-provider/client", diff --git a/peer-resolver/Cargo.toml b/peer-resolver/Cargo.toml new file mode 100644 index 000000000..bc80db146 --- /dev/null +++ b/peer-resolver/Cargo.toml @@ -0,0 +1,19 @@ +[package] +authors.workspace = true +edition.workspace = true +homepage.workspace = true +license-file.workspace = true +name = "peer-resolver" +repository.workspace = true +version = "0.1.0" + +[dependencies] +anyhow.workspace = true +clap = { workspace = true, features = ["derive"] } +libp2p = { workspace = true, features = ["identify", "macros", "noise", "rendezvous", "tcp", "tokio", "yamux"] } +tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } +tracing.workspace = true +tracing-subscriber = { workspace = true, features = ["env-filter"] } + +[lints] +workspace = true diff --git a/peer-resolver/src/main.rs b/peer-resolver/src/main.rs new file mode 100644 index 000000000..ed2af18e2 --- /dev/null +++ b/peer-resolver/src/main.rs @@ -0,0 +1,121 @@ +use std::time::Duration; + +use anyhow::{bail, Result}; +use clap::Parser; +use libp2p::{ + futures::StreamExt, + noise, + rendezvous::client::{Behaviour, Event}, + swarm::SwarmEvent, + tcp, yamux, Multiaddr, PeerId, Swarm, SwarmBuilder, +}; +use tracing_subscriber::EnvFilter; + +#[derive(Debug)] +struct PeerInfo { + peer_id: PeerId, + multiaddresses: Vec, +} + +#[derive(Parser)] +struct Cli { + /// Peer ID to resolve + #[arg(long)] + peer_id: PeerId, + + /// Rendezvous point address of the bootstrap node + #[arg(long)] + rendezvous_point_address: Multiaddr, + + /// PeerID of the bootstrap node + #[arg(long)] + rendezvous_point: PeerId, +} + +fn create_swarm() -> Result> { + Ok(SwarmBuilder::with_new_identity() + .with_tokio() + .with_tcp( + tcp::Config::default(), + noise::Config::new, + yamux::Config::default, + )? + .with_behaviour(|key| Behaviour::new(key.clone()))? + .with_swarm_config(|cfg| cfg.with_idle_connection_timeout(Duration::from_secs(10))) + .build()) +} + +async fn discover( + swarm: &mut Swarm, + peer_id_to_find: PeerId, + rendezvous_point_address: Multiaddr, + rendezvous_point: PeerId, +) -> Result { + // Dial in to the rendezvous point. + swarm.dial(rendezvous_point_address)?; + + loop { + match swarm.select_next_some().await { + SwarmEvent::ConnectionEstablished { peer_id, .. } => { + if peer_id == rendezvous_point { + tracing::info!("Connection established with rendezvous point {}", peer_id); + tracing::info!("Connected to rendezvous point, discovering nodes..."); + + // Requesting rendezvous point for peer discovery + swarm + .behaviour_mut() + .discover(None, None, None, rendezvous_point); + } + } + // Received discovered event from the rendezvous point + SwarmEvent::Behaviour(Event::Discovered { registrations, .. }) => { + // Check registrations + for registration in ®istrations { + // Get peer ID from the registration record + let peer_id = registration.record.peer_id(); + // skip self + if &peer_id == swarm.local_peer_id() { + continue; + } + if peer_id == peer_id_to_find { + return Ok(PeerInfo { + peer_id, + multiaddresses: registration.record.addresses().to_vec(), + }); + } + } + bail!("No registered multi-addresses found for Peer ID {peer_id_to_find}"); + } + + other => tracing::debug!("Other event: {other:?}"), + } + } +} + +#[tokio::main] +async fn main() -> Result<()> { + let _ = tracing_subscriber::fmt() + .with_env_filter(EnvFilter::from_default_env()) + .try_init(); + let args = Cli::parse(); + + let mut swarm = create_swarm()?; + match discover( + &mut swarm, + args.peer_id, + args.rendezvous_point_address, + args.rendezvous_point, + ) + .await + { + Ok(peer_info) => { + println!("Found peer with Peer ID {}", args.peer_id); + println!("Peer Info:"); + println!("Peer ID: {}", peer_info.peer_id); + println!("Multiaddresses: {:?}", peer_info.multiaddresses); + } + Err(e) => eprintln!("{e}"), + } + + Ok(()) +} diff --git a/storage-provider/server/src/p2p/mod.rs b/storage-provider/server/src/p2p/mod.rs index 5a8621538..83814adac 100644 --- a/storage-provider/server/src/p2p/mod.rs +++ b/storage-provider/server/src/p2p/mod.rs @@ -127,8 +127,6 @@ pub async fn run_bootstrap_node( }, _ = token.cancelled() => { tracing::info!("P2P node has been stopped by the cancellation token..."); - tracker.close(); - tracker.wait().await; }, } @@ -162,8 +160,6 @@ pub async fn run_register_node( }, _ = token.cancelled() => { tracing::info!("P2P node has been stopped by the cancellation token..."); - tracker.close(); - tracker.wait().await; }, } From e845283535bd389c04c2b693e93c5b366932c47a Mon Sep 17 00:00:00 2001 From: aidan46 Date: Mon, 27 Jan 2025 17:59:14 +0800 Subject: [PATCH 5/8] fix: Move peer-resolver into examples folder --- Cargo.toml | 2 +- {peer-resolver => examples/peer-resolver}/Cargo.toml | 0 {peer-resolver => examples/peer-resolver}/src/main.rs | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename {peer-resolver => examples/peer-resolver}/Cargo.toml (100%) rename {peer-resolver => examples/peer-resolver}/src/main.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index e53b92105..e498c416b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ repository = "https://github.com/eigerco/polka-storage" [workspace] members = [ + "examples/peer-resolver", "lib/polka-storage-proofs", "maat", "mater/cli", @@ -17,7 +18,6 @@ members = [ "pallets/proofs", "pallets/randomness", "pallets/storage-provider", - "peer-resolver", "primitives", "runtime", "storage-provider/client", diff --git a/peer-resolver/Cargo.toml b/examples/peer-resolver/Cargo.toml similarity index 100% rename from peer-resolver/Cargo.toml rename to examples/peer-resolver/Cargo.toml diff --git a/peer-resolver/src/main.rs b/examples/peer-resolver/src/main.rs similarity index 100% rename from peer-resolver/src/main.rs rename to examples/peer-resolver/src/main.rs From 7f1be0141948de424c5ae198dae7d245629ab63b Mon Sep 17 00:00:00 2001 From: aidan46 Date: Thu, 30 Jan 2025 10:24:55 +0800 Subject: [PATCH 6/8] fix: Move peer-resolver into client examples --- Cargo.lock | 13 +------------ Cargo.toml | 1 - examples/peer-resolver/Cargo.toml | 19 ------------------- storage-provider/client/Cargo.toml | 3 +++ .../client/examples/peer-resolver.rs | 12 +++++++++++- 5 files changed, 15 insertions(+), 33 deletions(-) delete mode 100644 examples/peer-resolver/Cargo.toml rename examples/peer-resolver/src/main.rs => storage-provider/client/examples/peer-resolver.rs (86%) diff --git a/Cargo.lock b/Cargo.lock index 8a238f833..75f92ef57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13587,18 +13587,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" -[[package]] -name = "peer-resolver" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "libp2p 0.54.1", - "tokio", - "tracing", - "tracing-subscriber 0.3.19", -] - [[package]] name = "pem" version = "1.1.1" @@ -13877,6 +13865,7 @@ dependencies = [ name = "polka-storage-provider-client" version = "0.1.0" dependencies = [ + "anyhow", "async-trait", "bls12_381", "cid 0.11.1", diff --git a/Cargo.toml b/Cargo.toml index e498c416b..d3b18cc73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,6 @@ repository = "https://github.com/eigerco/polka-storage" [workspace] members = [ - "examples/peer-resolver", "lib/polka-storage-proofs", "maat", "mater/cli", diff --git a/examples/peer-resolver/Cargo.toml b/examples/peer-resolver/Cargo.toml deleted file mode 100644 index bc80db146..000000000 --- a/examples/peer-resolver/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -authors.workspace = true -edition.workspace = true -homepage.workspace = true -license-file.workspace = true -name = "peer-resolver" -repository.workspace = true -version = "0.1.0" - -[dependencies] -anyhow.workspace = true -clap = { workspace = true, features = ["derive"] } -libp2p = { workspace = true, features = ["identify", "macros", "noise", "rendezvous", "tcp", "tokio", "yamux"] } -tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } -tracing.workspace = true -tracing-subscriber = { workspace = true, features = ["env-filter"] } - -[lints] -workspace = true diff --git a/storage-provider/client/Cargo.toml b/storage-provider/client/Cargo.toml index c3b8a9ec3..91fc1032d 100644 --- a/storage-provider/client/Cargo.toml +++ b/storage-provider/client/Cargo.toml @@ -34,6 +34,9 @@ tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } url = { workspace = true } +[dev-dependencies] +anyhow.workspace = true +libp2p = { workspace = true, features = ["identify", "macros", "noise", "rendezvous", "tcp", "tokio", "yamux"] } [lints] workspace = true diff --git a/examples/peer-resolver/src/main.rs b/storage-provider/client/examples/peer-resolver.rs similarity index 86% rename from examples/peer-resolver/src/main.rs rename to storage-provider/client/examples/peer-resolver.rs index ed2af18e2..27c70d46f 100644 --- a/examples/peer-resolver/src/main.rs +++ b/storage-provider/client/examples/peer-resolver.rs @@ -1,3 +1,14 @@ +//! Peer Resolver example +//! +//! This example shows how to use the rendezvous client protocol to +//! connect to rendezvous bootstrap, and send a discovery message, +//! requesting the bootstrap node to return their registrations. +//! Then it will check the registrations to see if a given Peer ID +//! is contained in them to get a Peer ID to multiaddr mapping. +//! If the bootstrap node does not have information on the given Peer +//! ID, the example will return an error. +//! NOTE: This example is to be removed and implemented into the +//! client at some point. use std::time::Duration; use anyhow::{bail, Result}; @@ -59,7 +70,6 @@ async fn discover( SwarmEvent::ConnectionEstablished { peer_id, .. } => { if peer_id == rendezvous_point { tracing::info!("Connection established with rendezvous point {}", peer_id); - tracing::info!("Connected to rendezvous point, discovering nodes..."); // Requesting rendezvous point for peer discovery swarm From dc1526f2964008ee661f8001b34b5b896edcdea7 Mon Sep 17 00:00:00 2001 From: aidan46 Date: Fri, 31 Jan 2025 12:55:44 +0800 Subject: [PATCH 7/8] fix: Remove anyhow dep --- Cargo.lock | 1 - storage-provider/client/Cargo.toml | 1 - storage-provider/client/examples/peer-resolver.rs | 11 +++++------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 75f92ef57..f3450caad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13865,7 +13865,6 @@ dependencies = [ name = "polka-storage-provider-client" version = "0.1.0" dependencies = [ - "anyhow", "async-trait", "bls12_381", "cid 0.11.1", diff --git a/storage-provider/client/Cargo.toml b/storage-provider/client/Cargo.toml index 91fc1032d..9de5a66b0 100644 --- a/storage-provider/client/Cargo.toml +++ b/storage-provider/client/Cargo.toml @@ -35,7 +35,6 @@ tracing-subscriber = { workspace = true, features = ["env-filter"] } url = { workspace = true } [dev-dependencies] -anyhow.workspace = true libp2p = { workspace = true, features = ["identify", "macros", "noise", "rendezvous", "tcp", "tokio", "yamux"] } [lints] diff --git a/storage-provider/client/examples/peer-resolver.rs b/storage-provider/client/examples/peer-resolver.rs index 27c70d46f..8e2f77b99 100644 --- a/storage-provider/client/examples/peer-resolver.rs +++ b/storage-provider/client/examples/peer-resolver.rs @@ -9,9 +9,8 @@ //! ID, the example will return an error. //! NOTE: This example is to be removed and implemented into the //! client at some point. -use std::time::Duration; +use std::{time::Duration, error::Error}; -use anyhow::{bail, Result}; use clap::Parser; use libp2p::{ futures::StreamExt, @@ -43,7 +42,7 @@ struct Cli { rendezvous_point: PeerId, } -fn create_swarm() -> Result> { +fn create_swarm() -> Result, Box> { Ok(SwarmBuilder::with_new_identity() .with_tokio() .with_tcp( @@ -61,7 +60,7 @@ async fn discover( peer_id_to_find: PeerId, rendezvous_point_address: Multiaddr, rendezvous_point: PeerId, -) -> Result { +) -> Result> { // Dial in to the rendezvous point. swarm.dial(rendezvous_point_address)?; @@ -94,7 +93,7 @@ async fn discover( }); } } - bail!("No registered multi-addresses found for Peer ID {peer_id_to_find}"); + return Err(format!("No registered multi-addresses found for Peer ID {peer_id_to_find}").into()); } other => tracing::debug!("Other event: {other:?}"), @@ -103,7 +102,7 @@ async fn discover( } #[tokio::main] -async fn main() -> Result<()> { +async fn main() -> Result<(), Box> { let _ = tracing_subscriber::fmt() .with_env_filter(EnvFilter::from_default_env()) .try_init(); From 43e2d7721d67ca91ad32e5e428ff6af50049c6f0 Mon Sep 17 00:00:00 2001 From: aidan46 Date: Fri, 31 Jan 2025 13:35:23 +0800 Subject: [PATCH 8/8] fix: Cargo fmt --- storage-provider/client/examples/peer-resolver.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/storage-provider/client/examples/peer-resolver.rs b/storage-provider/client/examples/peer-resolver.rs index 8e2f77b99..6ec1541ab 100644 --- a/storage-provider/client/examples/peer-resolver.rs +++ b/storage-provider/client/examples/peer-resolver.rs @@ -9,7 +9,7 @@ //! ID, the example will return an error. //! NOTE: This example is to be removed and implemented into the //! client at some point. -use std::{time::Duration, error::Error}; +use std::{error::Error, time::Duration}; use clap::Parser; use libp2p::{ @@ -93,7 +93,10 @@ async fn discover( }); } } - return Err(format!("No registered multi-addresses found for Peer ID {peer_id_to_find}").into()); + return Err(format!( + "No registered multi-addresses found for Peer ID {peer_id_to_find}" + ) + .into()); } other => tracing::debug!("Other event: {other:?}"),