arnaucube
arnaucube/hyperplonkPublic Self-hosted repository
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, 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 ws = vec![Rc::new(DenseMultilinearExtension::rand(nv, &mut rng))];
148
149        // identity map
150        let perms = identity_permutation_mles(nv, 1);
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                &ws,
161                &ws,
162                &perms,
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 fs = vec![Rc::new(f)];
222        let gs = vec![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, _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}