diff --git a/Cargo.lock b/Cargo.lock index 100a1bc0571..d9fbe1b6329 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3605,6 +3605,15 @@ dependencies = [ "tokio", ] +[[package]] +name = "example-node-builder-api" +version = "0.0.0" +dependencies = [ + "eyre", + "reth-ethereum", + "reth-tracing", +] + [[package]] name = "example-node-custom-rpc" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index d33d4ccf3c5..d22a2c6ed10 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -161,6 +161,7 @@ members = [ "examples/network-txpool/", "examples/network/", "examples/network-proxy/", + "examples/node-builder-api/", "examples/node-custom-rpc/", "examples/node-event-hooks/", "examples/op-db-access/", diff --git a/crates/ethereum/reth/Cargo.toml b/crates/ethereum/reth/Cargo.toml index f81aa0795d6..959b7c1b65f 100644 --- a/crates/ethereum/reth/Cargo.toml +++ b/crates/ethereum/reth/Cargo.toml @@ -124,6 +124,7 @@ node = [ "provider", "consensus", "evm", + "network", "node-api", "dep:reth-node-ethereum", "dep:reth-node-builder", diff --git a/crates/node/builder/src/components/builder.rs b/crates/node/builder/src/components/builder.rs index 2fcafeb4e91..bd1a9fda718 100644 --- a/crates/node/builder/src/components/builder.rs +++ b/crates/node/builder/src/components/builder.rs @@ -493,6 +493,13 @@ impl Default for NoopTransactionPoolBuilder { #[derive(Debug, Clone)] pub struct NoopNetworkBuilder(PhantomData); +impl NoopNetworkBuilder { + /// Returns the instance with ethereum types. + pub fn eth() -> Self { + Self::default() + } +} + impl NetworkBuilder for NoopNetworkBuilder where N: FullNodeTypes, diff --git a/crates/optimism/reth/Cargo.toml b/crates/optimism/reth/Cargo.toml index 31f74a1ebb3..384eca45b8c 100644 --- a/crates/optimism/reth/Cargo.toml +++ b/crates/optimism/reth/Cargo.toml @@ -108,6 +108,7 @@ node = [ "provider", "consensus", "evm", + "network", "node-api", "dep:reth-optimism-node", "dep:reth-node-builder", diff --git a/examples/node-builder-api/Cargo.toml b/examples/node-builder-api/Cargo.toml new file mode 100644 index 00000000000..751a7a099e5 --- /dev/null +++ b/examples/node-builder-api/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "example-node-builder-api" +version = "0.0.0" +publish = false +edition.workspace = true +license.workspace = true + +[dependencies] +reth-ethereum = { workspace = true, features = ["node", "pool", "node-api", "cli", "test-utils"] } +reth-tracing.workspace = true + +eyre.workspace = true diff --git a/examples/node-builder-api/src/main.rs b/examples/node-builder-api/src/main.rs new file mode 100644 index 00000000000..f0d937a2d97 --- /dev/null +++ b/examples/node-builder-api/src/main.rs @@ -0,0 +1,29 @@ +//! This example showcases various Nodebuilder use cases + +use reth_ethereum::{ + cli::interface::Cli, + node::{builder::components::NoopNetworkBuilder, node::EthereumAddOns, EthereumNode}, +}; + +/// Maps the ethereum node's network component to the noop implementation. +/// +/// This installs the [`NoopNetworkBuilder`] that does not launch a real network. +pub fn noop_network() { + Cli::parse_args() + .run(|builder, _| async move { + let handle = builder + // use the default ethereum node types + .with_types::() + // Configure the components of the node + // use default ethereum components but use the Noop network that does nothing but + .with_components(EthereumNode::components().network(NoopNetworkBuilder::eth())) + .with_add_ons(EthereumAddOns::default()) + .launch() + .await?; + + handle.wait_for_node_exit().await + }) + .unwrap(); +} + +fn main() {}