Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 30 additions & 15 deletions lib/net/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -161,19 +161,10 @@ pub fn make_server_endpoint(
pub type PeerInfoRx =
mpsc::UnboundedReceiver<(SocketAddr, Option<PeerConnectionInfo>)>;

const ALPHANET_SEED_PEER_ADDRS: &[PeerAddress<&'static str>] = {
// seed.alpha.ecash.drivecha.in
const DRIVECHA_IN: PeerAddress<&'static str> = PeerAddress {
host: url::Host::Ipv4(Ipv4Addr::new(157, 180, 96, 24)),
port: DEFAULT_PORT,
};
// seed.alpha.ecash.ninja
const ECASH_NINJA: PeerAddress<&'static str> = PeerAddress {
host: url::Host::Domain("seed.alpha.ecash.ninja"),
port: DEFAULT_PORT,
};
&[DRIVECHA_IN, ECASH_NINJA]
};
const ALPHANET_SEED_PEER_ADDRS: &[PeerAddress<&'static str>] = &[PeerAddress {
host: url::Host::Domain("seed.alpha.ecash.eu.com"),
port: DEFAULT_PORT,
}];

const SIGNET_SEED_PEER_ADDRS: &[PeerAddress<&'static str>] = {
const SIGNET_MINING_SERVER: PeerAddress<&'static str> = PeerAddress {
Expand Down Expand Up @@ -216,7 +207,7 @@ pub async fn resolve_peer_address<S>(
peer_addr: PeerAddress<S>,
) -> std::io::Result<ResolvedPeerAddress<S>>
where
S: std::fmt::Display + tokio::net::ToSocketAddrs,
S: std::fmt::Display,
{
match peer_addr.host {
url::Host::Ipv4(ipv4) => Ok(ResolvedPeerAddress::Static(
Expand All @@ -226,7 +217,9 @@ where
SocketAddr::new(IpAddr::V6(ipv6), peer_addr.port),
)),
url::Host::Domain(domain) => {
let mut addrs: Vec<_> = tokio::net::lookup_host(&domain)
// `lookup_host` reads a `host:port` pair, not a bare name.
let host_port = format!("{domain}:{}", peer_addr.port);
let mut addrs: Vec<_> = tokio::net::lookup_host(host_port)
.await?
.filter_map(|addr| {
if addr.ip().is_unspecified() {
Expand Down Expand Up @@ -674,3 +667,25 @@ impl Net {
})
}
}

#[cfg(test)]
mod test {
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

use crate::{net::resolve_peer_address, types::net::PeerAddress};

/// A seed names a host and a port, and the resolver keeps both.
#[tokio::test]
async fn a_seed_name_resolves_with_its_port() -> anyhow::Result<()> {
let peer_addr: PeerAddress = "localhost:4009".parse()?;
let resolved = resolve_peer_address(peer_addr).await?;
assert_eq!(resolved.port(), 4009);
assert!(
resolved
.ip_addrs()
.any(|addr| addr == IpAddr::V4(Ipv4Addr::LOCALHOST)
|| addr == IpAddr::V6(Ipv6Addr::LOCALHOST))
);
Ok(())
}
}
Loading