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