reth_node_builder/components/
consensus.rs

1//! Consensus component for the node builder.
2use reth_consensus::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>> + Clone + Unpin + 'static;
12
13    /// Creates the consensus implementation.
14    fn build_consensus(
15        self,
16        ctx: &BuilderContext<Node>,
17    ) -> impl Future<Output = eyre::Result<Self::Consensus>> + Send;
18}
19
20impl<Node, F, Fut, Consensus> ConsensusBuilder<Node> for F
21where
22    Node: FullNodeTypes,
23    Consensus: FullConsensus<PrimitivesTy<Node::Types>> + Clone + Unpin + 'static,
24    F: FnOnce(&BuilderContext<Node>) -> Fut + Send,
25    Fut: Future<Output = eyre::Result<Consensus>> + Send,
26{
27    type Consensus = Consensus;
28
29    fn build_consensus(
30        self,
31        ctx: &BuilderContext<Node>,
32    ) -> impl Future<Output = eyre::Result<Self::Consensus>> {
33        self(ctx)
34    }
35}