* add benchmark * chore: add complex circuit * feat: enable parallel / asm * bench: use pre-calculated matrices/constraints * chore: bump ethers-rs * chore: fmt * feat: add benches for differently sized circuits (#6) * feat: update bench circuit * feat: add benches for many sizes * fix: adjust bench parameters * fix: remove sym * chore: fmt * fix: point to correct commit of groth16 * fix: update function names to upstream * fix: update function names to upstream Co-authored-by: Kobi Gurkan <kobigurk@gmail.com>pull/3/head
@ -1,2 +1 @@ |
|||||
/target |
/target |
||||
Cargo.lock |
|
@ -0,0 +1,105 @@ |
|||||
|
use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
||||
|
|
||||
|
use ark_circom::{read_zkey, CircomReduction, WitnessCalculator};
|
||||
|
use ark_std::rand::thread_rng;
|
||||
|
|
||||
|
use ark_bn254::Bn254;
|
||||
|
use ark_groth16::{create_proof_with_reduction_and_matrices, prepare_verifying_key, verify_proof};
|
||||
|
|
||||
|
use std::{collections::HashMap, fs::File};
|
||||
|
|
||||
|
fn bench_groth(c: &mut Criterion, num_validators: u32, num_constraints: u32) {
|
||||
|
let i = num_validators;
|
||||
|
let j = num_constraints;
|
||||
|
let path = format!(
|
||||
|
"./test-vectors/complex-circuit/complex-circuit-{}-{}.zkey",
|
||||
|
i, j
|
||||
|
);
|
||||
|
let mut file = File::open(&path).unwrap();
|
||||
|
let (params, matrices) = read_zkey(&mut file).unwrap();
|
||||
|
let num_inputs = matrices.num_instance_variables;
|
||||
|
let num_constraints = matrices.num_constraints;
|
||||
|
|
||||
|
let inputs = {
|
||||
|
let mut inputs: HashMap<String, Vec<num_bigint::BigInt>> = HashMap::new();
|
||||
|
let values = inputs.entry("a".to_string()).or_insert_with(Vec::new);
|
||||
|
values.push(3.into());
|
||||
|
|
||||
|
inputs
|
||||
|
};
|
||||
|
|
||||
|
let mut wtns = WitnessCalculator::new(&format!(
|
||||
|
"./test-vectors/complex-circuit/complex-circuit-{}-{}.wasm",
|
||||
|
i, j
|
||||
|
))
|
||||
|
.unwrap();
|
||||
|
let full_assignment = wtns
|
||||
|
.calculate_witness_element::<Bn254, _>(inputs, false)
|
||||
|
.unwrap();
|
||||
|
|
||||
|
let mut rng = thread_rng();
|
||||
|
use ark_std::UniformRand;
|
||||
|
let rng = &mut rng;
|
||||
|
|
||||
|
let r = ark_bn254::Fr::rand(rng);
|
||||
|
let s = ark_bn254::Fr::rand(rng);
|
||||
|
|
||||
|
let proof = create_proof_with_reduction_and_matrices::<_, CircomReduction>(
|
||||
|
¶ms,
|
||||
|
r,
|
||||
|
s,
|
||||
|
&matrices,
|
||||
|
num_inputs,
|
||||
|
num_constraints,
|
||||
|
full_assignment.as_slice(),
|
||||
|
)
|
||||
|
.unwrap();
|
||||
|
|
||||
|
let pvk = prepare_verifying_key(¶ms.vk);
|
||||
|
let inputs = &full_assignment[1..num_inputs];
|
||||
|
let verified = verify_proof(&pvk, &proof, inputs).unwrap();
|
||||
|
|
||||
|
assert!(verified);
|
||||
|
|
||||
|
c.bench_function(&format!("groth proof {} {}", i, j), |b| {
|
||||
|
b.iter(|| {
|
||||
|
black_box(
|
||||
|
create_proof_with_reduction_and_matrices::<_, CircomReduction>(
|
||||
|
¶ms,
|
||||
|
r,
|
||||
|
s,
|
||||
|
&matrices,
|
||||
|
num_inputs,
|
||||
|
num_constraints,
|
||||
|
full_assignment.as_slice(),
|
||||
|
)
|
||||
|
.unwrap(),
|
||||
|
);
|
||||
|
})
|
||||
|
});
|
||||
|
}
|
||||
|
|
||||
|
cfg_if::cfg_if! {
|
||||
|
if #[cfg(feature = "bench-complex-all")] {
|
||||
|
const MIN_NUM_VARIABLES_POWER: u32 = 3;
|
||||
|
const MAX_NUM_VARIABLES_POWER: u32 = 5;
|
||||
|
const MAX_NUM_CONSTRAINTS_POWER: u32 = 5;
|
||||
|
fn groth_all(c: &mut Criterion) {
|
||||
|
for i in MIN_NUM_VARIABLES_POWER..=MAX_NUM_VARIABLES_POWER {
|
||||
|
for j in i..=MAX_NUM_CONSTRAINTS_POWER {
|
||||
|
let i = 10_u32.pow(i);
|
||||
|
let j = 10_u32.pow(j);
|
||||
|
bench_groth(c, i, j);
|
||||
|
}
|
||||
|
}
|
||||
|
}
|
||||
|
criterion_group!(benches, groth_all);
|
||||
|
} else {
|
||||
|
fn groth(c: &mut Criterion) {
|
||||
|
bench_groth(c, 10000, 10000);
|
||||
|
}
|
||||
|
criterion_group!(benches, groth);
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
criterion_main!(benches);
|
@ -0,0 +1,8 @@ |
|||||
|
*.swp |
||||
|
complex-circuit-*-*.* |
||||
|
powersOfTau* |
||||
|
!complex-circuit-10000-10000.* |
||||
|
proof.json |
||||
|
public.json |
||||
|
verification_key.json |
||||
|
witness.wtns |
@ -0,0 +1,20 @@ |
|||||
|
MIN_NUM_VARIABLES=$1 |
||||
|
MAX_NUM_VARIABLES=$2 |
||||
|
MAX_NUM_CONSTRAINTS=$3 |
||||
|
|
||||
|
for i in `seq 10 19`; do wget https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_$i.ptau; done |
||||
|
|
||||
|
./prepare.sh $MIN_NUM_VARIABLES $MAX_NUM_VARIABLES $MAX_NUM_CONSTRAINTS |
||||
|
|
||||
|
for i in `seq $MIN_NUM_VARIABLES $MAX_NUM_VARIABLES` |
||||
|
do |
||||
|
for j in `seq $i $MAX_NUM_CONSTRAINTS` |
||||
|
do |
||||
|
NUM_VARIABLES=$(echo 10^$i | bc) |
||||
|
NUM_CONSTRAINTS=$(echo 10^$j | bc) |
||||
|
echo "**** START benchmarking $NUM_VARIABLES $NUM_CONSTRAINTS ****" |
||||
|
./prove.sh $NUM_VARIABLES $NUM_CONSTRAINTS |
||||
|
perf stat -r5 rapidsnark complex-circuit-$NUM_VARIABLES-$NUM_CONSTRAINTS.zkey witness.wtns proof.json public.json |
||||
|
echo "**** END benchmarking $NUM_VARIABLES $NUM_CONSTRAINTS ****" |
||||
|
done |
||||
|
done |
@ -0,0 +1,11 @@ |
|||||
|
NUM_VARIABLES=$1 |
||||
|
NUM_CONSTRAINTS=$2 |
||||
|
PTAU_POWER=$(echo "l($NUM_CONSTRAINTS)/l(2)" | bc -l | xargs -I{} awk "BEGIN{printf(\"%.f\n\", {}+0.5)}") |
||||
|
|
||||
|
export NODE_OPTIONS=--max-old-space-size=8192 |
||||
|
|
||||
|
echo "compiling" |
||||
|
circom -f complex-circuit-$NUM_VARIABLES-$NUM_CONSTRAINTS.circom --r1cs --wasm |
||||
|
|
||||
|
echo "zkey" |
||||
|
snarkjs zkey new complex-circuit-$NUM_VARIABLES-$NUM_CONSTRAINTS.r1cs powersOfTau28_hez_final_$PTAU_POWER.ptau complex-circuit-$NUM_VARIABLES-$NUM_CONSTRAINTS.zkey |
@ -0,0 +1,21 @@ |
|||||
|
template ManyConstraints(NUM_VARIABLES, NUM_CONSTRAINTS) { |
||||
|
signal private input a; |
||||
|
signal output c; |
||||
|
|
||||
|
assert(NUM_VARIABLES <= NUM_CONSTRAINTS) |
||||
|
|
||||
|
signal b[NUM_VARIABLES]; |
||||
|
|
||||
|
b[0] <== a*a; |
||||
|
var i; |
||||
|
for (i = 1; i < NUM_VARIABLES; i++) { |
||||
|
b[i] <== b[i-1]*b[i-1]; |
||||
|
} |
||||
|
i = i-1; |
||||
|
for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { |
||||
|
b[i] === b[i-1]*b[i-1]; |
||||
|
} |
||||
|
c <== b[i]; |
||||
|
} |
||||
|
|
||||
|
component main = ManyConstraints(10000, 10000); |
@ -0,0 +1,21 @@ |
|||||
|
template ManyConstraints(NUM_VARIABLES, NUM_CONSTRAINTS) { |
||||
|
signal private input a; |
||||
|
signal output c; |
||||
|
|
||||
|
assert(NUM_VARIABLES <= NUM_CONSTRAINTS) |
||||
|
|
||||
|
signal b[NUM_VARIABLES]; |
||||
|
|
||||
|
b[0] <== a*a; |
||||
|
var i; |
||||
|
for (i = 1; i < NUM_VARIABLES; i++) { |
||||
|
b[i] <== b[i-1]*b[i-1]; |
||||
|
} |
||||
|
i = i-1; |
||||
|
for (var j = NUM_VARIABLES; j < NUM_CONSTRAINTS; j++) { |
||||
|
b[i] === b[i-1]*b[i-1]; |
||||
|
} |
||||
|
c <== b[i]; |
||||
|
} |
||||
|
|
||||
|
component main = ManyConstraints(NUM_VARIABLES_TEMPLATE, NUM_CONSTRAINTS_TEMPLATE); |
@ -0,0 +1 @@ |
|||||
|
{ "a": "3" } |
@ -0,0 +1,10 @@ |
|||||
|
for i in `seq 3 5` |
||||
|
do |
||||
|
for j in `seq $i 5` |
||||
|
do |
||||
|
NUM_VARIABLES=$(echo 10^$i | bc) |
||||
|
NUM_CONSTRAINTS=$(echo 10^$j | bc) |
||||
|
sed "s/NUM_VARIABLES_TEMPLATE/$NUM_VARIABLES/g;s/NUM_CONSTRAINTS_TEMPLATE/$NUM_CONSTRAINTS/g" complex-circuit.circom.template > complex-circuit-$NUM_VARIABLES-$NUM_CONSTRAINTS.circom |
||||
|
./build.sh $NUM_VARIABLES $NUM_CONSTRAINTS |
||||
|
done |
||||
|
done |
@ -0,0 +1,8 @@ |
|||||
|
NUM_VARIABLES=$1 |
||||
|
NUM_CONSTRAINTS=$2 |
||||
|
|
||||
|
snarkjs wtns calculate complex-circuit-$NUM_VARIABLES-$NUM_CONSTRAINTS.wasm input.json witness.wtns |
||||
|
snarkjs groth16 prove complex-circuit-$NUM_VARIABLES-$NUM_CONSTRAINTS.zkey witness.wtns proof.json public.json |
||||
|
snarkjs zkey export verificationkey complex-circuit-$NUM_VARIABLES-$NUM_CONSTRAINTS.zkey |
||||
|
snarkjs groth16 verify verification_key.json proof.json public.json |
||||
|
|
@ -0,0 +1,14 @@ |
|||||
|
echo "compiling" |
||||
|
circom -f complex-circuit.circom --r1cs --wasm |
||||
|
|
||||
|
echo "wtns" |
||||
|
snarkjs wtns calculate complex-circuit.wasm input.json witness.wtns |
||||
|
|
||||
|
echo "zkey" |
||||
|
snarkjs zkey new complex-circuit.r1cs powersOfTau28_hez_final_17.ptau complex.zkey |
||||
|
|
||||
|
echo "proving 1" |
||||
|
time snarkjs groth16 prove complex.zkey witness.wtns proof.json public.json |
||||
|
|
||||
|
echo "proving 2" |
||||
|
time docker run rapidsnark complex.zkey witness.wtns proof.json public.json |
@ -1,3 +1,3 @@ |
|||||
[ |
[ |
||||
"33" |
|
||||
|
"20227169454906525228014700210166866282343639252280745415680311389428188660505" |
||||
] |
] |