testudo/benches/testudo.rs
benches/testudo.rsRaw
1use std::time::Instant;
2
3use ark_crypto_primitives::sponge::poseidon::PoseidonConfig;
4use ark_crypto_primitives::sponge::Absorb;
5use ark_ec::pairing::Pairing;
6use ark_ff::PrimeField;
7use ark_serialize::*;
8use libtestudo::parameters::PoseidonConfiguration;
9use libtestudo::{
10 poseidon_transcript::PoseidonTranscript,
11 testudo_snark::{TestudoSnark, TestudoSnarkGens},
12 Instance,
13};
14use serde::Serialize;
15
16#[derive(Default, Clone, Serialize)]
17struct BenchmarkResults {
18 power: usize,
19 input_constraints: usize,
20 testudo_proving_time: u128,
21 testudo_verification_time: u128,
22 sat_proof_size: usize,
23 eval_proof_size: usize,
24 total_proof_size: usize,
25}
26
27fn main() {
28 bench_with_bls12_377();
29 // bench_with_bls12_381();
30 // bench_with_ark_blst();
31}
32
33fn bench_with_ark_blst() {
34 let params = ark_blst::Scalar::poseidon_params();
35 testudo_snark_bench::<ark_blst::Bls12>(params, "testudo_blst");
36}
37
38fn bench_with_bls12_377() {
39 let params = ark_bls12_377::Fr::poseidon_params();
40 testudo_snark_bench::<ark_bls12_377::Bls12_377>(params, "testudo_bls12_377");
41}
42
43fn bench_with_bls12_381() {
44 let params = ark_bls12_381::Fr::poseidon_params();
45 testudo_snark_bench::<ark_bls12_381::Bls12_381>(params, "testudo_bls12_381");
46}
47
48fn testudo_snark_bench<E>(params: PoseidonConfig<E::ScalarField>, file_name: &str)
49where
50 E: Pairing,
51 E::ScalarField: PrimeField,
52 E::ScalarField: Absorb,
53{
54 let mut writer = csv::Writer::from_path(file_name).expect("unable to open csv writer");
55 for &s in [4, 5, 10, 12, 14, 16, 18, 20, 22, 24, 26].iter() {
56 println!("Running for {} inputs", s);
57 let mut br = BenchmarkResults::default();
58 let num_vars = (2_usize).pow(s as u32);
59 let num_cons = num_vars;
60 br.power = s;
61 br.input_constraints = num_cons;
62 let num_inputs = 10;
63
64 let (inst, vars, inputs) =
65 Instance::<E::ScalarField>::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
66 let mut prover_transcript = PoseidonTranscript::new(¶ms.clone());
67
68 let gens =
69 TestudoSnarkGens::<E>::setup(num_cons, num_vars, num_inputs, num_cons, params.clone());
70
71 let (comm, decomm) = TestudoSnark::<E>::encode(&inst, &gens);
72
73 let start = Instant::now();
74 let proof = TestudoSnark::prove(
75 &inst,
76 &comm,
77 &decomm,
78 vars,
79 &inputs,
80 &gens,
81 &mut prover_transcript,
82 params.clone(),
83 )
84 .unwrap();
85 let duration = start.elapsed().as_millis();
86 br.testudo_proving_time = duration;
87
88 let mut sat_proof = Vec::<u8>::new();
89 proof
90 .r1cs_verifier_proof
91 .serialize_with_mode(&mut sat_proof, Compress::Yes)
92 .unwrap();
93 br.sat_proof_size = sat_proof.len();
94
95 let mut eval_proof = Vec::<u8>::new();
96 proof
97 .r1cs_eval_proof
98 .serialize_with_mode(&mut eval_proof, Compress::Yes)
99 .unwrap();
100 br.eval_proof_size = eval_proof.len();
101
102 let mut total_proof = Vec::<u8>::new();
103 proof
104 .serialize_with_mode(&mut total_proof, Compress::Yes)
105 .unwrap();
106 br.total_proof_size = total_proof.len();
107
108 let mut verifier_transcript = PoseidonTranscript::new(¶ms.clone());
109 let start = Instant::now();
110
111 let res = proof.verify(
112 &gens,
113 &comm,
114 &inputs,
115 &mut verifier_transcript,
116 params.clone(),
117 );
118 assert!(res.is_ok());
119 let duration = start.elapsed().as_millis();
120 br.testudo_verification_time = duration;
121
122 writer
123 .serialize(br)
124 .expect("unable to write results to csv");
125 writer.flush().expect("wasn't able to flush");
126 }
127}