reth_engine_tree/
launch.rs1use 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#[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}