openvm_sdk/prover/
stark.rs
1use std::sync::Arc;
2
3use openvm_circuit::arch::VmConfig;
4use openvm_continuations::verifier::root::types::RootVmVerifierInput;
5use openvm_stark_backend::{proof::Proof, Chip};
6use openvm_stark_sdk::engine::StarkFriEngine;
7
8use crate::{
9 config::AggregationTreeConfig,
10 keygen::{AggStarkProvingKey, AppProvingKey},
11 prover::{agg::AggStarkProver, app::AppProver},
12 NonRootCommittedExe, RootSC, StdIn, F, SC,
13};
14
15pub struct StarkProver<VC, E: StarkFriEngine<SC>> {
16 pub app_prover: AppProver<VC, E>,
17 pub agg_prover: AggStarkProver<E>,
18}
19impl<VC, E: StarkFriEngine<SC>> StarkProver<VC, E> {
20 pub fn new(
21 app_pk: Arc<AppProvingKey<VC>>,
22 app_committed_exe: Arc<NonRootCommittedExe>,
23 agg_stark_pk: AggStarkProvingKey,
24 agg_tree_config: AggregationTreeConfig,
25 ) -> Self
26 where
27 VC: VmConfig<F>,
28 {
29 assert_eq!(
30 app_pk.leaf_fri_params, agg_stark_pk.leaf_vm_pk.fri_params,
31 "App VM is incompatible with Agg VM because of leaf FRI parameters"
32 );
33 assert_eq!(
34 app_pk.app_vm_pk.vm_config.system().num_public_values,
35 agg_stark_pk.num_public_values(),
36 "App VM is incompatible with Agg VM because of the number of public values"
37 );
38
39 Self {
40 app_prover: AppProver::new(app_pk.app_vm_pk.clone(), app_committed_exe),
41 agg_prover: AggStarkProver::new(
42 agg_stark_pk,
43 app_pk.leaf_committed_exe.clone(),
44 agg_tree_config,
45 ),
46 }
47 }
48 pub fn set_program_name(&mut self, program_name: impl AsRef<str>) -> &mut Self {
49 self.app_prover.set_program_name(program_name);
50 self
51 }
52 pub fn generate_proof_for_outer_recursion(&self, input: StdIn) -> Proof<RootSC>
53 where
54 VC: VmConfig<F>,
55 VC::Executor: Chip<SC>,
56 VC::Periphery: Chip<SC>,
57 {
58 let app_proof = self.app_prover.generate_app_proof(input);
59 self.agg_prover.generate_agg_proof(app_proof)
60 }
61
62 pub fn generate_root_verifier_input(&self, input: StdIn) -> RootVmVerifierInput<SC>
63 where
64 VC: VmConfig<F>,
65 VC::Executor: Chip<SC>,
66 VC::Periphery: Chip<SC>,
67 {
68 let app_proof = self.app_prover.generate_app_proof(input);
69 self.agg_prover.generate_root_verifier_input(app_proof)
70 }
71}