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