From 8bfd6ec0e1ebf2e3830292ea09d01986979d3aac Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Thu, 27 Jun 2024 14:53:41 +0400 Subject: [PATCH 1/3] refactor: clean-up discv5 configuration --- Cargo.lock | 1 - bin/reth/src/commands/debug_cmd/execution.rs | 15 ++-- .../commands/debug_cmd/in_memory_merkle.rs | 15 ++-- bin/reth/src/commands/debug_cmd/merkle.rs | 15 ++-- .../src/commands/debug_cmd/replay_engine.rs | 15 ++-- bin/reth/src/commands/p2p/mod.rs | 51 +---------- bin/reth/src/commands/stage/run.rs | 1 + crates/net/network/src/config.rs | 41 +++------ crates/node-core/src/args/network.rs | 87 ++++++++++++++----- crates/node/builder/Cargo.toml | 3 - crates/node/builder/src/builder/mod.rs | 70 ++++----------- crates/optimism/node/src/node.rs | 21 ++--- 12 files changed, 134 insertions(+), 201 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76615d5719ce..0ab142a02833 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7430,7 +7430,6 @@ dependencies = [ "aquamarine", "backon", "confy", - "discv5", "eyre", "fdlimit", "futures", diff --git a/bin/reth/src/commands/debug_cmd/execution.rs b/bin/reth/src/commands/debug_cmd/execution.rs index c1fd4cfa5fa2..7b4d33483874 100644 --- a/bin/reth/src/commands/debug_cmd/execution.rs +++ b/bin/reth/src/commands/debug_cmd/execution.rs @@ -34,7 +34,7 @@ use reth_stages::{ }; use reth_static_file::StaticFileProducer; use reth_tasks::TaskExecutor; -use std::{net::SocketAddr, path::PathBuf, sync::Arc}; +use std::{path::PathBuf, sync::Arc}; use tokio::sync::watch; use tracing::*; @@ -128,13 +128,14 @@ impl Command { let secret_key = get_secret_key(&network_secret_path)?; let network = self .network - .network_config(config, provider_factory.chain_spec(), secret_key, default_peers_path) + .network_config( + config, + provider_factory.chain_spec(), + secret_key, + default_peers_path, + None, + ) .with_task_executor(Box::new(task_executor)) - .listener_addr(SocketAddr::new(self.network.addr, self.network.port)) - .discovery_addr(SocketAddr::new( - self.network.discovery.addr, - self.network.discovery.port, - )) .build(provider_factory) .start_network() .await?; diff --git a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs index 8f78d6711073..9391797140b7 100644 --- a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs +++ b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs @@ -26,7 +26,7 @@ use reth_revm::database::StateProviderDatabase; use reth_stages::StageId; use reth_tasks::TaskExecutor; use reth_trie::{updates::TrieKey, StateRoot}; -use std::{net::SocketAddr, path::PathBuf, sync::Arc}; +use std::{path::PathBuf, sync::Arc}; use tracing::*; /// `reth debug in-memory-merkle` command @@ -62,13 +62,14 @@ impl Command { let secret_key = get_secret_key(&network_secret_path)?; let network = self .network - .network_config(config, provider_factory.chain_spec(), secret_key, default_peers_path) + .network_config( + config, + provider_factory.chain_spec(), + secret_key, + default_peers_path, + None, + ) .with_task_executor(Box::new(task_executor)) - .listener_addr(SocketAddr::new(self.network.addr, self.network.port)) - .discovery_addr(SocketAddr::new( - self.network.discovery.addr, - self.network.discovery.port, - )) .build(provider_factory) .start_network() .await?; diff --git a/bin/reth/src/commands/debug_cmd/merkle.rs b/bin/reth/src/commands/debug_cmd/merkle.rs index 46e76d1da090..afa5f85d2c10 100644 --- a/bin/reth/src/commands/debug_cmd/merkle.rs +++ b/bin/reth/src/commands/debug_cmd/merkle.rs @@ -30,7 +30,7 @@ use reth_stages::{ ExecInput, Stage, StageCheckpoint, }; use reth_tasks::TaskExecutor; -use std::{net::SocketAddr, path::PathBuf, sync::Arc}; +use std::{path::PathBuf, sync::Arc}; use tracing::*; /// `reth debug merkle` command @@ -67,13 +67,14 @@ impl Command { let secret_key = get_secret_key(&network_secret_path)?; let network = self .network - .network_config(config, provider_factory.chain_spec(), secret_key, default_peers_path) + .network_config( + config, + provider_factory.chain_spec(), + secret_key, + default_peers_path, + None, + ) .with_task_executor(Box::new(task_executor)) - .listener_addr(SocketAddr::new(self.network.addr, self.network.port)) - .discovery_addr(SocketAddr::new( - self.network.discovery.addr, - self.network.discovery.port, - )) .build(provider_factory) .start_network() .await?; diff --git a/bin/reth/src/commands/debug_cmd/replay_engine.rs b/bin/reth/src/commands/debug_cmd/replay_engine.rs index 26c8a3558e73..75c8fec0ec16 100644 --- a/bin/reth/src/commands/debug_cmd/replay_engine.rs +++ b/bin/reth/src/commands/debug_cmd/replay_engine.rs @@ -27,7 +27,7 @@ use reth_stages::Pipeline; use reth_static_file::StaticFileProducer; use reth_tasks::TaskExecutor; use reth_transaction_pool::noop::NoopTransactionPool; -use std::{net::SocketAddr, path::PathBuf, sync::Arc, time::Duration}; +use std::{path::PathBuf, sync::Arc, time::Duration}; use tokio::sync::oneshot; use tracing::*; @@ -63,13 +63,14 @@ impl Command { let secret_key = get_secret_key(&network_secret_path)?; let network = self .network - .network_config(config, provider_factory.chain_spec(), secret_key, default_peers_path) + .network_config( + config, + provider_factory.chain_spec(), + secret_key, + default_peers_path, + None, + ) .with_task_executor(Box::new(task_executor)) - .listener_addr(SocketAddr::new(self.network.addr, self.network.port)) - .discovery_addr(SocketAddr::new( - self.network.discovery.addr, - self.network.discovery.port, - )) .build(provider_factory) .start_network() .await?; diff --git a/bin/reth/src/commands/p2p/mod.rs b/bin/reth/src/commands/p2p/mod.rs index 290a0a0b08bb..a54a1f9a52a1 100644 --- a/bin/reth/src/commands/p2p/mod.rs +++ b/bin/reth/src/commands/p2p/mod.rs @@ -4,13 +4,12 @@ use crate::{ args::{ get_secret_key, utils::{chain_help, chain_value_parser, hash_or_num_value_parser, SUPPORTED_CHAINS}, - DatabaseArgs, DiscoveryArgs, NetworkArgs, + DatabaseArgs, NetworkArgs, }, utils::get_single_header, }; use backon::{ConstantBuilder, Retryable}; use clap::{Parser, Subcommand}; -use discv5::ListenConfig; use reth_chainspec::ChainSpec; use reth_config::Config; use reth_db::create_db; @@ -19,11 +18,7 @@ use reth_network_p2p::bodies::client::BodiesClient; use reth_node_core::args::DatadirArgs; use reth_primitives::BlockHashOrNumber; use reth_provider::{providers::StaticFileProvider, ProviderFactory}; -use std::{ - net::{IpAddr, SocketAddrV4, SocketAddrV6}, - path::PathBuf, - sync::Arc, -}; +use std::{path::PathBuf, sync::Arc}; /// `reth p2p` command #[derive(Debug, Parser)] @@ -113,47 +108,7 @@ impl Command { .disable_discv4_discovery_if(self.chain.chain.is_optimism()) .boot_nodes(boot_nodes.clone()) .apply(|builder| { - self.network - .discovery - .apply_to_builder(builder, rlpx_socket) - .map_discv5_config_builder(|builder| { - let DiscoveryArgs { - discv5_addr, - discv5_addr_ipv6, - discv5_port, - discv5_port_ipv6, - discv5_lookup_interval, - discv5_bootstrap_lookup_interval, - discv5_bootstrap_lookup_countdown, - .. - } = self.network.discovery; - - // Use rlpx address if none given - let discv5_addr_ipv4 = discv5_addr.or(match self.network.addr { - IpAddr::V4(ip) => Some(ip), - IpAddr::V6(_) => None, - }); - let discv5_addr_ipv6 = discv5_addr_ipv6.or(match self.network.addr { - IpAddr::V4(_) => None, - IpAddr::V6(ip) => Some(ip), - }); - - builder - .discv5_config( - discv5::ConfigBuilder::new(ListenConfig::from_two_sockets( - discv5_addr_ipv4 - .map(|addr| SocketAddrV4::new(addr, discv5_port)), - discv5_addr_ipv6.map(|addr| { - SocketAddrV6::new(addr, discv5_port_ipv6, 0, 0) - }), - )) - .build(), - ) - .add_unsigned_boot_nodes(boot_nodes.into_iter()) - .lookup_interval(discv5_lookup_interval) - .bootstrap_lookup_interval(discv5_bootstrap_lookup_interval) - .bootstrap_lookup_countdown(discv5_bootstrap_lookup_countdown) - }) + self.network.discovery.apply_to_builder(builder, rlpx_socket, boot_nodes, 1) }) .build(Arc::new(ProviderFactory::new( noop_db, diff --git a/bin/reth/src/commands/stage/run.rs b/bin/reth/src/commands/stage/run.rs index b8dcc7c9194d..401aaa2d45f0 100644 --- a/bin/reth/src/commands/stage/run.rs +++ b/bin/reth/src/commands/stage/run.rs @@ -141,6 +141,7 @@ impl Command { provider_factory.chain_spec(), p2p_secret_key, default_peers_path, + None, ) .build(provider_factory.clone()) .start_network() diff --git a/crates/net/network/src/config.rs b/crates/net/network/src/config.rs index 151421b4a5de..41d5c3e481c5 100644 --- a/crates/net/network/src/config.rs +++ b/crates/net/network/src/config.rs @@ -411,36 +411,6 @@ impl NetworkConfigBuilder { } } - /// Calls a closure on [`reth_discv5::ConfigBuilder`], if discv5 discovery is enabled and the - /// builder has been set. - /// ``` - /// use reth_chainspec::MAINNET; - /// use reth_network::NetworkConfigBuilder; - /// use reth_provider::test_utils::NoopProvider; - /// use secp256k1::{rand::thread_rng, SecretKey}; - /// - /// let sk = SecretKey::new(&mut thread_rng()); - /// let fork_id = MAINNET.latest_fork_id(); - /// let network_config = NetworkConfigBuilder::new(sk) - /// .map_discv5_config_builder(|builder| builder.fork(b"eth", fork_id)) - /// .build(NoopProvider::default()); - /// ``` - pub fn map_discv5_config_builder( - mut self, - f: impl FnOnce(reth_discv5::ConfigBuilder) -> reth_discv5::ConfigBuilder, - ) -> Self { - if let Some(mut builder) = self.discovery_v5_builder { - if let Some(network_stack_id) = NetworkStackId::id(&self.chain_spec) { - let fork_id = self.chain_spec.latest_fork_id(); - builder = builder.fork(network_stack_id, fork_id); - } - - self.discovery_v5_builder = Some(f(builder)); - } - - self - } - /// Adds a new additional protocol to the `RLPx` sub-protocol list. pub fn add_rlpx_sub_protocol(mut self, protocol: impl IntoRlpxSubProtocol) -> Self { self.extra_protocols.push(protocol); @@ -480,7 +450,7 @@ impl NetworkConfigBuilder { secret_key, mut dns_discovery_config, discovery_v4_builder, - discovery_v5_builder, + mut discovery_v5_builder, boot_nodes, discovery_addr, listener_addr, @@ -497,6 +467,15 @@ impl NetworkConfigBuilder { transactions_manager_config, } = self; + discovery_v5_builder = discovery_v5_builder.map(|mut builder| { + if let Some(network_stack_id) = NetworkStackId::id(&chain_spec) { + let fork_id = chain_spec.latest_fork_id(); + builder = builder.fork(network_stack_id, fork_id) + } + + builder + }); + let listener_addr = listener_addr.unwrap_or(DEFAULT_DISCOVERY_ADDRESS); let mut hello_message = diff --git a/crates/node-core/src/args/network.rs b/crates/node-core/src/args/network.rs index a5763495cd8d..dfc02022104f 100644 --- a/crates/node-core/src/args/network.rs +++ b/crates/node-core/src/args/network.rs @@ -4,9 +4,9 @@ use crate::version::P2P_CLIENT_VERSION; use clap::Args; use reth_chainspec::{net::mainnet_nodes, ChainSpec}; use reth_config::Config; -use reth_discv4::{DEFAULT_DISCOVERY_ADDR, DEFAULT_DISCOVERY_PORT}; +use reth_discv4::{NodeRecord, DEFAULT_DISCOVERY_ADDR, DEFAULT_DISCOVERY_PORT}; use reth_discv5::{ - DEFAULT_COUNT_BOOTSTRAP_LOOKUPS, DEFAULT_DISCOVERY_V5_PORT, + discv5::ListenConfig, DEFAULT_COUNT_BOOTSTRAP_LOOKUPS, DEFAULT_DISCOVERY_V5_PORT, DEFAULT_SECONDS_BOOTSTRAP_LOOKUP_INTERVAL, DEFAULT_SECONDS_LOOKUP_INTERVAL, }; use reth_net_nat::NatResolver; @@ -21,7 +21,7 @@ use reth_network::{ use reth_network_peers::TrustedPeer; use secp256k1::SecretKey; use std::{ - net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, ops::Not, path::PathBuf, sync::Arc, @@ -129,10 +129,13 @@ impl NetworkArgs { chain_spec: Arc, secret_key: SecretKey, default_peers_file: PathBuf, + instance: Option, ) -> NetworkConfigBuilder { let chain_bootnodes = chain_spec.bootnodes().unwrap_or_else(mainnet_nodes); let peers_file = self.peers_file.clone().unwrap_or(default_peers_file); + let instance = instance.unwrap_or(1); + // Configure peer connections let peers_config = config .peers @@ -173,23 +176,18 @@ impl NetworkArgs { // apply discovery settings .apply(|builder| { let rlpx_socket = (self.addr, self.port).into(); - self.discovery.apply_to_builder(builder, rlpx_socket) - }) - // modify discv5 settings if enabled in previous step - .map_discv5_config_builder(|builder| { - let DiscoveryArgs { - discv5_lookup_interval, - discv5_bootstrap_lookup_interval, - discv5_bootstrap_lookup_countdown, - .. - } = self.discovery; - - builder - .add_unsigned_boot_nodes(chain_bootnodes) - .lookup_interval(discv5_lookup_interval) - .bootstrap_lookup_interval(discv5_bootstrap_lookup_interval) - .bootstrap_lookup_countdown(discv5_bootstrap_lookup_countdown) + self.discovery.apply_to_builder(builder, rlpx_socket, chain_bootnodes, instance) }) + .listener_addr(SocketAddr::new( + self.addr, + // set discovery port based on instance number + self.port + instance - 1, + )) + .discovery_addr(SocketAddr::new( + self.discovery.addr, + // set discovery port based on instance number + self.discovery.port + instance - 1, + )) } /// If `no_persist_peers` is false then this returns the path to the persistent peers file path. @@ -309,6 +307,8 @@ impl DiscoveryArgs { &self, mut network_config_builder: NetworkConfigBuilder, rlpx_tcp_socket: SocketAddr, + boot_nodes: impl IntoIterator, + instance: u16, ) -> NetworkConfigBuilder { if self.disable_discovery || self.disable_dns_discovery { network_config_builder = network_config_builder.disable_dns_discovery(); @@ -319,13 +319,58 @@ impl DiscoveryArgs { } if !self.disable_discovery && self.enable_discv5_discovery { - network_config_builder = - network_config_builder.discovery_v5(reth_discv5::Config::builder(rlpx_tcp_socket)); + network_config_builder = network_config_builder + .discovery_v5(self.discovery_v5_builder(rlpx_tcp_socket, boot_nodes, instance)); } network_config_builder } + /// Creates a [`reth_discv5::ConfigBuilder`] filling it with the values from this struct. + pub fn discovery_v5_builder( + &self, + rlpx_tcp_socket: SocketAddr, + boot_nodes: impl IntoIterator, + instance: u16, + ) -> reth_discv5::ConfigBuilder { + let Self { + discv5_addr, + discv5_addr_ipv6, + discv5_port, + discv5_port_ipv6, + discv5_lookup_interval, + discv5_bootstrap_lookup_interval, + discv5_bootstrap_lookup_countdown, + .. + } = self; + + // Use rlpx address if none given + let discv5_addr_ipv4 = discv5_addr.or(match rlpx_tcp_socket { + SocketAddr::V4(addr) => Some(*addr.ip()), + SocketAddr::V6(_) => None, + }); + let discv5_addr_ipv6 = discv5_addr_ipv6.or(match rlpx_tcp_socket { + SocketAddr::V4(_) => None, + SocketAddr::V6(addr) => Some(*addr.ip()), + }); + + let discv5_port = discv5_port + instance - 1; + let discv5_port_ipv6 = discv5_port_ipv6 + instance - 1; + + reth_discv5::Config::builder(rlpx_tcp_socket) + .discv5_config( + reth_discv5::discv5::ConfigBuilder::new(ListenConfig::from_two_sockets( + discv5_addr_ipv4.map(|addr| SocketAddrV4::new(addr, discv5_port)), + discv5_addr_ipv6.map(|addr| SocketAddrV6::new(addr, discv5_port_ipv6, 0, 0)), + )) + .build(), + ) + .add_unsigned_boot_nodes(boot_nodes) + .lookup_interval(*discv5_lookup_interval) + .bootstrap_lookup_interval(*discv5_bootstrap_lookup_interval) + .bootstrap_lookup_countdown(*discv5_bootstrap_lookup_countdown) + } + /// Set the discovery port to zero, to allow the OS to assign a random unused port when /// discovery binds to the socket. pub const fn with_unused_discovery_port(mut self) -> Self { diff --git a/crates/node/builder/Cargo.toml b/crates/node/builder/Cargo.toml index 87746ff13571..e6eaa4a393fe 100644 --- a/crates/node/builder/Cargo.toml +++ b/crates/node/builder/Cargo.toml @@ -56,9 +56,6 @@ tokio = { workspace = true, features = [ ] } tokio-stream.workspace = true -## ethereum -discv5.workspace = true - ## crypto secp256k1 = { workspace = true, features = [ "global-context", diff --git a/crates/node/builder/src/builder/mod.rs b/crates/node/builder/src/builder/mod.rs index f23fc873e885..838aa27445f4 100644 --- a/crates/node/builder/src/builder/mod.rs +++ b/crates/node/builder/src/builder/mod.rs @@ -9,7 +9,6 @@ use crate::{ rpc::{RethRpcServerHandles, RpcContext}, DefaultNodeLauncher, Node, NodeHandle, }; -use discv5::ListenConfig; use futures::Future; use reth_chainspec::ChainSpec; use reth_db::{ @@ -39,10 +38,7 @@ use reth_tasks::TaskExecutor; use reth_transaction_pool::{PoolConfig, TransactionPool}; use secp256k1::SecretKey; pub use states::*; -use std::{ - net::{IpAddr, SocketAddr, SocketAddrV4, SocketAddrV6}, - sync::Arc, -}; +use std::sync::Arc; mod states; @@ -530,12 +526,20 @@ impl BuilderContext { pub fn network_config_builder(&self) -> eyre::Result { let secret_key = self.network_secret(&self.config().datadir())?; let default_peers_path = self.config().datadir().known_peers(); - Ok(self.config().network.network_config( - self.reth_config(), - self.config().chain.clone(), - secret_key, - default_peers_path, - )) + let builder = self + .config() + .network + .network_config( + self.reth_config(), + self.config().chain.clone(), + secret_key, + default_peers_path, + None, + ) + .with_task_executor(Box::new(self.executor.clone())) + .set_head(self.head); + + Ok(builder) } /// Get the network secret from the given data dir @@ -551,49 +555,7 @@ impl BuilderContext { &self, network_builder: NetworkConfigBuilder, ) -> NetworkConfig { - network_builder - .with_task_executor(Box::new(self.executor.clone())) - .set_head(self.head) - .listener_addr(SocketAddr::new( - self.config().network.addr, - // set discovery port based on instance number - self.config().network.port + self.config().instance - 1, - )) - .discovery_addr(SocketAddr::new( - self.config().network.discovery.addr, - // set discovery port based on instance number - self.config().network.discovery.port + self.config().instance - 1, - )) - .map_discv5_config_builder(|builder| { - // Use rlpx address if none given - let discv5_addr_ipv4 = self.config().network.discovery.discv5_addr.or( - match self.config().network.addr { - IpAddr::V4(ip) => Some(ip), - IpAddr::V6(_) => None, - }, - ); - let discv5_addr_ipv6 = self.config().network.discovery.discv5_addr_ipv6.or( - match self.config().network.addr { - IpAddr::V4(_) => None, - IpAddr::V6(ip) => Some(ip), - }, - ); - - let discv5_port_ipv4 = - self.config().network.discovery.discv5_port + self.config().instance - 1; - let discv5_port_ipv6 = - self.config().network.discovery.discv5_port_ipv6 + self.config().instance - 1; - - builder.discv5_config( - discv5::ConfigBuilder::new(ListenConfig::from_two_sockets( - discv5_addr_ipv4.map(|addr| SocketAddrV4::new(addr, discv5_port_ipv4)), - discv5_addr_ipv6 - .map(|addr| SocketAddrV6::new(addr, discv5_port_ipv6, 0, 0)), - )) - .build(), - ) - }) - .build(self.provider.clone()) + network_builder.build(self.provider.clone()) } } diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs index d8628dc6bf85..af1d448c4619 100644 --- a/crates/optimism/node/src/node.rs +++ b/crates/optimism/node/src/node.rs @@ -283,27 +283,18 @@ where // purposefully disable discv4 .disable_discv4_discovery() // apply discovery settings - .apply(|builder| { + .apply(|mut builder| { let rlpx_socket = (args.addr, args.port).into(); - let mut builder = args.discovery.apply_to_builder(builder, rlpx_socket); if !args.discovery.disable_discovery { - builder = builder.discovery_v5(reth_discv5::Config::builder(rlpx_socket)); + builder = builder.discovery_v5(args.discovery.discovery_v5_builder( + rlpx_socket, + ctx.chain_spec().bootnodes().unwrap_or_default(), + ctx.config().instance, + )); } builder - }) - // ensure we configure discv5 - .map_discv5_config_builder(|builder| { - builder - .add_unsigned_boot_nodes(ctx.chain_spec().bootnodes().unwrap_or_default()) - .lookup_interval(ctx.config().network.discovery.discv5_lookup_interval) - .bootstrap_lookup_interval( - ctx.config().network.discovery.discv5_bootstrap_lookup_interval, - ) - .bootstrap_lookup_countdown( - ctx.config().network.discovery.discv5_bootstrap_lookup_countdown, - ) }); let mut network_config = ctx.build_network_config(network_builder); From 76016c68128301999494fc35a96368676b2facaf Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Thu, 27 Jun 2024 16:28:42 +0400 Subject: [PATCH 2/3] fix: apply instance earlier --- bin/reth/src/commands/debug_cmd/execution.rs | 8 +--- .../commands/debug_cmd/in_memory_merkle.rs | 8 +--- bin/reth/src/commands/debug_cmd/merkle.rs | 8 +--- .../src/commands/debug_cmd/replay_engine.rs | 8 +--- bin/reth/src/commands/p2p/mod.rs | 2 +- bin/reth/src/commands/stage/run.rs | 1 - crates/node-core/src/args/network.rs | 46 ++++++++++++------- crates/node-core/src/node_config.rs | 1 + crates/node/builder/src/builder/mod.rs | 1 - crates/node/builder/src/launch/common.rs | 4 +- 10 files changed, 38 insertions(+), 49 deletions(-) diff --git a/bin/reth/src/commands/debug_cmd/execution.rs b/bin/reth/src/commands/debug_cmd/execution.rs index 7b4d33483874..bd6ae6e4a518 100644 --- a/bin/reth/src/commands/debug_cmd/execution.rs +++ b/bin/reth/src/commands/debug_cmd/execution.rs @@ -128,13 +128,7 @@ impl Command { let secret_key = get_secret_key(&network_secret_path)?; let network = self .network - .network_config( - config, - provider_factory.chain_spec(), - secret_key, - default_peers_path, - None, - ) + .network_config(config, provider_factory.chain_spec(), secret_key, default_peers_path) .with_task_executor(Box::new(task_executor)) .build(provider_factory) .start_network() diff --git a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs index 9391797140b7..d7a5b42bc201 100644 --- a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs +++ b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs @@ -62,13 +62,7 @@ impl Command { let secret_key = get_secret_key(&network_secret_path)?; let network = self .network - .network_config( - config, - provider_factory.chain_spec(), - secret_key, - default_peers_path, - None, - ) + .network_config(config, provider_factory.chain_spec(), secret_key, default_peers_path) .with_task_executor(Box::new(task_executor)) .build(provider_factory) .start_network() diff --git a/bin/reth/src/commands/debug_cmd/merkle.rs b/bin/reth/src/commands/debug_cmd/merkle.rs index afa5f85d2c10..a2ea76db201c 100644 --- a/bin/reth/src/commands/debug_cmd/merkle.rs +++ b/bin/reth/src/commands/debug_cmd/merkle.rs @@ -67,13 +67,7 @@ impl Command { let secret_key = get_secret_key(&network_secret_path)?; let network = self .network - .network_config( - config, - provider_factory.chain_spec(), - secret_key, - default_peers_path, - None, - ) + .network_config(config, provider_factory.chain_spec(), secret_key, default_peers_path) .with_task_executor(Box::new(task_executor)) .build(provider_factory) .start_network() diff --git a/bin/reth/src/commands/debug_cmd/replay_engine.rs b/bin/reth/src/commands/debug_cmd/replay_engine.rs index 75c8fec0ec16..6d1fabda60a8 100644 --- a/bin/reth/src/commands/debug_cmd/replay_engine.rs +++ b/bin/reth/src/commands/debug_cmd/replay_engine.rs @@ -63,13 +63,7 @@ impl Command { let secret_key = get_secret_key(&network_secret_path)?; let network = self .network - .network_config( - config, - provider_factory.chain_spec(), - secret_key, - default_peers_path, - None, - ) + .network_config(config, provider_factory.chain_spec(), secret_key, default_peers_path) .with_task_executor(Box::new(task_executor)) .build(provider_factory) .start_network() diff --git a/bin/reth/src/commands/p2p/mod.rs b/bin/reth/src/commands/p2p/mod.rs index a54a1f9a52a1..161eb6cc9133 100644 --- a/bin/reth/src/commands/p2p/mod.rs +++ b/bin/reth/src/commands/p2p/mod.rs @@ -108,7 +108,7 @@ impl Command { .disable_discv4_discovery_if(self.chain.chain.is_optimism()) .boot_nodes(boot_nodes.clone()) .apply(|builder| { - self.network.discovery.apply_to_builder(builder, rlpx_socket, boot_nodes, 1) + self.network.discovery.apply_to_builder(builder, rlpx_socket, boot_nodes) }) .build(Arc::new(ProviderFactory::new( noop_db, diff --git a/bin/reth/src/commands/stage/run.rs b/bin/reth/src/commands/stage/run.rs index 401aaa2d45f0..b8dcc7c9194d 100644 --- a/bin/reth/src/commands/stage/run.rs +++ b/bin/reth/src/commands/stage/run.rs @@ -141,7 +141,6 @@ impl Command { provider_factory.chain_spec(), p2p_secret_key, default_peers_path, - None, ) .build(provider_factory.clone()) .start_network() diff --git a/crates/node-core/src/args/network.rs b/crates/node-core/src/args/network.rs index dfc02022104f..725838d08bca 100644 --- a/crates/node-core/src/args/network.rs +++ b/crates/node-core/src/args/network.rs @@ -129,13 +129,10 @@ impl NetworkArgs { chain_spec: Arc, secret_key: SecretKey, default_peers_file: PathBuf, - instance: Option, ) -> NetworkConfigBuilder { let chain_bootnodes = chain_spec.bootnodes().unwrap_or_else(mainnet_nodes); let peers_file = self.peers_file.clone().unwrap_or(default_peers_file); - let instance = instance.unwrap_or(1); - // Configure peer connections let peers_config = config .peers @@ -176,17 +173,16 @@ impl NetworkArgs { // apply discovery settings .apply(|builder| { let rlpx_socket = (self.addr, self.port).into(); - self.discovery.apply_to_builder(builder, rlpx_socket, chain_bootnodes, instance) + self.discovery.apply_to_builder(builder, rlpx_socket, chain_bootnodes) }) .listener_addr(SocketAddr::new( - self.addr, - // set discovery port based on instance number - self.port + instance - 1, + self.addr, // set discovery port based on instance number + self.port, )) .discovery_addr(SocketAddr::new( self.discovery.addr, // set discovery port based on instance number - self.discovery.port + instance - 1, + self.discovery.port, )) } @@ -209,6 +205,17 @@ impl NetworkArgs { self.discovery = self.discovery.with_unused_discovery_port(); self } + + /// Change networking port numbers based on the instance number. + /// Ports are updated to `previous_value + instance - 1` + /// + /// # Panics + /// Warning: if `instance` is zero in debug mode, this will panic. + pub fn adjust_instance_ports(&mut self, instance: u16) { + debug_assert_ne!(instance, 0, "instance must be non-zero"); + self.port += instance - 1; + self.discovery.adjust_instance_ports(instance); + } } impl Default for NetworkArgs { @@ -308,7 +315,6 @@ impl DiscoveryArgs { mut network_config_builder: NetworkConfigBuilder, rlpx_tcp_socket: SocketAddr, boot_nodes: impl IntoIterator, - instance: u16, ) -> NetworkConfigBuilder { if self.disable_discovery || self.disable_dns_discovery { network_config_builder = network_config_builder.disable_dns_discovery(); @@ -320,7 +326,7 @@ impl DiscoveryArgs { if !self.disable_discovery && self.enable_discv5_discovery { network_config_builder = network_config_builder - .discovery_v5(self.discovery_v5_builder(rlpx_tcp_socket, boot_nodes, instance)); + .discovery_v5(self.discovery_v5_builder(rlpx_tcp_socket, boot_nodes)); } network_config_builder @@ -331,7 +337,6 @@ impl DiscoveryArgs { &self, rlpx_tcp_socket: SocketAddr, boot_nodes: impl IntoIterator, - instance: u16, ) -> reth_discv5::ConfigBuilder { let Self { discv5_addr, @@ -354,14 +359,11 @@ impl DiscoveryArgs { SocketAddr::V6(addr) => Some(*addr.ip()), }); - let discv5_port = discv5_port + instance - 1; - let discv5_port_ipv6 = discv5_port_ipv6 + instance - 1; - reth_discv5::Config::builder(rlpx_tcp_socket) .discv5_config( reth_discv5::discv5::ConfigBuilder::new(ListenConfig::from_two_sockets( - discv5_addr_ipv4.map(|addr| SocketAddrV4::new(addr, discv5_port)), - discv5_addr_ipv6.map(|addr| SocketAddrV6::new(addr, discv5_port_ipv6, 0, 0)), + discv5_addr_ipv4.map(|addr| SocketAddrV4::new(addr, *discv5_port)), + discv5_addr_ipv6.map(|addr| SocketAddrV6::new(addr, *discv5_port_ipv6, 0, 0)), )) .build(), ) @@ -377,6 +379,18 @@ impl DiscoveryArgs { self.port = 0; self } + + /// Change networking port numbers based on the instance number. + /// Ports are updated to `previous_value + instance - 1` + /// + /// # Panics + /// Warning: if `instance` is zero in debug mode, this will panic. + pub fn adjust_instance_ports(&mut self, instance: u16) { + debug_assert_ne!(instance, 0, "instance must be non-zero"); + self.port += instance - 1; + self.discv5_port += instance - 1; + self.discv5_port_ipv6 += instance - 1; + } } impl Default for DiscoveryArgs { diff --git a/crates/node-core/src/node_config.rs b/crates/node-core/src/node_config.rs index 932c12e70436..8f9ff42f9eae 100644 --- a/crates/node-core/src/node_config.rs +++ b/crates/node-core/src/node_config.rs @@ -390,6 +390,7 @@ impl NodeConfig { /// [`RpcServerArgs::adjust_instance_ports`] method. pub fn adjust_instance_ports(&mut self) { self.rpc.adjust_instance_ports(self.instance); + self.network.adjust_instance_ports(self.instance); } /// Sets networking and RPC ports to zero, causing the OS to choose random unused ports when diff --git a/crates/node/builder/src/builder/mod.rs b/crates/node/builder/src/builder/mod.rs index 838aa27445f4..bb6a13ad6b5a 100644 --- a/crates/node/builder/src/builder/mod.rs +++ b/crates/node/builder/src/builder/mod.rs @@ -534,7 +534,6 @@ impl BuilderContext { self.config().chain.clone(), secret_key, default_peers_path, - None, ) .with_task_executor(Box::new(self.executor.clone())) .set_head(self.head); diff --git a/crates/node/builder/src/launch/common.rs b/crates/node/builder/src/launch/common.rs index 1c48fd763041..a1512e25798f 100644 --- a/crates/node/builder/src/launch/common.rs +++ b/crates/node/builder/src/launch/common.rs @@ -251,7 +251,7 @@ impl LaunchContextWith> { /// - Making sure the ETL dir is set to the datadir /// - RPC settings are adjusted to the correct port pub fn with_adjusted_configs(self) -> Self { - self.ensure_etl_datadir().with_adjusted_rpc_instance_ports() + self.ensure_etl_datadir().with_adjusted_instance_ports() } /// Make sure ETL doesn't default to /tmp/, but to whatever datadir is set to @@ -265,7 +265,7 @@ impl LaunchContextWith> { } /// Change rpc port numbers based on the instance number. - pub fn with_adjusted_rpc_instance_ports(mut self) -> Self { + pub fn with_adjusted_instance_ports(mut self) -> Self { self.node_config_mut().adjust_instance_ports(); self } From 04a071d20e5d8389363df403fa8f9db546c39208 Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Thu, 27 Jun 2024 16:32:35 +0400 Subject: [PATCH 3/3] fix --- crates/optimism/node/src/node.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs index af1d448c4619..2ea24da6754a 100644 --- a/crates/optimism/node/src/node.rs +++ b/crates/optimism/node/src/node.rs @@ -290,7 +290,6 @@ where builder = builder.discovery_v5(args.discovery.discovery_v5_builder( rlpx_socket, ctx.chain_spec().bootnodes().unwrap_or_default(), - ctx.config().instance, )); }