openvm_verify_stark_circuit/
lib.rs1use 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
27pub mod bus;
29pub mod commit;
30pub mod output;
31pub mod verifier;
32
33pub 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_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}