miden_core/deferred/
mod.rs1mod claim;
12mod node;
13mod precompile;
14mod precompile_registry;
15mod state;
16mod wire;
17
18use alloc::boxed::Box;
19
20pub use claim::DeferredClaim;
21pub use node::{DataChunk, Digest, Node, NodeType, Payload, TRUE_DIGEST, Tag};
22pub use precompile::{Precompile, precompile_id};
23pub use precompile_registry::PrecompileRegistry;
24pub use state::{DeferredContext, DeferredState};
25pub use wire::{IntegrityError, PrecompileWitness, WireEntry as PrecompileWitnessEntry};
26
27use crate::Word;
28
29pub type DeferredRoot = Digest;
31
32pub const DEFERRED_ROOT_DOMAIN: Word = Word::new(Tag::AND.as_word());
34
35pub const MAX_DEFERRED_ELEMENTS: usize = 1 << 20;
37
38pub const MAX_PRECOMPILE_ROOTS: usize = 1 << 12;
42
43pub fn fold_deferred_root(root: DeferredRoot, statement: Digest) -> DeferredRoot {
45 Node::and(root, statement).digest()
46}
47
48#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
53pub enum DeferredError {
54 #[error("invalid or unknown deferred tag")]
55 InvalidTag,
56 #[error("referenced digest is not present in deferred state")]
57 MissingNode,
58 #[error("conflicting node definition for digest")]
59 ConflictingNode,
60 #[error("payload is not valid for the given tag")]
61 InvalidPayload,
62 #[error("equality assertion failed")]
63 AssertionFailed,
64 #[error("deferred insertion requires {num_elements} elements but only {max} remain")]
65 DeferredStateTooLarge { num_elements: usize, max: usize },
66 #[error("operation is not supported by this handler")]
67 Unsupported,
68 #[error("invalid deferred root transition: expected {expected:?}, got {actual:?}")]
69 InvalidDeferredRootTransition { expected: Digest, actual: Digest },
70}
71
72#[derive(Debug, Clone, thiserror::Error)]
74pub enum PrecompileError {
75 #[error("deferred DAG is missing a node referenced during evaluation")]
77 MissingNode,
78
79 #[error("node failed precompile validation")]
81 InvalidNode,
82
83 #[error("deferred assertion failed: values disagree")]
85 AssertionFailed,
86
87 #[error(transparent)]
89 Other(#[from] DeferredError),
90
91 #[error("precompile `{name}`: {source}")]
95 Precompile {
96 name: &'static str,
97 source: Box<PrecompileError>,
98 },
99}
100
101impl PrecompileError {
102 pub fn root(&self) -> &PrecompileError {
104 match self {
105 PrecompileError::Precompile { source, .. } => source.root(),
106 other => other,
107 }
108 }
109
110 pub(crate) fn with_precompile(name: &'static str, source: PrecompileError) -> Self {
111 Self::Precompile { name, source: Box::new(source) }
112 }
113}