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_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,
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#[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
85 let persistence_handle =
86 PersistenceHandle::<N::Primitives>::spawn_service(provider, pruner, sync_metrics_tx);
87
88 let canonical_in_memory_state = blockchain_db.canonical_in_memory_state();
89
90 let (to_tree_tx, from_tree) = EngineApiTreeHandler::spawn_new(
91 blockchain_db,
92 consensus,
93 payload_validator,
94 persistence_handle,
95 payload_builder,
96 canonical_in_memory_state,
97 tree_config,
98 engine_kind,
99 evm_config,
100 changeset_cache,
101 runtime,
102 );
103
104 let engine_handler = EngineApiRequestHandler::new(to_tree_tx, from_tree);
105 let handler = EngineHandler::new(engine_handler, downloader, incoming_requests);
106
107 let backfill_sync = PipelineSync::new(pipeline, pipeline_task_spawner);
108
109 ChainOrchestrator::new(handler, backfill_sync)
110}