ab_client_block_builder/
lib.rs1pub 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#[derive(Debug, thiserror::Error)]
12pub enum BlockBuilderError {
13 #[error("Custom builder error: {error}")]
15 Custom {
16 #[from]
18 error: anyhow::Error,
19 },
20 #[error("Failed to seal the block")]
22 FailedToSeal,
23 #[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: Blake3Hash,
31 pre_seal_hash: Blake3Hash,
33 },
34}
35
36pub trait BlockBuilder<Block>
38where
39 Block: GenericOwnedBlock,
40{
41 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}