reth_node_builder/
node.rs

1use reth_db::DatabaseEnv;
2// re-export the node api types
3pub use reth_node_api::{FullNodeTypes, NodeTypes};
4
5use crate::{
6    components::NodeComponentsBuilder, rpc::RethRpcAddOns, NodeAdapter, NodeAddOns, NodeHandle,
7    RethFullAdapter,
8};
9use reth_node_api::{EngineTypes, FullNodeComponents, PayloadTypes};
10use reth_node_core::{
11    dirs::{ChainPath, DataDirPath},
12    node_config::NodeConfig,
13};
14use reth_payload_builder::PayloadBuilderHandle;
15use reth_provider::ChainSpecProvider;
16use reth_rpc_api::EngineApiClient;
17use reth_rpc_builder::{auth::AuthServerHandle, RpcServerHandle};
18use reth_tasks::TaskExecutor;
19use std::{
20    fmt::Debug,
21    marker::PhantomData,
22    ops::{Deref, DerefMut},
23    sync::Arc,
24};
25
26/// A helper type to obtain components for a given node when [`FullNodeTypes::Types`] is a [`Node`]
27/// implementation.
28pub type ComponentsFor<N> = <<<N as FullNodeTypes>::Types as Node<N>>::ComponentsBuilder as NodeComponentsBuilder<N>>::Components;
29
30/// A [`crate::Node`] is a [`NodeTypes`] that comes with preconfigured components.
31///
32/// This can be used to configure the builder with a preset of components.
33pub trait Node<N: FullNodeTypes>: NodeTypes + Clone {
34    /// The type that builds the node's components.
35    type ComponentsBuilder: NodeComponentsBuilder<N>;
36
37    /// Exposes the customizable node add-on types.
38    type AddOns: NodeAddOns<
39        NodeAdapter<N, <Self::ComponentsBuilder as NodeComponentsBuilder<N>>::Components>,
40    >;
41
42    /// Returns a [`NodeComponentsBuilder`] for the node.
43    fn components_builder(&self) -> Self::ComponentsBuilder;
44
45    /// Returns the node add-ons.
46    fn add_ons(&self) -> Self::AddOns;
47}
48
49/// A [`Node`] type builder
50#[derive(Clone, Default, Debug)]
51pub struct AnyNode<N = (), C = (), AO = ()>(PhantomData<N>, C, AO);
52
53impl<N, C, AO> AnyNode<N, C, AO> {
54    /// Configures the types of the node.
55    pub fn types<T>(self) -> AnyNode<T, C, AO> {
56        AnyNode(PhantomData, self.1, self.2)
57    }
58
59    /// Sets the node components builder.
60    pub fn components_builder<T>(self, value: T) -> AnyNode<N, T, AO> {
61        AnyNode(PhantomData, value, self.2)
62    }
63
64    /// Sets the node add-ons.
65    pub fn add_ons<T>(self, value: T) -> AnyNode<N, C, T> {
66        AnyNode(PhantomData, self.1, value)
67    }
68}
69
70impl<N, C, AO> NodeTypes for AnyNode<N, C, AO>
71where
72    N: FullNodeTypes,
73    C: Clone + Debug + Send + Sync + Unpin + 'static,
74    AO: Clone + Debug + Send + Sync + Unpin + 'static,
75{
76    type Primitives = <N::Types as NodeTypes>::Primitives;
77
78    type ChainSpec = <N::Types as NodeTypes>::ChainSpec;
79
80    type Storage = <N::Types as NodeTypes>::Storage;
81
82    type Payload = <N::Types as NodeTypes>::Payload;
83}
84
85impl<N, C, AO> Node<N> for AnyNode<N, C, AO>
86where
87    N: FullNodeTypes + Clone,
88    C: NodeComponentsBuilder<N> + Clone + Debug + Sync + Unpin + 'static,
89    AO: NodeAddOns<NodeAdapter<N, C::Components>> + Clone + Debug + Sync + Unpin + 'static,
90{
91    type ComponentsBuilder = C;
92    type AddOns = AO;
93
94    fn components_builder(&self) -> Self::ComponentsBuilder {
95        self.1.clone()
96    }
97
98    fn add_ons(&self) -> Self::AddOns {
99        self.2.clone()
100    }
101}
102
103/// The launched node with all components including RPC handlers.
104///
105/// This can be used to interact with the launched node.
106#[derive(Debug)]
107pub struct FullNode<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> {
108    /// The evm configuration.
109    pub evm_config: Node::Evm,
110    /// The node's transaction pool.
111    pub pool: Node::Pool,
112    /// Handle to the node's network.
113    pub network: Node::Network,
114    /// Provider to interact with the node's database
115    pub provider: Node::Provider,
116    /// Handle to the node's payload builder service.
117    pub payload_builder_handle: PayloadBuilderHandle<<Node::Types as NodeTypes>::Payload>,
118    /// Task executor for the node.
119    pub task_executor: TaskExecutor,
120    /// The initial node config.
121    pub config: NodeConfig<<Node::Types as NodeTypes>::ChainSpec>,
122    /// The data dir of the node.
123    pub data_dir: ChainPath<DataDirPath>,
124    /// The handle to launched add-ons
125    pub add_ons_handle: AddOns::Handle,
126}
127
128impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> Clone for FullNode<Node, AddOns> {
129    fn clone(&self) -> Self {
130        Self {
131            evm_config: self.evm_config.clone(),
132            pool: self.pool.clone(),
133            network: self.network.clone(),
134            provider: self.provider.clone(),
135            payload_builder_handle: self.payload_builder_handle.clone(),
136            task_executor: self.task_executor.clone(),
137            config: self.config.clone(),
138            data_dir: self.data_dir.clone(),
139            add_ons_handle: self.add_ons_handle.clone(),
140        }
141    }
142}
143
144impl<Payload, Node, AddOns> FullNode<Node, AddOns>
145where
146    Payload: PayloadTypes,
147    Node: FullNodeComponents<Types: NodeTypes<Payload = Payload>>,
148    AddOns: NodeAddOns<Node>,
149{
150    /// Returns the chain spec of the node.
151    pub fn chain_spec(&self) -> Arc<<Node::Types as NodeTypes>::ChainSpec> {
152        self.provider.chain_spec()
153    }
154}
155
156impl<Payload, Node, AddOns> FullNode<Node, AddOns>
157where
158    Payload: PayloadTypes,
159    Node: FullNodeComponents<Types: NodeTypes<Payload = Payload>>,
160    AddOns: RethRpcAddOns<Node>,
161{
162    /// Returns the [`RpcServerHandle`] to the started rpc server.
163    pub const fn rpc_server_handle(&self) -> &RpcServerHandle {
164        &self.add_ons_handle.rpc_server_handles.rpc
165    }
166
167    /// Returns the [`AuthServerHandle`] to the started authenticated engine API server.
168    pub const fn auth_server_handle(&self) -> &AuthServerHandle {
169        &self.add_ons_handle.rpc_server_handles.auth
170    }
171}
172
173impl<Engine, Node, AddOns> FullNode<Node, AddOns>
174where
175    Engine: EngineTypes,
176    Node: FullNodeComponents<Types: NodeTypes<Payload = Engine>>,
177    AddOns: RethRpcAddOns<Node>,
178{
179    /// Returns the [`EngineApiClient`] interface for the authenticated engine API.
180    ///
181    /// This will send authenticated http requests to the node's auth server.
182    pub fn engine_http_client(&self) -> impl EngineApiClient<Engine> {
183        self.auth_server_handle().http_client()
184    }
185
186    /// Returns the [`EngineApiClient`] interface for the authenticated engine API.
187    ///
188    /// This will send authenticated ws requests to the node's auth server.
189    pub async fn engine_ws_client(&self) -> impl EngineApiClient<Engine> {
190        self.auth_server_handle().ws_client().await
191    }
192
193    /// Returns the [`EngineApiClient`] interface for the authenticated engine API.
194    ///
195    /// This will send not authenticated IPC requests to the node's auth server.
196    #[cfg(unix)]
197    pub async fn engine_ipc_client(&self) -> Option<impl EngineApiClient<Engine>> {
198        self.auth_server_handle().ipc_client().await
199    }
200}
201
202impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> Deref for FullNode<Node, AddOns> {
203    type Target = AddOns::Handle;
204
205    fn deref(&self) -> &Self::Target {
206        &self.add_ons_handle
207    }
208}
209
210impl<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> DerefMut for FullNode<Node, AddOns> {
211    fn deref_mut(&mut self) -> &mut Self::Target {
212        &mut self.add_ons_handle
213    }
214}
215
216/// Helper type alias to define [`FullNode`] for a given [`Node`].
217pub type FullNodeFor<N, DB = Arc<DatabaseEnv>> =
218    FullNode<NodeAdapter<RethFullAdapter<DB, N>>, <N as Node<RethFullAdapter<DB, N>>>::AddOns>;
219
220/// Helper type alias to define [`NodeHandle`] for a given [`Node`].
221pub type NodeHandleFor<N, DB = Arc<DatabaseEnv>> =
222    NodeHandle<NodeAdapter<RethFullAdapter<DB, N>>, <N as Node<RethFullAdapter<DB, N>>>::AddOns>;