openvm_continuations/verifier/internal/
mod.rs1use openvm_circuit::arch::instructions::program::Program;
2use openvm_native_compiler::{conversion::CompilerOptions, prelude::*};
3use openvm_native_recursion::{
4 fri::TwoAdicFriPcsVariable, hints::Hintable, types::new_from_inner_multi_vk,
5 utils::const_fri_config,
6};
7use openvm_stark_sdk::{
8 config::{baby_bear_poseidon2::BabyBearPoseidon2Config, FriParameters},
9 openvm_stark_backend::keygen::types::MultiStarkVerifyingKey,
10};
11
12use crate::{
13 verifier::{
14 common::non_leaf::NonLeafVerifierVariables,
15 internal::{
16 types::{InternalVmVerifierExtraPvs, InternalVmVerifierInput, InternalVmVerifierPvs},
17 vars::InternalVmVerifierInputVariable,
18 },
19 },
20 C, F,
21};
22
23pub mod types;
24pub mod vars;
25
26pub struct InternalVmVerifierConfig {
28 pub leaf_fri_params: FriParameters,
29 pub internal_fri_params: FriParameters,
30 pub compiler_options: CompilerOptions,
31}
32
33impl InternalVmVerifierConfig {
34 pub fn build_program(
35 &self,
36 leaf_vm_vk: &MultiStarkVerifyingKey<BabyBearPoseidon2Config>,
37 internal_vm_vk: &MultiStarkVerifyingKey<BabyBearPoseidon2Config>,
38 ) -> Program<F> {
39 let leaf_advice = new_from_inner_multi_vk(leaf_vm_vk);
40 let internal_advice = new_from_inner_multi_vk(internal_vm_vk);
41 let mut builder = Builder::<C>::default();
42 {
43 builder.cycle_tracker_start("ReadProofsFromInput");
44 let InternalVmVerifierInputVariable {
45 self_program_commit,
46 proofs,
47 } = InternalVmVerifierInput::<BabyBearPoseidon2Config>::read(&mut builder);
48 builder.cycle_tracker_end("ReadProofsFromInput");
49 builder.cycle_tracker_start("InitializePcsConst");
50 let leaf_pcs = TwoAdicFriPcsVariable {
51 config: const_fri_config(&mut builder, &self.leaf_fri_params),
52 };
53 let internal_pcs = TwoAdicFriPcsVariable {
54 config: const_fri_config(&mut builder, &self.internal_fri_params),
55 };
56 builder.cycle_tracker_end("InitializePcsConst");
57 let non_leaf_verifier = NonLeafVerifierVariables {
58 internal_program_commit: self_program_commit,
59 leaf_pcs,
60 leaf_advice,
61 internal_pcs,
62 internal_advice,
63 };
64 builder.cycle_tracker_start("VerifyProofs");
65 let (vm_verifier_pvs, leaf_verifier_commit) =
66 non_leaf_verifier.verify_internal_or_leaf_verifier_proofs(&mut builder, &proofs);
67 builder.cycle_tracker_end("VerifyProofs");
68 let pvs = InternalVmVerifierPvs {
69 vm_verifier_pvs,
70 extra_pvs: InternalVmVerifierExtraPvs {
71 internal_program_commit: self_program_commit,
72 leaf_verifier_commit,
73 },
74 };
75 for pv in pvs.flatten() {
76 builder.commit_public_value(pv);
77 }
78
79 builder.halt();
80 }
81
82 builder.compile_isa_with_options(self.compiler_options)
83 }
84}