Skip to main content

ab_client_block_builder/
lib.rs

1//! Block building implementation
2
3#![feature(async_fn_traits, unboxed_closures)]
4
5pub mod beacon_chain;
6
7use ab_client_api::BlockDetails;
8use ab_core_primitives::block::BlockRoot;
9use ab_core_primitives::block::header::owned::GenericOwnedBlockHeader;
10use ab_core_primitives::block::header::{
11    BlockHeaderConsensusInfo, BlockHeaderConsistencyError, OwnedBlockHeaderSeal,
12};
13use ab_core_primitives::block::owned::GenericOwnedBlock;
14use ab_core_primitives::hashes::Blake3Hash;
15use ab_core_primitives::pot::PotCheckpoints;
16
17/// Error for [`BlockBuilder`]
18#[derive(Debug, thiserror::Error)]
19pub enum BlockBuilderError {
20    /// Invalid parent MMR
21    #[error("Invalid parent MMR")]
22    InvalidParentMmr,
23    /// Custom builder error
24    #[error("Custom builder error: {error}")]
25    Custom {
26        // Custom block builder error
27        #[from]
28        error: anyhow::Error,
29    },
30    /// Invalid block header parts
31    #[error("Invalid block header parts: {error}")]
32    InvalidHeaderParts {
33        /// Block header consistency error
34        #[from]
35        error: BlockHeaderConsistencyError,
36    },
37    /// Failed to seal the block
38    #[error("Failed to seal the block")]
39    FailedToSeal,
40    /// Received invalid seal
41    #[error(
42        "Received invalid seal for pre-seal hash {pre_seal_hash} and public key hash \
43        {public_key_hash}"
44    )]
45    InvalidSeal {
46        /// Public key hash
47        public_key_hash: Blake3Hash,
48        /// Pre-seal hash
49        pre_seal_hash: Blake3Hash,
50    },
51    /// Can't extend MMR, too many blocks; this is an implementation bug and must never happen
52    #[error(
53        "Can't extend MMR, too many blocks; this is an implementation bug and must never happen"
54    )]
55    CantExtendMmr,
56}
57
58/// Result of block building
59#[derive(Debug, Clone)]
60pub struct BlockBuilderResult<Block, ExtraBlockBuilderDetails = ()> {
61    /// Block itself
62    pub block: Block,
63    /// Additional details about a block
64    pub block_details: BlockDetails,
65    /// Extra block builder details
66    pub extra: ExtraBlockBuilderDetails,
67}
68
69/// Block builder interface
70pub trait BlockBuilder<Block, ExtraBlockBuilderDetails = ()>: Send
71where
72    Block: GenericOwnedBlock,
73{
74    /// Build a new block using provided parameters
75    fn build<SealBlock>(
76        &mut self,
77        parent_block_root: &BlockRoot,
78        parent_header: &<Block::Header as GenericOwnedBlockHeader>::Header<'_>,
79        parent_block_details: &BlockDetails,
80        consensus_info: &BlockHeaderConsensusInfo,
81        checkpoints: &[PotCheckpoints],
82        seal_block: SealBlock,
83    ) -> impl Future<
84        Output = Result<BlockBuilderResult<Block, ExtraBlockBuilderDetails>, BlockBuilderError>,
85    > + Send
86    where
87        SealBlock: AsyncFnOnce<(Blake3Hash,), Output = Option<OwnedBlockHeaderSeal>, CallOnceFuture: Send>
88            + Send;
89}