pub enum BlockError {
Show 36 variants
InvalidData(String),
InvalidVersion {
expected: u16,
actual: u16,
},
TooLarge {
size: u32,
max: u32,
},
CostExceeded {
cost: u64,
max: u64,
},
SpendBundleCountMismatch {
header: u32,
actual: u32,
},
InvalidSpendsRoot {
expected: Bytes32,
computed: Bytes32,
},
InvalidReceiptsRoot {
expected: Bytes32,
computed: Bytes32,
},
InvalidParent {
expected: Bytes32,
got: Bytes32,
},
InvalidSlashProposalsRoot,
SlashProposalPayloadTooLarge,
TooManySlashProposals,
InvalidAdditionsRoot,
InvalidRemovalsRoot,
InvalidFilterHash,
DuplicateOutput {
coin_id: Bytes32,
},
DoubleSpendInBlock {
coin_id: Bytes32,
},
AdditionsCountMismatch {
header: u32,
actual: u32,
},
RemovalsCountMismatch {
header: u32,
actual: u32,
},
SlashProposalCountMismatch {
header: u32,
actual: u32,
},
TimestampTooFarInFuture {
timestamp: u64,
max_allowed: u64,
},
PuzzleHashMismatch {
coin_id: Bytes32,
expected: Bytes32,
computed: Bytes32,
},
ClvmExecutionFailed {
coin_id: Bytes32,
reason: String,
},
ClvmCostExceeded {
coin_id: Bytes32,
cost: u64,
remaining: u64,
},
AssertionFailed {
condition: String,
reason: String,
},
AnnouncementNotFound {
announcement_hash: Bytes32,
},
SignatureFailed {
bundle_index: u32,
},
CoinMinting {
removed: u64,
added: u64,
},
FeesMismatch {
header: u64,
computed: u64,
},
ReserveFeeFailed {
required: u64,
actual: u64,
},
CostMismatch {
header: u64,
computed: u64,
},
InvalidProposerSignature,
NotFound(Bytes32),
InvalidStateRoot {
expected: Bytes32,
computed: Bytes32,
},
CoinNotFound {
coin_id: Bytes32,
},
CoinAlreadySpent {
coin_id: Bytes32,
spent_height: u64,
},
CoinAlreadyExists {
coin_id: Bytes32,
},
}Expand description
Block validation failures across three tiers on one enum (ERR-001, ERR-002).
Tier 1 — structural: cheapest checks first on crate::L2BlockHeader / crate::L2Block (SVL-*); no CLVM, no crate::CoinLookup.
BlockError::InvalidData is also used for SVL-002 DFSP pre-activation root policy (crate::L2BlockHeader::validate_with_dfsp_activation).
Tier 2 — execution: CLVM / puzzle / signature / fee invariants for validate_execution (EXE-*;
execution_validation NORMATIVE). Prefer mapping dig-clvm errors into these variants rather than BlockError::InvalidData.
Tier 3 — state: coin set and proposer checks in validate_state (STV-*;
state_validation NORMATIVE).
Derivation: Debug + Clone + thiserror::Error — same rationale as ERR-001 (acceptance criteria).
Semantic links: Bincode decode failures from crate::L2BlockHeader::from_bytes, crate::L2Block::from_bytes,
and crate::AttestedBlock::from_bytes map to BlockError::InvalidData (SER-002; wire serde in SER-001).
Variants§
InvalidData(String)
Opaque structural failure (e.g. bincode parse, policy text); prefer specific variants when available.
InvalidVersion
Header version does not match the height / DFSP activation rule (SVL-001).
TooLarge
Serialized block size exceeds crate::MAX_BLOCK_SIZE or configured limit.
CostExceeded
Sum of spend costs exceeds crate::MAX_COST_PER_BLOCK or header-declared budget.
SpendBundleCountMismatch
header.spend_bundle_count does not match spend_bundles.len().
InvalidSpendsRoot
Merkle root of spends does not match header.spends_root.
InvalidReceiptsRoot
Merkle root of receipts does not match header.receipts_root.
InvalidParent
header.prev_hash chain link failure (wrong parent).
InvalidSlashProposalsRoot
Slash proposals Merkle root does not match commitment in header.
SlashProposalPayloadTooLarge
Single slash proposal payload exceeds max serialized size.
TooManySlashProposals
More slash proposals than protocol allows.
InvalidAdditionsRoot
Additions set root mismatch (see SVL-006).
InvalidRemovalsRoot
Removals set root mismatch.
InvalidFilterHash
Gossip / filter hash in header does not match computed filter.
DuplicateOutput
Two outputs mint the same coin id within the block.
DoubleSpendInBlock
Same coin id spent more than once in removals.
AdditionsCountMismatch
Header additions_count vs computed additions from the body (SVL-005).
RemovalsCountMismatch
Header removals_count vs total coin spends in the body (SVL-005).
SlashProposalCountMismatch
Header slash_proposal_count vs slash_proposal_payloads.len() (SVL-005).
TimestampTooFarInFuture
Block timestamp too far ahead of local wall clock (SVL-004).
PuzzleHashMismatch
On-chain puzzle hash does not match hash of serialized puzzle revealed in the spend (EXE NORMATIVE).
ClvmExecutionFailed
dig-clvm / CLVM runtime rejected the spend; reason preserves the engine diagnostic (start.md — use dig-clvm, not raw chia-consensus entrypoints).
ClvmCostExceeded
Single spend exceeded the remaining per-block CLVM budget after prior spends.
AssertionFailed
ASSERT_* or concurrent-spend assertion failed; condition names the opcode class, reason is validator-local detail (ERR-002 notes).
AnnouncementNotFound
Spend expected an announcement that was not present in the ephemeral announcement set.
SignatureFailed
Aggregate or AGG_SIG verification failed for the spend bundle at bundle_index.
CoinMinting
Value conservation failure: outputs (added) exceed destroyed value (removed) without minting authority (ERR-002 notes).
FeesMismatch
Header total_fees does not match summed fees from execution / receipts.
ReserveFeeFailed
Reserve-fee condition not satisfied by available fees in the bundle.
CostMismatch
Header total_cost does not match summed CLVM costs from spends.
InvalidProposerSignature
Proposer BLS signature over the block hash did not verify (STV-006).
NotFound(Bytes32)
Looked up a block by hash (e.g. parent) that is not in the local view (ERR-002 notes).
InvalidStateRoot
State transition Merkle root after applying removals/additions does not match header state_root (STV-007).
CoinNotFound
Removal references a coin id absent from crate::CoinLookup and not ephemeral in-block (STV-002).
CoinAlreadySpent
Removal targets a coin already marked spent at spent_height.
CoinAlreadyExists
Addition would create a coin id that already exists in the live coin set (STV NORMATIVE).
Trait Implementations§
Source§impl Clone for BlockError
impl Clone for BlockError
Source§fn clone(&self) -> BlockError
fn clone(&self) -> BlockError
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BlockError
impl Debug for BlockError
Source§impl Display for BlockError
impl Display for BlockError
Source§impl Error for BlockError
impl Error for BlockError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()
Auto Trait Implementations§
impl Freeze for BlockError
impl RefUnwindSafe for BlockError
impl Send for BlockError
impl Sync for BlockError
impl Unpin for BlockError
impl UnsafeUnpin for BlockError
impl UnwindSafe for BlockError
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.Source§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
Source§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string, but without panic on OOM.