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