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