openvm_sdk/prover/
stark.rs1use std::sync::Arc;
2
3use openvm_circuit::arch::{
4 instructions::exe::VmExe, Executor, MeteredExecutor, PreflightExecutor, VirtualMachineError,
5 VmBuilder, VmExecutionConfig,
6};
7use openvm_continuations::verifier::internal::types::VmStarkProof;
8#[cfg(feature = "evm-prove")]
9use openvm_continuations::{verifier::root::types::RootVmVerifierInput, RootSC};
10use openvm_native_circuit::NativeConfig;
11#[cfg(feature = "evm-prove")]
12use openvm_stark_backend::proof::Proof;
13use openvm_stark_sdk::engine::StarkFriEngine;
14
15use crate::{
16 commit::AppExecutionCommit,
17 config::AggregationTreeConfig,
18 keygen::{AggProvingKey, AppProvingKey},
19 prover::{agg::AggStarkProver, app::AppProver},
20 StdIn, F, SC,
21};
22
23pub struct StarkProver<E, VB, NativeBuilder>
25where
26 E: StarkFriEngine<SC = SC>,
27 VB: VmBuilder<E>,
28 NativeBuilder: VmBuilder<E, VmConfig = NativeConfig>,
29{
30 pub app_prover: AppProver<E, VB>,
31 pub agg_prover: AggStarkProver<E, NativeBuilder>,
32}
33impl<E, VB, NativeBuilder> StarkProver<E, VB, NativeBuilder>
34where
35 E: StarkFriEngine<SC = SC>,
36 VB: VmBuilder<E>,
37 <VB::VmConfig as VmExecutionConfig<F>>::Executor:
38 Executor<F> + MeteredExecutor<F> + PreflightExecutor<F, <VB as VmBuilder<E>>::RecordArena>,
39 NativeBuilder: VmBuilder<E, VmConfig = NativeConfig> + Clone,
40 <NativeConfig as VmExecutionConfig<F>>::Executor:
41 PreflightExecutor<F, <NativeBuilder as VmBuilder<E>>::RecordArena>,
42{
43 pub fn new(
44 app_vm_builder: VB,
45 native_builder: NativeBuilder,
46 app_pk: &AppProvingKey<VB::VmConfig>,
47 app_exe: Arc<VmExe<F>>,
48 agg_pk: &AggProvingKey,
49 agg_tree_config: AggregationTreeConfig,
50 ) -> Result<Self, VirtualMachineError> {
51 assert_eq!(
52 app_pk.leaf_fri_params, agg_pk.leaf_vm_pk.fri_params,
53 "App VM is incompatible with Agg VM because of leaf FRI parameters"
54 );
55 assert_eq!(
56 app_pk.app_vm_pk.vm_config.as_ref().num_public_values,
57 agg_pk.num_user_public_values(),
58 "App VM is incompatible with Agg VM because of the number of public values"
59 );
60
61 Ok(Self {
62 app_prover: AppProver::new(
63 app_vm_builder,
64 &app_pk.app_vm_pk,
65 app_exe,
66 app_pk.leaf_committed_exe.get_program_commit(),
67 )?,
68 agg_prover: AggStarkProver::new(
69 native_builder,
70 agg_pk,
71 app_pk.leaf_committed_exe.exe.clone(),
72 agg_tree_config,
73 )?,
74 })
75 }
76
77 pub fn from_parts(
78 app_prover: AppProver<E, VB>,
79 agg_prover: AggStarkProver<E, NativeBuilder>,
80 ) -> Result<Self, VirtualMachineError> {
81 Ok(Self {
82 app_prover,
83 agg_prover,
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.app_prover.set_program_name(program_name);
93 self
94 }
95
96 pub fn app_commit(&self) -> AppExecutionCommit {
97 self.app_prover.app_commit()
98 }
99
100 pub fn prove(&mut self, input: StdIn) -> Result<VmStarkProof<SC>, VirtualMachineError> {
101 let app_proof = self.app_prover.prove(input)?;
102 let leaf_proofs = self.agg_prover.generate_leaf_proofs(&app_proof)?;
103 self.agg_prover
104 .aggregate_leaf_proofs(leaf_proofs, app_proof.user_public_values.public_values)
105 }
106
107 #[cfg(feature = "evm-prove")]
108 pub fn generate_proof_for_outer_recursion(
109 &mut self,
110 input: StdIn,
111 ) -> Result<Proof<RootSC>, VirtualMachineError> {
112 let app_proof = self.app_prover.prove(input)?;
113 self.agg_prover.generate_root_proof(app_proof)
114 }
115 #[cfg(feature = "evm-prove")]
116 pub fn generate_root_verifier_input(
117 &mut self,
118 input: StdIn,
119 ) -> Result<RootVmVerifierInput<SC>, VirtualMachineError> {
120 let app_proof = self.app_prover.prove(input)?;
121 self.agg_prover.generate_root_verifier_input(app_proof)
122 }
123}