openvm_stark_sdk/
engine.rs

1use std::sync::Arc;
2
3pub use openvm_stark_backend::engine::StarkEngine;
4use openvm_stark_backend::{
5    config::{StarkGenericConfig, Val},
6    engine::VerificationData,
7    p3_matrix::dense::RowMajorMatrix,
8    prover::{hal::DeviceDataTransporter, types::AirProvingContext},
9    verifier::VerificationError,
10    AirRef,
11};
12use tracing::Level;
13
14use crate::config::{instrument::StarkHashStatistics, setup_tracing_with_log_level, FriParameters};
15
16pub trait StarkEngineWithHashInstrumentation: StarkEngine {
17    fn clear_instruments(&mut self);
18    fn stark_hash_statistics<T>(&self, custom: T) -> StarkHashStatistics<T>;
19}
20
21/// All necessary data to verify a Stark proof.
22pub struct VerificationDataWithFriParams<SC: StarkGenericConfig> {
23    pub data: VerificationData<SC>,
24    pub fri_params: FriParameters,
25}
26
27/// Stark engine using Fri.
28pub trait StarkFriEngine: StarkEngine + Sized {
29    fn new(fri_params: FriParameters) -> Self;
30    fn fri_params(&self) -> FriParameters;
31    fn run_test(
32        &self,
33        airs: Vec<AirRef<Self::SC>>,
34        ctx: Vec<AirProvingContext<Self::PB>>,
35    ) -> Result<VerificationDataWithFriParams<Self::SC>, VerificationError> {
36        setup_tracing_with_log_level(Level::WARN);
37        let data = <Self as StarkEngine>::run_test_impl(self, airs, ctx)?;
38        Ok(VerificationDataWithFriParams {
39            data,
40            fri_params: self.fri_params(),
41        })
42    }
43    fn run_test_fast(
44        airs: Vec<AirRef<Self::SC>>,
45        ctx: Vec<AirProvingContext<Self::PB>>,
46    ) -> Result<VerificationDataWithFriParams<Self::SC>, VerificationError> {
47        let engine = Self::new(FriParameters::standard_fast());
48        engine.run_test(airs, ctx)
49    }
50    /// Runs a single end-to-end test for a given set of AIRs and traces.
51    /// This includes proving/verifying key generation, creating a proof, and verifying the proof.
52    /// This function should only be used on AIRs where the main trace is **not** partitioned.
53    fn run_simple_test_impl(
54        &self,
55        chips: Vec<AirRef<Self::SC>>,
56        traces: Vec<RowMajorMatrix<Val<Self::SC>>>,
57        public_values: Vec<Vec<Val<Self::SC>>>,
58    ) -> Result<VerificationDataWithFriParams<Self::SC>, VerificationError> {
59        let traces = traces
60            .into_iter()
61            .map(|trace| self.device().transport_matrix_to_device(&Arc::new(trace)))
62            .collect();
63        self.run_test(
64            chips,
65            AirProvingContext::multiple_simple(traces, public_values),
66        )
67    }
68    fn run_simple_test_fast(
69        airs: Vec<AirRef<Self::SC>>,
70        traces: Vec<RowMajorMatrix<Val<Self::SC>>>,
71        public_values: Vec<Vec<Val<Self::SC>>>,
72    ) -> Result<VerificationDataWithFriParams<Self::SC>, VerificationError> {
73        let engine = Self::new(FriParameters::standard_fast());
74        StarkFriEngine::run_simple_test_impl(&engine, airs, traces, public_values)
75    }
76    fn run_simple_test_no_pis_fast(
77        airs: Vec<AirRef<Self::SC>>,
78        traces: Vec<RowMajorMatrix<Val<Self::SC>>>,
79    ) -> Result<VerificationDataWithFriParams<Self::SC>, VerificationError> {
80        let pis = vec![vec![]; airs.len()];
81        <Self as StarkFriEngine>::run_simple_test_fast(airs, traces, pis)
82    }
83}