reth_node_builder/components/
consensus.rs

1//! Consensus component for the node builder.
2use reth_node_api::NodeTypes;
3
4use crate::{BuilderContext, FullNodeTypes};
5use std::future::Future;
6
7/// A type that knows how to build the consensus implementation.
8pub trait ConsensusBuilder<Node: FullNodeTypes>: Send {
9    /// The consensus implementation to build.
10    type Consensus: reth_consensus::FullConsensus<<Node::Types as NodeTypes>::Primitives>
11        + Clone
12        + Unpin
13        + 'static;
14
15    /// Creates the consensus implementation.
16    fn build_consensus(
17        self,
18        ctx: &BuilderContext<Node>,
19    ) -> impl Future<Output = eyre::Result<Self::Consensus>> + Send;
20}
21
22impl<Node, F, Fut, Consensus> ConsensusBuilder<Node> for F
23where
24    Node: FullNodeTypes,
25    Consensus: reth_consensus::FullConsensus<<Node::Types as NodeTypes>::Primitives>
26        + Clone
27        + Unpin
28        + 'static,
29    F: FnOnce(&BuilderContext<Node>) -> Fut + Send,
30    Fut: Future<Output = eyre::Result<Consensus>> + Send,
31{
32    type Consensus = Consensus;
33
34    fn build_consensus(
35        self,
36        ctx: &BuilderContext<Node>,
37    ) -> impl Future<Output = eyre::Result<Self::Consensus>> {
38        self(ctx)
39    }
40}