Add an ability to change P2P listening address (#4849)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
kaliubuntu0206
2023-09-29 21:44:43 +09:00
committed by GitHub
parent 3c681fa45e
commit 23d2baff0f
6 changed files with 73 additions and 53 deletions

View File

@ -3,11 +3,12 @@
use crate::version::P2P_CLIENT_VERSION; use crate::version::P2P_CLIENT_VERSION;
use clap::Args; use clap::Args;
use reth_config::Config; use reth_config::Config;
use reth_discv4::{DEFAULT_DISCOVERY_ADDR, DEFAULT_DISCOVERY_PORT};
use reth_net_nat::NatResolver; use reth_net_nat::NatResolver;
use reth_network::{HelloMessage, NetworkConfigBuilder}; use reth_network::{HelloMessage, NetworkConfigBuilder};
use reth_primitives::{mainnet_nodes, ChainSpec, NodeRecord}; use reth_primitives::{mainnet_nodes, ChainSpec, NodeRecord};
use secp256k1::SecretKey; use secp256k1::SecretKey;
use std::{path::PathBuf, sync::Arc}; use std::{net::Ipv4Addr, path::PathBuf, sync::Arc};
/// Parameters for configuring the network more granularity via CLI /// Parameters for configuring the network more granularity via CLI
#[derive(Debug, Args)] #[derive(Debug, Args)]
@ -57,9 +58,13 @@ pub struct NetworkArgs {
#[arg(long, default_value = "any")] #[arg(long, default_value = "any")]
pub nat: NatResolver, pub nat: NatResolver,
/// Network listening port. default: 30303 /// Network listening address
#[arg(long = "port", value_name = "PORT")] #[arg(long = "addr", value_name = "ADDR", default_value_t = DEFAULT_DISCOVERY_ADDR)]
pub port: Option<u16>, pub addr: Ipv4Addr,
/// Network listening port
#[arg(long = "port", value_name = "PORT", default_value_t = DEFAULT_DISCOVERY_PORT)]
pub port: u16,
/// Maximum number of outbound requests. default: 100 /// Maximum number of outbound requests. default: 100
#[arg(long)] #[arg(long)]
@ -133,9 +138,13 @@ pub struct DiscoveryArgs {
#[arg(long, conflicts_with = "disable_discovery")] #[arg(long, conflicts_with = "disable_discovery")]
pub disable_discv4_discovery: bool, pub disable_discv4_discovery: bool,
/// The UDP port to use for P2P discovery/networking. default: 30303 /// The UDP address to use for P2P discovery/networking
#[arg(long = "discovery.port", name = "discovery.port", value_name = "DISCOVERY_PORT")] #[arg(long = "discovery.addr", name = "discovery.addr", value_name = "DISCOVERY_ADDR", default_value_t = DEFAULT_DISCOVERY_ADDR)]
pub port: Option<u16>, pub addr: Ipv4Addr,
/// The UDP port to use for P2P discovery/networking
#[arg(long = "discovery.port", name = "discovery.port", value_name = "DISCOVERY_PORT", default_value_t = DEFAULT_DISCOVERY_PORT)]
pub port: u16,
} }
impl DiscoveryArgs { impl DiscoveryArgs {

View File

@ -12,7 +12,6 @@ use futures::{stream::select as stream_select, StreamExt};
use reth_beacon_consensus::BeaconConsensus; use reth_beacon_consensus::BeaconConsensus;
use reth_config::Config; use reth_config::Config;
use reth_db::{database::Database, init_db, DatabaseEnv}; use reth_db::{database::Database, init_db, DatabaseEnv};
use reth_discv4::DEFAULT_DISCOVERY_PORT;
use reth_downloaders::{ use reth_downloaders::{
bodies::bodies::BodiesDownloaderBuilder, bodies::bodies::BodiesDownloaderBuilder,
headers::reverse_headers::ReverseHeadersDownloaderBuilder, headers::reverse_headers::ReverseHeadersDownloaderBuilder,
@ -35,7 +34,7 @@ use reth_stages::{
}; };
use reth_tasks::TaskExecutor; use reth_tasks::TaskExecutor;
use std::{ use std::{
net::{Ipv4Addr, SocketAddr, SocketAddrV4}, net::{SocketAddr, SocketAddrV4},
path::PathBuf, path::PathBuf,
sync::Arc, sync::Arc,
}; };
@ -167,13 +166,10 @@ impl Command {
.network .network
.network_config(config, self.chain.clone(), secret_key, default_peers_path) .network_config(config, self.chain.clone(), secret_key, default_peers_path)
.with_task_executor(Box::new(task_executor)) .with_task_executor(Box::new(task_executor))
.listener_addr(SocketAddr::V4(SocketAddrV4::new( .listener_addr(SocketAddr::V4(SocketAddrV4::new(self.network.addr, self.network.port)))
Ipv4Addr::UNSPECIFIED,
self.network.port.unwrap_or(DEFAULT_DISCOVERY_PORT),
)))
.discovery_addr(SocketAddr::V4(SocketAddrV4::new( .discovery_addr(SocketAddr::V4(SocketAddrV4::new(
Ipv4Addr::UNSPECIFIED, self.network.discovery.addr,
self.network.discovery.port.unwrap_or(DEFAULT_DISCOVERY_PORT), self.network.discovery.port,
))) )))
.build(ProviderFactory::new(db, self.chain.clone())) .build(ProviderFactory::new(db, self.chain.clone()))
.start_network() .start_network()

View File

@ -9,7 +9,6 @@ use backon::{ConstantBuilder, Retryable};
use clap::Parser; use clap::Parser;
use reth_config::Config; use reth_config::Config;
use reth_db::{init_db, DatabaseEnv}; use reth_db::{init_db, DatabaseEnv};
use reth_discv4::DEFAULT_DISCOVERY_PORT;
use reth_network::NetworkHandle; use reth_network::NetworkHandle;
use reth_network_api::NetworkInfo; use reth_network_api::NetworkInfo;
use reth_primitives::{fs, stage::StageId, BlockHashOrNumber, ChainSpec}; use reth_primitives::{fs, stage::StageId, BlockHashOrNumber, ChainSpec};
@ -21,7 +20,7 @@ use reth_provider::{
use reth_tasks::TaskExecutor; use reth_tasks::TaskExecutor;
use reth_trie::{hashed_cursor::HashedPostStateCursorFactory, updates::TrieKey, StateRoot}; use reth_trie::{hashed_cursor::HashedPostStateCursorFactory, updates::TrieKey, StateRoot};
use std::{ use std::{
net::{Ipv4Addr, SocketAddr, SocketAddrV4}, net::{SocketAddr, SocketAddrV4},
path::PathBuf, path::PathBuf,
sync::Arc, sync::Arc,
}; };
@ -90,13 +89,10 @@ impl Command {
.network .network
.network_config(config, self.chain.clone(), secret_key, default_peers_path) .network_config(config, self.chain.clone(), secret_key, default_peers_path)
.with_task_executor(Box::new(task_executor)) .with_task_executor(Box::new(task_executor))
.listener_addr(SocketAddr::V4(SocketAddrV4::new( .listener_addr(SocketAddr::V4(SocketAddrV4::new(self.network.addr, self.network.port)))
Ipv4Addr::UNSPECIFIED,
self.network.port.unwrap_or(DEFAULT_DISCOVERY_PORT),
)))
.discovery_addr(SocketAddr::V4(SocketAddrV4::new( .discovery_addr(SocketAddr::V4(SocketAddrV4::new(
Ipv4Addr::UNSPECIFIED, self.network.discovery.addr,
self.network.discovery.port.unwrap_or(DEFAULT_DISCOVERY_PORT), self.network.discovery.port,
))) )))
.build(ProviderFactory::new(db, self.chain.clone())) .build(ProviderFactory::new(db, self.chain.clone()))
.start_network() .start_network()

View File

@ -10,7 +10,6 @@ use clap::Parser;
use reth_beacon_consensus::BeaconConsensus; use reth_beacon_consensus::BeaconConsensus;
use reth_config::Config; use reth_config::Config;
use reth_db::{cursor::DbCursorRO, init_db, tables, transaction::DbTx, DatabaseEnv}; use reth_db::{cursor::DbCursorRO, init_db, tables, transaction::DbTx, DatabaseEnv};
use reth_discv4::DEFAULT_DISCOVERY_PORT;
use reth_interfaces::{consensus::Consensus, p2p::full_block::FullBlockClient}; use reth_interfaces::{consensus::Consensus, p2p::full_block::FullBlockClient};
use reth_network::NetworkHandle; use reth_network::NetworkHandle;
use reth_network_api::NetworkInfo; use reth_network_api::NetworkInfo;
@ -29,7 +28,7 @@ use reth_stages::{
}; };
use reth_tasks::TaskExecutor; use reth_tasks::TaskExecutor;
use std::{ use std::{
net::{Ipv4Addr, SocketAddr, SocketAddrV4}, net::{SocketAddr, SocketAddrV4},
path::PathBuf, path::PathBuf,
sync::Arc, sync::Arc,
}; };
@ -99,13 +98,10 @@ impl Command {
.network .network
.network_config(config, self.chain.clone(), secret_key, default_peers_path) .network_config(config, self.chain.clone(), secret_key, default_peers_path)
.with_task_executor(Box::new(task_executor)) .with_task_executor(Box::new(task_executor))
.listener_addr(SocketAddr::V4(SocketAddrV4::new( .listener_addr(SocketAddr::V4(SocketAddrV4::new(self.network.addr, self.network.port)))
Ipv4Addr::UNSPECIFIED,
self.network.port.unwrap_or(DEFAULT_DISCOVERY_PORT),
)))
.discovery_addr(SocketAddr::V4(SocketAddrV4::new( .discovery_addr(SocketAddr::V4(SocketAddrV4::new(
Ipv4Addr::UNSPECIFIED, self.network.discovery.addr,
self.network.discovery.port.unwrap_or(DEFAULT_DISCOVERY_PORT), self.network.discovery.port,
))) )))
.build(ProviderFactory::new(db, self.chain.clone())) .build(ProviderFactory::new(db, self.chain.clone()))
.start_network() .start_network()

View File

@ -34,7 +34,6 @@ use reth_blockchain_tree::{
}; };
use reth_config::{config::PruneConfig, Config}; use reth_config::{config::PruneConfig, Config};
use reth_db::{database::Database, init_db, DatabaseEnv}; use reth_db::{database::Database, init_db, DatabaseEnv};
use reth_discv4::DEFAULT_DISCOVERY_PORT;
use reth_downloaders::{ use reth_downloaders::{
bodies::bodies::BodiesDownloaderBuilder, bodies::bodies::BodiesDownloaderBuilder,
headers::reverse_headers::ReverseHeadersDownloaderBuilder, headers::reverse_headers::ReverseHeadersDownloaderBuilder,
@ -78,7 +77,7 @@ use reth_transaction_pool::{
}; };
use secp256k1::SecretKey; use secp256k1::SecretKey;
use std::{ use std::{
net::{Ipv4Addr, SocketAddr, SocketAddrV4}, net::{SocketAddr, SocketAddrV4},
path::PathBuf, path::PathBuf,
sync::Arc, sync::Arc,
}; };
@ -777,20 +776,14 @@ impl<Ext: RethCliExt> NodeCommand<Ext> {
.with_task_executor(Box::new(executor)) .with_task_executor(Box::new(executor))
.set_head(head) .set_head(head)
.listener_addr(SocketAddr::V4(SocketAddrV4::new( .listener_addr(SocketAddr::V4(SocketAddrV4::new(
Ipv4Addr::UNSPECIFIED, self.network.addr,
// set discovery port based on instance number // set discovery port based on instance number
match self.network.port { self.network.port + self.instance - 1,
Some(port) => port + self.instance - 1,
None => DEFAULT_DISCOVERY_PORT + self.instance - 1,
},
))) )))
.discovery_addr(SocketAddr::V4(SocketAddrV4::new( .discovery_addr(SocketAddr::V4(SocketAddrV4::new(
Ipv4Addr::UNSPECIFIED, self.network.addr,
// set discovery port based on instance number // set discovery port based on instance number
match self.network.port { self.network.port + self.instance - 1,
Some(port) => port + self.instance - 1,
None => DEFAULT_DISCOVERY_PORT + self.instance - 1,
},
))) )))
.build(ProviderFactory::new(db, self.chain.clone())) .build(ProviderFactory::new(db, self.chain.clone()))
} }
@ -954,8 +947,12 @@ async fn run_network_until_shutdown<C>(
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use reth_discv4::DEFAULT_DISCOVERY_PORT;
use reth_primitives::DEV; use reth_primitives::DEV;
use std::{net::IpAddr, path::Path}; use std::{
net::{IpAddr, Ipv4Addr},
path::Path,
};
#[test] #[test]
fn parse_help_node_command() { fn parse_help_node_command() {
@ -971,10 +968,31 @@ mod tests {
} }
} }
#[test]
fn parse_discovery_addr() {
let cmd =
NodeCommand::<()>::try_parse_from(["reth", "--discovery.addr", "127.0.0.1"]).unwrap();
assert_eq!(cmd.network.discovery.addr, Ipv4Addr::LOCALHOST);
}
#[test]
fn parse_addr() {
let cmd = NodeCommand::<()>::try_parse_from([
"reth",
"--discovery.addr",
"127.0.0.1",
"--addr",
"127.0.0.1",
])
.unwrap();
assert_eq!(cmd.network.discovery.addr, Ipv4Addr::LOCALHOST);
assert_eq!(cmd.network.addr, Ipv4Addr::LOCALHOST);
}
#[test] #[test]
fn parse_discovery_port() { fn parse_discovery_port() {
let cmd = NodeCommand::<()>::try_parse_from(["reth", "--discovery.port", "300"]).unwrap(); let cmd = NodeCommand::<()>::try_parse_from(["reth", "--discovery.port", "300"]).unwrap();
assert_eq!(cmd.network.discovery.port, Some(300)); assert_eq!(cmd.network.discovery.port, 300);
} }
#[test] #[test]
@ -982,8 +1000,8 @@ mod tests {
let cmd = let cmd =
NodeCommand::<()>::try_parse_from(["reth", "--discovery.port", "300", "--port", "99"]) NodeCommand::<()>::try_parse_from(["reth", "--discovery.port", "300", "--port", "99"])
.unwrap(); .unwrap();
assert_eq!(cmd.network.discovery.port, Some(300)); assert_eq!(cmd.network.discovery.port, 300);
assert_eq!(cmd.network.port, Some(99)); assert_eq!(cmd.network.port, 99);
} }
#[test] #[test]
@ -1052,32 +1070,32 @@ mod tests {
fn parse_instance() { fn parse_instance() {
let mut cmd = NodeCommand::<()>::parse_from(["reth"]); let mut cmd = NodeCommand::<()>::parse_from(["reth"]);
cmd.adjust_instance_ports(); cmd.adjust_instance_ports();
cmd.network.port = Some(DEFAULT_DISCOVERY_PORT + cmd.instance - 1); cmd.network.port = DEFAULT_DISCOVERY_PORT + cmd.instance - 1;
// check rpc port numbers // check rpc port numbers
assert_eq!(cmd.rpc.auth_port, 8551); assert_eq!(cmd.rpc.auth_port, 8551);
assert_eq!(cmd.rpc.http_port, 8545); assert_eq!(cmd.rpc.http_port, 8545);
assert_eq!(cmd.rpc.ws_port, 8546); assert_eq!(cmd.rpc.ws_port, 8546);
// check network listening port number // check network listening port number
assert_eq!(cmd.network.port.unwrap(), 30303); assert_eq!(cmd.network.port, 30303);
let mut cmd = NodeCommand::<()>::parse_from(["reth", "--instance", "2"]); let mut cmd = NodeCommand::<()>::parse_from(["reth", "--instance", "2"]);
cmd.adjust_instance_ports(); cmd.adjust_instance_ports();
cmd.network.port = Some(DEFAULT_DISCOVERY_PORT + cmd.instance - 1); cmd.network.port = DEFAULT_DISCOVERY_PORT + cmd.instance - 1;
// check rpc port numbers // check rpc port numbers
assert_eq!(cmd.rpc.auth_port, 8651); assert_eq!(cmd.rpc.auth_port, 8651);
assert_eq!(cmd.rpc.http_port, 8544); assert_eq!(cmd.rpc.http_port, 8544);
assert_eq!(cmd.rpc.ws_port, 8548); assert_eq!(cmd.rpc.ws_port, 8548);
// check network listening port number // check network listening port number
assert_eq!(cmd.network.port.unwrap(), 30304); assert_eq!(cmd.network.port, 30304);
let mut cmd = NodeCommand::<()>::parse_from(["reth", "--instance", "3"]); let mut cmd = NodeCommand::<()>::parse_from(["reth", "--instance", "3"]);
cmd.adjust_instance_ports(); cmd.adjust_instance_ports();
cmd.network.port = Some(DEFAULT_DISCOVERY_PORT + cmd.instance - 1); cmd.network.port = DEFAULT_DISCOVERY_PORT + cmd.instance - 1;
// check rpc port numbers // check rpc port numbers
assert_eq!(cmd.rpc.auth_port, 8751); assert_eq!(cmd.rpc.auth_port, 8751);
assert_eq!(cmd.rpc.http_port, 8543); assert_eq!(cmd.rpc.http_port, 8543);
assert_eq!(cmd.rpc.ws_port, 8550); assert_eq!(cmd.rpc.ws_port, 8550);
// check network listening port number // check network listening port number
assert_eq!(cmd.network.port.unwrap(), 30305); assert_eq!(cmd.network.port, 30305);
} }
} }

View File

@ -88,6 +88,11 @@ use reth_net_nat::ResolveNatInterval;
/// reexport to get public ip. /// reexport to get public ip.
pub use reth_net_nat::{external_ip, NatResolver}; pub use reth_net_nat::{external_ip, NatResolver};
/// The default address for discv4 via UDP
///
/// Note: the default TCP address is the same.
pub const DEFAULT_DISCOVERY_ADDR: Ipv4Addr = Ipv4Addr::UNSPECIFIED;
/// The default port for discv4 via UDP /// The default port for discv4 via UDP
/// ///
/// Note: the default TCP port is the same. /// Note: the default TCP port is the same.