feat(discv5): config via cli (#7394)

This commit is contained in:
Emilia Hane
2024-04-03 14:27:46 +02:00
committed by GitHub
parent 05c9f61a38
commit 3cafd586cf
12 changed files with 149 additions and 16 deletions

View File

@ -41,6 +41,9 @@ reth-prune.workspace = true
reth-blockchain-tree.workspace = true
reth-static-file.workspace = true
# ethereum
discv5.workspace = true
# async
tokio.workspace = true

View File

@ -3,7 +3,10 @@
use crate::version::P2P_CLIENT_VERSION;
use clap::Args;
use reth_config::Config;
use reth_discv4::{DEFAULT_DISCOVERY_ADDR, DEFAULT_DISCOVERY_PORT};
use reth_discv4::{
DEFAULT_DISCOVERY_ADDR, DEFAULT_DISCOVERY_PORT, DEFAULT_DISCOVERY_V5_ADDR,
DEFAULT_DISCOVERY_V5_PORT,
};
use reth_net_nat::NatResolver;
use reth_network::{
transactions::{
@ -211,13 +214,27 @@ pub struct DiscoveryArgs {
#[arg(long, conflicts_with = "disable_discovery")]
pub disable_discv4_discovery: bool,
/// The UDP address to use for P2P discovery/networking
/// Enable Discv5 discovery.
#[arg(long, conflicts_with = "disable_discovery")]
pub enable_discv5_discovery: bool,
/// The UDP address to use for devp2p peer discovery version 4.
#[arg(id = "discovery.addr", long = "discovery.addr", value_name = "DISCOVERY_ADDR", default_value_t = DEFAULT_DISCOVERY_ADDR)]
pub addr: IpAddr,
/// The UDP port to use for P2P discovery/networking
/// The UDP port to use for devp2p peer discovery version 4.
#[arg(id = "discovery.port", long = "discovery.port", value_name = "DISCOVERY_PORT", default_value_t = DEFAULT_DISCOVERY_PORT)]
pub port: u16,
/// The UDP address to use for devp2p peer discovery version 5.
#[arg(id = "discovery.v5.addr", long = "discovery.v5.addr", value_name = "DISCOVERY_V5_ADDR",
default_value_t = DEFAULT_DISCOVERY_V5_ADDR)]
pub discv5_addr: IpAddr,
/// The UDP port to use for devp2p peer discovery version 5.
#[arg(id = "discovery.v5.port", long = "discovery.v5.port", value_name = "DISCOVERY_V5_PORT",
default_value_t = DEFAULT_DISCOVERY_V5_PORT)]
pub discv5_port: u16,
}
impl DiscoveryArgs {
@ -233,6 +250,11 @@ impl DiscoveryArgs {
if self.disable_discovery || self.disable_discv4_discovery {
network_config_builder = network_config_builder.disable_discv4_discovery();
}
if !self.disable_discovery && (self.enable_discv5_discovery || cfg!(feature = "optimism")) {
network_config_builder = network_config_builder.enable_discv5_discovery();
}
network_config_builder
}
@ -250,8 +272,11 @@ impl Default for DiscoveryArgs {
disable_discovery: false,
disable_dns_discovery: false,
disable_discv4_discovery: false,
enable_discv5_discovery: cfg!(feature = "optimism"),
addr: DEFAULT_DISCOVERY_ADDR,
port: DEFAULT_DISCOVERY_PORT,
discv5_addr: DEFAULT_DISCOVERY_V5_ADDR,
discv5_port: DEFAULT_DISCOVERY_V5_PORT,
}
}
}
@ -315,6 +340,7 @@ mod tests {
);
}
#[cfg(not(feature = "optimism"))]
#[test]
fn network_args_default_sanity_test() {
let default_args = NetworkArgs::default();

View File

@ -2,14 +2,15 @@
use crate::{
args::{
get_secret_key, DatabaseArgs, DebugArgs, DevArgs, NetworkArgs, PayloadBuilderArgs,
PruningArgs, RpcServerArgs, TxPoolArgs,
get_secret_key, DatabaseArgs, DebugArgs, DevArgs, DiscoveryArgs, NetworkArgs,
PayloadBuilderArgs, PruningArgs, RpcServerArgs, TxPoolArgs,
},
cli::config::RethTransactionPoolConfig,
dirs::{ChainPath, DataDirPath},
metrics::prometheus_exporter,
utils::{get_single_header, write_peers_to_file},
};
use discv5::ListenConfig;
use metrics_exporter_prometheus::PrometheusHandle;
use once_cell::sync::Lazy;
use reth_auto_seal_consensus::{AutoSealConsensus, MiningMode};
@ -162,6 +163,7 @@ pub struct NodeConfig {
///
/// Changes to the following port numbers:
/// - DISCOVERY_PORT: default + `instance` - 1
/// - DISCOVERY_V5_PORT: default + `instance` - 1
/// - AUTH_PORT: default + `instance` * 100 - 100
/// - HTTP_RPC_PORT: default - `instance` + 1
/// - WS_RPC_PORT: default + `instance` * 2 - 2
@ -768,7 +770,25 @@ impl NodeConfig {
self.network.discovery.port + self.instance - 1,
));
cfg_builder.build(client)
let config = cfg_builder.build(client);
if !self.network.discovery.enable_discv5_discovery {
return config
}
// work around since discv5 config builder can't be integrated into network config builder
// due to unsatisfied trait bounds
config.discovery_v5_with_config_builder(|builder| {
let DiscoveryArgs { discv5_addr, discv5_port, .. } = self.network.discovery;
builder
.discv5_config(
discv5::ConfigBuilder::new(ListenConfig::from(Into::<SocketAddr>::into((
discv5_addr,
discv5_port + self.instance - 1,
))))
.build(),
)
.build()
})
}
/// Builds the [Pipeline] with the given [ProviderFactory] and downloaders.