arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/benches/pst.rs
benches/pst.rsRaw
 1use std::time::Instant;
 2
 3use ark_poly_commit::multilinear_pc::MultilinearPC;
 4use ark_serialize::CanonicalSerialize;
 5use libtestudo::{
 6  parameters::PoseidonConfiguration, poseidon_transcript::PoseidonTranscript, sqrt_pst::Polynomial,
 7};
 8use serde::Serialize;
 9type F = ark_bls12_377::Fr;
10type E = ark_bls12_377::Bls12_377;
11use ark_std::UniformRand;
12
13#[derive(Default, Clone, Serialize)]
14struct BenchmarkResults {
15  power: usize,
16  commit_time: u128,
17  opening_time: u128,
18  verification_time: u128,
19  proof_size: usize,
20  commiter_key_size: usize,
21}
22fn main() {
23  let params = ark_bls12_377::Fr::poseidon_params();
24
25  let mut writer = csv::Writer::from_path("sqrt_pst.csv").expect("unable to open csv writer");
26  for &s in [4, 5, 20, 27].iter() {
27    println!("Running for {} inputs", s);
28    let mut rng = ark_std::test_rng();
29    let mut br = BenchmarkResults::default();
30    br.power = s;
31    let num_vars = s;
32    let len = 2_usize.pow(num_vars as u32);
33    let z: Vec<F> = (0..len).into_iter().map(|_| F::rand(&mut rng)).collect();
34    let r: Vec<F> = (0..num_vars)
35      .into_iter()
36      .map(|_| F::rand(&mut rng))
37      .collect();
38
39    let setup_vars = (num_vars as f32 / 2.0).ceil() as usize;
40    let gens = MultilinearPC::<E>::setup((num_vars as f32 / 2.0).ceil() as usize, &mut rng);
41    let (ck, vk) = MultilinearPC::<E>::trim(&gens, setup_vars);
42
43    let mut cks = Vec::<u8>::new();
44    ck.serialize_with_mode(&mut cks, ark_serialize::Compress::Yes)
45      .unwrap();
46    br.commiter_key_size = cks.len();
47
48    let mut pl = Polynomial::from_evaluations(&z.clone());
49
50    let v = pl.eval(&r);
51
52    let start = Instant::now();
53    let (comm_list, t) = pl.commit(&ck);
54    let duration = start.elapsed().as_millis();
55    br.commit_time = duration;
56
57    let mut prover_transcript = PoseidonTranscript::new(&params);
58
59    let start = Instant::now();
60    let (u, pst_proof, mipp_proof) = pl.open(&mut prover_transcript, comm_list, &ck, &r, &t);
61    let duration = start.elapsed().as_millis();
62    br.opening_time = duration;
63
64    let mut p1 = Vec::<u8>::new();
65    let mut p2 = Vec::<u8>::new();
66    pst_proof
67      .serialize_with_mode(&mut p1, ark_serialize::Compress::Yes)
68      .unwrap();
69
70    mipp_proof
71      .serialize_with_mode(&mut p2, ark_serialize::Compress::Yes)
72      .unwrap();
73
74    br.proof_size = p1.len() + p2.len();
75
76    let mut verifier_transcript = PoseidonTranscript::new(&params);
77
78    let start = Instant::now();
79    let res = Polynomial::verify(
80      &mut verifier_transcript,
81      &vk,
82      &u,
83      &r,
84      v,
85      &pst_proof,
86      &mipp_proof,
87      &t,
88    );
89    let duration = start.elapsed().as_millis();
90    br.verification_time = duration;
91    assert!(res == true);
92
93    writer
94      .serialize(br)
95      .expect("unable to write results to csv");
96    writer.flush().expect("wasn't able to flush");
97  }
98}