vector-commit 0.1.0

A collection of traits to use with vector commitment schemes, and a few implementations of VC
Documentation
use rand::Rng;
use vector_commit::{kzg_amortized::*, VectorCommitment};

use ark_bn254::Bn254;
use ark_ec::pairing::Pairing;
use ark_ff::UniformRand;
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};

type F = <Bn254 as Pairing>::ScalarField;
type G1 = <Bn254 as Pairing>::G1;
type G2 = <Bn254 as Pairing>::G2;
type KZG = KZGAmortized<Bn254>;

const DATA_SIZE: usize = 20;
const MAX_CRS: usize = 32;

fn gen_data(num: usize) -> Vec<F> {
    let mut data: Vec<F> = vec![];
    let mut rng = rand::thread_rng();
    for _i in 0..num {
        data.push(F::rand(&mut rng));
    }
    data
}

fn setup(n: usize, max_degree: usize) -> (KZGPreparedData<F>, KZGKey<F, G1, G2>) {
    let data = gen_data(n);
    let crs = KZG::setup(max_degree, &mut rand::thread_rng()).unwrap();
    let prep = KZGPreparedData::from_points_and_domain(data, crs.domain());

    (prep, crs)
}

fn bench_setup(c: &mut Criterion) {
    let base = 32;
    let rng = &mut rand::thread_rng();

    let mut group = c.benchmark_group("CRS setup");
    group.sample_size(10);
    for size in [base, base * 64, base * 128, base * 512].iter() {
        group.throughput(criterion::Throughput::Elements(*size as u64));
        group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, &size| {
            b.iter(|| KZG::setup(size, rng));
        });
    }

    group.finish();
}

fn bench_data_commitment(c: &mut Criterion) {
    let (data, crs) = setup(DATA_SIZE, MAX_CRS);

    c.bench_function("commitment", |b| b.iter(|| KZG::commit(&crs, &data)));
}

fn bench_single_proof(c: &mut Criterion) {
    let (data, crs) = setup(DATA_SIZE, MAX_CRS);
    let commit = KZG::commit(&crs, &data).unwrap();
    let mut rng = rand::thread_rng();
    c.bench_function("single proof", |b| {
        b.iter(|| KZG::prove(&crs, &commit, rng.gen_range(0..DATA_SIZE), &data))
    });
}

fn bench_multi_proof(c: &mut Criterion) {
    let (data, crs) = setup(DATA_SIZE, MAX_CRS);
    let commit = KZG::commit(&crs, &data).unwrap();
    c.bench_function("multi proof", |b| {
        b.iter(|| KZG::prove_all(&crs, &commit, &data))
    });
}

criterion_group!(
    proofs,
    bench_single_proof,
    bench_multi_proof,
    bench_data_commitment,
    bench_setup
);
criterion_main!(proofs);