openvm_native_recursion/halo2/
verifier.rs

1use openvm_native_compiler::ir::Witness;
2use openvm_stark_backend::proof::Proof;
3use openvm_stark_sdk::config::{
4    baby_bear_poseidon2_root::BabyBearPoseidon2RootConfig, FriParameters,
5};
6use serde::{Deserialize, Serialize};
7use snark_verifier_sdk::Snark;
8
9use crate::{
10    config::outer::OuterConfig,
11    halo2::{
12        utils::Halo2ParamsReader, DslOperations, Halo2Params, Halo2Prover, Halo2ProvingPinning,
13    },
14    stark::outer::build_circuit_verify_operations,
15    types::MultiStarkVerificationAdvice,
16    witness::Witnessable,
17};
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct Halo2VerifierProvingKey {
21    pub pinning: Halo2ProvingPinning,
22    pub dsl_ops: DslOperations<OuterConfig>,
23}
24
25/// Generate a Halo2 verifier circuit for a given stark.
26pub fn generate_halo2_verifier_proving_key(
27    params: &Halo2Params,
28    advice: MultiStarkVerificationAdvice<OuterConfig>,
29    fri_params: &FriParameters,
30    proof: &Proof<BabyBearPoseidon2RootConfig>,
31) -> Halo2VerifierProvingKey {
32    let mut witness = Witness::default();
33    proof.write(&mut witness);
34    let dsl_operations = build_circuit_verify_operations(advice, fri_params, proof);
35    Halo2VerifierProvingKey {
36        pinning: Halo2Prover::keygen(params, dsl_operations.clone(), witness),
37        dsl_ops: dsl_operations,
38    }
39}
40
41impl Halo2VerifierProvingKey {
42    pub fn prove(
43        &self,
44        params: &Halo2Params,
45        witness: Witness<OuterConfig>,
46        profiling: bool,
47    ) -> Snark {
48        Halo2Prover::prove(
49            params,
50            self.pinning.metadata.config_params.clone(),
51            self.pinning.metadata.break_points.clone(),
52            &self.pinning.pk,
53            self.dsl_ops.clone(),
54            witness,
55            profiling,
56        )
57    }
58    // TODO: Add verify method
59
60    /// Generate a dummy snark for wrapper keygen.
61    pub fn generate_dummy_snark(&self, reader: &impl Halo2ParamsReader) -> Snark {
62        self.pinning.generate_dummy_snark(reader)
63    }
64}