arnaucube
arnaucube/hyperplonkPublic Self-hosted repository
hyperplonk/subroutines/benches/pcs_bench.rs
subroutines/benches/pcs_bench.rsRaw
 1use ark_bls12_381::{Bls12_381, Fr};
 2use ark_ff::UniformRand;
 3use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
 4use ark_std::{sync::Arc, test_rng};
 5use std::time::Instant;
 6use subroutines::pcs::{
 7    prelude::{MultilinearKzgPCS, PCSError, PolynomialCommitmentScheme},
 8    StructuredReferenceString,
 9};
10
11fn main() -> Result<(), PCSError> {
12    bench_pcs()
13}
14
15fn bench_pcs() -> Result<(), PCSError> {
16    let mut rng = test_rng();
17
18    // normal polynomials
19    let uni_params = MultilinearKzgPCS::<Bls12_381>::gen_srs_for_testing(&mut rng, 24)?;
20
21    for nv in 4..25 {
22        let repetition = if nv < 10 {
23            10
24        } else if nv < 20 {
25            5
26        } else {
27            2
28        };
29
30        let poly = Arc::new(DenseMultilinearExtension::rand(nv, &mut rng));
31        let (ck, vk) = uni_params.trim(nv)?;
32
33        let point: Vec<_> = (0..nv).map(|_| Fr::rand(&mut rng)).collect();
34
35        // commit
36        let com = {
37            let start = Instant::now();
38            for _ in 0..repetition {
39                let _commit = MultilinearKzgPCS::commit(&ck, &poly)?;
40            }
41
42            println!(
43                "KZG commit for {} variables: {} ns",
44                nv,
45                start.elapsed().as_nanos() / repetition as u128
46            );
47
48            MultilinearKzgPCS::commit(&ck, &poly)?
49        };
50
51        // open
52        let (proof, value) = {
53            let start = Instant::now();
54            for _ in 0..repetition {
55                let _open = MultilinearKzgPCS::open(&ck, &poly, &point)?;
56            }
57
58            println!(
59                "KZG open for {} variables: {} ns",
60                nv,
61                start.elapsed().as_nanos() / repetition as u128
62            );
63            MultilinearKzgPCS::open(&ck, &poly, &point)?
64        };
65
66        // verify
67        {
68            let start = Instant::now();
69            for _ in 0..repetition {
70                assert!(MultilinearKzgPCS::verify(
71                    &vk, &com, &point, &value, &proof
72                )?);
73            }
74            println!(
75                "KZG verify for {} variables: {} ns",
76                nv,
77                start.elapsed().as_nanos() / repetition as u128
78            );
79        }
80
81        println!("====================================");
82    }
83
84    Ok(())
85}