arnaucube
arnaucube/hyperplonkPublic Self-hosted repository
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}