ab_client_block_verification/
lib.rs1pub mod beacon_chain;
2mod shared;
3
4use ab_client_api::BlockOrigin;
5use ab_client_consensus_common::consensus_parameters::{
6 DeriveConsensusParametersChainInfo, ShardMembershipEntropySourceChainInfo,
7 ShardMembershipEntropySourceError,
8};
9use ab_core_primitives::block::header::owned::GenericOwnedBlockHeader;
10use ab_core_primitives::block::owned::GenericOwnedBlock;
11use ab_core_primitives::hashes::Blake3Hash;
12use ab_core_primitives::pot::SlotNumber;
13use ab_core_primitives::segments::{LocalSegmentIndex, SegmentRoot};
14
15type GenericHeader<'a, Block> =
16 <<Block as GenericOwnedBlock>::Header as GenericOwnedBlockHeader>::Header<'a>;
17
18#[derive(Debug, thiserror::Error)]
20pub enum BlockVerificationError {
21 #[error("Block is below archiving point")]
29 BelowArchivingPoint,
30 #[error("Invalid header prefix")]
32 InvalidHeaderPrefix,
33 #[error("Timestamp too far in the future")]
35 TimestampTooFarInTheFuture,
36 #[error("Invalid slot {slot} (parent slot {parent_slot})")]
41 InvalidSlot {
42 slot: SlotNumber,
44 parent_slot: SlotNumber,
46 },
47 #[error("Invalid seal")]
49 InvalidSeal,
50 #[error("Invalid own segments")]
52 InvalidOwnSegments {
53 expected_first_local_segment_index: Option<LocalSegmentIndex>,
55 expected_segment_roots: Vec<SegmentRoot>,
57 actual_first_local_segment_index: Option<LocalSegmentIndex>,
59 actual_segment_roots: Vec<SegmentRoot>,
61 },
62 #[error("Shard membership entropy source error: {error}")]
64 ShardMembershipEntropySource {
65 #[from]
67 error: ShardMembershipEntropySourceError,
68 },
69 #[error("Custom verification error: {error}")]
71 Custom {
72 #[from]
74 error: anyhow::Error,
75 },
76}
77
78pub trait BlockVerification<Block, ExtraBlockVerificationDetails>: Send + Sync
80where
81 Block: GenericOwnedBlock,
82{
83 fn verify_concurrent<BCI>(
92 &self,
93 parent_header: &GenericHeader<'_, Block>,
94 parent_block_mmr_root: &Blake3Hash,
95 block: &Block,
96 origin: &BlockOrigin,
97 beacon_chain_info: &BCI,
98 ) -> impl Future<Output = Result<(), BlockVerificationError>> + Send
99 where
100 BCI: DeriveConsensusParametersChainInfo + ShardMembershipEntropySourceChainInfo;
101
102 fn verify_sequential(
105 &self,
106 parent_header: &GenericHeader<'_, Block>,
107 parent_block_mmr_root: &Blake3Hash,
108 block: &Block,
109 origin: &BlockOrigin,
110 ) -> impl Future<Output = Result<ExtraBlockVerificationDetails, BlockVerificationError>> + Send;
111}