openvm_verify_stark_circuit/
lib.rs

1use std::sync::Arc;
2
3use openvm_circuit::system::memory::dimensions::MemoryDimensions;
4use openvm_continuations::{
5    circuit::{
6        root::{
7            bus::{DeferralAccPathBus, DeferralMerkleRootsBus, MemoryMerkleCommitBus},
8            def_paths::DeferralAccMerklePathsAir,
9            memory::UserPvsInMemoryAir,
10        },
11        subair::{HashSliceSubAir, MerkleRootBus, MerkleTreeInternalBus},
12        Circuit,
13    },
14    CommitBytes, VkCommitBytes,
15};
16use openvm_recursion_circuit::{prelude::F, system::AggregationSubCircuit};
17use openvm_stark_backend::{AirRef, StarkProtocolConfig, SystemParams};
18use openvm_stark_sdk::config::internal_params_with_100_bits_security;
19
20use crate::{
21    bus::{OutputCommitBus, OutputValBus},
22    commit::UserPvsCommitValuesAir,
23    output::DeferralOutputCommitAir,
24    verifier::DeferredVerifyPvsAir,
25};
26
27// AIR definitions
28pub mod bus;
29pub mod commit;
30pub mod output;
31pub mod verifier;
32
33// Integration with deferral extension + SDK
34pub mod extension;
35pub mod prover;
36
37mod trace;
38pub use trace::*;
39
40#[cfg(test)]
41mod tests;
42
43pub fn default_verify_stark_circuit_params() -> SystemParams {
44    // Internal params are tuned well for the verify-stark circuit's size and proof cost
45    internal_params_with_100_bits_security()
46}
47
48#[derive(derive_new::new, Clone)]
49pub struct DeferredVerifyCircuit<S: AggregationSubCircuit> {
50    pub verifier_circuit: Arc<S>,
51    internal_recursive_vk_commit: VkCommitBytes,
52    def_hook_commit: Option<CommitBytes>,
53    pub(crate) memory_dimensions: MemoryDimensions,
54    pub(crate) num_user_pvs: usize,
55    pub(crate) def_idx: usize,
56}
57
58impl<SC: StarkProtocolConfig<F = F>, S: AggregationSubCircuit> Circuit<SC>
59    for DeferredVerifyCircuit<S>
60{
61    fn airs(&self) -> Vec<AirRef<SC>> {
62        let bus_inventory = self.verifier_circuit.bus_inventory();
63        let next_bus_idx = self.verifier_circuit.next_bus_idx();
64
65        let merkle_root_bus = MerkleRootBus::new(next_bus_idx);
66        let merkle_tree_internal_bus = MerkleTreeInternalBus::new(next_bus_idx + 1);
67        let memory_merkle_commit_bus = MemoryMerkleCommitBus::new(next_bus_idx + 2);
68        let output_val_bus = OutputValBus::new(next_bus_idx + 3);
69        let output_commit_bus = OutputCommitBus::new(next_bus_idx + 4);
70        let def_acc_paths_bus = DeferralAccPathBus::new(next_bus_idx + 5);
71        let memory_merkle_roots_bus = DeferralMerkleRootsBus::new(next_bus_idx + 6);
72
73        let verifier_pvs_air = DeferredVerifyPvsAir {
74            public_values_bus: bus_inventory.public_values_bus,
75            cached_commit_bus: bus_inventory.cached_commit_bus,
76            pre_hash_bus: bus_inventory.pre_hash_bus,
77            range_bus: bus_inventory.range_checker_bus,
78            poseidon2_compress_bus: bus_inventory.poseidon2_compress_bus,
79            hash_slice_subair: HashSliceSubAir {
80                compress_bus: bus_inventory.poseidon2_compress_bus,
81                permute_bus: bus_inventory.poseidon2_permute_bus,
82            },
83            memory_merkle_commit_bus,
84            output_val_bus,
85            output_commit_bus,
86            final_state_bus: bus_inventory.final_state_bus,
87            def_acc_paths_bus,
88            def_merkle_roots_bus: memory_merkle_roots_bus,
89            expected_internal_recursive_vk_commit: self.internal_recursive_vk_commit,
90            expected_def_hook_commit: self.def_hook_commit,
91            def_idx: self.def_idx,
92        };
93        let user_pvs_commit_air = UserPvsCommitValuesAir::new(
94            bus_inventory.poseidon2_compress_bus,
95            merkle_root_bus,
96            merkle_tree_internal_bus,
97            output_val_bus,
98            self.num_user_pvs,
99        );
100        let user_pvs_memory_air = UserPvsInMemoryAir::new(
101            bus_inventory.poseidon2_compress_bus,
102            merkle_root_bus,
103            memory_merkle_commit_bus,
104            self.memory_dimensions,
105            self.num_user_pvs,
106        );
107        let output_commit_air = DeferralOutputCommitAir {
108            poseidon2_bus: bus_inventory.poseidon2_permute_bus,
109            range_bus: bus_inventory.range_checker_bus,
110            output_val_bus,
111            output_commit_bus,
112            def_idx: self.def_idx,
113        };
114
115        let acc_paths_air = self.def_hook_commit.map(|_| {
116            Arc::new(DeferralAccMerklePathsAir::new(
117                bus_inventory.poseidon2_compress_bus,
118                def_acc_paths_bus,
119                memory_merkle_roots_bus,
120                self.memory_dimensions,
121            )) as AirRef<SC>
122        });
123
124        [Arc::new(verifier_pvs_air) as AirRef<SC>]
125            .into_iter()
126            .chain([Arc::new(user_pvs_commit_air) as AirRef<SC>])
127            .chain([Arc::new(user_pvs_memory_air) as AirRef<SC>])
128            .chain(self.verifier_circuit.airs())
129            .chain([Arc::new(output_commit_air) as AirRef<SC>])
130            .chain(acc_paths_air)
131            .collect()
132    }
133}