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}