openvm_native_recursion/
testing_utils.rs

1use inner::build_verification_program;
2use openvm_circuit::{arch::instructions::program::Program, utils::execute_and_prove_program};
3use openvm_native_circuit::NativeConfig;
4use openvm_native_compiler::conversion::CompilerOptions;
5use openvm_stark_backend::{
6    config::{Com, Domain, PcsProof, PcsProverData, StarkGenericConfig},
7    engine::VerificationData,
8    p3_commit::PolynomialSpace,
9    verifier::VerificationError,
10};
11use openvm_stark_sdk::{
12    config::baby_bear_poseidon2::BabyBearPoseidon2Config,
13    engine::{StarkFriEngine, VerificationDataWithFriParams},
14    p3_baby_bear::BabyBear,
15    utils::ProofInputForTest,
16};
17
18use crate::hints::InnerVal;
19
20type InnerSC = BabyBearPoseidon2Config;
21
22pub mod inner {
23    use openvm_native_circuit::NativeConfig;
24    use openvm_native_compiler::conversion::CompilerOptions;
25    use openvm_stark_sdk::{
26        config::{
27            baby_bear_poseidon2::{BabyBearPoseidon2Config, BabyBearPoseidon2Engine},
28            FriParameters,
29        },
30        engine::{StarkFriEngine, VerificationDataWithFriParams},
31    };
32
33    use super::*;
34    use crate::{hints::Hintable, stark::VerifierProgram, types::new_from_inner_multi_vk};
35
36    pub fn build_verification_program(
37        vparams: VerificationDataWithFriParams<InnerSC>,
38        compiler_options: CompilerOptions,
39    ) -> (Program<BabyBear>, Vec<Vec<InnerVal>>) {
40        let VerificationDataWithFriParams { data, fri_params } = vparams;
41        let VerificationData { proof, vk } = data;
42
43        let advice = new_from_inner_multi_vk(&vk);
44        cfg_if::cfg_if! {
45            if #[cfg(feature = "bench-metrics")] {
46                let start = std::time::Instant::now();
47            }
48        }
49        let program = VerifierProgram::build_with_options(advice, &fri_params, compiler_options);
50        #[cfg(feature = "bench-metrics")]
51        metrics::gauge!("verify_program_compile_ms").set(start.elapsed().as_millis() as f64);
52
53        let mut input_stream = Vec::new();
54        input_stream.extend(proof.write());
55
56        (program, input_stream)
57    }
58
59    /// Steps of recursive tests:
60    /// 1. Generate a stark proof, P.
61    /// 2. build a verifier program which can verify P.
62    /// 3. Execute the verifier program and generate a proof.
63    ///
64    /// This is a convenience function with default configs for testing purposes only.
65    pub fn run_recursive_test(
66        test_proof_input: ProofInputForTest<BabyBearPoseidon2Config>,
67        fri_params: FriParameters,
68    ) {
69        let vparams = test_proof_input
70            .run_test(&BabyBearPoseidon2Engine::new(
71                FriParameters::new_for_testing(1),
72            ))
73            .unwrap();
74
75        recursive_stark_test(
76            vparams,
77            CompilerOptions::default(),
78            NativeConfig::aggregation(4, 7),
79            &BabyBearPoseidon2Engine::new(fri_params),
80        )
81        .unwrap();
82    }
83}
84
85/// 1. Builds the recursive verification program to verify `vparams`
86/// 2. Execute and proves the program in VM with `AggSC` config using `engine`.
87///
88/// The `vparams` must be from the BabyBearPoseidon2 stark config for the recursion
89/// program to work at the moment.
90#[allow(clippy::type_complexity)]
91pub fn recursive_stark_test<AggSC: StarkGenericConfig, E: StarkFriEngine<AggSC>>(
92    vparams: VerificationDataWithFriParams<InnerSC>,
93    compiler_options: CompilerOptions,
94    vm_config: NativeConfig,
95    engine: &E,
96) -> Result<VerificationDataWithFriParams<AggSC>, VerificationError>
97where
98    Domain<AggSC>: PolynomialSpace<Val = BabyBear>,
99    Domain<AggSC>: Send + Sync,
100    PcsProverData<AggSC>: Send + Sync,
101    Com<AggSC>: Send + Sync,
102    PcsProof<AggSC>: Send + Sync,
103{
104    let (program, witness_stream) = build_verification_program(vparams, compiler_options);
105
106    execute_and_prove_program(program, witness_stream, vm_config, engine)
107}