2022-03-24 06:41:55 -07:00
|
|
|
#[macro_use]
|
|
|
|
extern crate criterion;
|
|
|
|
|
|
|
|
use halo2_proofs::arithmetic::FieldExt;
|
|
|
|
use halo2_proofs::circuit::{Layouter, SimpleFloorPlanner};
|
|
|
|
use halo2_proofs::dev::MockProver;
|
|
|
|
use halo2_proofs::plonk::*;
|
|
|
|
use halo2_proofs::poly::Rotation;
|
|
|
|
use pasta_curves::pallas;
|
|
|
|
|
|
|
|
use std::marker::PhantomData;
|
|
|
|
|
|
|
|
use criterion::{BenchmarkId, Criterion};
|
|
|
|
|
|
|
|
fn criterion_benchmark(c: &mut Criterion) {
|
|
|
|
#[derive(Clone, Default)]
|
|
|
|
struct MyCircuit<F: FieldExt> {
|
|
|
|
_marker: PhantomData<F>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
struct MyConfig {
|
|
|
|
selector: Selector,
|
|
|
|
table: TableColumn,
|
|
|
|
advice: Column<Advice>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<F: FieldExt> Circuit<F> for MyCircuit<F> {
|
|
|
|
type Config = MyConfig;
|
|
|
|
type FloorPlanner = SimpleFloorPlanner;
|
|
|
|
|
|
|
|
fn without_witnesses(&self) -> Self {
|
|
|
|
Self::default()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn configure(meta: &mut ConstraintSystem<F>) -> MyConfig {
|
|
|
|
let config = MyConfig {
|
|
|
|
selector: meta.complex_selector(),
|
|
|
|
table: meta.lookup_table_column(),
|
|
|
|
advice: meta.advice_column(),
|
|
|
|
};
|
|
|
|
|
|
|
|
meta.lookup(|meta| {
|
|
|
|
let selector = meta.query_selector(config.selector);
|
|
|
|
let not_selector = Expression::Constant(F::one()) - selector.clone();
|
|
|
|
let advice = meta.query_advice(config.advice, Rotation::cur());
|
|
|
|
vec![(selector * advice + not_selector, config.table)]
|
|
|
|
});
|
|
|
|
|
|
|
|
config
|
|
|
|
}
|
|
|
|
|
|
|
|
fn synthesize(
|
|
|
|
&self,
|
|
|
|
config: MyConfig,
|
|
|
|
mut layouter: impl Layouter<F>,
|
|
|
|
) -> Result<(), Error> {
|
|
|
|
layouter.assign_table(
|
|
|
|
|| "8-bit table",
|
|
|
|
|mut table| {
|
|
|
|
for row in 0u64..(1 << 8) {
|
|
|
|
table.assign_cell(
|
|
|
|
|| format!("row {}", row),
|
|
|
|
config.table,
|
|
|
|
row as usize,
|
|
|
|
|| Ok(F::from(row + 1)),
|
|
|
|
)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
},
|
|
|
|
)?;
|
|
|
|
|
|
|
|
layouter.assign_region(
|
|
|
|
|| "assign values",
|
|
|
|
|mut region| {
|
|
|
|
for offset in 0u64..(1 << 10) {
|
|
|
|
config.selector.enable(&mut region, offset as usize)?;
|
|
|
|
region.assign_advice(
|
|
|
|
|| format!("offset {}", offset),
|
|
|
|
config.advice,
|
|
|
|
offset as usize,
|
|
|
|
|| Ok(F::from((offset % 256) + 1)),
|
|
|
|
)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn prover(k: u32) {
|
|
|
|
let circuit = MyCircuit::<pallas::Base> {
|
|
|
|
_marker: PhantomData,
|
|
|
|
};
|
|
|
|
let prover = MockProver::run(k, &circuit, vec![]).unwrap();
|
|
|
|
assert_eq!(prover.verify(), Ok(()))
|
|
|
|
}
|
|
|
|
|
|
|
|
let k_range = 14..=18;
|
|
|
|
|
|
|
|
let mut prover_group = c.benchmark_group("dev-lookup");
|
|
|
|
prover_group.sample_size(10);
|
2022-04-18 03:25:58 -07:00
|
|
|
for k in k_range {
|
2022-03-24 06:41:55 -07:00
|
|
|
prover_group.bench_with_input(BenchmarkId::from_parameter(k), &k, |b, &k| {
|
|
|
|
b.iter(|| prover(k));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
prover_group.finish();
|
|
|
|
}
|
|
|
|
|
|
|
|
criterion_group!(benches, criterion_benchmark);
|
|
|
|
criterion_main!(benches);
|