openvm_sdk/prover/
mod.rs

1mod agg;
2mod app;
3#[cfg(feature = "evm-prove")]
4mod halo2;
5#[cfg(feature = "evm-prove")]
6mod root;
7mod stark;
8pub mod vm;
9
10pub use agg::*;
11pub use app::*;
12#[cfg(feature = "evm-prove")]
13pub use evm::*;
14#[cfg(feature = "evm-prove")]
15pub use halo2::*;
16#[cfg(feature = "evm-prove")]
17pub use root::*;
18pub use stark::*;
19
20#[cfg(feature = "evm-prove")]
21mod evm {
22    use std::sync::Arc;
23
24    use openvm_circuit::arch::{
25        instructions::exe::VmExe, Executor, MeteredExecutor, PreflightExecutor,
26        VirtualMachineError, VmBuilder, VmExecutionConfig,
27    };
28    use openvm_native_circuit::NativeConfig;
29    use openvm_native_recursion::halo2::utils::Halo2ParamsReader;
30    use openvm_stark_sdk::engine::StarkFriEngine;
31
32    use super::{Halo2Prover, StarkProver};
33    use crate::{
34        config::AggregationTreeConfig,
35        keygen::{AggProvingKey, AppProvingKey, Halo2ProvingKey},
36        stdin::StdIn,
37        types::EvmProof,
38        F, SC,
39    };
40
41    pub struct EvmHalo2Prover<E, VB, NativeBuilder>
42    where
43        E: StarkFriEngine<SC = SC>,
44        VB: VmBuilder<E>,
45        NativeBuilder: VmBuilder<E, VmConfig = NativeConfig>,
46    {
47        pub stark_prover: StarkProver<E, VB, NativeBuilder>,
48        pub halo2_prover: Halo2Prover,
49    }
50
51    impl<E, VB, NativeBuilder> EvmHalo2Prover<E, VB, NativeBuilder>
52    where
53        E: StarkFriEngine<SC = SC>,
54        VB: VmBuilder<E>,
55        <VB::VmConfig as VmExecutionConfig<F>>::Executor: Executor<F>
56            + MeteredExecutor<F>
57            + PreflightExecutor<F, <VB as VmBuilder<E>>::RecordArena>,
58        NativeBuilder: VmBuilder<E, VmConfig = NativeConfig> + Clone,
59        <NativeConfig as VmExecutionConfig<F>>::Executor:
60            PreflightExecutor<F, <NativeBuilder as VmBuilder<E>>::RecordArena>,
61    {
62        #[allow(clippy::too_many_arguments)]
63        pub fn new(
64            reader: &impl Halo2ParamsReader,
65            app_vm_builder: VB,
66            native_builder: NativeBuilder,
67            app_pk: &AppProvingKey<VB::VmConfig>,
68            app_exe: Arc<VmExe<F>>,
69            agg_pk: &AggProvingKey,
70            halo2_pk: Halo2ProvingKey,
71            agg_tree_config: AggregationTreeConfig,
72        ) -> Result<Self, VirtualMachineError> {
73            let stark_prover = StarkProver::new(
74                app_vm_builder,
75                native_builder,
76                app_pk,
77                app_exe,
78                agg_pk,
79                agg_tree_config,
80            )?;
81            Ok(Self {
82                stark_prover,
83                halo2_prover: Halo2Prover::new(reader, halo2_pk),
84            })
85        }
86
87        pub fn with_program_name(mut self, program_name: impl AsRef<str>) -> Self {
88            self.set_program_name(program_name);
89            self
90        }
91        pub fn set_program_name(&mut self, program_name: impl AsRef<str>) -> &mut Self {
92            self.stark_prover.set_program_name(program_name);
93            self
94        }
95
96        pub fn prove_evm(&mut self, input: StdIn) -> Result<EvmProof, VirtualMachineError> {
97            let root_proof = self
98                .stark_prover
99                .generate_proof_for_outer_recursion(input)?;
100            let evm_proof = self.halo2_prover.prove_for_evm(&root_proof);
101            Ok(evm_proof)
102        }
103    }
104}