hyperplonk/subroutines/benches/iop_bench.rs
subroutines/benches/iop_bench.rsRaw
1use arithmetic::{identity_permutation_mles, VPAuxInfo, VirtualPolynomial};
2use ark_bls12_381::{Bls12_381, Fr};
3use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
4use ark_std::test_rng;
5use std::{marker::PhantomData, sync::Arc, 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 ws = vec![Arc::new(DenseMultilinearExtension::rand(nv, &mut rng))];
148
149 // identity map
150 let perms = identity_permutation_mles(nv, 1);
151
152 let proof =
153 {
154 let start = Instant::now();
155 let mut transcript =
156 <PolyIOP<Fr> as PermutationCheck<Bls12_381, KZG>>::init_transcript();
157 transcript.append_message(b"testing", b"initializing transcript for testing")?;
158
159 let (proof, _q_x, _frac_poly) = <PolyIOP<Fr> as PermutationCheck<
160 Bls12_381,
161 KZG,
162 >>::prove(
163 &pcs_param, &ws, &ws, &perms, &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 fs = vec![Arc::new(f)];
222 let gs = vec![Arc::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, _frac_poly) =
230 <PolyIOP<Fr> as ProductCheck<Bls12_381, KZG>>::prove(
231 &pcs_param,
232 &fs,
233 &gs,
234 &mut transcript,
235 )?;
236
237 println!(
238 "product check proving time for {} variables: {} ns",
239 nv,
240 start.elapsed().as_nanos() / repetition as u128
241 );
242 proof
243 };
244
245 {
246 let poly_info = VPAuxInfo {
247 max_degree: 2,
248 num_variables: nv,
249 phantom: PhantomData::default(),
250 };
251
252 let start = Instant::now();
253 let mut transcript = <PolyIOP<Fr> as ProductCheck<Bls12_381, KZG>>::init_transcript();
254 transcript.append_message(b"testing", b"initializing transcript for testing")?;
255 let _perm_check_sum_claim = <PolyIOP<Fr> as ProductCheck<Bls12_381, KZG>>::verify(
256 &proof,
257 &poly_info,
258 &mut transcript,
259 )?;
260 println!(
261 "product check verification time for {} variables: {} ns",
262 nv,
263 start.elapsed().as_nanos() / repetition as u128
264 );
265 }
266
267 println!("====================================");
268 }
269
270 Ok(())
271}