openvm_stark_sdk/dummy_airs/interaction/
mod.rs

1use std::sync::Arc;
2
3use itertools::{izip, Itertools};
4use openvm_stark_backend::{
5    keygen::MultiStarkKeygenBuilder,
6    p3_matrix::dense::RowMajorMatrix,
7    prover::{
8        cpu::{CpuBackend, CpuDevice},
9        hal::DeviceDataTransporter,
10        types::{AirProvingContext, ProvingContext},
11        MultiTraceStarkProver, Prover,
12    },
13    verifier::{MultiTraceStarkVerifier, VerificationError},
14    AirRef,
15};
16use p3_baby_bear::BabyBear;
17
18use crate::config::{self, baby_bear_poseidon2::BabyBearPoseidon2Config};
19
20pub mod dummy_interaction_air;
21
22type Val = BabyBear;
23
24pub fn verify_interactions(
25    traces: Vec<RowMajorMatrix<Val>>,
26    airs: Vec<AirRef<BabyBearPoseidon2Config>>,
27    pis: Vec<Vec<Val>>,
28) -> Result<(), VerificationError> {
29    let perm = config::baby_bear_poseidon2::random_perm();
30    let config = config::baby_bear_poseidon2::default_config(&perm);
31
32    let mut keygen_builder = MultiStarkKeygenBuilder::new(&config);
33    let air_ids = airs
34        .into_iter()
35        .map(|air| keygen_builder.add_air(air))
36        .collect_vec();
37    let pk = keygen_builder.generate_pk();
38    let vk = pk.get_vk();
39
40    let backend = CpuBackend::default();
41    let pk = backend.transport_pk_to_device(&pk, air_ids.clone());
42    let per_air: Vec<_> = izip!(air_ids, traces, pis)
43        .map(|(air_id, trace, pvs)| {
44            (
45                air_id,
46                AirProvingContext {
47                    cached_mains: vec![],
48                    common_main: Some(Arc::new(trace)),
49                    public_values: pvs,
50                },
51            )
52        })
53        .collect();
54
55    let challenger = config::baby_bear_poseidon2::Challenger::new(perm.clone());
56    let mut prover = MultiTraceStarkProver::new(backend, CpuDevice::new(&config), challenger);
57    let proof = prover.prove(&pk, ProvingContext::new(per_air));
58
59    // Verify the proof:
60    // Start from clean challenger
61    let mut challenger = config::baby_bear_poseidon2::Challenger::new(perm.clone());
62    let verifier = MultiTraceStarkVerifier::new(prover.device.config());
63    verifier.verify(&mut challenger, &vk, &proof.into())
64}