diff --git a/crates/optimism/bin/src/main.rs b/crates/optimism/bin/src/main.rs index 379a1cea857..0a4f213204e 100644 --- a/crates/optimism/bin/src/main.rs +++ b/crates/optimism/bin/src/main.rs @@ -47,7 +47,6 @@ struct Args { /// The window to span blocks for proofs history. Value is the number of blocks. /// Default is 1 month of blocks based on 2 seconds block time. /// 30 * 24 * 60 * 60 / 2 = `1_296_000` - // TODO: Pass this arg to the ExEx or remove it if not needed. #[arg( long = "proofs-history.window", default_value_t = 1_296_000, diff --git a/crates/optimism/cli/src/app.rs b/crates/optimism/cli/src/app.rs index 0f0d4748e9d..d66285dc32a 100644 --- a/crates/optimism/cli/src/app.rs +++ b/crates/optimism/cli/src/app.rs @@ -116,6 +116,9 @@ where Commands::UnwindOpProofs(command) => { runner.run_blocking_until_ctrl_c(command.execute::()) } + Commands::PruneOpProofs(command) => { + runner.run_blocking_until_ctrl_c(command.execute::()) + } } } diff --git a/crates/optimism/cli/src/commands/mod.rs b/crates/optimism/cli/src/commands/mod.rs index daf8f07908e..f548037ba5a 100644 --- a/crates/optimism/cli/src/commands/mod.rs +++ b/crates/optimism/cli/src/commands/mod.rs @@ -15,6 +15,7 @@ pub mod import; pub mod import_receipts; pub mod init_state; pub mod initialize_proofs; +pub mod prune_proofs; pub mod unwind_proofs; #[cfg(feature = "dev")] @@ -69,6 +70,9 @@ pub enum Commands), + /// Prunes the proofs storage by removing old proof history and state updates. + #[command(name = "prune-op-proofs")] + PruneOpProofs(prune_proofs::PruneOpProofsCommand), } impl< @@ -95,6 +99,7 @@ impl< Self::ReExecute(cmd) => cmd.chain_spec(), Self::InitializeOpProofs(cmd) => cmd.chain_spec(), Self::UnwindOpProofs(cmd) => cmd.chain_spec(), + Self::PruneOpProofs(cmd) => cmd.chain_spec(), } } } diff --git a/crates/optimism/cli/src/commands/prune_proofs.rs b/crates/optimism/cli/src/commands/prune_proofs.rs new file mode 100644 index 00000000000..dca9be03e30 --- /dev/null +++ b/crates/optimism/cli/src/commands/prune_proofs.rs @@ -0,0 +1,78 @@ +//! Command that prunes the OP proofs storage. + +use clap::Parser; +use reth_cli::chainspec::ChainSpecParser; +use reth_cli_commands::common::{AccessRights, CliNodeTypes, Environment, EnvironmentArgs}; +use reth_node_core::version::version_metadata; +use reth_optimism_chainspec::OpChainSpec; +use reth_optimism_primitives::OpPrimitives; +use reth_optimism_trie::{ + db::MdbxProofsStorage, OpProofStoragePruner, OpProofsStorage, OpProofsStore, +}; +use std::{path::PathBuf, sync::Arc}; +use tracing::info; + +/// Prunes the proofs storage by removing old proof history and state updates. +#[derive(Debug, Parser)] +pub struct PruneOpProofsCommand { + #[command(flatten)] + env: EnvironmentArgs, + + /// The path to the storage DB for proofs history. + #[arg( + long = "proofs-history.storage-path", + value_name = "PROOFS_HISTORY_STORAGE_PATH", + required = true + )] + pub storage_path: PathBuf, + + /// The window to span blocks for proofs history. Value is the number of blocks. + /// Default is 1 month of blocks based on 2 seconds block time. + /// 30 * 24 * 60 * 60 / 2 = `1_296_000` + #[arg( + long = "proofs-history.window", + default_value_t = 1_296_000, + value_name = "PROOFS_HISTORY_WINDOW" + )] + pub proofs_history_window: u64, +} + +impl> PruneOpProofsCommand { + /// Execute [`PruneOpProofsCommand`]. + pub async fn execute>( + self, + ) -> eyre::Result<()> { + info!(target: "reth::cli", "reth {} starting", version_metadata().short_version); + info!(target: "reth::cli", "Pruning OP proofs storage at: {:?}", self.storage_path); + + // Initialize the environment with read-only access + let Environment { provider_factory, .. } = self.env.init::(AccessRights::RO)?; + + let storage: OpProofsStorage> = Arc::new( + MdbxProofsStorage::new(&self.storage_path) + .map_err(|e| eyre::eyre!("Failed to create MdbxProofsStorage: {e}"))?, + ) + .into(); + + let earliest_block = storage.get_earliest_block_number().await?; + let latest_block = storage.get_latest_block_number().await?; + info!( + target: "reth::cli", + ?earliest_block, + ?latest_block, + "Current proofs storage block range" + ); + + let pruner = + OpProofStoragePruner::new(storage, provider_factory, self.proofs_history_window); + pruner.run().await; + Ok(()) + } +} + +impl PruneOpProofsCommand { + /// Returns the underlying chain being used to run this command + pub const fn chain_spec(&self) -> Option<&Arc> { + Some(&self.env.chain) + } +} diff --git a/docs/vocs/docs/pages/cli/SUMMARY.mdx b/docs/vocs/docs/pages/cli/SUMMARY.mdx index 2c50a8ff219..a769d2a4af1 100644 --- a/docs/vocs/docs/pages/cli/SUMMARY.mdx +++ b/docs/vocs/docs/pages/cli/SUMMARY.mdx @@ -103,4 +103,5 @@ - [`op-reth prune`](./op-reth/prune.mdx) - [`op-reth re-execute`](./op-reth/re-execute.mdx) - [`op-reth initialize-op-proofs`](./op-reth/initialize-op-proofs.mdx) - - [`op-reth unwind-op-proofs`](./op-reth/unwind-op-proofs.mdx) \ No newline at end of file + - [`op-reth unwind-op-proofs`](./op-reth/unwind-op-proofs.mdx) + - [`op-reth prune-op-proofs`](./op-reth/prune-op-proofs.mdx) \ No newline at end of file diff --git a/docs/vocs/docs/pages/cli/op-reth.mdx b/docs/vocs/docs/pages/cli/op-reth.mdx index e0c12e5acac..f5ea65cb17e 100644 --- a/docs/vocs/docs/pages/cli/op-reth.mdx +++ b/docs/vocs/docs/pages/cli/op-reth.mdx @@ -23,6 +23,7 @@ Commands: re-execute Re-execute blocks in parallel to verify historical sync correctness initialize-op-proofs Initializes the proofs storage with the current state of the chain unwind-op-proofs Unwinds the proofs storage to a specific block number + prune-op-proofs Prunes the proofs storage by removing old proof history and state updates help Print this message or the help of the given subcommand(s) Options: diff --git a/docs/vocs/docs/pages/cli/op-reth/prune-op-proofs.mdx b/docs/vocs/docs/pages/cli/op-reth/prune-op-proofs.mdx new file mode 100644 index 00000000000..2e3dad0c122 --- /dev/null +++ b/docs/vocs/docs/pages/cli/op-reth/prune-op-proofs.mdx @@ -0,0 +1,247 @@ +# op-reth prune-op-proofs + +Prunes the proofs storage by removing old proof history and state updates + +```bash +$ op-reth prune-op-proofs --help +``` +```txt +Usage: op-reth prune-op-proofs [OPTIONS] --proofs-history.storage-path + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --config + The path to the configuration file to use + + --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: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + --proofs-history.storage-path + The path to the storage DB for proofs history + + --proofs-history.window + The window to span blocks for proofs history. Value is the number of blocks. Default is 1 month of blocks based on 2 seconds block time. 30 * 24 * 60 * 60 / 2 = `1_296_000` + + [default: 1296000] + +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] + +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. + + - `http`: expects endpoint path to end with `/v1/traces` - `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 056761f4a45..565a4aff6c3 100644 --- a/docs/vocs/sidebar-cli-op-reth.ts +++ b/docs/vocs/sidebar-cli-op-reth.ts @@ -245,6 +245,10 @@ export const opRethCliSidebar: SidebarItem = { { text: "op-reth unwind-op-proofs", link: "/cli/op-reth/unwind-op-proofs" + }, + { + text: "op-reth prune-op-proofs", + link: "/cli/op-reth/prune-op-proofs" } ] };