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 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#[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}