diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b4a927621173..b108ddb96b48 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -70,7 +70,7 @@ jobs: - uses: Swatinem/rust-cache@v2 with: cache-on-failure: true - - run: cargo hack check --workspace --exclude op-reth + - run: cargo hack check msrv: name: MSRV / ${{ matrix.network }} diff --git a/.github/workflows/op-sync.yml b/.github/workflows/op-sync.yml index bf4f5fda480e..73303b032d05 100644 --- a/.github/workflows/op-sync.yml +++ b/.github/workflows/op-sync.yml @@ -33,7 +33,8 @@ jobs: with: cache-on-failure: true - name: Build op-reth - run: make install-op + run: | + cargo install --features asm-keccak,jemalloc,optimism --bin op-reth --path bin/reth - name: Run sync # https://basescan.org/block/10000 run: | diff --git a/Cargo.lock b/Cargo.lock index 1c9a346fe07f..f1ba11884f90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5256,19 +5256,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "op-reth" -version = "1.0.3" -dependencies = [ - "clap", - "reth-cli-util", - "reth-node-builder", - "reth-node-optimism", - "reth-optimism-cli", - "reth-tracing", - "tikv-jemallocator", -] - [[package]] name = "opaque-debug" version = "0.3.1" @@ -6274,6 +6261,9 @@ dependencies = [ "reth-node-ethereum", "reth-node-events", "reth-node-metrics", + "reth-node-optimism", + "reth-optimism-cli", + "reth-optimism-primitives", "reth-payload-builder", "reth-payload-primitives", "reth-payload-validator", @@ -7918,7 +7908,6 @@ dependencies = [ "reth-chainspec", "reth-cli", "reth-cli-commands", - "reth-cli-runner", "reth-config", "reth-consensus", "reth-db", @@ -7929,7 +7918,6 @@ dependencies = [ "reth-evm-optimism", "reth-execution-types", "reth-network-p2p", - "reth-node-builder", "reth-node-core", "reth-node-events", "reth-optimism-primitives", @@ -7940,7 +7928,6 @@ dependencies = [ "reth-stages-types", "reth-static-file", "reth-static-file-types", - "reth-tracing", "serde_json", "shellexpand", "tempfile", diff --git a/Cargo.toml b/Cargo.toml index 66fa42d0497a..073a26d14002 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,7 +67,6 @@ members = [ "crates/node/builder/", "crates/node/events/", "crates/node/metrics", - "crates/optimism/bin", "crates/optimism/cli", "crates/optimism/consensus", "crates/optimism/evm/", @@ -338,7 +337,6 @@ reth-node-ethereum = { path = "crates/ethereum/node" } reth-node-events = { path = "crates/node/events" } reth-node-metrics = { path = "crates/node/metrics" } reth-node-optimism = { path = "crates/optimism/node" } -reth-optimism-bin = { path = "crates/optimism/bin" } reth-optimism-cli = { path = "crates/optimism/cli" } reth-optimism-consensus = { path = "crates/optimism/consensus" } reth-optimism-payload-builder = { path = "crates/optimism/payload" } @@ -546,5 +544,3 @@ serial_test = "3" similar-asserts = "1.5.0" test-fuzz = "5" iai-callgrind = "0.11" - -tikv-jemallocator = { version = "0.5.0" } diff --git a/Makefile b/Makefile index d01a707f2b6b..d42c426671d4 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ install: ## Build and install the reth binary under `~/.cargo/bin`. .PHONY: install-op install-op: ## Build and install the op-reth binary under `~/.cargo/bin`. - cargo install --path crates/optimism/bin --bin op-reth --force --locked \ + cargo install --path bin/reth --bin op-reth --force --locked \ --features "optimism,$(FEATURES)" \ --profile "$(PROFILE)" \ $(CARGO_INSTALL_EXTRA_FLAGS) @@ -63,14 +63,14 @@ build: ## Build the reth binary into `target` directory. .PHONY: build-op build-op: ## Build the op-reth binary into `target` directory. - cargo build --bin op-reth --features "optimism,$(FEATURES)" --profile "$(PROFILE)" --manifest-path crates/optimism/bin/Cargo.toml + cargo build --bin op-reth --features "optimism,$(FEATURES)" --profile "$(PROFILE)" # Builds the reth binary natively. build-native-%: cargo build --bin reth --target $* --features "$(FEATURES)" --profile "$(PROFILE)" op-build-native-%: - cargo build --bin op-reth --target $* --features "optimism,$(FEATURES)" --profile "$(PROFILE)" --manifest-path crates/optimism/bin/Cargo.toml + cargo build --bin op-reth --target $* --features "optimism,$(FEATURES)" --profile "$(PROFILE)" # The following commands use `cross` to build a cross-compile. # @@ -105,7 +105,7 @@ build-%: op-build-%: RUSTFLAGS="-C link-arg=-lgcc -Clink-arg=-static-libgcc" \ - cross build --bin op-reth --target $* --features "optimism,$(FEATURES)" --profile "$(PROFILE)" --manifest-path crates/optimism/bin/Cargo.toml + cross build --bin op-reth --target $* --features "optimism,$(FEATURES)" --profile "$(PROFILE)" # Unfortunately we can't easily use cross to build for Darwin because of licensing issues. # If we wanted to, we would need to build a custom Docker image with the SDK available. @@ -313,7 +313,7 @@ maxperf: ## Builds `reth` with the most aggressive optimisations. .PHONY: maxperf-op maxperf-op: ## Builds `op-reth` with the most aggressive optimisations. - RUSTFLAGS="-C target-cpu=native" cargo build --profile maxperf --features jemalloc,asm-keccak,optimism --bin op-reth --manifest-path crates/optimism/bin/Cargo.toml + RUSTFLAGS="-C target-cpu=native" cargo build --profile maxperf --features jemalloc,asm-keccak,optimism --bin op-reth .PHONY: maxperf-no-asm maxperf-no-asm: ## Builds `reth` with the most aggressive optimisations, minus the "asm-keccak" feature. diff --git a/bin/reth-bench/Cargo.toml b/bin/reth-bench/Cargo.toml index 4023c1c17375..29e9c4963c95 100644 --- a/bin/reth-bench/Cargo.toml +++ b/bin/reth-bench/Cargo.toml @@ -72,7 +72,7 @@ clap = { workspace = true, features = ["derive", "env"] } csv = "1.3.0" [target.'cfg(unix)'.dependencies] -tikv-jemallocator = { workspace = true, optional = true } +tikv-jemallocator = { version = "0.5.0", optional = true } libc = "0.2" [dev-dependencies] diff --git a/bin/reth/Cargo.toml b/bin/reth/Cargo.toml index 54ce037891bc..3623f31dbcaf 100644 --- a/bin/reth/Cargo.toml +++ b/bin/reth/Cargo.toml @@ -56,6 +56,9 @@ reth-static-file-types = { workspace = true, features = ["clap"] } reth-trie = { workspace = true, features = ["metrics"] } reth-trie-db = { workspace = true, features = ["metrics"] } reth-node-api.workspace = true +reth-node-optimism = { workspace = true, optional = true, features = [ + "optimism", +] } reth-node-core.workspace = true reth-ethereum-payload-builder.workspace = true reth-db-common.workspace = true @@ -64,9 +67,11 @@ reth-node-builder.workspace = true reth-node-events.workspace = true reth-node-metrics.workspace = true reth-consensus.workspace = true +reth-optimism-primitives.workspace = true reth-engine-util.workspace = true reth-prune.workspace = true reth-stages-api.workspace = true +reth-optimism-cli = { workspace = true, optional = true } # crypto alloy-rlp.workspace = true @@ -106,7 +111,7 @@ itertools.workspace = true discv5.workspace = true [target.'cfg(unix)'.dependencies] -tikv-jemallocator = { workspace = true, optional = true } +tikv-jemallocator = { version = "0.5.0", optional = true } libc = "0.2" [dev-dependencies] @@ -128,6 +133,21 @@ min-info-logs = ["tracing/release_max_level_info"] min-debug-logs = ["tracing/release_max_level_debug"] min-trace-logs = ["tracing/release_max_level_trace"] +optimism = [ + "dep:reth-node-optimism", + "dep:reth-optimism-cli", + "reth-beacon-consensus/optimism", + "reth-blockchain-tree/optimism", + "reth-node-core/optimism", + "reth-optimism-cli?/optimism", + "reth-primitives/optimism", + "reth-provider/optimism", + "reth-rpc/optimism", +] + +# no-op feature flag for switching between the `optimism` and default functionality in CI matrices +ethereum = [] + [[bin]] name = "reth" path = "src/main.rs" @@ -135,3 +155,8 @@ path = "src/main.rs" [[bin]] name = "engine2" path = "src/engine2.rs" + +[[bin]] +name = "op-reth" +path = "src/optimism.rs" +required-features = ["optimism"] diff --git a/bin/reth/src/cli/mod.rs b/bin/reth/src/cli/mod.rs index f8966f694d9d..d6fc7d3c4df4 100644 --- a/bin/reth/src/cli/mod.rs +++ b/bin/reth/src/cli/mod.rs @@ -6,6 +6,7 @@ use crate::{ LogArgs, }, commands::debug_cmd, + macros::block_executor, version::{LONG_VERSION, SHORT_VERSION}, }; use clap::{value_parser, Parser, Subcommand}; @@ -18,7 +19,6 @@ use reth_cli_commands::{ use reth_cli_runner::CliRunner; use reth_db::DatabaseEnv; use reth_node_builder::{NodeBuilder, WithLaunchContext}; -use reth_node_ethereum::EthExecutorProvider; use reth_tracing::FileWorkerGuard; use std::{ffi::OsString, fmt, future::Future, sync::Arc}; use tracing::info; @@ -151,13 +151,20 @@ impl Cli { } Commands::Init(command) => runner.run_blocking_until_ctrl_c(command.execute()), Commands::InitState(command) => runner.run_blocking_until_ctrl_c(command.execute()), - Commands::Import(command) => { - runner.run_blocking_until_ctrl_c(command.execute(EthExecutorProvider::ethereum)) + Commands::Import(command) => runner.run_blocking_until_ctrl_c( + command.execute(|chain_spec| block_executor!(chain_spec)), + ), + #[cfg(feature = "optimism")] + Commands::ImportOp(command) => runner.run_blocking_until_ctrl_c(command.execute()), + #[cfg(feature = "optimism")] + Commands::ImportReceiptsOp(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_command_until_exit(|ctx| command.execute(ctx, EthExecutorProvider::ethereum)), + Commands::Stage(command) => runner.run_command_until_exit(|ctx| { + command.execute(ctx, |chain_spec| block_executor!(chain_spec)) + }), Commands::P2P(command) => runner.run_until_ctrl_c(command.execute()), #[cfg(feature = "dev")] Commands::TestVectors(command) => runner.run_until_ctrl_c(command.execute()), @@ -193,6 +200,14 @@ pub enum Commands { /// This syncs RLP encoded blocks from a file. #[command(name = "import")] Import(import::ImportCommand), + /// This syncs RLP encoded OP blocks below Bedrock from a file, without executing. + #[cfg(feature = "optimism")] + #[command(name = "import-op")] + ImportOp(reth_optimism_cli::ImportOpCommand), + /// This imports RLP encoded receipts from a file. + #[cfg(feature = "optimism")] + #[command(name = "import-receipts-op")] + ImportReceiptsOp(reth_optimism_cli::ImportReceiptsOpCommand), /// Dumps genesis block JSON configuration to stdout. DumpGenesis(dump_genesis::DumpGenesisCommand), /// Database debugging utilities diff --git a/bin/reth/src/commands/debug_cmd/build_block.rs b/bin/reth/src/commands/debug_cmd/build_block.rs index 30bbc705c657..d93b62564328 100644 --- a/bin/reth/src/commands/debug_cmd/build_block.rs +++ b/bin/reth/src/commands/debug_cmd/build_block.rs @@ -1,4 +1,5 @@ //! Command for debugging block building. +use crate::macros::block_executor; use alloy_rlp::Decodable; use clap::Parser; use eyre::Context; @@ -18,7 +19,6 @@ use reth_evm::execute::{BlockExecutionOutput, BlockExecutorProvider, Executor}; use reth_execution_types::ExecutionOutcome; use reth_fs_util as fs; use reth_node_api::PayloadBuilderAttributes; -use reth_node_ethereum::EthExecutorProvider; use reth_payload_builder::database::CachedReads; use reth_primitives::{ constants::eip4844::LoadKzgSettingsError, revm_primitives::KzgSettings, Address, @@ -120,7 +120,7 @@ impl Command { let consensus: Arc = Arc::new(EthBeaconConsensus::new(provider_factory.chain_spec())); - let executor = EthExecutorProvider::ethereum(provider_factory.chain_spec()); + let executor = block_executor!(provider_factory.chain_spec()); // configure blockchain tree let tree_externals = @@ -221,6 +221,17 @@ impl Command { let payload_config = PayloadConfig::new( Arc::clone(&best_block), Bytes::default(), + #[cfg(feature = "optimism")] + reth_node_optimism::OptimismPayloadBuilderAttributes::try_new( + best_block.hash(), + reth_rpc_types::engine::OptimismPayloadAttributes { + payload_attributes: payload_attrs, + transactions: None, + no_tx_pool: None, + gas_limit: None, + }, + )?, + #[cfg(not(feature = "optimism"))] reth_payload_builder::EthPayloadBuilderAttributes::try_new( best_block.hash(), payload_attrs, @@ -237,6 +248,13 @@ impl Command { None, ); + #[cfg(feature = "optimism")] + let payload_builder = reth_node_optimism::OptimismPayloadBuilder::new( + reth_node_optimism::OptimismEvmConfig::default(), + ) + .compute_pending_block(); + + #[cfg(not(feature = "optimism"))] let payload_builder = reth_ethereum_payload_builder::EthereumPayloadBuilder::default(); match payload_builder.try_build(args)? { @@ -253,8 +271,7 @@ impl Command { SealedBlockWithSenders::new(block.clone(), senders).unwrap(); let db = StateProviderDatabase::new(blockchain_db.latest()?); - let executor = - EthExecutorProvider::ethereum(provider_factory.chain_spec()).executor(db); + let executor = block_executor!(provider_factory.chain_spec()).executor(db); let BlockExecutionOutput { state, receipts, requests, .. } = executor.execute((&block_with_senders.clone().unseal(), U256::MAX).into())?; diff --git a/bin/reth/src/commands/debug_cmd/execution.rs b/bin/reth/src/commands/debug_cmd/execution.rs index 175f1e0571d2..3298fe5d6367 100644 --- a/bin/reth/src/commands/debug_cmd/execution.rs +++ b/bin/reth/src/commands/debug_cmd/execution.rs @@ -1,6 +1,6 @@ //! Command for debugging execution. -use crate::{args::NetworkArgs, utils::get_single_header}; +use crate::{args::NetworkArgs, macros::block_executor, utils::get_single_header}; use clap::Parser; use futures::{stream::select as stream_select, StreamExt}; use reth_beacon_consensus::EthBeaconConsensus; @@ -19,7 +19,6 @@ use reth_exex::ExExManagerHandle; use reth_network::{NetworkEvents, NetworkHandle}; use reth_network_api::NetworkInfo; use reth_network_p2p::{bodies::client::BodiesClient, headers::client::HeadersClient}; -use reth_node_ethereum::EthExecutorProvider; use reth_primitives::{BlockHashOrNumber, BlockNumber, B256}; use reth_provider::{ BlockExecutionWriter, ChainSpecProvider, ProviderFactory, StageCheckpointReader, @@ -81,7 +80,7 @@ impl Command { let prune_modes = config.prune.clone().map(|prune| prune.segments).unwrap_or_default(); let (tip_tx, tip_rx) = watch::channel(B256::ZERO); - let executor = EthExecutorProvider::ethereum(provider_factory.chain_spec()); + let executor = block_executor!(provider_factory.chain_spec()); let pipeline = Pipeline::builder() .with_tip_sender(tip_tx) diff --git a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs index b6a05c6ebf9f..df288b5ef858 100644 --- a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs +++ b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs @@ -2,6 +2,7 @@ use crate::{ args::NetworkArgs, + macros::block_executor, utils::{get_single_body, get_single_header}, }; use backon::{ConstantBuilder, Retryable}; @@ -16,7 +17,6 @@ use reth_evm::execute::{BlockExecutionOutput, BlockExecutorProvider, Executor}; use reth_execution_types::ExecutionOutcome; use reth_network::NetworkHandle; use reth_network_api::NetworkInfo; -use reth_node_ethereum::EthExecutorProvider; use reth_primitives::BlockHashOrNumber; use reth_provider::{ writer::StorageWriter, AccountExtReader, ChainSpecProvider, HashingWriter, HeaderProvider, @@ -130,7 +130,7 @@ impl Command { provider_factory.static_file_provider(), )); - let executor = EthExecutorProvider::ethereum(provider_factory.chain_spec()).executor(db); + let executor = block_executor!(provider_factory.chain_spec()).executor(db); let merkle_block_td = provider.header_td_by_number(merkle_block_number)?.unwrap_or_default(); diff --git a/bin/reth/src/commands/debug_cmd/merkle.rs b/bin/reth/src/commands/debug_cmd/merkle.rs index af4fa97d0bc6..6d8667f82f58 100644 --- a/bin/reth/src/commands/debug_cmd/merkle.rs +++ b/bin/reth/src/commands/debug_cmd/merkle.rs @@ -1,5 +1,5 @@ //! Command for debugging merkle trie calculation. -use crate::{args::NetworkArgs, utils::get_single_header}; +use crate::{args::NetworkArgs, macros::block_executor, utils::get_single_header}; use backon::{ConstantBuilder, Retryable}; use clap::Parser; use reth_beacon_consensus::EthBeaconConsensus; @@ -14,7 +14,6 @@ use reth_evm::execute::{BatchExecutor, BlockExecutorProvider}; use reth_network::NetworkHandle; use reth_network_api::NetworkInfo; use reth_network_p2p::full_block::FullBlockClient; -use reth_node_ethereum::EthExecutorProvider; use reth_primitives::BlockHashOrNumber; use reth_provider::{ writer::StorageWriter, BlockNumReader, BlockWriter, ChainSpecProvider, HeaderProvider, @@ -92,7 +91,7 @@ impl Command { ) .await?; - let executor_provider = EthExecutorProvider::ethereum(provider_factory.chain_spec()); + let executor_provider = block_executor!(provider_factory.chain_spec()); // Initialize the fetch client info!(target: "reth::cli", target_block_number=self.to, "Downloading tip of block range"); diff --git a/bin/reth/src/commands/debug_cmd/replay_engine.rs b/bin/reth/src/commands/debug_cmd/replay_engine.rs index 2cb6e6d8f77f..4339a0f76063 100644 --- a/bin/reth/src/commands/debug_cmd/replay_engine.rs +++ b/bin/reth/src/commands/debug_cmd/replay_engine.rs @@ -1,4 +1,4 @@ -use crate::args::NetworkArgs; +use crate::{args::NetworkArgs, macros::block_executor}; use clap::Parser; use eyre::Context; use reth_basic_payload_builder::{BasicPayloadJobGenerator, BasicPayloadJobGeneratorConfig}; @@ -16,7 +16,6 @@ use reth_engine_util::engine_store::{EngineMessageStore, StoredEngineApiMessage} use reth_fs_util as fs; use reth_network::NetworkHandle; use reth_network_api::NetworkInfo; -use reth_node_ethereum::EthExecutorProvider; use reth_payload_builder::{PayloadBuilderHandle, PayloadBuilderService}; use reth_provider::{ providers::BlockchainProvider, CanonStateSubscriptions, ChainSpecProvider, ProviderFactory, @@ -79,7 +78,7 @@ impl Command { let consensus: Arc = Arc::new(EthBeaconConsensus::new(provider_factory.chain_spec())); - let executor = EthExecutorProvider::ethereum(provider_factory.chain_spec()); + let executor = block_executor!(provider_factory.chain_spec()); // Configure blockchain tree let tree_externals = @@ -108,8 +107,15 @@ impl Command { .await?; // Set up payload builder + #[cfg(not(feature = "optimism"))] let payload_builder = reth_ethereum_payload_builder::EthereumPayloadBuilder::default(); + // Optimism's payload builder is implemented on the OptimismPayloadBuilder type. + #[cfg(feature = "optimism")] + let payload_builder = reth_node_optimism::OptimismPayloadBuilder::new( + reth_node_optimism::OptimismEvmConfig::default(), + ); + let payload_generator = BasicPayloadJobGenerator::with_builder( blockchain_db.clone(), NoopTransactionPool::default(), @@ -119,6 +125,13 @@ impl Command { payload_builder, ); + #[cfg(feature = "optimism")] + let (payload_service, payload_builder): ( + _, + PayloadBuilderHandle, + ) = PayloadBuilderService::new(payload_generator, blockchain_db.canonical_state_stream()); + + #[cfg(not(feature = "optimism"))] let (payload_service, payload_builder): ( _, PayloadBuilderHandle, diff --git a/bin/reth/src/engine2.rs b/bin/reth/src/engine2.rs index 3f0470699ca3..94777307cf94 100644 --- a/bin/reth/src/engine2.rs +++ b/bin/reth/src/engine2.rs @@ -6,6 +6,7 @@ #[global_allocator] static ALLOC: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; +#[cfg(not(feature = "optimism"))] fn main() { use reth::cli::Cli; use reth_node_ethereum::{launch::EthNodeLauncher, node::EthereumAddOns, EthereumNode}; diff --git a/bin/reth/src/lib.rs b/bin/reth/src/lib.rs index f49c909b94bc..0032b73c907a 100644 --- a/bin/reth/src/lib.rs +++ b/bin/reth/src/lib.rs @@ -31,6 +31,7 @@ pub mod cli; pub mod commands; +mod macros; /// Re-exported utils. pub mod utils { diff --git a/bin/reth/src/macros.rs b/bin/reth/src/macros.rs new file mode 100644 index 000000000000..7ff81a0f9058 --- /dev/null +++ b/bin/reth/src/macros.rs @@ -0,0 +1,20 @@ +//! Helper macros + +/// Creates the block executor type based on the configured feature. +/// +/// Note(mattsse): This is incredibly horrible and will be replaced +#[cfg(not(feature = "optimism"))] +macro_rules! block_executor { + ($chain_spec:expr) => { + reth_node_ethereum::EthExecutorProvider::ethereum($chain_spec) + }; +} + +#[cfg(feature = "optimism")] +macro_rules! block_executor { + ($chain_spec:expr) => { + reth_node_optimism::OpExecutorProvider::optimism($chain_spec) + }; +} + +pub(crate) use block_executor; diff --git a/bin/reth/src/main.rs b/bin/reth/src/main.rs index abe4dc34ce08..4eacb9df3f2d 100644 --- a/bin/reth/src/main.rs +++ b/bin/reth/src/main.rs @@ -5,6 +5,10 @@ #[global_allocator] static ALLOC: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; +#[cfg(all(feature = "optimism", not(test)))] +compile_error!("Cannot build the `reth` binary with the `optimism` feature flag enabled. Did you mean to build `op-reth`?"); + +#[cfg(not(feature = "optimism"))] fn main() { use reth::cli::Cli; use reth_node_ethereum::EthereumNode; diff --git a/crates/optimism/bin/src/main.rs b/bin/reth/src/optimism.rs similarity index 86% rename from crates/optimism/bin/src/main.rs rename to bin/reth/src/optimism.rs index df7de34d6fc9..9ed6f552c737 100644 --- a/crates/optimism/bin/src/main.rs +++ b/bin/reth/src/optimism.rs @@ -1,8 +1,7 @@ #![allow(missing_docs, rustdoc::missing_crate_level_docs)] -// The `optimism` feature must be enabled to use this crate. -#![cfg(feature = "optimism")] use clap::Parser; +use reth::cli::Cli; use reth_node_optimism::{args::RollupArgs, rpc::SequencerClient, OptimismNode}; use std::sync::Arc; @@ -11,8 +10,11 @@ use std::sync::Arc; #[global_allocator] static ALLOC: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; +#[cfg(not(feature = "optimism"))] +compile_error!("Cannot build the `op-reth` binary with the `optimism` feature flag disabled. Did you mean to build `reth`?"); + +#[cfg(feature = "optimism")] fn main() { - use reth_optimism_cli::Cli; reth_cli_util::sigsegv_handler::install(); // Enable backtraces unless a RUST_BACKTRACE value has already been explicitly provided. diff --git a/crates/optimism/bin/Cargo.toml b/crates/optimism/bin/Cargo.toml deleted file mode 100644 index 31be158c042a..000000000000 --- a/crates/optimism/bin/Cargo.toml +++ /dev/null @@ -1,42 +0,0 @@ -[package] -name = "op-reth" -version.workspace = true -edition.workspace = true -rust-version.workspace = true -license.workspace = true -homepage.workspace = true -repository.workspace = true -exclude.workspace = true - -[dependencies] -reth-node-builder.workspace = true -reth-cli-util.workspace = true -reth-optimism-cli.workspace = true -reth-tracing.workspace = true -reth-node-optimism.workspace = true - -clap = { workspace = true, features = ["derive", "env"] } - -[target.'cfg(unix)'.dependencies] -tikv-jemallocator = { workspace = true, optional = true } - -[lints] -workspace = true - -[[bin]] -name = "op-reth" -path = "src/main.rs" - - -[features] -default = ["jemalloc"] - -jemalloc = ["dep:tikv-jemallocator"] -jemalloc-prof = ["jemalloc", "tikv-jemallocator?/profiling"] - -asm-keccak = ["reth-node-optimism/asm-keccak"] - -optimism = [ - "reth-optimism-cli/optimism", - "reth-node-optimism/optimism", -] diff --git a/crates/optimism/cli/Cargo.toml b/crates/optimism/cli/Cargo.toml index 453062e488a7..82f9d999dfc8 100644 --- a/crates/optimism/cli/Cargo.toml +++ b/crates/optimism/cli/Cargo.toml @@ -36,10 +36,6 @@ reth-errors.workspace = true reth-config.workspace = true reth-evm-optimism.workspace = true reth-cli.workspace = true -reth-cli-runner.workspace = true -reth-node-builder.workspace = true -reth-tracing.workspace = true - # eth alloy-genesis.workspace = true @@ -74,4 +70,4 @@ reth-db-common.workspace = true "reth-primitives/optimism", "reth-evm-optimism/optimism", "reth-provider/optimism", - ] + ] \ No newline at end of file diff --git a/crates/optimism/cli/src/lib.rs b/crates/optimism/cli/src/lib.rs index 7599d21313ca..6260a8e9044e 100644 --- a/crates/optimism/cli/src/lib.rs +++ b/crates/optimism/cli/src/lib.rs @@ -34,22 +34,15 @@ use std::{ffi::OsString, fmt, sync::Arc}; use chainspec::OpChainSpecParser; use clap::{command, value_parser, Parser}; use commands::Commands; -use futures_util::Future; use reth_chainspec::ChainSpec; use reth_cli::chainspec::ChainSpecParser; use reth_cli_commands::node::NoArgs; -use reth_cli_runner::CliRunner; -use reth_db::DatabaseEnv; -use reth_evm_optimism::OpExecutorProvider; -use reth_node_builder::{NodeBuilder, WithLaunchContext}; use reth_node_core::{ args::{utils::chain_help, LogArgs}, version::{LONG_VERSION, SHORT_VERSION}, }; -use reth_tracing::FileWorkerGuard; -use tracing::info; -/// The main op-reth cli interface. +/// The main reth cli interface. /// /// This is the entrypoint to the executable. #[derive(Debug, Parser)] @@ -107,52 +100,3 @@ impl Cli { Self::try_parse_from(itr) } } - -impl Cli { - /// Execute the configured cli command. - /// - /// This accepts a closure that is used to launch the node via the - /// [`NodeCommand`](reth_cli_commands::node::NodeCommand). - pub fn run(mut self, launcher: L) -> eyre::Result<()> - where - L: FnOnce(WithLaunchContext>>, Ext) -> Fut, - Fut: Future>, - { - // add network name to logs dir - self.logs.log_file_directory = - self.logs.log_file_directory.join(self.chain.chain.to_string()); - - let _guard = self.init_tracing()?; - info!(target: "reth::cli", "Initialized tracing, debug log directory: {}", self.logs.log_file_directory); - - let runner = CliRunner::default(); - match self.command { - Commands::Node(command) => { - runner.run_command_until_exit(|ctx| command.execute(ctx, launcher)) - } - Commands::Init(command) => runner.run_blocking_until_ctrl_c(command.execute()), - Commands::InitState(command) => runner.run_blocking_until_ctrl_c(command.execute()), - Commands::ImportOp(command) => runner.run_blocking_until_ctrl_c(command.execute()), - Commands::ImportReceiptsOp(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_command_until_exit(|ctx| command.execute(ctx, OpExecutorProvider::optimism)), - Commands::P2P(command) => runner.run_until_ctrl_c(command.execute()), - Commands::Config(command) => runner.run_until_ctrl_c(command.execute()), - Commands::Recover(command) => runner.run_command_until_exit(|ctx| command.execute(ctx)), - Commands::Prune(command) => runner.run_until_ctrl_c(command.execute()), - } - } - - /// Initializes tracing with the configured options. - /// - /// If file logging is enabled, this function returns a guard that must be kept alive to ensure - /// that all logs are flushed to disk. - pub fn init_tracing(&self) -> eyre::Result> { - let guard = self.logs.init_tracing()?; - Ok(guard) - } -} diff --git a/crates/optimism/node/Cargo.toml b/crates/optimism/node/Cargo.toml index 53e0e56e5c6d..0b163a571bfb 100644 --- a/crates/optimism/node/Cargo.toml +++ b/crates/optimism/node/Cargo.toml @@ -82,5 +82,4 @@ optimism = [ "reth-auto-seal-consensus/optimism", "reth-optimism-rpc/optimism" ] -asm-keccak = ["reth-primitives/asm-keccak"] test-utils = ["reth-node-builder/test-utils"]