From 3aa240d8cf09de4b2a853ad3df19b12aa070ea06 Mon Sep 17 00:00:00 2001 From: anonymousGiga Date: Tue, 2 Jul 2024 16:12:16 +0800 Subject: [PATCH 1/5] Fix: fix the issue of not being able to specify bootnode through command parameters --- crates/node/core/src/args/network.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/node/core/src/args/network.rs b/crates/node/core/src/args/network.rs index 03bd6a30783..55a8f86133f 100644 --- a/crates/node/core/src/args/network.rs +++ b/crates/node/core/src/args/network.rs @@ -50,7 +50,7 @@ pub struct NetworkArgs { /// /// Will fall back to a network-specific default if not specified. #[arg(long, value_delimiter = ',')] - pub bootnodes: Option>, + pub bootnodes: Option>, /// Amount of DNS resolution requests retries to perform when peering. #[arg(long, default_value_t = 0)] @@ -130,7 +130,10 @@ impl NetworkArgs { secret_key: SecretKey, default_peers_file: PathBuf, ) -> NetworkConfigBuilder { - let chain_bootnodes = chain_spec.bootnodes().unwrap_or_else(mainnet_nodes); + let chain_bootnodes = self + .bootnodes + .clone() + .unwrap_or_else(|| chain_spec.bootnodes().unwrap_or_else(mainnet_nodes)); let peers_file = self.peers_file.clone().unwrap_or(default_peers_file); // Configure peer connections From f0b2ce815706aef0373bc8404cd5fddcd53ad48f Mon Sep 17 00:00:00 2001 From: anonymousGiga Date: Wed, 3 Jul 2024 10:48:56 +0800 Subject: [PATCH 2/5] use trusted peer struct for bootnodes --- crates/net/peers/src/node_record.rs | 23 ++++++++++++++++++++++- crates/node/core/src/args/network.rs | 5 +++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/crates/net/peers/src/node_record.rs b/crates/net/peers/src/node_record.rs index 5f268c25391..c96d6aadd3f 100644 --- a/crates/net/peers/src/node_record.rs +++ b/crates/net/peers/src/node_record.rs @@ -8,12 +8,13 @@ use std::{ str::FromStr, }; -use crate::PeerId; +use crate::{PeerId, TrustedPeer}; use alloy_rlp::{RlpDecodable, RlpEncodable}; use serde_with::{DeserializeFromStr, SerializeDisplay}; #[cfg(feature = "secp256k1")] use enr::Enr; +use url::Host; /// Represents a ENR in discovery. /// @@ -196,6 +197,26 @@ impl FromStr for NodeRecord { } } +impl From for NodeRecord { + fn from(trust: TrustedPeer) -> Self { + use std::net::{SocketAddr, ToSocketAddrs}; + let lookup_host = |host: &str| -> Option { + let mut addrs = host.to_socket_addrs().expect("No IP found"); + addrs.next() + }; + + let address = match trust.host { + Host::Ipv4(ip) => IpAddr::V4(ip), + Host::Ipv6(ip) => IpAddr::V6(ip), + Host::Domain(domain) => { + let ip = lookup_host(&format!("{domain}:0")).expect("No IP found"); + ip.ip() + } + }; + Self { address, tcp_port: trust.tcp_port, udp_port: trust.udp_port, id: trust.id } + } +} + #[cfg(feature = "secp256k1")] impl TryFrom<&Enr> for NodeRecord { type Error = NodeRecordParseError; diff --git a/crates/node/core/src/args/network.rs b/crates/node/core/src/args/network.rs index 55a8f86133f..c36baf5cf9b 100644 --- a/crates/node/core/src/args/network.rs +++ b/crates/node/core/src/args/network.rs @@ -50,7 +50,7 @@ pub struct NetworkArgs { /// /// Will fall back to a network-specific default if not specified. #[arg(long, value_delimiter = ',')] - pub bootnodes: Option>, + pub bootnodes: Option>, /// Amount of DNS resolution requests retries to perform when peering. #[arg(long, default_value_t = 0)] @@ -130,9 +130,10 @@ impl NetworkArgs { secret_key: SecretKey, default_peers_file: PathBuf, ) -> NetworkConfigBuilder { - let chain_bootnodes = self + let chain_bootnodes: Vec = self .bootnodes .clone() + .map(|bootnodes| bootnodes.into_iter().map(Into::into).collect()) .unwrap_or_else(|| chain_spec.bootnodes().unwrap_or_else(mainnet_nodes)); let peers_file = self.peers_file.clone().unwrap_or(default_peers_file); From 907ca0b5e344a3eb03c557fca23f08af4258217d Mon Sep 17 00:00:00 2001 From: anonymousGiga Date: Thu, 4 Jul 2024 14:11:12 +0800 Subject: [PATCH 3/5] use resolve_blocking convert TustedPeer to NodeRecord --- crates/net/peers/src/node_record.rs | 23 +---------------------- crates/node/core/src/args/network.rs | 9 +++++++-- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/crates/net/peers/src/node_record.rs b/crates/net/peers/src/node_record.rs index c96d6aadd3f..5f268c25391 100644 --- a/crates/net/peers/src/node_record.rs +++ b/crates/net/peers/src/node_record.rs @@ -8,13 +8,12 @@ use std::{ str::FromStr, }; -use crate::{PeerId, TrustedPeer}; +use crate::PeerId; use alloy_rlp::{RlpDecodable, RlpEncodable}; use serde_with::{DeserializeFromStr, SerializeDisplay}; #[cfg(feature = "secp256k1")] use enr::Enr; -use url::Host; /// Represents a ENR in discovery. /// @@ -197,26 +196,6 @@ impl FromStr for NodeRecord { } } -impl From for NodeRecord { - fn from(trust: TrustedPeer) -> Self { - use std::net::{SocketAddr, ToSocketAddrs}; - let lookup_host = |host: &str| -> Option { - let mut addrs = host.to_socket_addrs().expect("No IP found"); - addrs.next() - }; - - let address = match trust.host { - Host::Ipv4(ip) => IpAddr::V4(ip), - Host::Ipv6(ip) => IpAddr::V6(ip), - Host::Domain(domain) => { - let ip = lookup_host(&format!("{domain}:0")).expect("No IP found"); - ip.ip() - } - }; - Self { address, tcp_port: trust.tcp_port, udp_port: trust.udp_port, id: trust.id } - } -} - #[cfg(feature = "secp256k1")] impl TryFrom<&Enr> for NodeRecord { type Error = NodeRecordParseError; diff --git a/crates/node/core/src/args/network.rs b/crates/node/core/src/args/network.rs index c36baf5cf9b..71ed0a5f020 100644 --- a/crates/node/core/src/args/network.rs +++ b/crates/node/core/src/args/network.rs @@ -130,10 +130,15 @@ impl NetworkArgs { secret_key: SecretKey, default_peers_file: PathBuf, ) -> NetworkConfigBuilder { - let chain_bootnodes: Vec = self + let chain_bootnodes = self .bootnodes .clone() - .map(|bootnodes| bootnodes.into_iter().map(Into::into).collect()) + .map(|bootnodes| { + bootnodes + .into_iter() + .filter_map(|trusted_peer| trusted_peer.resolve_blocking().ok()) + .collect() + }) .unwrap_or_else(|| chain_spec.bootnodes().unwrap_or_else(mainnet_nodes)); let peers_file = self.peers_file.clone().unwrap_or(default_peers_file); From eb8613546f02f133d9d8364ad0198c5de8db33b3 Mon Sep 17 00:00:00 2001 From: anonymousGiga Date: Thu, 4 Jul 2024 22:38:26 +0800 Subject: [PATCH 4/5] add the default bootnodes of chainspec --- crates/node/core/src/args/network.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/node/core/src/args/network.rs b/crates/node/core/src/args/network.rs index 71ed0a5f020..3afefc85df3 100644 --- a/crates/node/core/src/args/network.rs +++ b/crates/node/core/src/args/network.rs @@ -137,9 +137,15 @@ impl NetworkArgs { bootnodes .into_iter() .filter_map(|trusted_peer| trusted_peer.resolve_blocking().ok()) - .collect() + .collect::>() }) - .unwrap_or_else(|| chain_spec.bootnodes().unwrap_or_else(mainnet_nodes)); + .unwrap_or_default() + .into_iter() + .chain(chain_spec.bootnodes().unwrap_or_default()) + .collect::>(); + let chain_bootnodes = + if chain_bootnodes.is_empty() { mainnet_nodes() } else { chain_bootnodes }; + let peers_file = self.peers_file.clone().unwrap_or(default_peers_file); // Configure peer connections From efc48ba106a3196a62861b37c22fafb742cd5bbf Mon Sep 17 00:00:00 2001 From: anonymousGiga Date: Thu, 4 Jul 2024 23:26:26 +0800 Subject: [PATCH 5/5] update --- crates/node/core/src/args/network.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/node/core/src/args/network.rs b/crates/node/core/src/args/network.rs index 3afefc85df3..65f6f5834f1 100644 --- a/crates/node/core/src/args/network.rs +++ b/crates/node/core/src/args/network.rs @@ -123,6 +123,12 @@ impl NetworkArgs { /// /// The `default_peers_file` will be used as the default location to store the persistent peers /// file if `no_persist_peers` is false, and there is no provided `peers_file`. + /// + /// Configured Bootnodes are prioritized, if unset, the chain spec bootnodes are used + /// Priority order for bootnodes configuration: + /// 1. --bootnodes flag + /// 2. Network preset flags (e.g. --holesky) + /// 3. default to mainnet nodes pub fn network_config( &self, config: &Config, @@ -137,15 +143,9 @@ impl NetworkArgs { bootnodes .into_iter() .filter_map(|trusted_peer| trusted_peer.resolve_blocking().ok()) - .collect::>() + .collect() }) - .unwrap_or_default() - .into_iter() - .chain(chain_spec.bootnodes().unwrap_or_default()) - .collect::>(); - let chain_bootnodes = - if chain_bootnodes.is_empty() { mainnet_nodes() } else { chain_bootnodes }; - + .unwrap_or_else(|| chain_spec.bootnodes().unwrap_or_else(mainnet_nodes)); let peers_file = self.peers_file.clone().unwrap_or(default_peers_file); // Configure peer connections