openvm_continuations/verifier/internal/
mod.rs

1use 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
26/// Config to generate internal VM verifier program.
27pub 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}