From a47c62c84b95ae7400455ab6b4c92b2079823f9d Mon Sep 17 00:00:00 2001 From: Abner Zheng Date: Tue, 27 Feb 2024 22:31:58 +0800 Subject: [PATCH] feat: Add dumpgenesis subcommand (#6797) --- bin/reth/src/cli/mod.rs | 6 +- bin/reth/src/commands/dump_genesis.rs | 47 +++++++++++ bin/reth/src/commands/mod.rs | 2 + book/SUMMARY.md | 1 + book/cli/SUMMARY.md | 1 + book/cli/reth.md | 3 + book/cli/reth/dump-genesis.md | 111 ++++++++++++++++++++++++++ 7 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 bin/reth/src/commands/dump_genesis.rs create mode 100644 book/cli/reth/dump-genesis.md diff --git a/bin/reth/src/cli/mod.rs b/bin/reth/src/cli/mod.rs index 1b5b26df1..8c33e36e7 100644 --- a/bin/reth/src/cli/mod.rs +++ b/bin/reth/src/cli/mod.rs @@ -7,7 +7,8 @@ use crate::{ }, cli::ext::RethCliExt, commands::{ - config_cmd, db, debug_cmd, import, init_cmd, node, p2p, recover, stage, test_vectors, + config_cmd, db, debug_cmd, dump_genesis, import, init_cmd, node, p2p, recover, stage, + test_vectors, }, core::cli::runner::CliRunner, version::{LONG_VERSION, SHORT_VERSION}, @@ -81,6 +82,7 @@ impl Cli { Commands::Node(command) => runner.run_command_until_exit(|ctx| command.execute(ctx)), Commands::Init(command) => runner.run_blocking_until_ctrl_c(command.execute()), Commands::Import(command) => runner.run_blocking_until_ctrl_c(command.execute()), + Commands::DumpGenesis(command) => runner.run_blocking_until_ctrl_c(command.execute()), Commands::Db(command) => runner.run_blocking_until_ctrl_c(command.execute()), Commands::Stage(command) => runner.run_blocking_until_ctrl_c(command.execute()), Commands::P2P(command) => runner.run_until_ctrl_c(command.execute()), @@ -128,6 +130,8 @@ pub enum Commands { /// This syncs RLP encoded blocks from a file. #[command(name = "import")] Import(import::ImportCommand), + /// Dumps genesis block JSON configuration to stdout. + DumpGenesis(dump_genesis::DumpGenesisCommand), /// Database debugging utilities #[command(name = "db")] Db(db::Command), diff --git a/bin/reth/src/commands/dump_genesis.rs b/bin/reth/src/commands/dump_genesis.rs new file mode 100644 index 000000000..843d3d18a --- /dev/null +++ b/bin/reth/src/commands/dump_genesis.rs @@ -0,0 +1,47 @@ +//! Command that dumps genesis block JSON configuration to stdout +use crate::args::utils::{chain_help, genesis_value_parser, SUPPORTED_CHAINS}; +use clap::Parser; +use reth_primitives::ChainSpec; +use std::sync::Arc; + +/// Dumps genesis block JSON configuration to stdout +#[derive(Debug, Parser)] +pub struct DumpGenesisCommand { + /// The chain this node is running. + /// + /// Possible values are either a built-in chain or the path to a chain specification file. + #[arg( + long, + value_name = "CHAIN_OR_PATH", + long_help = chain_help(), + default_value = SUPPORTED_CHAINS[0], + value_parser = genesis_value_parser + )] + chain: Arc, +} + +impl DumpGenesisCommand { + /// Execute the `dump-genesis` command + pub async fn execute(self) -> eyre::Result<()> { + println!("{}", serde_json::to_string_pretty(self.chain.genesis())?); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_dump_genesis_command_chain_args() { + for chain in SUPPORTED_CHAINS { + let args: DumpGenesisCommand = + DumpGenesisCommand::parse_from(["reth", "--chain", chain]); + assert_eq!( + Ok(args.chain.chain), + chain.parse::(), + "failed to parse chain {chain}" + ); + } + } +} diff --git a/bin/reth/src/commands/mod.rs b/bin/reth/src/commands/mod.rs index f5584120a..771c2719d 100644 --- a/bin/reth/src/commands/mod.rs +++ b/bin/reth/src/commands/mod.rs @@ -3,8 +3,10 @@ pub mod config_cmd; pub mod db; pub mod debug_cmd; +pub mod dump_genesis; pub mod import; pub mod init_cmd; + pub mod node; pub mod p2p; pub mod recover; diff --git a/book/SUMMARY.md b/book/SUMMARY.md index 136e67434..1422cf1b7 100644 --- a/book/SUMMARY.md +++ b/book/SUMMARY.md @@ -31,6 +31,7 @@ - [`reth node`](./cli/reth/node.md) - [`reth init`](./cli/reth/init.md) - [`reth import`](./cli/reth/import.md) + - [`reth dump-genesis`](./cli/reth/dump-genesis.md) - [`reth db`](./cli/reth/db.md) - [`reth db stats`](./cli/reth/db/stats.md) - [`reth db list`](./cli/reth/db/list.md) diff --git a/book/cli/SUMMARY.md b/book/cli/SUMMARY.md index f5c1b792c..898ddeb86 100644 --- a/book/cli/SUMMARY.md +++ b/book/cli/SUMMARY.md @@ -2,6 +2,7 @@ - [`reth node`](./reth/node.md) - [`reth init`](./reth/init.md) - [`reth import`](./reth/import.md) + - [`reth dump-genesis`](./reth/dump-genesis.md) - [`reth db`](./reth/db.md) - [`reth db stats`](./reth/db/stats.md) - [`reth db list`](./reth/db/list.md) diff --git a/book/cli/reth.md b/book/cli/reth.md index d0c57788f..6ea89edc6 100644 --- a/book/cli/reth.md +++ b/book/cli/reth.md @@ -4,12 +4,15 @@ Reth ```bash $ reth --help +Reth + Usage: reth [OPTIONS] Commands: node Start the node init Initialize the database from a genesis file import This syncs RLP encoded blocks from a file + dump-genesis Dumps genesis block JSON configuration to stdout db Database debugging utilities stage Manipulate individual stages p2p P2P Debugging utilities diff --git a/book/cli/reth/dump-genesis.md b/book/cli/reth/dump-genesis.md new file mode 100644 index 000000000..3ce0594fa --- /dev/null +++ b/book/cli/reth/dump-genesis.md @@ -0,0 +1,111 @@ +# reth dump-genesis + +This dumps genesis block JSON configuration to stdout + +```bash +$ reth dump-genesis +Dumps genesis block JSON configuration to stdout + +Usage: reth dump-genesis [OPTIONS] + +Options: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + mainnet, sepolia, goerli, holesky, dev + + [default: mainnet] + + --instance + Add a new instance of a node. + + Configures the ports of the node to avoid conflicts with the defaults. This is useful for running multiple nodes on the same machine. + + Max number of instances is 200. It is chosen in a way so that it's not possible to have port numbers that conflict with each other. + + Changes to the following port numbers: - DISCOVERY_PORT: default + `instance` - 1 - AUTH_PORT: default + `instance` * 100 - 100 - HTTP_RPC_PORT: default - `instance` + 1 - WS_RPC_PORT: default + `instance` * 2 - 2 + + [default: 1] + + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + [default: terminal] + + 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 + + --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 + + [default: terminal] + + 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 + + --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.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 + + [default: always] + + Possible values: + - always: Colors on + - auto: Colors on + - never: Colors off + +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 +``` \ No newline at end of file