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}