hyperplonk/poly-iop/benches/bench.rs
poly-iop/benches/bench.rsRaw
1use arithmetic::{VPAuxInfo, VirtualPolynomial};
2use ark_bls12_381::{Bls12_381, Fr};
3use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
4use ark_std::test_rng;
5use jf_primitives::pcs::{prelude::MultilinearKzgPCS, PolynomialCommitmentScheme};
6use poly_iop::prelude::{
7 identity_permutation_mle, PermutationCheck, PolyIOP, PolyIOPErrors, ProductCheck, SumCheck,
8 ZeroCheck,
9};
10use std::{marker::PhantomData, rc::Rc, time::Instant};
11
12type Kzg = MultilinearKzgPCS<Bls12_381>;
13
14fn main() -> Result<(), PolyIOPErrors> {
15 bench_permutation_check()?;
16 println!("\n\n");
17 bench_sum_check()?;
18 println!("\n\n");
19 bench_prod_check()?;
20 println!("\n\n");
21 bench_zero_check()
22}
23
24fn bench_sum_check() -> Result<(), PolyIOPErrors> {
25 let mut rng = test_rng();
26 for degree in 2..4 {
27 for nv in 4..25 {
28 let repetition = if nv < 10 {
29 100
30 } else if nv < 20 {
31 50
32 } else {
33 10
34 };
35
36 let (poly, asserted_sum) =
37 VirtualPolynomial::rand(nv, (degree, degree + 1), 2, &mut rng)?;
38 let poly_info = poly.aux_info.clone();
39 let proof = {
40 let start = Instant::now();
41 for _ in 0..repetition {
42 let mut transcript = <PolyIOP<Fr> as SumCheck<Fr>>::init_transcript();
43 let _proof = <PolyIOP<Fr> as SumCheck<Fr>>::prove(&poly, &mut transcript)?;
44 }
45
46 println!(
47 "sum check proving time for {} variables and {} degree: {} ns",
48 nv,
49 degree,
50 start.elapsed().as_nanos() / repetition as u128
51 );
52 let mut transcript = <PolyIOP<Fr> as SumCheck<Fr>>::init_transcript();
53 <PolyIOP<Fr> as SumCheck<Fr>>::prove(&poly, &mut transcript)?
54 };
55
56 {
57 let start = Instant::now();
58
59 for _ in 0..repetition {
60 let mut transcript = <PolyIOP<Fr> as SumCheck<Fr>>::init_transcript();
61 let subclaim = <PolyIOP<Fr> as SumCheck<Fr>>::verify(
62 asserted_sum,
63 &proof,
64 &poly_info,
65 &mut transcript,
66 )?;
67 assert!(
68 poly.evaluate(&subclaim.point).unwrap() == subclaim.expected_evaluation,
69 "wrong subclaim"
70 );
71 }
72 println!(
73 "sum check verification time for {} variables and {} degree: {} ns",
74 nv,
75 degree,
76 start.elapsed().as_nanos() / repetition as u128
77 );
78 }
79
80 println!("====================================");
81 }
82 }
83 Ok(())
84}
85
86fn bench_zero_check() -> Result<(), PolyIOPErrors> {
87 let mut rng = test_rng();
88 for degree in 2..4 {
89 for nv in 4..20 {
90 let repetition = if nv < 10 {
91 100
92 } else if nv < 20 {
93 50
94 } else {
95 10
96 };
97
98 let poly = VirtualPolynomial::rand_zero(nv, (degree, degree + 1), 2, &mut rng)?;
99 let poly_info = poly.aux_info.clone();
100 let proof = {
101 let start = Instant::now();
102 let mut transcript = <PolyIOP<Fr> as ZeroCheck<Fr>>::init_transcript();
103 transcript.append_message(b"testing", b"initializing transcript for testing")?;
104 let proof = <PolyIOP<Fr> as ZeroCheck<Fr>>::prove(&poly, &mut transcript)?;
105
106 println!(
107 "zero check proving time for {} variables and {} degree: {} ns",
108 nv,
109 degree,
110 start.elapsed().as_nanos() / repetition as u128
111 );
112 proof
113 };
114
115 {
116 let start = Instant::now();
117 let mut transcript = <PolyIOP<Fr> as ZeroCheck<Fr>>::init_transcript();
118 transcript.append_message(b"testing", b"initializing transcript for testing")?;
119 let zero_subclaim =
120 <PolyIOP<Fr> as ZeroCheck<Fr>>::verify(&proof, &poly_info, &mut transcript)?;
121 assert!(
122 poly.evaluate(&zero_subclaim.point)? == zero_subclaim.expected_evaluation,
123 "wrong subclaim"
124 );
125 println!(
126 "zero check verification time for {} variables and {} degree: {} ns",
127 nv,
128 degree,
129 start.elapsed().as_nanos() / repetition as u128
130 );
131 }
132
133 println!("====================================");
134 }
135 }
136 Ok(())
137}
138
139fn bench_permutation_check() -> Result<(), PolyIOPErrors> {
140 let mut rng = test_rng();
141
142 for nv in 4..20 {
143 let srs = Kzg::gen_srs_for_testing(&mut rng, nv + 1)?;
144 let (pcs_param, _) = Kzg::trim(&srs, nv + 1, Some(nv + 1))?;
145
146 let repetition = if nv < 10 {
147 100
148 } else if nv < 20 {
149 50
150 } else {
151 10
152 };
153
154 let w = Rc::new(DenseMultilinearExtension::rand(nv, &mut rng));
155
156 // s_perm is the identity map
157 let s_perm = identity_permutation_mle(nv);
158
159 let proof = {
160 let start = Instant::now();
161 let mut transcript =
162 <PolyIOP<Fr> as PermutationCheck<Bls12_381, Kzg>>::init_transcript();
163 transcript.append_message(b"testing", b"initializing transcript for testing")?;
164
165 let (proof, _q_x) = <PolyIOP<Fr> as PermutationCheck<Bls12_381, Kzg>>::prove(
166 &pcs_param,
167 &w,
168 &w,
169 &s_perm,
170 &mut transcript,
171 )?;
172
173 println!(
174 "permutation check proving time for {} variables: {} ns",
175 nv,
176 start.elapsed().as_nanos() / repetition as u128
177 );
178 proof
179 };
180
181 {
182 let poly_info = VPAuxInfo {
183 max_degree: 2,
184 num_variables: nv,
185 phantom: PhantomData::default(),
186 };
187
188 let start = Instant::now();
189 let mut transcript =
190 <PolyIOP<Fr> as PermutationCheck<Bls12_381, Kzg>>::init_transcript();
191 transcript.append_message(b"testing", b"initializing transcript for testing")?;
192 let _perm_check_sum_claim = <PolyIOP<Fr> as PermutationCheck<Bls12_381, Kzg>>::verify(
193 &proof,
194 &poly_info,
195 &mut transcript,
196 )?;
197 println!(
198 "permutation check verification time for {} variables: {} ns",
199 nv,
200 start.elapsed().as_nanos() / repetition as u128
201 );
202 }
203
204 println!("====================================");
205 }
206
207 Ok(())
208}
209
210fn bench_prod_check() -> Result<(), PolyIOPErrors> {
211 let mut rng = test_rng();
212
213 for nv in 4..20 {
214 let srs = Kzg::gen_srs_for_testing(&mut rng, nv + 1)?;
215 let (pcs_param, _) = Kzg::trim(&srs, nv + 1, Some(nv + 1))?;
216
217 let repetition = if nv < 10 {
218 100
219 } else if nv < 20 {
220 50
221 } else {
222 10
223 };
224
225 let f: DenseMultilinearExtension<Fr> = DenseMultilinearExtension::rand(nv, &mut rng);
226 let mut g = f.clone();
227 g.evaluations.reverse();
228 let f = Rc::new(f);
229 let g = Rc::new(g);
230
231 let proof = {
232 let start = Instant::now();
233 let mut transcript = <PolyIOP<Fr> as ProductCheck<Bls12_381, Kzg>>::init_transcript();
234 transcript.append_message(b"testing", b"initializing transcript for testing")?;
235
236 let (proof, _prod_x) = <PolyIOP<Fr> as ProductCheck<Bls12_381, Kzg>>::prove(
237 &pcs_param,
238 &f,
239 &g,
240 &mut transcript,
241 )?;
242
243 println!(
244 "product check proving time for {} variables: {} ns",
245 nv,
246 start.elapsed().as_nanos() / repetition as u128
247 );
248 proof
249 };
250
251 {
252 let poly_info = VPAuxInfo {
253 max_degree: 2,
254 num_variables: nv,
255 phantom: PhantomData::default(),
256 };
257
258 let start = Instant::now();
259 let mut transcript = <PolyIOP<Fr> as ProductCheck<Bls12_381, Kzg>>::init_transcript();
260 transcript.append_message(b"testing", b"initializing transcript for testing")?;
261 let _perm_check_sum_claim = <PolyIOP<Fr> as ProductCheck<Bls12_381, Kzg>>::verify(
262 &proof,
263 &poly_info,
264 &mut transcript,
265 )?;
266 println!(
267 "product check verification time for {} variables: {} ns",
268 nv,
269 start.elapsed().as_nanos() / repetition as u128
270 );
271 }
272
273 println!("====================================");
274 }
275
276 Ok(())
277}