From a2237c534e99d59bd2d44d568082c193318e643c Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Fri, 23 Jan 2026 05:23:44 -0800 Subject: [PATCH] feat(p2p): add `reth p2p enode` command (#21357) Co-authored-by: Amp --- crates/cli/commands/src/p2p/enode.rs | 34 ++++ crates/cli/commands/src/p2p/mod.rs | 19 ++ docs/vocs/docs/pages/cli/SUMMARY.mdx | 2 + docs/vocs/docs/pages/cli/op-reth/p2p.mdx | 1 + .../vocs/docs/pages/cli/op-reth/p2p/enode.mdx | 165 ++++++++++++++++++ docs/vocs/docs/pages/cli/reth/p2p.mdx | 1 + docs/vocs/docs/pages/cli/reth/p2p/enode.mdx | 165 ++++++++++++++++++ docs/vocs/sidebar-cli-op-reth.ts | 4 + docs/vocs/sidebar-cli-reth.ts | 4 + 9 files changed, 395 insertions(+) create mode 100644 crates/cli/commands/src/p2p/enode.rs create mode 100644 docs/vocs/docs/pages/cli/op-reth/p2p/enode.mdx create mode 100644 docs/vocs/docs/pages/cli/reth/p2p/enode.mdx diff --git a/crates/cli/commands/src/p2p/enode.rs b/crates/cli/commands/src/p2p/enode.rs new file mode 100644 index 0000000000..eb58acb290 --- /dev/null +++ b/crates/cli/commands/src/p2p/enode.rs @@ -0,0 +1,34 @@ +//! Enode identifier command + +use clap::Parser; +use reth_cli_util::get_secret_key; +use reth_network_peers::NodeRecord; +use std::{ + net::{IpAddr, Ipv4Addr, SocketAddr}, + path::PathBuf, +}; + +/// Print the enode identifier for a given secret key. +#[derive(Parser, Debug)] +pub struct Command { + /// Path to the secret key file for discovery. + pub discovery_secret: PathBuf, + + /// Optional IP address to include in the enode URL. + /// + /// If not provided, defaults to 0.0.0.0. + #[arg(long)] + pub ip: Option, +} + +impl Command { + /// Execute the enode command. + pub fn execute(self) -> eyre::Result<()> { + let sk = get_secret_key(&self.discovery_secret)?; + let ip = self.ip.unwrap_or(IpAddr::V4(Ipv4Addr::UNSPECIFIED)); + let addr = SocketAddr::new(ip, 30303); + let enr = NodeRecord::from_secret_key(addr, &sk); + println!("{enr}"); + Ok(()) + } +} diff --git a/crates/cli/commands/src/p2p/mod.rs b/crates/cli/commands/src/p2p/mod.rs index 31d017ba92..9634d95ba1 100644 --- a/crates/cli/commands/src/p2p/mod.rs +++ b/crates/cli/commands/src/p2p/mod.rs @@ -18,6 +18,7 @@ use reth_node_core::{ }; pub mod bootnode; +pub mod enode; pub mod rlpx; /// `reth p2p` command @@ -85,6 +86,9 @@ impl Subcommands::Bootnode(command) => { command.execute().await?; } + Subcommands::Enode(command) => { + command.execute()?; + } } Ok(()) @@ -99,6 +103,7 @@ impl Command { Subcommands::Body { args, .. } => Some(&args.chain), Subcommands::Rlpx(_) => None, Subcommands::Bootnode(_) => None, + Subcommands::Enode(_) => None, } } } @@ -126,6 +131,8 @@ pub enum Subcommands { Rlpx(rlpx::Command), /// Bootnode command Bootnode(bootnode::Command), + /// Print enode identifier + Enode(enode::Command), } #[derive(Debug, Clone, Parser)] @@ -225,4 +232,16 @@ mod tests { let _args: Command = Command::parse_from(["reth", "body", "--chain", "mainnet", "1000"]); } + + #[test] + fn parse_enode_cmd() { + let _args: Command = + Command::parse_from(["reth", "enode", "/tmp/secret"]); + } + + #[test] + fn parse_enode_cmd_with_ip() { + let _args: Command = + Command::parse_from(["reth", "enode", "/tmp/secret", "--ip", "192.168.1.1"]); + } } diff --git a/docs/vocs/docs/pages/cli/SUMMARY.mdx b/docs/vocs/docs/pages/cli/SUMMARY.mdx index ac193f4d95..4012565f48 100644 --- a/docs/vocs/docs/pages/cli/SUMMARY.mdx +++ b/docs/vocs/docs/pages/cli/SUMMARY.mdx @@ -55,6 +55,7 @@ - [`reth p2p rlpx`](./reth/p2p/rlpx.mdx) - [`reth p2p rlpx ping`](./reth/p2p/rlpx/ping.mdx) - [`reth p2p bootnode`](./reth/p2p/bootnode.mdx) + - [`reth p2p enode`](./reth/p2p/enode.mdx) - [`reth config`](./reth/config.mdx) - [`reth prune`](./reth/prune.mdx) - [`reth re-execute`](./reth/re-execute.mdx) @@ -113,6 +114,7 @@ - [`op-reth p2p rlpx`](./op-reth/p2p/rlpx.mdx) - [`op-reth p2p rlpx ping`](./op-reth/p2p/rlpx/ping.mdx) - [`op-reth p2p bootnode`](./op-reth/p2p/bootnode.mdx) + - [`op-reth p2p enode`](./op-reth/p2p/enode.mdx) - [`op-reth config`](./op-reth/config.mdx) - [`op-reth prune`](./op-reth/prune.mdx) - [`op-reth re-execute`](./op-reth/re-execute.mdx) \ No newline at end of file diff --git a/docs/vocs/docs/pages/cli/op-reth/p2p.mdx b/docs/vocs/docs/pages/cli/op-reth/p2p.mdx index 3b4efdbd6f..9be0964d76 100644 --- a/docs/vocs/docs/pages/cli/op-reth/p2p.mdx +++ b/docs/vocs/docs/pages/cli/op-reth/p2p.mdx @@ -13,6 +13,7 @@ Commands: body Download block body rlpx RLPx commands bootnode Bootnode command + enode Print enode identifier help Print this message or the help of the given subcommand(s) Options: diff --git a/docs/vocs/docs/pages/cli/op-reth/p2p/enode.mdx b/docs/vocs/docs/pages/cli/op-reth/p2p/enode.mdx new file mode 100644 index 0000000000..cdcd7ae111 --- /dev/null +++ b/docs/vocs/docs/pages/cli/op-reth/p2p/enode.mdx @@ -0,0 +1,165 @@ +# op-reth p2p enode + +Print enode identifier + +```bash +$ op-reth p2p enode --help +``` +```txt +Usage: op-reth p2p enode [OPTIONS] + +Arguments: + + Path to the secret key file for discovery + +Options: + --ip + Optional IP address to include in the enode URL. + + If not provided, defaults to 0.0.0.0. + + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/vocs/docs/pages/cli/reth/p2p.mdx b/docs/vocs/docs/pages/cli/reth/p2p.mdx index 11d9743c97..d942762999 100644 --- a/docs/vocs/docs/pages/cli/reth/p2p.mdx +++ b/docs/vocs/docs/pages/cli/reth/p2p.mdx @@ -13,6 +13,7 @@ Commands: body Download block body rlpx RLPx commands bootnode Bootnode command + enode Print enode identifier help Print this message or the help of the given subcommand(s) Options: diff --git a/docs/vocs/docs/pages/cli/reth/p2p/enode.mdx b/docs/vocs/docs/pages/cli/reth/p2p/enode.mdx new file mode 100644 index 0000000000..93f6924787 --- /dev/null +++ b/docs/vocs/docs/pages/cli/reth/p2p/enode.mdx @@ -0,0 +1,165 @@ +# reth p2p enode + +Print enode identifier + +```bash +$ reth p2p enode --help +``` +```txt +Usage: reth p2p enode [OPTIONS] + +Arguments: + + Path to the secret key file for discovery + +Options: + --ip + Optional IP address to include in the enode URL. + + If not provided, defaults to 0.0.0.0. + + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/vocs/sidebar-cli-op-reth.ts b/docs/vocs/sidebar-cli-op-reth.ts index 7a15d76437..2c4eb8a61e 100644 --- a/docs/vocs/sidebar-cli-op-reth.ts +++ b/docs/vocs/sidebar-cli-op-reth.ts @@ -254,6 +254,10 @@ export const opRethCliSidebar: SidebarItem = { { text: "op-reth p2p bootnode", link: "/cli/op-reth/p2p/bootnode" + }, + { + text: "op-reth p2p enode", + link: "/cli/op-reth/p2p/enode" } ] }, diff --git a/docs/vocs/sidebar-cli-reth.ts b/docs/vocs/sidebar-cli-reth.ts index 5b5a74c2a6..9cf94ca980 100644 --- a/docs/vocs/sidebar-cli-reth.ts +++ b/docs/vocs/sidebar-cli-reth.ts @@ -262,6 +262,10 @@ export const rethCliSidebar: SidebarItem = { { text: "reth p2p bootnode", link: "/cli/reth/p2p/bootnode" + }, + { + text: "reth p2p enode", + link: "/cli/reth/p2p/enode" } ] },