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(¶ms);
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(¶ms);
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}