From c28e269b1f600f383371e018b82e989aa4fc502c Mon Sep 17 00:00:00 2001 From: Ash Manning Date: Tue, 8 Sep 2026 18:36:20 +0800 Subject: [PATCH 1/2] net: use hickory_resolver for DNS resolution --- Cargo.lock | 181 ++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + app/rpc_server.rs | 9 ++- lib/Cargo.toml | 3 +- lib/net/error.rs | 12 ++- lib/net/mod.rs | 42 ++++++----- lib/node/mod.rs | 4 + 7 files changed, 230 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c1993bd..f9522d43 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1290,6 +1290,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -1457,6 +1463,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "data-encoding" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" + [[package]] name = "der" version = "0.7.10" @@ -2787,6 +2799,76 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "hickory-net" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084e7bd6a377435d568f652153e571b50970d7ccc1d1eeec0519f834632287e1" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "futures-channel", + "futures-io", + "futures-util", + "hickory-proto", + "idna", + "ipnet", + "jni 0.22.4", + "rand 0.10.1", + "thiserror 2.0.19", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-proto" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e2da0694c15b44c6f68a6b05e0233617008c54080e31d6eb848d858a9c5b38d" +dependencies = [ + "data-encoding", + "idna", + "ipnet", + "jni 0.22.4", + "once_cell", + "prefix-trie", + "rand 0.10.1", + "ring", + "thiserror 2.0.19", + "tinyvec", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4f9f4603319422d482738f3f6fe5aac03157fdbfed1cd85a3ff45adb09072f" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-net", + "hickory-proto", + "ipconfig", + "ipnet", + "jni 0.22.4", + "moka", + "ndk-context", + "once_cell", + "parking_lot", + "rand 0.10.1", + "resolv-conf", + "smallvec", + "system-configuration", + "thiserror 2.0.19", + "tokio", + "tracing", +] + [[package]] name = "higher-kinded-types" version = "0.2.1" @@ -3164,11 +3246,27 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" +[[package]] +name = "ipconfig" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" +dependencies = [ + "socket2", + "widestring", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", +] + [[package]] name = "ipnet" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +dependencies = [ + "serde", +] [[package]] name = "iri-string" @@ -3894,6 +3992,23 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "moka" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + [[package]] name = "monostate" version = "1.0.3" @@ -4371,6 +4486,10 @@ name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] [[package]] name = "once_cell_polyfill" @@ -4781,6 +4900,17 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prefix-trie" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf6e3177f0684016a5c209b00882e15f8bdd3f3bb48f0491df10cd102d0c6e7" +dependencies = [ + "either", + "ipnet", + "num-traits", +] + [[package]] name = "prettyplease" version = "0.2.37" @@ -5417,6 +5547,12 @@ dependencies = [ "thiserror 2.0.19", ] +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + [[package]] name = "ring" version = "0.17.14" @@ -6291,6 +6427,33 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "temp-dir" version = "0.2.0" @@ -6379,6 +6542,7 @@ dependencies = [ "governor", "hashlink 0.12.1", "heed", + "hickory-resolver", "jsonrpsee", "nonempty 0.11.0", "parking_lot", @@ -7693,6 +7857,12 @@ dependencies = [ "safe_arch", ] +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + [[package]] name = "win_uds" version = "0.2.2" @@ -7776,6 +7946,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + [[package]] name = "windows-result" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index 14ed448c..589eaa0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ futures = { version = "0.3.30", default-features = false } governor = { version = "0.8.1", default-features = false } hashlink = "0.12.1" heed = "0.22.0" +hickory-resolver = { version = "0.26", default-features = false } http = "1.2.0" human-size = "0.4.3" jsonrpsee = { version = "0.26.0", features = ["tracing"] } diff --git a/app/rpc_server.rs b/app/rpc_server.rs index faff067e..7ec881ec 100644 --- a/app/rpc_server.rs +++ b/app/rpc_server.rs @@ -79,9 +79,12 @@ impl rpc_api::open_api::RpcServer for RpcServerImpl { #[async_trait] impl rpc_api::node::PrivateRpcServer for RpcServerImpl { async fn connect_peer(&self, addr: PeerAddress) -> RpcResult<()> { - let resolved_addr = thunder::net::resolve_peer_address(addr) - .await - .map_err(custom_err)?; + let resolved_addr = thunder::net::resolve_peer_address( + self.app.node.dns_resolver(), + addr, + ) + .await + .map_err(custom_err)?; self.app .node .connect_peer(resolved_addr) diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 01313b31..196d9d62 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -29,6 +29,7 @@ futures = { workspace = true, features = ["alloc"] } governor = { workspace = true, features = ["quanta", "std"] } hashlink = { workspace = true, features = ["serde_impl"] } heed = { workspace = true } +hickory-resolver = { workspace = true, features = ["system-config", "tokio"] } jsonrpsee = { workspace = true } nonempty = { workspace = true, features = ["serialize"] } parking_lot = { workspace = true } @@ -47,7 +48,7 @@ sneed = { workspace = true, features = ["observe"] } thiserror = { workspace = true } thunder_types = { path = "../types", features = ["heed"] } tiny-bip39 = { workspace = true } -tokio = { workspace = true, features = ["net", "rt-multi-thread", "sync"] } +tokio = { workspace = true, features = ["rt-multi-thread", "sync"] } tokio-stream = { workspace = true, features = ["sync"] } tokio-util = { workspace = true, features = ["join-map", "rt"] } tonic = { workspace = true } diff --git a/lib/net/error.rs b/lib/net/error.rs index a95b7d62..b23a833c 100644 --- a/lib/net/error.rs +++ b/lib/net/error.rs @@ -123,12 +123,20 @@ impl From for ConnectPeer { } } +#[derive(Debug, Error)] +pub enum ResolvePeerAddress { + #[error(transparent)] + Net(Box), + #[error("unable to resolve host for domain ({domain})")] + NoIpAddrs { domain: String }, +} + #[derive(Debug, Error)] pub enum DialKnownPeer { #[error("failed to connect to peer")] ConnectPeer(#[from] ConnectPeer), #[error("DNS resolution for hostname failed")] - DnsResolve(#[source] std::io::Error), + DnsResolve(#[from] ResolvePeerAddress), } #[allow(clippy::duplicated_attributes)] @@ -148,6 +156,8 @@ pub enum Error { AlreadyConnected(#[from] AlreadyConnected), #[error("bincode error")] Bincode(#[from] bincode::Error), + #[error("failed to build DNS resolver")] + BuildDnsResolver(#[source] hickory_resolver::net::NetError), #[error("failed to connect to peer ({peer_addr})")] ConnectPeer { peer_addr: crate::types::net::PeerAddress, diff --git a/lib/net/mod.rs b/lib/net/mod.rs index f4f653a2..90843785 100644 --- a/lib/net/mod.rs +++ b/lib/net/mod.rs @@ -7,6 +7,7 @@ use std::{ use fallible_iterator::FallibleIterator; use futures::{StreamExt, channel::mpsc}; use heed::types::{SerdeBincode, Unit}; +use hickory_resolver::TokioResolver; use parking_lot::RwLock; use quinn::{ClientConfig, Endpoint, ServerConfig}; use sneed::{ @@ -213,10 +214,12 @@ const fn seed_peer_addrs( } pub async fn resolve_peer_address( + dns_resolver: &TokioResolver, peer_addr: PeerAddress, -) -> std::io::Result> +) -> Result, error::ResolvePeerAddress> where - S: std::fmt::Display + tokio::net::ToSocketAddrs, + S: std::fmt::Display, + for<'a> &'a S: hickory_resolver::proto::rr::IntoName, { match peer_addr.host { url::Host::Ipv4(ipv4) => Ok(ResolvedPeerAddress::Static( @@ -226,15 +229,12 @@ where SocketAddr::new(IpAddr::V6(ipv6), peer_addr.port), )), url::Host::Domain(domain) => { - let mut addrs: Vec<_> = tokio::net::lookup_host(&domain) - .await? - .filter_map(|addr| { - if addr.ip().is_unspecified() { - None - } else { - Some(addr.ip()) - } - }) + let mut addrs: Vec<_> = dns_resolver + .lookup_ip(&domain) + .await + .map_err(|err| error::ResolvePeerAddress::Net(Box::new(err)))? + .into_iter() + .filter(|addr| !addr.is_unspecified()) .collect(); if let Some(last_addr) = addrs.pop() { addrs.reverse(); @@ -248,10 +248,9 @@ where domain, }) } else { + let domain = domain.to_string(); tracing::warn!(%domain, "unable to resolve host"); - let err_msg = - format!("unable to resolve host for domain ({domain})"); - Err(std::io::Error::other(err_msg)) + Err(error::ResolvePeerAddress::NoIpAddrs { domain }) } } } @@ -288,6 +287,7 @@ impl DialKnownPeersHandle { pub struct Net { pub server: Endpoint, archive: Archive, + pub dns_resolver: Arc, magic_bytes: peer_message::MagicBytes, state: State, active_peers: Arc>>, @@ -443,9 +443,10 @@ impl Net { peer_addr: PeerAddress, ) -> Result<(), error::DialKnownPeer> { tracing::trace!("connecting to already known peer at {peer_addr}"); - let resolved_peer_addr = resolve_peer_address(peer_addr) - .await - .map_err(error::DialKnownPeer::DnsResolve)?; + let resolved_peer_addr = + resolve_peer_address(&self.dns_resolver, peer_addr) + .await + .map_err(error::DialKnownPeer::DnsResolve)?; let () = self.connect_peer(env, resolved_peer_addr)?; Ok(()) } @@ -507,10 +508,17 @@ impl Net { rwtxn.commit().map_err(RwTxnError::from)?; let magic_bytes = magic_bytes_override .unwrap_or_else(|| peer_message::magic_bytes(network)); + let dns_resolver = { + let builder = hickory_resolver::Resolver::builder_tokio() + .map_err(Error::BuildDnsResolver)?; + let resolver = builder.build().map_err(Error::BuildDnsResolver)?; + Arc::new(resolver) + }; let (peer_info_tx, peer_info_rx) = mpsc::unbounded(); let net = Net { server, archive, + dns_resolver, magic_bytes, state, active_peers, diff --git a/lib/node/mod.rs b/lib/node/mod.rs index 47ff4305..d944cea8 100644 --- a/lib/node/mod.rs +++ b/lib/node/mod.rs @@ -197,6 +197,10 @@ where f(&self.cusf_mainchain) } + pub fn dns_resolver(&self) -> &Arc { + &self.net.dns_resolver + } + /// Invalidate a block. /// This will delete the header and body, and mark invalid, the specified /// block and any descendants. From 8a89eab4d027f4ff58a9b7ea1de4e16e5ebadcd0 Mon Sep 17 00:00:00 2001 From: Ash Manning Date: Tue, 8 Sep 2026 19:35:13 +0800 Subject: [PATCH 2/2] net: specify server names correctly --- app/app.rs | 29 +++++++++++++++++++++++------ app/cli.rs | 21 ++++++++++++++------- app/main.rs | 26 ++++++++++++++++++++++---- lib/net/mod.rs | 25 +++++++++++++++++-------- lib/node/mod.rs | 19 +++++++++++-------- 5 files changed, 87 insertions(+), 33 deletions(-) diff --git a/app/app.rs b/app/app.rs index 6b756e80..dbe85265 100644 --- a/app/app.rs +++ b/app/app.rs @@ -1,4 +1,10 @@ -use std::{borrow::BorrowMut, collections::HashMap, sync::Arc}; +use std::{ + borrow::BorrowMut, + collections::{HashMap, HashSet}, + net::SocketAddr, + path::PathBuf, + sync::Arc, +}; use fallible_iterator::FallibleIterator as _; use futures::{StreamExt, TryFutureExt}; @@ -26,8 +32,6 @@ use tonic_health::{ pb::{HealthCheckRequest, health_client::HealthClient}, }; -use crate::cli::Config; - #[derive(Debug, thiserror::Error)] pub enum Error { #[error("CUSF mainchain proto error")] @@ -104,6 +108,18 @@ pub struct BlockTemplate { pub fees: bitcoin::Amount, } +#[derive(Debug)] +pub struct Config { + pub add_peers: HashSet, + pub datadir: PathBuf, + pub mainchain_grpc_url: url::Url, + pub mnemonic_seed_phrase_path: Option, + pub net_addr: SocketAddr, + pub network: thunder::types::Network, + pub network_magic_override: Option, + pub server_names: HashSet, +} + #[derive(Clone)] pub struct App { pub node: Arc, @@ -214,7 +230,7 @@ impl App { Ok(res) } - pub fn new(config: &Config) -> Result { + pub fn new(config: Config) -> Result { // Node launches some tokio tasks for p2p networking, that is why we need a tokio runtime // here. let runtime = tokio::runtime::Builder::new_multi_thread() @@ -278,11 +294,12 @@ impl App { tracing::debug!("Instantiating node struct"); let node = Node::new( thunder::node::Config { - datadir: &config.datadir, + add_peers: config.add_peers, bind_addr: config.net_addr, + datadir: config.datadir, magic_bytes_override: config.network_magic_override, - peers: &config.peers, network: config.network, + server_names: config.server_names, }, cusf_mainchain, cusf_mainchain_wallet, diff --git a/app/cli.rs b/app/cli.rs index fd519ed6..eb55944a 100644 --- a/app/cli.rs +++ b/app/cli.rs @@ -1,4 +1,5 @@ use std::{ + collections::HashSet, net::{IpAddr, Ipv4Addr, SocketAddr}, ops::Deref, path::PathBuf, @@ -103,6 +104,11 @@ fn parse_network_magic(s: &str) -> Result<[u8; 4], const_hex::FromHexError> { #[derive(Clone, Debug, Parser)] #[command(author, version, about, long_about = None)] pub(super) struct Cli { + /// Additional peers to dial on startup, as `host:port`. May be given + /// more than once, and is dialed in addition to the network's built-in + /// seed peers. + #[arg(long = "add-peer")] + add_peers: Vec, /// Data directory for storing blockchain and wallet data #[command(flatten)] datadir: DatadirArg, @@ -141,21 +147,21 @@ pub(super) struct Cli { /// Manually provide the network magic bytes #[arg(long, value_parser = parse_network_magic)] network_magic: Option<[u8; 4]>, - /// Additional peers to dial on startup, as `host:port`. May be given - /// more than once, and is dialed in addition to the network's built-in - /// seed peers. - #[arg(long = "add-peer")] - peers: Vec, /// Socket address to host the private RPC server #[arg(default_value_t = DEFAULT_RPC_ADDR, long, short)] private_rpc_addr: SocketAddr, /// Socket address to host the RPC server #[arg(default_value_t = DEFAULT_RPC_ADDR, long, short)] rpc_addr: SocketAddr, + /// Host name used by the p2p server. + /// This option can be specified multiple times. + #[arg(long = "server-name")] + server_names: Vec, } #[derive(Clone, Debug)] pub struct Config { + pub add_peers: HashSet, pub datadir: PathBuf, pub headless: bool, /// If None, logging to file should be disabled. @@ -167,9 +173,9 @@ pub struct Config { pub net_addr: SocketAddr, pub network: Network, pub network_magic_override: Option, - pub peers: Vec, pub private_rpc_addr: SocketAddr, pub rpc_addr: SocketAddr, + pub server_names: HashSet, } impl Cli { @@ -196,6 +202,7 @@ impl Cli { saturating_pred_level(self.log_level) }; Ok(Config { + add_peers: HashSet::from_iter(self.add_peers), datadir: self.datadir.0, headless: self.headless, log_dir, @@ -206,9 +213,9 @@ impl Cli { net_addr: self.net_addr, network: self.network, network_magic_override: self.network_magic, - peers: self.peers, private_rpc_addr: self.private_rpc_addr, rpc_addr: self.rpc_addr, + server_names: HashSet::from_iter(self.server_names), }) } } diff --git a/app/main.rs b/app/main.rs index 2515efd8..84fa0eb7 100644 --- a/app/main.rs +++ b/app/main.rs @@ -1,4 +1,4 @@ -use std::{path::Path, sync::Arc}; +use std::{net::SocketAddr, path::Path, sync::Arc}; use clap::Parser as _; use mimalloc::MiMalloc; @@ -174,8 +174,13 @@ fn set_tracing_subscriber( Ok((line_buffer, rolling_log_guard)) } +#[derive(Debug)] +struct EguiAppConfig { + rpc_addr: SocketAddr, +} + fn run_egui_app( - config: &crate::cli::Config, + config: EguiAppConfig, line_buffer: LineBuffer, app: Result, ) -> Result<(), eframe::Error> { @@ -213,7 +218,17 @@ fn main() -> anyhow::Result<()> { let (app_tx, app_rx) = oneshot::channel::(); - let app = app::App::new(&config).inspect(|app| { + let app_config = app::Config { + add_peers: config.add_peers, + datadir: config.datadir, + mainchain_grpc_url: config.mainchain_grpc_url, + mnemonic_seed_phrase_path: config.mnemonic_seed_phrase_path, + net_addr: config.net_addr, + network: config.network, + network_magic_override: config.network_magic_override, + server_names: config.server_names, + }; + let app = app::App::new(app_config).inspect(|app| { // spawn rpc server app.runtime.spawn({ let app = app.clone(); @@ -242,9 +257,12 @@ fn main() -> anyhow::Result<()> { Arc::new(rt) } }; + let egui_app_config = EguiAppConfig { + rpc_addr: config.rpc_addr, + }; let _rt_guard = rt.enter(); // For GUI mode we want the GUI to start, even if the app fails to start. - return run_egui_app(&config, line_buffer, app) + return run_egui_app(egui_app_config, line_buffer, app) .map_err(|e| anyhow::anyhow!("failed to run egui app: {e:#}")); } diff --git a/lib/net/mod.rs b/lib/net/mod.rs index 90843785..15c68e16 100644 --- a/lib/net/mod.rs +++ b/lib/net/mod.rs @@ -121,9 +121,12 @@ fn configure_client() -> Result { } /// Returns default server configuration along with its certificate. -fn configure_server() -> Result<(ServerConfig, Vec), Error> { - let cert_key = - rcgen::generate_simple_self_signed(vec!["localhost".into()])?; +fn configure_server( + mut server_names: HashSet, +) -> Result<(ServerConfig, Vec), Error> { + server_names.insert("localhost".to_owned()); + let server_names = Vec::from_iter(server_names); + let cert_key = rcgen::generate_simple_self_signed(server_names)?; let keypair_der = cert_key.key_pair.serialize_der(); let priv_key = rustls::pki_types::PrivateKeyDer::Pkcs8(keypair_der.into()); let cert_der = cert_key.cert.der().to_vec(); @@ -146,11 +149,10 @@ fn configure_server() -> Result<(ServerConfig, Vec), Error> { /// - server certificate serialized into DER format pub fn make_server_endpoint( bind_addr: SocketAddr, + server_names: HashSet, ) -> Result<(Endpoint, Vec), Error> { - let (server_config, server_cert) = configure_server()?; - + let (server_config, server_cert) = configure_server(server_names)?; tracing::info!("creating server endpoint: binding to {bind_addr}",); - let mut endpoint = Endpoint::server(server_config, bind_addr).map_err(Error::Quinn)?; let client_cfg = configure_client()?; @@ -394,7 +396,13 @@ impl Net { if addr.ip().is_unspecified() { return Err(error::ConnectPeer::UnspecfiedPeerIP(addr.ip())); } - let connecting = self.server.connect(addr, "localhost")?; + let connecting = { + let server_name = match resolved_addr.host() { + url::Host::Domain(domain) => domain.as_str(), + url::Host::Ipv4(_) | url::Host::Ipv6(_) => "localhost", + }; + self.server.connect(addr, server_name)? + }; let connection_ctxt = PeerConnectionCtxt { env, archive: self.archive.clone(), @@ -461,8 +469,9 @@ impl Net { state: State, bind_addr: SocketAddr, add_peers: HashSet, + server_names: HashSet, ) -> Result<(Self, PeerInfoRx, DialKnownPeersHandle), Error> { - let (server, _) = make_server_endpoint(bind_addr)?; + let (server, _) = make_server_endpoint(bind_addr, server_names)?; let active_peers = Arc::new(RwLock::new(HashMap::new())); let mut rwtxn = env.write_txn()?; let known_peers = diff --git a/lib/node/mod.rs b/lib/node/mod.rs index d944cea8..2f1a8929 100644 --- a/lib/node/mod.rs +++ b/lib/node/mod.rs @@ -2,7 +2,7 @@ use std::{ borrow::BorrowMut, collections::{HashMap, HashSet}, net::SocketAddr, - path::Path, + path::PathBuf, sync::Arc, }; @@ -36,13 +36,14 @@ use mainchain_task::MainchainTaskHandle; mod net_task; use net_task::NetTaskHandle; -#[derive(Clone, Debug)] -pub struct Config<'a> { - pub datadir: &'a Path, +#[derive(Debug)] +pub struct Config { + pub datadir: PathBuf, pub bind_addr: SocketAddr, pub magic_bytes_override: Option, pub network: Network, - pub peers: &'a [PeerAddress], + pub add_peers: HashSet, + pub server_names: HashSet, } /// Handles for spawned tasks / task sets @@ -71,7 +72,7 @@ where MainchainTransport: proto::Transport, { pub fn new( - config: Config<'_>, + config: Config, cusf_mainchain: mainchain::ValidatorClient, cusf_mainchain_wallet: Option< mainchain::WalletClient, @@ -90,7 +91,8 @@ where bind_addr, magic_bytes_override, network, - peers, + add_peers, + server_names, } = config; let env_path = datadir.join("data.mdb"); // let _ = std::fs::remove_dir_all(&env_path); @@ -148,7 +150,8 @@ where network, state.clone(), bind_addr, - peers.iter().cloned().collect(), + add_peers, + server_names, )?; let net_task_handle = NetTaskHandle::new( runtime,