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}