2021-02-09 21:25:21 -08:00
|
|
|
use std::thread;
|
|
|
|
|
use std::time::Instant;
|
|
|
|
|
|
2021-03-30 20:10:01 -07:00
|
|
|
use env_logger::Env;
|
2021-02-09 21:25:21 -08:00
|
|
|
use rayon::prelude::*;
|
|
|
|
|
|
|
|
|
|
use field::crandall_field::CrandallField;
|
|
|
|
|
use field::fft;
|
|
|
|
|
|
2021-03-25 15:20:14 -07:00
|
|
|
use crate::circuit_builder::CircuitBuilder;
|
|
|
|
|
use crate::circuit_data::CircuitConfig;
|
2021-03-30 20:10:01 -07:00
|
|
|
use crate::field::field::Field;
|
2021-03-28 15:36:51 -07:00
|
|
|
use crate::gates::constant::ConstantGate;
|
2021-03-30 20:10:01 -07:00
|
|
|
use crate::gates::gmimc::GMiMCGate;
|
2021-04-02 15:29:21 -07:00
|
|
|
use crate::hash::{GMIMC_CONSTANTS, GMIMC_ROUNDS};
|
2021-03-30 13:30:31 -07:00
|
|
|
use crate::polynomial::polynomial::PolynomialCoeffs;
|
2021-03-30 20:10:01 -07:00
|
|
|
use crate::witness::PartialWitness;
|
2021-02-09 21:25:21 -08:00
|
|
|
|
2021-02-26 13:18:41 -08:00
|
|
|
mod circuit_builder;
|
2021-02-09 21:25:21 -08:00
|
|
|
mod circuit_data;
|
|
|
|
|
mod constraint_polynomial;
|
|
|
|
|
mod field;
|
2021-02-17 22:19:18 -08:00
|
|
|
mod fri;
|
2021-03-18 12:44:45 -07:00
|
|
|
mod gadgets;
|
2021-02-09 21:25:21 -08:00
|
|
|
mod gates;
|
|
|
|
|
mod generator;
|
|
|
|
|
mod gmimc;
|
2021-03-30 13:30:31 -07:00
|
|
|
mod hash;
|
2021-03-30 23:12:47 -07:00
|
|
|
mod partition;
|
2021-03-31 21:15:24 -07:00
|
|
|
mod plonk_challenger;
|
2021-03-28 15:36:51 -07:00
|
|
|
mod plonk_common;
|
2021-03-30 13:30:31 -07:00
|
|
|
mod polynomial;
|
2021-02-09 21:25:21 -08:00
|
|
|
mod proof;
|
|
|
|
|
mod prover;
|
2021-02-26 13:18:41 -08:00
|
|
|
mod recursive_verifier;
|
2021-02-09 21:25:21 -08:00
|
|
|
mod rescue;
|
|
|
|
|
mod target;
|
|
|
|
|
mod util;
|
|
|
|
|
mod verifier;
|
|
|
|
|
mod wire;
|
|
|
|
|
mod witness;
|
|
|
|
|
|
2021-03-01 13:40:05 -08:00
|
|
|
// 112 wire polys, 3 Z polys, 4 parts of quotient poly.
|
|
|
|
|
const PROVER_POLYS: usize = 113 + 3 + 4;
|
2021-02-09 21:25:21 -08:00
|
|
|
|
|
|
|
|
fn main() {
|
2021-03-25 15:20:14 -07:00
|
|
|
// Set the default log filter. This can be overridden using the `RUST_LOG` environment variable,
|
|
|
|
|
// e.g. `RUST_LOG=debug`.
|
|
|
|
|
// We default to debug for now, since there aren't many logs anyway, but we should probably
|
|
|
|
|
// change this to info or warn later.
|
|
|
|
|
env_logger::Builder::from_env(Env::default().default_filter_or("debug")).init();
|
|
|
|
|
|
|
|
|
|
bench_prove::<CrandallField>();
|
|
|
|
|
|
2021-04-02 14:00:26 -07:00
|
|
|
// bench_field_mul::<CrandallField>();
|
|
|
|
|
|
2021-02-09 21:25:21 -08:00
|
|
|
// bench_fft();
|
|
|
|
|
println!();
|
2021-03-25 15:20:14 -07:00
|
|
|
// bench_gmimc::<CrandallField>();
|
2021-02-09 21:25:21 -08:00
|
|
|
|
|
|
|
|
// field_search()
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-02 14:00:26 -07:00
|
|
|
fn bench_field_mul<F: Field>() {
|
|
|
|
|
let m = F::from_canonical_u64(12345678901234567890);
|
|
|
|
|
let mut x = F::ONE;
|
|
|
|
|
let start = Instant::now();
|
|
|
|
|
let num_muls = 2000000000;
|
|
|
|
|
for _ in 0..num_muls {
|
|
|
|
|
x *= m;
|
|
|
|
|
}
|
|
|
|
|
let duration = start.elapsed();
|
|
|
|
|
println!("result {:?}", x);
|
|
|
|
|
println!("took {:?}", duration);
|
|
|
|
|
println!("avg {:?}ns", duration.as_secs_f64() * 1e9 / (num_muls as f64));
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-25 15:20:14 -07:00
|
|
|
fn bench_prove<F: Field>() {
|
2021-04-02 15:29:21 -07:00
|
|
|
let gmimc_gate = GMiMCGate::<F, GMIMC_ROUNDS>::with_automatic_constants();
|
2021-03-25 15:20:14 -07:00
|
|
|
|
|
|
|
|
let config = CircuitConfig {
|
|
|
|
|
num_wires: 120,
|
|
|
|
|
num_routed_wires: 12,
|
|
|
|
|
security_bits: 128,
|
|
|
|
|
rate_bits: 3,
|
2021-03-28 15:36:51 -07:00
|
|
|
num_checks: 3,
|
2021-03-25 15:20:14 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let mut builder = CircuitBuilder::<F>::new(config);
|
|
|
|
|
|
|
|
|
|
for _ in 0..5000 {
|
|
|
|
|
builder.add_gate_no_constants(gmimc_gate.clone());
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-28 15:36:51 -07:00
|
|
|
builder.add_gate(ConstantGate::get(), vec![F::NEG_ONE]);
|
|
|
|
|
|
|
|
|
|
// for _ in 0..(40 * 5) {
|
|
|
|
|
// builder.add_gate(
|
|
|
|
|
// FriConsistencyGate::new(2, 3, 13),
|
|
|
|
|
// vec![F::primitive_root_of_unity(13)]);
|
|
|
|
|
// }
|
2021-03-25 15:20:14 -07:00
|
|
|
|
|
|
|
|
let prover = builder.build_prover();
|
|
|
|
|
let inputs = PartialWitness::new();
|
|
|
|
|
prover.prove(inputs);
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-09 21:25:21 -08:00
|
|
|
fn bench_gmimc<F: Field>() {
|
2021-02-28 21:43:10 -08:00
|
|
|
const THREADS: usize = 12;
|
2021-03-01 13:40:05 -08:00
|
|
|
const LDE_BITS: i32 = 3;
|
2021-02-28 23:34:07 -08:00
|
|
|
const W: usize = 13;
|
2021-02-28 21:43:10 -08:00
|
|
|
let hashes_per_poly = 1 << (13 + LDE_BITS);
|
|
|
|
|
let threads = (0..THREADS).map(|_i| {
|
2021-02-24 12:25:13 -08:00
|
|
|
thread::spawn(move || {
|
2021-02-28 23:34:07 -08:00
|
|
|
let mut x = [F::ZERO; W];
|
|
|
|
|
for i in 0..W {
|
2021-02-24 12:25:13 -08:00
|
|
|
x[i] = F::from_canonical_u64((i as u64) * 123456 + 789);
|
|
|
|
|
}
|
2021-02-09 21:25:21 -08:00
|
|
|
|
2021-02-28 21:43:10 -08:00
|
|
|
let hashes_per_thread = hashes_per_poly * PROVER_POLYS / THREADS;
|
2021-02-24 12:25:13 -08:00
|
|
|
let start = Instant::now();
|
|
|
|
|
for _ in 0..hashes_per_thread {
|
2021-02-28 23:34:07 -08:00
|
|
|
x = gmimc::gmimc_permute_array::<_, W, GMIMC_ROUNDS>(x, GMIMC_CONSTANTS);
|
2021-02-24 12:25:13 -08:00
|
|
|
}
|
|
|
|
|
let duration = start.elapsed();
|
|
|
|
|
println!("took {:?}", duration);
|
|
|
|
|
println!("avg {:?}us", duration.as_secs_f64() * 1e6 / (hashes_per_thread as f64));
|
|
|
|
|
println!("result {:?}", x);
|
|
|
|
|
})
|
|
|
|
|
}).collect::<Vec<_>>();
|
2021-02-09 21:25:21 -08:00
|
|
|
|
|
|
|
|
for t in threads {
|
|
|
|
|
t.join().expect("oops");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn bench_fft() {
|
2021-03-25 15:20:14 -07:00
|
|
|
let degree = 1 << 13;
|
|
|
|
|
let lde_bits = 3;
|
2021-02-09 21:25:21 -08:00
|
|
|
let lde_size = degree << lde_bits;
|
|
|
|
|
println!("{} << {} = {}", degree, lde_bits, lde_size);
|
|
|
|
|
|
|
|
|
|
let start = Instant::now();
|
|
|
|
|
(0usize..PROVER_POLYS).into_par_iter().for_each(|i| {
|
|
|
|
|
let mut coeffs = vec![CrandallField::ZERO; lde_size];
|
|
|
|
|
for j in 0usize..lde_size {
|
|
|
|
|
coeffs[j] = CrandallField((i * j) as u64);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let start = Instant::now();
|
2021-03-30 13:30:31 -07:00
|
|
|
let result = fft::fft(PolynomialCoeffs { coeffs });
|
2021-02-09 21:25:21 -08:00
|
|
|
let duration = start.elapsed();
|
|
|
|
|
println!("FFT took {:?}", duration);
|
2021-03-30 13:30:31 -07:00
|
|
|
println!("FFT result: {:?}", result.values[0]);
|
2021-02-09 21:25:21 -08:00
|
|
|
});
|
|
|
|
|
println!("FFT overall took {:?}", start.elapsed());
|
|
|
|
|
}
|