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