Skip to main content

miden_precompiles_prover/
lib.rs

1#![no_std]
2#![allow(
3    dead_code,
4    unused_imports,
5    reason = "the imported prover stack is intentionally retained behind a narrow crate API"
6)]
7
8extern crate alloc;
9#[cfg(any(test, feature = "std"))]
10extern crate std;
11
12use alloc::string::{String, ToString};
13
14use miden_core::deferred::DeferredState;
15pub use miden_core::proof::{HashFunction, StarkProof};
16
17pub(crate) mod ec;
18pub(crate) mod hash;
19pub(crate) mod logup;
20pub(crate) mod math;
21pub(crate) mod primitives;
22pub(crate) mod relations;
23pub(crate) mod session;
24pub(crate) mod stark_config;
25pub(crate) mod transcript;
26pub(crate) mod uint;
27pub(crate) mod utils;
28
29/// Proves the precompile claims accumulated in `state` against its exact deferred root.
30pub fn prove_deferred_state(
31    state: &DeferredState,
32    hash_fn: HashFunction,
33) -> Result<StarkProof, ProveDeferredStateError> {
34    let deferred = {
35        let _span = tracing::info_span!("build_session").entered();
36        deferred::session_from_deferred_state(state)?
37    };
38    let traces = {
39        let _span = tracing::info_span!("build_trace").entered();
40        deferred.session.finish(deferred.root)
41    };
42    Ok(traces.prove_stark(hash_fn)?)
43}
44
45/// Errors produced while proving deferred precompile claims from VM deferred state.
46#[derive(Debug, thiserror::Error)]
47pub enum ProveDeferredStateError {
48    /// The VM deferred DAG could not be translated into the precompile prover's session model.
49    #[error("failed to translate deferred state into a precompile proving session: {0}")]
50    Translation(String),
51    /// The translated precompile session could not be proved.
52    #[error(transparent)]
53    Prove(#[from] ProveError),
54}
55
56impl From<deferred::DeferredSessionError> for ProveDeferredStateError {
57    fn from(error: deferred::DeferredSessionError) -> Self {
58        Self::Translation(error.to_string())
59    }
60}
61
62/// Errors produced by serialized precompile STARK proof generation.
63#[derive(Debug, thiserror::Error)]
64pub enum ProveError {
65    /// The chiplet stack declares preprocessed columns, but no preprocessed
66    /// bundle was produced. This should not happen for the full session AIR set.
67    #[error("chiplet stack declares preprocessed columns, but no preprocessed bundle was built")]
68    MissingPreprocessed,
69    /// The preprocessed bundle did not match the declared AIR columns/config.
70    #[error(transparent)]
71    Preprocessed(#[from] miden_lifted_stark::PreprocessedValidationError),
72    /// The lifted STARK prover rejected the instance.
73    #[error(transparent)]
74    Prover(#[from] miden_lifted_stark::ProverError),
75    /// Failed to serialize the STARK proof data into the core proof envelope.
76    #[error("failed to serialize STARK proof: {0}")]
77    Serialization(#[from] wincode::error::WriteError),
78}
79
80pub(crate) mod deferred;
81
82#[cfg(test)]
83mod tests;