openvm_continuations/circuit/deferral/
dummy.rs

1use std::sync::Arc;
2
3use openvm_circuit_primitives::ColumnsAir;
4use openvm_stark_backend::{
5    keygen::types::MultiStarkVerifyingKey, p3_matrix::Matrix, AirRef, PartitionedBaseAir,
6    StarkEngine, SystemParams,
7};
8use p3_air::{Air, AirBuilder, AirBuilderWithPublicValues, BaseAir, BaseAirWithPublicValues};
9
10use super::DeferralCircuitPvs;
11use crate::SC;
12
13/// Minimal AIR with a single zero column and deferral-circuit public values.
14///
15/// This is used only as a cheap verifying-key seed for deferral path fixed-point derivation; it is
16/// not intended to be proven.
17pub(crate) struct EmptyAirWithPvs(pub(crate) usize);
18
19// No columns provided: this dummy AIR has a single anonymous column and no matching `Cols` struct.
20impl ColumnsAir for EmptyAirWithPvs {}
21
22impl<F> BaseAir<F> for EmptyAirWithPvs {
23    fn width(&self) -> usize {
24        1
25    }
26}
27
28impl<F> BaseAirWithPublicValues<F> for EmptyAirWithPvs {
29    fn num_public_values(&self) -> usize {
30        self.0
31    }
32}
33
34impl<F> PartitionedBaseAir<F> for EmptyAirWithPvs {}
35
36impl<AB: AirBuilder + AirBuilderWithPublicValues> Air<AB> for EmptyAirWithPvs {
37    fn eval(&self, builder: &mut AB) {
38        let main = builder.main();
39        let local = main.row_slice(0).unwrap();
40        builder.assert_zero(local[0].clone());
41
42        let pvs = builder
43            .public_values()
44            .iter()
45            .map(|pv| (*pv).into())
46            .collect::<Vec<AB::Expr>>();
47        for pv in pvs {
48            // Trivial asserts to ensure pvs get placed in the DAG
49            builder.assert_eq(pv.clone(), pv);
50        }
51    }
52}
53
54pub fn dummy_deferral_circuit_vk<E>(system_params: SystemParams) -> Arc<MultiStarkVerifyingKey<SC>>
55where
56    E: StarkEngine<SC = SC>,
57{
58    let engine = E::new(system_params);
59    let dummy_air = Arc::new(EmptyAirWithPvs(DeferralCircuitPvs::<u8>::width())) as AirRef<SC>;
60    Arc::new(engine.keygen(&[dummy_air]).1)
61}