ab_client_block_builder/
lib.rs1#![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#[derive(Debug, thiserror::Error)]
19pub enum BlockBuilderError {
20 #[error("Invalid parent MMR")]
22 InvalidParentMmr,
23 #[error("Custom builder error: {error}")]
25 Custom {
26 #[from]
28 error: anyhow::Error,
29 },
30 #[error("Invalid block header parts: {error}")]
32 InvalidHeaderParts {
33 #[from]
35 error: BlockHeaderConsistencyError,
36 },
37 #[error("Failed to seal the block")]
39 FailedToSeal,
40 #[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: Blake3Hash,
48 pre_seal_hash: Blake3Hash,
50 },
51 #[error(
53 "Can't extend MMR, too many blocks; this is an implementation bug and must never happen"
54 )]
55 CantExtendMmr,
56}
57
58#[derive(Debug, Clone)]
60pub struct BlockBuilderResult<Block, ExtraBlockBuilderDetails = ()> {
61 pub block: Block,
63 pub block_details: BlockDetails,
65 pub extra: ExtraBlockBuilderDetails,
67}
68
69pub trait BlockBuilder<Block, ExtraBlockBuilderDetails = ()>: Send
71where
72 Block: GenericOwnedBlock,
73{
74 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}