diff --git a/iroh-net/src/derp.rs b/iroh-net/src/derp.rs index 86e78eb3e1..2f864d4dab 100644 --- a/iroh-net/src/derp.rs +++ b/iroh-net/src/derp.rs @@ -17,7 +17,6 @@ mod codec; pub mod http; mod map; mod metrics; -pub(crate) mod pkarr_announce; pub(crate) mod server; pub(crate) mod types; diff --git a/iroh-net/src/derp/http/client.rs b/iroh-net/src/derp/http/client.rs index 9f0dee442c..b8d51617fc 100644 --- a/iroh-net/src/derp/http/client.rs +++ b/iroh-net/src/derp/http/client.rs @@ -389,7 +389,6 @@ impl Client { /// If there is already an active derp connection, returns the already /// connected [`crate::derp::client::Client`]. pub async fn connect(&self) -> Result<(DerpClient, usize), ClientError> { - self.send_actor(ActorMessage::Connect).await } diff --git a/iroh-net/src/derp/http/server.rs b/iroh-net/src/derp/http/server.rs index 42c60f99cc..09fb889ee0 100644 --- a/iroh-net/src/derp/http/server.rs +++ b/iroh-net/src/derp/http/server.rs @@ -293,7 +293,11 @@ impl ServerBuilder { pub async fn spawn(self) -> Result { ensure!(self.secret_key.is_some() || self.derp_override.is_some(), "Must provide a `SecretKey` for the derp server OR pass in an override function for the 'derp' endpoint"); let (derp_handler, derp_server, mesh_clients) = if let Some(secret_key) = self.secret_key { - let server = crate::derp::server::Server::new(secret_key.clone(), self.mesh_key, self.pkarr_relay); + let server = crate::derp::server::Server::new( + secret_key.clone(), + self.mesh_key, + self.pkarr_relay, + ); let packet_fwd = server.packet_forwarder_handler(); let mesh_clients = if let Some(mesh_addrs) = self.mesh_derpers { ensure!( diff --git a/iroh-net/src/derp/pkarr_announce.rs b/iroh-net/src/derp/pkarr_announce.rs deleted file mode 100644 index 7b13529431..0000000000 --- a/iroh-net/src/derp/pkarr_announce.rs +++ /dev/null @@ -1,30 +0,0 @@ -use std::net::SocketAddr; - -use anyhow::Result; -use pkarr::{ - dns::{self, rdata::RData}, - SignedPacket, -}; - -use crate::derp::DerpUrl; -use crate::key::SecretKey; - -pub fn create_signed_packet( - secret_key: &SecretKey, - derp_url: &DerpUrl, - _direct_addrs: Option>, -) -> Result { - let mut packet = dns::Packet::new_reply(0); - let value = format!("node={} derp={}", secret_key.public(), derp_url); - // TODO: support direct_addrs - let record = dns::ResourceRecord::new( - dns::Name::new("_iroh_node").unwrap(), - dns::CLASS::IN, - 30, - RData::TXT(value.as_str().try_into()?), - ); - packet.answers.push(record); - let keypair = pkarr::Keypair::from_secret_key(&secret_key.to_bytes()); - let signed_packet = pkarr::SignedPacket::from_packet(&keypair, &packet)?; - Ok(signed_packet) -} diff --git a/iroh-net/src/discovery/pkarr_relay_publish.rs b/iroh-net/src/discovery/pkarr_relay_publish.rs index 44d154e775..8d87e8971e 100644 --- a/iroh-net/src/discovery/pkarr_relay_publish.rs +++ b/iroh-net/src/discovery/pkarr_relay_publish.rs @@ -24,7 +24,7 @@ use crate::{discovery::Discovery, dns::node_info::NodeInfo, key::SecretKey, Addr pub const IROH_TEST_PKARR_RELAY: &str = "https://testdns.iroh.link/pkarr"; /// Default TTL for the _iroh_node TXT record in the pkarr signed packet -const DEFAULT_PKARR_TTL: u32 = 30; +pub const DEFAULT_PKARR_TTL: u32 = 30; /// Publish node info to a pkarr relay. #[derive(derive_more::Debug, Clone)] diff --git a/iroh-net/src/dns/node_info.rs b/iroh-net/src/dns/node_info.rs index 09e12cf775..5f68841b44 100644 --- a/iroh-net/src/dns/node_info.rs +++ b/iroh-net/src/dns/node_info.rs @@ -93,8 +93,11 @@ impl From for AddrInfo { impl NodeInfo { /// Create a new [`NodeInfo`] from its parts. - pub fn new(node_id: NodeId, derp_url: Option) -> Self { - Self { node_id, derp_url } + pub fn new(node_id: NodeId, derp_url: Option>) -> Self { + Self { + node_id, + derp_url: derp_url.map(Into::into), + } } /// Convert this node info into a DNS attribute string. diff --git a/iroh-net/src/magicsock/derp_actor.rs b/iroh-net/src/magicsock/derp_actor.rs index 3c99f474b3..2e287f7561 100644 --- a/iroh-net/src/magicsock/derp_actor.rs +++ b/iroh-net/src/magicsock/derp_actor.rs @@ -19,10 +19,9 @@ use tokio_util::sync::CancellationToken; use tracing::{debug, info, info_span, trace, warn, Instrument}; use crate::{ - derp::{ - self, http::ClientError, pkarr_announce::create_signed_packet, DerpUrl, ReceivedMessage, - MAX_PACKET_SIZE, - }, + derp::{self, http::ClientError, DerpUrl, ReceivedMessage, MAX_PACKET_SIZE}, + discovery::pkarr_relay_publish::DEFAULT_PKARR_TTL, + dns::node_info::NodeInfo, key::{PublicKey, PUBLIC_KEY_LENGTH}, }; @@ -429,18 +428,20 @@ impl DerpActor { } async fn pkarr_announce_to_derp(&self, my_derp: &DerpUrl) -> anyhow::Result<()> { - if let Some(opts) = &self.conn.pkarr_announce { + if let Some(_opts) = &self.conn.pkarr_announce { let s = self .active_derp .iter() .find_map(|(derp_url, (s, _))| (derp_url == my_derp).then_some(s)) .context("home derp not in list of active derps")?; - let addrs = opts.include_addrs.then(|| { - let local_endpoints = self.conn.endpoints.read(); - let local_endpoints = local_endpoints.iter().map(|ep| ep.addr); - local_endpoints.collect() - }); - let packet = create_signed_packet(&self.conn.secret_key, my_derp, addrs)?; + // TODO: support direct addrs? + // let addrs = opts.include_addrs.then(|| { + // let local_endpoints = self.conn.endpoints.read(); + // let local_endpoints = local_endpoints.iter().map(|ep| ep.addr); + // local_endpoints.collect() + // }); + let info = NodeInfo::new(self.conn.secret_key.public(), Some(my_derp.clone())); + let packet = info.to_pkarr_signed_packet(&self.conn.secret_key, DEFAULT_PKARR_TTL)?; s.send(ActiveDerpMessage::PkarrPublish(packet)).await?; } Ok(()) diff --git a/iroh/src/commands/start.rs b/iroh/src/commands/start.rs index fe2f32cedb..bcef1e156c 100644 --- a/iroh/src/commands/start.rs +++ b/iroh/src/commands/start.rs @@ -16,7 +16,7 @@ use iroh::{ }; use iroh_net::{ derp::{DerpMap, DerpMode}, - discovery::{dns::DnsDiscovery, pkarr_relay_publish, CombinedDiscovery}, + discovery::{dns::DnsDiscovery, CombinedDiscovery}, key::SecretKey, }; use quic_rpc::{transport::quinn::QuinnServerEndpoint, ServiceEndpoint}; @@ -223,11 +223,6 @@ pub(crate) async fn start_node( let mut discovery = CombinedDiscovery::new(); let dns_discovery = DnsDiscovery::with_n0_testdns(); discovery.add(dns_discovery); - // // TODO: We don't want nodes to self-publish. Remove once publishing over derpers lands. - // let pkarr_publish = pkarr_relay_publish::Publisher::new( - // pkarr_relay_publish::Config::n0_testdns(secret_key.clone()), - // ); - // discovery.add(pkarr_publish); Node::builder(bao_store, doc_store) .derp_mode(derp_mode)