ab_client_block_builder/
lib.rs

1pub mod beacon_chain;
2
3use ab_core_primitives::block::BlockRoot;
4use ab_core_primitives::block::header::owned::GenericOwnedBlockHeader;
5use ab_core_primitives::block::header::{BlockHeaderConsensusInfo, OwnedBlockHeaderSeal};
6use ab_core_primitives::block::owned::GenericOwnedBlock;
7use ab_core_primitives::hashes::Blake3Hash;
8use ab_core_primitives::pot::PotCheckpoints;
9
10/// Error for [`BlockBuilder`]
11#[derive(Debug, thiserror::Error)]
12pub enum BlockBuilderError {
13    /// Custom builder error
14    #[error("Custom builder error: {error}")]
15    Custom {
16        // Custom block builder error
17        #[from]
18        error: anyhow::Error,
19    },
20    /// Failed to seal the block
21    #[error("Failed to seal the block")]
22    FailedToSeal,
23    /// Received invalid seal
24    #[error(
25        "Received invalid seal for pre-seal hash {pre_seal_hash} and public key hash \
26        {public_key_hash}"
27    )]
28    InvalidSeal {
29        /// Public key hash
30        public_key_hash: Blake3Hash,
31        /// Pre-seal hash
32        pre_seal_hash: Blake3Hash,
33    },
34}
35
36/// Block builder interface
37pub trait BlockBuilder<Block>
38where
39    Block: GenericOwnedBlock,
40{
41    /// Build a new block using provided parameters
42    fn build<SealBlock, SealBlockFut>(
43        &mut self,
44        parent_block_root: &BlockRoot,
45        parent_header: &<Block::Header as GenericOwnedBlockHeader>::Header<'_>,
46        consensus_info: &BlockHeaderConsensusInfo,
47        checkpoints: &[PotCheckpoints],
48        seal_block: SealBlock,
49    ) -> impl Future<Output = Result<Block, BlockBuilderError>> + Send
50    where
51        SealBlock: FnOnce(Blake3Hash) -> SealBlockFut + Send,
52        SealBlockFut: Future<Output = Option<OwnedBlockHeaderSeal>> + Send;
53}