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