openvm_sdk/prover/
halo2.rs

1use 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}