Skip to content

Commit 020cc60

Browse files
committed
refactor: use z32 encoding for pkarr domain names
1 parent 0cbc308 commit 020cc60

File tree

6 files changed

+34
-12
lines changed

6 files changed

+34
-12
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

iroh-dns/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ rustls = "0.21"
3030
tokio = { version = "1", features = ["rt", "sync"] }
3131
tracing = "0.1"
3232
url = { version = "2", features = ["serde"] }
33+
z32 = "1.0.3"
3334

3435
[dev-dependencies]
3536
clap = { version = "4.5.1", features = ["derive"] }

iroh-dns/examples/publish.rs

+10-9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use iroh_dns::{
99
packet::IROH_NODE_TXT_LABEL,
1010
publish::{Config, Publisher},
1111
resolve::{EXAMPLE_DOMAIN, IROH_TEST_DOMAIN},
12+
to_z32,
1213
};
1314

1415
#[derive(ValueEnum, Clone, Debug, Default, Copy)]
@@ -71,20 +72,20 @@ async fn main() -> Result<()> {
7172
};
7273
// let an = NodeAnnounce::new(node_id, Some(args.home_derp), vec![]);
7374
publisher.publish_addr_info(&info).await?;
74-
println!("published signed record to {}!", publisher.pkarr_relay());
75+
println!(
76+
"published signed record to {}! Resolve with ",
77+
publisher.pkarr_relay()
78+
);
7579
match args.env {
76-
Env::IrohTest => println!(
77-
"TXT record resolvable at {}",
78-
node_domain(node_id, IROH_TEST_DOMAIN)
79-
),
80+
Env::IrohTest => println!("dig {} TXT", node_domain(&node_id, IROH_TEST_DOMAIN)),
8081
Env::LocalDev => println!(
81-
"TXT record resolvable at {}",
82-
node_domain(node_id, EXAMPLE_DOMAIN)
82+
"dig @localhost -p 5353 {} TXT",
83+
node_domain(&node_id, EXAMPLE_DOMAIN)
8384
),
8485
}
8586
Ok(())
8687
}
8788

88-
fn node_domain(node_id: NodeId, origin: &str) -> String {
89-
format!("{}.{}.{}", IROH_NODE_TXT_LABEL, node_id, origin)
89+
fn node_domain(node_id: &NodeId, origin: &str) -> String {
90+
format!("{}.{}.{}", IROH_NODE_TXT_LABEL, to_z32(node_id), origin)
9091
}

iroh-dns/src/lib.rs

+14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,18 @@
1+
use anyhow::{anyhow, Result};
2+
use iroh_net::NodeId;
3+
14
pub mod discovery;
25
pub mod packet;
36
pub mod publish;
47
pub mod resolve;
8+
9+
pub fn to_z32(node_id: &NodeId) -> String {
10+
z32::encode(node_id.as_bytes())
11+
}
12+
13+
pub fn from_z32(s: &str) -> Result<NodeId> {
14+
let bytes = z32::decode(s.as_bytes()).map_err(|_| anyhow!("invalid z32"))?;
15+
let bytes: &[u8; 32] = &bytes.try_into().map_err(|_| anyhow!("not 32 bytes long"))?;
16+
let node_id = NodeId::from_bytes(bytes)?;
17+
Ok(node_id)
18+
}

iroh-dns/src/packet.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use hickory_proto::error::ProtoError;
66
use iroh_net::{AddrInfo, NodeAddr, NodeId};
77
use url::Url;
88

9+
use crate::from_z32;
10+
911
pub const IROH_ROOT_ZONE: &str = "iroh";
1012
pub const IROH_NODE_TXT_LABEL: &str = "_iroh_node";
1113
pub const DEFAULT_TTL: u32 = 30;
@@ -231,7 +233,7 @@ fn is_hickory_node_info_name(name: &hickory_proto::rr::Name) -> Option<NodeId> {
231233
return None;
232234
}
233235
let label = std::str::from_utf8(labels.next().expect("num_labels checked")).ok()?;
234-
let node_id = NodeId::from_str(label).ok()?;
236+
let node_id = from_z32(label).ok()?;
235237
Some(node_id)
236238
}
237239

iroh-dns/src/resolve.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use hickory_resolver::{
1010
use iroh_net::{AddrInfo, NodeAddr, NodeId};
1111
use tracing::debug;
1212

13-
use crate::packet::{NodeAnnounce, IROH_NODE_TXT_LABEL};
13+
use crate::{
14+
packet::{NodeAnnounce, IROH_NODE_TXT_LABEL},
15+
to_z32,
16+
};
1417

1518
pub const IROH_TEST_DNS_IPV4: Ipv4Addr = Ipv4Addr::new(5, 75, 181, 3);
1619
pub const IROH_TEST_DOMAIN: &str = "testdns.iroh.link.";
@@ -93,7 +96,7 @@ impl Resolver {
9396

9497
pub async fn resolve_node_by_id(&self, node_id: NodeId) -> Result<AddrInfo> {
9598
debug!(?node_id, "resolve node by id");
96-
let name = Name::parse(&node_id.to_string(), Some(&self.default_node_origin))?;
99+
let name = Name::parse(&to_z32(&node_id), Some(&self.default_node_origin))?;
97100
let addr = self.resolve_node(name).await;
98101
debug!(?node_id, ?addr, "resolved");
99102
let addr = addr?;

0 commit comments

Comments
 (0)