openvm_sdk/prover/
halo2.rs

1use std::sync::Arc;
2
3use openvm_continuations::RootSC;
4use openvm_stark_backend::proof::Proof;
5use openvm_static_verifier::{Halo2Params, Halo2ParamsReader};
6use tracing::{info, info_span};
7
8use crate::{keygen::Halo2ProvingKey, types::EvmProof};
9
10#[derive(Clone)]
11pub struct Halo2Prover {
12    halo2_pk: Halo2ProvingKey,
13    verifier_srs: Arc<Halo2Params>,
14    wrapper_srs: Arc<Halo2Params>,
15}
16
17impl Halo2Prover {
18    pub fn new(reader: &impl Halo2ParamsReader, halo2_pk: Halo2ProvingKey) -> Self {
19        let verifier_k = halo2_pk.verifier.pinning.metadata.config_params.k;
20        let wrapper_k = halo2_pk.wrapper.pinning.metadata.config_params.k;
21        info!(verifier_k, wrapper_k, "Halo2Prover initialized");
22        let verifier_srs = reader.read_params(verifier_k);
23        let wrapper_srs = reader.read_params(wrapper_k);
24        Self {
25            halo2_pk,
26            verifier_srs,
27            wrapper_srs,
28        }
29    }
30
31    pub fn prove_for_evm(&self, root_proof: &Proof<RootSC>) -> EvmProof {
32        #[cfg(feature = "metrics")]
33        {
34            let verifier_k = self.halo2_pk.verifier.pinning.metadata.config_params.k;
35            let wrapper_k = self.halo2_pk.wrapper.pinning.metadata.config_params.k;
36            metrics::gauge!("halo2_verifier_k", "group" => "halo2_outer").set(verifier_k as f64);
37            metrics::gauge!("halo2_wrapper_k", "group" => "halo2_wrapper").set(wrapper_k as f64);
38        }
39        let snark = info_span!("total_proof", group = "halo2_outer").in_scope(|| {
40            self.halo2_pk
41                .verifier
42                .prove_wrapped(&self.verifier_srs, root_proof)
43        });
44        info_span!("total_proof", group = "halo2_wrapper").in_scope(|| {
45            let raw = self
46                .halo2_pk
47                .wrapper
48                .prove_for_evm(&self.wrapper_srs, snark);
49            EvmProof::from(raw)
50        })
51    }
52
53    pub fn pk(&self) -> Halo2ProvingKey {
54        self.halo2_pk.clone()
55    }
56}