mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 19:09:54 +00:00
Add an ability to change P2P listening address (#4849)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
@ -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 {
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user