openvm_sdk/keygen/
static_verifier.rs1use 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 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 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}