| Crates.io | dig-dns-discovery |
| lib.rs | dig-dns-discovery |
| version | 0.2.0 |
| created_at | 2026-01-20 18:30:19.913611+00 |
| updated_at | 2026-01-20 18:30:19.913611+00 |
| description | DNS resolver for Chia peers |
| homepage | |
| repository | |
| max_upload_size | |
| id | 2057168 |
| size | 132,675 |
An isolated Rust crate for discovering Chia network peers using DNS introducers. This crate properly handles both IPv4 (A records) and IPv6 (AAAA records) lookups, returning separate lists for each protocol version.
use dns_discovery::{DnsDiscovery, DnsDiscoveryError};
#[tokio::main]
async fn main() -> Result<(), DnsDiscoveryError> {
// Create DNS discovery instance
let discovery = DnsDiscovery::new().await?;
// Discover mainnet peers
let result = discovery.discover_mainnet_peers().await?;
println!("Found {} IPv4 peers and {} IPv6 peers",
result.ipv4_peers.len(),
result.ipv6_peers.len());
// Access individual peer lists
for peer in &result.ipv4_peers {
println!("IPv4 Peer: {}", peer.display_address());
}
for peer in &result.ipv6_peers {
println!("IPv6 Peer: {}", peer.display_address());
}
Ok(())
}
// Mainnet discovery
let mainnet_peers = discovery.discover_mainnet_peers().await?;
// Testnet11 discovery
let testnet_peers = discovery.discover_testnet11_peers().await?;
// Custom introducers
let custom_peers = discovery.discover_peers(
&["custom-introducer.example.com"],
8444
).await?;
// IPv4 only (A records)
let ipv4_addrs = discovery.resolve_ipv4("dns-introducer.chia.net").await?;
// IPv6 only (AAAA records)
let ipv6_addrs = discovery.resolve_ipv6("dns-introducer.chia.net").await?;
// Both protocols
let both = discovery.resolve_both("dns-introducer.chia.net", 8444).await?;
DiscoveryResultContains the results of DNS discovery:
pub struct DiscoveryResult {
pub ipv4_peers: Vec<PeerAddress>, // IPv4 peer addresses
pub ipv6_peers: Vec<PeerAddress>, // IPv6 peer addresses
pub total_count: usize, // Total number of peers
}
PeerAddressRepresents a single peer address:
pub struct PeerAddress {
pub host: IpAddr, // IP address (IPv4 or IPv6)
pub port: u16, // Port number
pub is_ipv6: bool, // True if IPv6, false if IPv4
}
The display_address() method properly formats addresses:
192.168.1.1:8444[2001:db8::1]:8444 (with brackets)dns-introducer.chia.netchia.ctrlaltdel.chseeder.dexie.spacechia.hoffmang.comdns-introducer-testnet11.chia.netThis Rust implementation provides several improvements over the JavaScript version in coin-monitor.js:
cd crate/dig-dns-discovery
cargo run --example discover_peers
This will discover peers for both mainnet and testnet11, showing separate IPv4 and IPv6 results.
cargo test
Tests include validation of DNS resolution, address formatting, and data structure operations.
tokio: Async runtimetrust-dns-resolver: DNS resolution with explicit A/AAAA record supportserde: Serialization support for data structuresthiserror: Error handlingtracing: Loggingrand: Peer list randomization