openvm_sdk/prover/
halo2.rs

1use std::sync::Arc;
2
3use openvm_native_compiler::prelude::Witness;
4use openvm_native_recursion::{
5    halo2::{utils::Halo2ParamsReader, Halo2Params},
6    witness::Witnessable,
7};
8use openvm_stark_sdk::openvm_stark_backend::proof::Proof;
9use tracing::info_span;
10
11use crate::{keygen::Halo2ProvingKey, types::EvmProof, RootSC};
12
13pub struct Halo2Prover {
14    halo2_pk: Halo2ProvingKey,
15    verifier_srs: Arc<Halo2Params>,
16    wrapper_srs: Arc<Halo2Params>,
17}
18
19impl Halo2Prover {
20    pub fn new(reader: &impl Halo2ParamsReader, halo2_pk: Halo2ProvingKey) -> Self {
21        let verifier_k = halo2_pk.verifier.pinning.metadata.config_params.k;
22        let wrapper_k = halo2_pk.wrapper.pinning.metadata.config_params.k;
23        let verifier_srs = reader.read_params(verifier_k);
24        let wrapper_srs = reader.read_params(wrapper_k);
25        Self {
26            halo2_pk,
27            verifier_srs,
28            wrapper_srs,
29        }
30    }
31    pub fn prove_for_evm(&self, root_proof: &Proof<RootSC>) -> EvmProof {
32        let mut witness = Witness::default();
33        root_proof.write(&mut witness);
34        let snark = info_span!("prove", group = "halo2_outer").in_scope(|| {
35            self.halo2_pk
36                .verifier
37                .prove(&self.verifier_srs, witness, self.halo2_pk.profiling)
38        });
39        info_span!("prove_for_evm", group = "halo2_wrapper").in_scope(|| {
40            self.halo2_pk
41                .wrapper
42                .prove_for_evm(&self.wrapper_srs, snark)
43                .try_into()
44                .unwrap()
45        })
46    }
47}