openvm_sdk/prover/
halo2.rs1use 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}