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