Skip to main content

reth_engine_tree/
launch.rs

1//! Engine orchestrator launch helper.
2//!
3//! Provides [`build_engine_orchestrator`](crate::launch::build_engine_orchestrator) which wires
4//! together all engine components and returns a
5//! [`ChainOrchestrator`](crate::chain::ChainOrchestrator) ready to be polled as a `Stream`.
6
7use crate::{
8    backfill::PipelineSync,
9    chain::ChainOrchestrator,
10    download::BasicBlockDownloader,
11    engine::{EngineApiKind, EngineApiRequest, EngineApiRequestHandler, EngineHandler},
12    persistence::PersistenceHandle,
13    tree::{EngineApiTreeHandler, EngineValidator, TreeConfig, WaitForCaches},
14};
15use futures::Stream;
16use reth_consensus::FullConsensus;
17use reth_engine_primitives::BeaconEngineMessage;
18use reth_evm::ConfigureEvm;
19use reth_network_p2p::BlockClient;
20use reth_payload_builder::PayloadBuilderHandle;
21use reth_primitives_traits::NodePrimitives;
22use reth_provider::{
23    providers::{BlockchainProvider, ProviderNodeTypes},
24    ProviderFactory, StorageSettingsCache,
25};
26use reth_prune::PrunerWithFactory;
27use reth_stages_api::{MetricEventsSender, Pipeline};
28use reth_tasks::Runtime;
29use reth_trie_db::ChangesetCache;
30use std::sync::Arc;
31
32/// Builds the engine [`ChainOrchestrator`] that drives the chain forward.
33///
34/// This spawns and wires together the following components:
35///
36/// - **[`BasicBlockDownloader`]** — downloads blocks on demand from the network during live sync.
37/// - **[`PersistenceHandle`]** — spawns the persistence service on a background thread for writing
38///   blocks and performing pruning outside the critical consensus path.
39/// - **[`EngineApiTreeHandler`]** — spawns the tree handler that processes engine API requests
40///   (`newPayload`, `forkchoiceUpdated`) and maintains the in-memory chain state.
41/// - **[`EngineApiRequestHandler`]** + **[`EngineHandler`]** — glue that routes incoming CL
42///   messages to the tree handler and manages download requests.
43/// - **[`PipelineSync`]** — wraps the staged sync [`Pipeline`] for backfill sync when the node
44///   needs to catch up over large block ranges.
45///
46/// The returned orchestrator implements [`Stream`] and yields
47/// [`ChainEvent`]s.
48///
49/// [`ChainEvent`]: crate::chain::ChainEvent
50#[expect(clippy::too_many_arguments, clippy::type_complexity)]
51pub fn build_engine_orchestrator<N, Client, S, V, C>(
52    engine_kind: EngineApiKind,
53    consensus: Arc<dyn FullConsensus<N::Primitives>>,
54    client: Client,
55    incoming_requests: S,
56    pipeline: Pipeline<N>,
57    pipeline_task_spawner: Runtime,
58    provider: ProviderFactory<N>,
59    blockchain_db: BlockchainProvider<N>,
60    pruner: PrunerWithFactory<ProviderFactory<N>>,
61    payload_builder: PayloadBuilderHandle<N::Payload>,
62    payload_validator: V,
63    tree_config: TreeConfig,
64    sync_metrics_tx: MetricEventsSender,
65    evm_config: C,
66    changeset_cache: ChangesetCache,
67    runtime: Runtime,
68) -> ChainOrchestrator<
69    EngineHandler<
70        EngineApiRequestHandler<EngineApiRequest<N::Payload, N::Primitives>, N::Primitives>,
71        S,
72        BasicBlockDownloader<Client, <N::Primitives as NodePrimitives>::Block>,
73    >,
74    PipelineSync<N>,
75>
76where
77    N: ProviderNodeTypes,
78    Client: BlockClient<Block = <N::Primitives as NodePrimitives>::Block> + 'static,
79    S: Stream<Item = BeaconEngineMessage<N::Payload>> + Send + Sync + Unpin + 'static,
80    V: EngineValidator<N::Payload> + WaitForCaches,
81    C: ConfigureEvm<Primitives = N::Primitives> + 'static,
82{
83    let downloader = BasicBlockDownloader::new(client, consensus.clone());
84    let use_hashed_state = provider.cached_storage_settings().use_hashed_state();
85
86    let persistence_handle =
87        PersistenceHandle::<N::Primitives>::spawn_service(provider, pruner, sync_metrics_tx);
88
89    let canonical_in_memory_state = blockchain_db.canonical_in_memory_state();
90
91    let (to_tree_tx, from_tree) = EngineApiTreeHandler::spawn_new(
92        blockchain_db,
93        consensus,
94        payload_validator,
95        persistence_handle,
96        payload_builder,
97        canonical_in_memory_state,
98        tree_config,
99        engine_kind,
100        evm_config,
101        changeset_cache,
102        use_hashed_state,
103        runtime,
104    );
105
106    let engine_handler = EngineApiRequestHandler::new(to_tree_tx, from_tree);
107    let handler = EngineHandler::new(engine_handler, downloader, incoming_requests);
108
109    let backfill_sync = PipelineSync::new(pipeline, pipeline_task_spawner);
110
111    ChainOrchestrator::new(handler, backfill_sync)
112}