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, 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#[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}