openvm_native_recursion/
testing_utils.rs

1use openvm_circuit::{arch::instructions::program::Program, utils::air_test_impl};
2use openvm_stark_backend::engine::VerificationData;
3use openvm_stark_sdk::{
4    config::baby_bear_poseidon2::BabyBearPoseidon2Config, p3_baby_bear::BabyBear,
5    utils::ProofInputForTest,
6};
7
8use crate::hints::InnerVal;
9
10type InnerSC = BabyBearPoseidon2Config;
11
12pub mod inner {
13    use openvm_native_circuit::{test_native_config, NativeCpuBuilder};
14    use openvm_native_compiler::conversion::CompilerOptions;
15    use openvm_stark_sdk::{
16        config::{
17            baby_bear_poseidon2::{BabyBearPoseidon2Config, BabyBearPoseidon2Engine},
18            FriParameters,
19        },
20        engine::{StarkFriEngine, VerificationDataWithFriParams},
21    };
22
23    use super::*;
24    use crate::{hints::Hintable, stark::VerifierProgram, types::new_from_inner_multi_vk};
25
26    pub fn build_verification_program(
27        vparams: VerificationDataWithFriParams<InnerSC>,
28        compiler_options: CompilerOptions,
29    ) -> (Program<BabyBear>, Vec<Vec<InnerVal>>) {
30        let VerificationDataWithFriParams { data, fri_params } = vparams;
31        let VerificationData { proof, vk } = data;
32
33        let advice = new_from_inner_multi_vk(&vk);
34        cfg_if::cfg_if! {
35            if #[cfg(feature = "metrics")] {
36                let start = std::time::Instant::now();
37            }
38        }
39        let program = VerifierProgram::build_with_options(advice, &fri_params, compiler_options);
40        #[cfg(feature = "metrics")]
41        metrics::gauge!("verify_program_compile_ms").set(start.elapsed().as_millis() as f64);
42
43        let mut input_stream = Vec::new();
44        input_stream.extend(proof.write());
45
46        (program, input_stream)
47    }
48
49    /// Steps of recursive tests:
50    /// 1. Generate a stark proof, P.
51    /// 2. build a verifier program which can verify P.
52    /// 3. Execute the verifier program and generate a proof.
53    ///
54    /// This is a convenience function with default configs for testing purposes only.
55    pub fn run_recursive_test(
56        test_proof_input: ProofInputForTest<BabyBearPoseidon2Config>,
57        fri_params: FriParameters,
58    ) {
59        let vparams = test_proof_input
60            .run_test(&BabyBearPoseidon2Engine::new(
61                FriParameters::new_for_testing(1),
62            ))
63            .unwrap();
64
65        let compiler_options = CompilerOptions::default();
66        let (program, witness_stream) = build_verification_program(vparams, compiler_options);
67        air_test_impl::<BabyBearPoseidon2Engine, _>(
68            fri_params,
69            NativeCpuBuilder,
70            test_native_config(),
71            program,
72            witness_stream,
73            1,
74            true,
75        )
76        .unwrap();
77    }
78}