Skip to main content

BlockError

Enum BlockError 

Source
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).

Fields

§expected: u16
§actual: u16
§

TooLarge

Serialized block size exceeds crate::MAX_BLOCK_SIZE or configured limit.

Fields

§size: u32
§max: u32
§

CostExceeded

Sum of spend costs exceeds crate::MAX_COST_PER_BLOCK or header-declared budget.

Fields

§cost: u64
§max: u64
§

SpendBundleCountMismatch

header.spend_bundle_count does not match spend_bundles.len().

Fields

§header: u32
§actual: u32
§

InvalidSpendsRoot

Merkle root of spends does not match header.spends_root.

Fields

§expected: Bytes32
§computed: Bytes32
§

InvalidReceiptsRoot

Merkle root of receipts does not match header.receipts_root.

Fields

§expected: Bytes32
§computed: Bytes32
§

InvalidParent

header.prev_hash chain link failure (wrong parent).

Fields

§expected: Bytes32
§

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.

Fields

§coin_id: Bytes32
§

DoubleSpendInBlock

Same coin id spent more than once in removals.

Fields

§coin_id: Bytes32
§

AdditionsCountMismatch

Header additions_count vs computed additions from the body (SVL-005).

Fields

§header: u32
§actual: u32
§

RemovalsCountMismatch

Header removals_count vs total coin spends in the body (SVL-005).

Fields

§header: u32
§actual: u32
§

SlashProposalCountMismatch

Header slash_proposal_count vs slash_proposal_payloads.len() (SVL-005).

Fields

§header: u32
§actual: u32
§

TimestampTooFarInFuture

Block timestamp too far ahead of local wall clock (SVL-004).

Fields

§timestamp: u64
§max_allowed: u64
§

PuzzleHashMismatch

On-chain puzzle hash does not match hash of serialized puzzle revealed in the spend (EXE NORMATIVE).

Fields

§coin_id: Bytes32
§expected: Bytes32
§computed: Bytes32
§

ClvmExecutionFailed

dig-clvm / CLVM runtime rejected the spend; reason preserves the engine diagnostic (start.md — use dig-clvm, not raw chia-consensus entrypoints).

Fields

§coin_id: Bytes32
§reason: String
§

ClvmCostExceeded

Single spend exceeded the remaining per-block CLVM budget after prior spends.

Fields

§coin_id: Bytes32
§cost: u64
§remaining: u64
§

AssertionFailed

ASSERT_* or concurrent-spend assertion failed; condition names the opcode class, reason is validator-local detail (ERR-002 notes).

Fields

§condition: String
§reason: String
§

AnnouncementNotFound

Spend expected an announcement that was not present in the ephemeral announcement set.

Fields

§announcement_hash: Bytes32
§

SignatureFailed

Aggregate or AGG_SIG verification failed for the spend bundle at bundle_index.

Fields

§bundle_index: u32
§

CoinMinting

Value conservation failure: outputs (added) exceed destroyed value (removed) without minting authority (ERR-002 notes).

Fields

§removed: u64
§added: u64
§

FeesMismatch

Header total_fees does not match summed fees from execution / receipts.

Fields

§header: u64
§computed: u64
§

ReserveFeeFailed

Reserve-fee condition not satisfied by available fees in the bundle.

Fields

§required: u64
§actual: u64
§

CostMismatch

Header total_cost does not match summed CLVM costs from spends.

Fields

§header: u64
§computed: u64
§

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).

Fields

§expected: Bytes32
§computed: Bytes32
§

CoinNotFound

Removal references a coin id absent from crate::CoinLookup and not ephemeral in-block (STV-002).

Fields

§coin_id: Bytes32
§

CoinAlreadySpent

Removal targets a coin already marked spent at spent_height.

Fields

§coin_id: Bytes32
§spent_height: u64
§

CoinAlreadyExists

Addition would create a coin id that already exists in the live coin set (STV NORMATIVE).

Fields

§coin_id: Bytes32

Trait Implementations§

Source§

impl Clone for BlockError

Source§

fn clone(&self) -> BlockError

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BlockError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for BlockError

Source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for BlockError

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0:

use the Display impl or to_string()

1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T> ToStringFallible for T
where T: Display,

Source§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more