openvm_native_recursion/halo2/
testing_utils.rs

1use openvm_native_compiler::prelude::Witness;
2use openvm_stark_sdk::{
3    config::{
4        baby_bear_poseidon2_root::{BabyBearPoseidon2RootConfig, BabyBearPoseidon2RootEngine},
5        FriParameters,
6    },
7    engine::StarkFriEngine,
8    utils::ProofInputForTest,
9};
10use snark_verifier_sdk::Snark;
11
12use crate::{
13    config::outer::new_from_outer_multi_vk,
14    halo2::{
15        utils::{CacheHalo2ParamsReader, Halo2ParamsReader},
16        verifier::{generate_halo2_verifier_proving_key, Halo2VerifierProvingKey},
17    },
18    witness::Witnessable,
19};
20
21pub fn run_static_verifier_test(
22    mut test_proof_input: ProofInputForTest<BabyBearPoseidon2RootConfig>,
23    fri_params: FriParameters,
24) -> (Halo2VerifierProvingKey, Snark) {
25    let k = 21;
26    let halo2_params_reader = CacheHalo2ParamsReader::new_with_default_params_dir();
27    let params = &halo2_params_reader.read_params(k);
28    test_proof_input.sort_chips();
29    let info_span =
30        tracing::info_span!("prove outer stark to verify", step = "outer_stark_prove").entered();
31    let engine = BabyBearPoseidon2RootEngine::new(fri_params);
32    let vparams = test_proof_input.run_test(&engine).unwrap();
33
34    info_span.exit();
35
36    // Build verification program in eDSL.
37    let advice = new_from_outer_multi_vk(&vparams.data.vk);
38
39    let info_span = tracing::info_span!(
40        "keygen halo2 verifier circuit",
41        step = "static_verifier_keygen"
42    )
43    .entered();
44    let stark_verifier_circuit = generate_halo2_verifier_proving_key(
45        params,
46        advice,
47        &vparams.fri_params,
48        &vparams.data.proof,
49    );
50    info_span.exit();
51
52    let info_span = tracing::info_span!(
53        "prove halo2 verifier circuit",
54        step = "static_verifier_prove"
55    )
56    .entered();
57    let mut witness = Witness::default();
58    vparams.data.proof.write(&mut witness);
59    let static_verifier_snark = stark_verifier_circuit.prove(params, witness, false);
60    info_span.exit();
61    (stark_verifier_circuit, static_verifier_snark)
62}