reth_node_builder/components/
consensus.rs

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