openvm_sdk/keygen/
static_verifier.rs

1use openvm_circuit::arch::{SingleSegmentVmProver, VirtualMachineError};
2use openvm_continuations::{
3    static_verifier::{StaticVerifierConfig, StaticVerifierPvHandler},
4    verifier::root::types::RootVmVerifierInput,
5};
6use openvm_native_circuit::NATIVE_MAX_TRACE_HEIGHTS;
7use openvm_native_compiler::prelude::*;
8use openvm_native_recursion::{
9    halo2::{verifier::Halo2VerifierProvingKey, Halo2Params, Halo2Prover},
10    hints::Hintable,
11    witness::Witnessable,
12};
13use openvm_stark_sdk::openvm_stark_backend::{p3_field::FieldAlgebra, proof::Proof};
14
15use crate::{keygen::RootVerifierProvingKey, prover::RootVerifierLocalProver, RootSC, F, SC};
16
17impl RootVerifierProvingKey {
18    /// Keygen the static verifier for this root verifier.
19    pub fn keygen_static_verifier(
20        &self,
21        params: &Halo2Params,
22        root_proof: Proof<RootSC>,
23        pv_handler: &impl StaticVerifierPvHandler,
24    ) -> Halo2VerifierProvingKey {
25        let mut witness = Witness::default();
26        root_proof.write(&mut witness);
27        let special_air_ids = self.air_id_permutation().get_special_air_ids();
28        let config = StaticVerifierConfig {
29            root_verifier_fri_params: self.vm_pk.fri_params,
30            special_air_ids,
31            root_verifier_program_commit: self.root_committed_exe.get_program_commit().into(),
32        };
33        let dsl_operations = config.build_static_verifier_operations(
34            &self.vm_pk.vm_pk.get_vk(),
35            &root_proof,
36            pv_handler,
37        );
38        Halo2VerifierProvingKey {
39            pinning: Halo2Prover::keygen(params, dsl_operations.clone(), witness),
40            dsl_ops: dsl_operations,
41        }
42    }
43
44    pub fn generate_dummy_root_proof(
45        &self,
46        dummy_internal_proof: Proof<SC>,
47    ) -> Result<Proof<RootSC>, VirtualMachineError> {
48        let mut prover = RootVerifierLocalProver::new(self)?;
49        // 2 * DIGEST_SIZE for exe_commit and leaf_commit
50        let num_public_values = prover.vm_config().as_ref().num_public_values - 2 * DIGEST_SIZE;
51        SingleSegmentVmProver::prove(
52            &mut prover,
53            RootVmVerifierInput {
54                proofs: vec![dummy_internal_proof],
55                public_values: vec![F::ZERO; num_public_values],
56            }
57            .write(),
58            NATIVE_MAX_TRACE_HEIGHTS,
59        )
60    }
61}