openvm_sdk/prover/
mod.rs

1use std::sync::Arc;
2
3use openvm_circuit::arch::VmConfig;
4use openvm_stark_sdk::openvm_stark_backend::Chip;
5
6use crate::{keygen::AppProvingKey, stdin::StdIn, NonRootCommittedExe, F, SC};
7
8mod agg;
9pub use agg::*;
10mod app;
11pub use app::*;
12use openvm_native_recursion::halo2::utils::Halo2ParamsReader;
13
14mod halo2;
15#[allow(unused_imports)]
16pub use halo2::*;
17mod root;
18pub use root::*;
19mod stark;
20pub mod vm;
21
22#[allow(unused_imports)]
23pub use stark::*;
24
25use crate::{keygen::AggProvingKey, prover::halo2::Halo2Prover, types::EvmProof};
26
27pub struct ContinuationProver<VC> {
28    stark_prover: StarkProver<VC>,
29    halo2_prover: Halo2Prover,
30}
31
32impl<VC> ContinuationProver<VC> {
33    pub fn new(
34        reader: &impl Halo2ParamsReader,
35        app_pk: Arc<AppProvingKey<VC>>,
36        app_committed_exe: Arc<NonRootCommittedExe>,
37        agg_pk: AggProvingKey,
38    ) -> Self
39    where
40        VC: VmConfig<F>,
41    {
42        let AggProvingKey {
43            agg_stark_pk,
44            halo2_pk,
45        } = agg_pk;
46        let stark_prover = StarkProver::new(app_pk, app_committed_exe, agg_stark_pk);
47        Self {
48            stark_prover,
49            halo2_prover: Halo2Prover::new(reader, halo2_pk),
50        }
51    }
52
53    pub fn set_program_name(&mut self, program_name: impl AsRef<str>) -> &mut Self {
54        self.stark_prover.set_program_name(program_name);
55        self
56    }
57
58    pub fn generate_proof_for_evm(&self, input: StdIn) -> EvmProof
59    where
60        VC: VmConfig<F>,
61        VC::Executor: Chip<SC>,
62        VC::Periphery: Chip<SC>,
63    {
64        let root_proof = self.stark_prover.generate_proof_for_outer_recursion(input);
65        self.halo2_prover.prove_for_evm(&root_proof)
66    }
67}