openvm_continuations/circuit/
mod.rs

1use std::sync::Arc;
2
3use openvm_circuit::arch::POSEIDON2_WIDTH;
4use openvm_recursion_circuit::prelude::F;
5use openvm_stark_backend::{
6    prover::{AirProvingContext, ProverBackend},
7    AirRef, StarkProtocolConfig,
8};
9
10pub mod deferral;
11pub mod inner;
12pub mod root;
13pub mod subair;
14
15pub struct SubCircuitTraceData<PB: ProverBackend> {
16    pub air_proving_ctxs: Vec<AirProvingContext<PB>>,
17    pub poseidon2_compress_inputs: Vec<[PB::Val; POSEIDON2_WIDTH]>,
18    pub poseidon2_permute_inputs: Vec<[PB::Val; POSEIDON2_WIDTH]>,
19    pub range_check_inputs: Vec<usize>,
20}
21
22pub struct SingleAirTraceData<PB: ProverBackend> {
23    pub air_proving_ctx: AirProvingContext<PB>,
24    pub poseidon2_compress_inputs: Vec<[PB::Val; POSEIDON2_WIDTH]>,
25    pub poseidon2_permute_inputs: Vec<[PB::Val; POSEIDON2_WIDTH]>,
26    pub range_check_inputs: Vec<usize>,
27}
28
29// TODO: move to stark-backend-v2
30pub trait Circuit<SC: StarkProtocolConfig<F = F>> {
31    fn airs(&self) -> Vec<AirRef<SC>>;
32}
33
34impl<SC: StarkProtocolConfig<F = F>, C: Circuit<SC>> Circuit<SC> for Arc<C> {
35    fn airs(&self) -> Vec<AirRef<SC>> {
36        self.as_ref().airs()
37    }
38}
39
40pub mod utils {
41    use openvm_circuit_primitives::utils::assert_array_eq;
42    use openvm_recursion_circuit::utils::assert_zeros;
43    use openvm_stark_sdk::config::baby_bear_poseidon2::DIGEST_SIZE;
44    use openvm_verify_stark_host::pvs::{VerifierBasePvs, VkCommit};
45    use p3_air::AirBuilder;
46
47    pub fn assert_vk_commit_eq<AB: AirBuilder, I1: Into<AB::Expr>, I2: Into<AB::Expr>>(
48        builder: &mut AB,
49        x: VkCommit<I1>,
50        y: VkCommit<I2>,
51    ) {
52        assert_array_eq(builder, x.cached_commit, y.cached_commit);
53        assert_array_eq(builder, x.vk_pre_hash, y.vk_pre_hash);
54    }
55
56    pub fn assert_vk_commit_unset<AB: AirBuilder, I1: Into<AB::Expr>>(
57        builder: &mut AB,
58        x: VkCommit<I1>,
59    ) {
60        assert_zeros(builder, x.cached_commit);
61        assert_zeros(builder, x.vk_pre_hash);
62    }
63
64    pub fn vk_commit_components<F: Copy>(pvs: &VerifierBasePvs<F>) -> Vec<[F; DIGEST_SIZE]> {
65        vec![
66            pvs.app_vk_commit.cached_commit,
67            pvs.app_vk_commit.vk_pre_hash,
68            pvs.leaf_vk_commit.cached_commit,
69            pvs.leaf_vk_commit.vk_pre_hash,
70            pvs.internal_for_leaf_vk_commit.cached_commit,
71            pvs.internal_for_leaf_vk_commit.vk_pre_hash,
72        ]
73    }
74}