Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Benchmarks for ZK proofs #173

Merged
merged 32 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
bf9acac
Synthetic benchmark for exponentiation with known totient
dvdplm Jan 8, 2025
a6e4168
Initial benchmark for Fac proof
dvdplm Jan 8, 2025
936fceb
Init tracing for FacProof benches
dvdplm Jan 16, 2025
3d8ebf0
Add test that exercise the ser-/deserialization of FacProof
dvdplm Jan 16, 2025
72355d1
Add benchmark for AffG
dvdplm Jan 17, 2025
e225fb2
mod.rs is not allowed and other clippy fixes
dvdplm Jan 17, 2025
0c78a5c
Allow formatting args in string literals
dvdplm Jan 17, 2025
0d748b7
Benchmark for DecProof construction and verification
dvdplm Jan 17, 2025
0e9b77c
Add Enc proof
dvdplm Jan 17, 2025
c310e31
Add Paillier Mul proof benchmark
dvdplm Jan 17, 2025
b6c79c9
Clippy fixes
dvdplm Jan 17, 2025
6f88bef
moar clippy crap
dvdplm Jan 17, 2025
7cf86ec
Add benches for Prm and Sch proofs
dvdplm Jan 17, 2025
30cc953
Remove workaround for broken/quirky clippy on nightly (https://github…
dvdplm Jan 20, 2025
5eedb88
Prm proofs are broken for now
dvdplm Jan 20, 2025
d45d19c
Appease clippy
dvdplm Jan 20, 2025
05d714b
Don't use a PublicSigned for PrmProof
dvdplm Jan 20, 2025
6ad3132
Merge branch 'master' into dp-zk-proof-benches
dvdplm Jan 21, 2025
58d9fb4
Re-enable Prm benchmark
dvdplm Jan 21, 2025
df1f717
Merge branch 'master' into dp-zk-proof-benches
dvdplm Jan 30, 2025
dcb7441
Remove the pow bench
dvdplm Jan 31, 2025
78a739d
Review feedback
dvdplm Jan 31, 2025
2fce254
Cleanup
dvdplm Jan 31, 2025
e92e83b
Add ser/deser to all prove_and_verify tests
dvdplm Jan 31, 2025
a6044f9
Merge branch 'master' into dp-zk-proof-benches
dvdplm Feb 13, 2025
e360611
Remove benches for remved proofs
dvdplm Feb 13, 2025
1f80ced
Update benches to new code
dvdplm Feb 13, 2025
2bb6173
Tweaks after merge
dvdplm Feb 13, 2025
0a98d23
Clippy tweaks
dvdplm Feb 13, 2025
da43870
DRY dec_proof a bit
dvdplm Feb 13, 2025
bff5f3e
Add benches for missing proofs
dvdplm Feb 13, 2025
d462b01
Clippy
dvdplm Feb 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 12 additions & 1 deletion synedrion/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ serde = { version = "1", default-features = false, features = ["derive"] }
serde-encoded-bytes = { version = "0.1", default-features = false, features = ["hex", "base64"] }
bincode = { version = "2.0.0-rc.3", default-features = false, features = ["serde", "alloc"] }
displaydoc = { version = "0.2", default-features = false }
criterion = { version = "0.5", optional = true }

[dev-dependencies]
manul = { git = "https://github.com/entropyxyz/manul.git", rev = "f4c9515eaeb97a17ab3eef908b73be6159f7d9d2", features = ["dev"] }
Expand All @@ -51,9 +52,19 @@ k256 = { version = "0.13", default-features = false, features = ["ecdsa", "arith
impls = "1"
hex = { version = "0.4", default-features = false, features = ["alloc"] }
test-log = { version = "0.2.16", default-features = false, features = ["trace", "color"] }
tracing-subscriber = "0.3.19"

[features]
private_benches = ["criterion"]

[[bench]]
bench = true
name = "bench"
harness = false
path = "benches/bench.rs"


[[bench]]
bench = true
name = "zk_proofs"
harness = false
required-features = ["private_benches"]
158 changes: 158 additions & 0 deletions synedrion/benches/zk_proofs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
#[cfg(feature = "private_benches")]
mod bench {
use criterion::{criterion_group, Criterion};
use rand::SeedableRng;
use synedrion::private_benches::*;
use tracing_subscriber::EnvFilter;

fn bench_aff_g(c: &mut Criterion) {
use aff_g_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();
let mut group = c.benchmark_group("AffG proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", aff_g_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", aff_g_proof_verify(rng));
}

fn bench_aff_g_star(c: &mut Criterion) {
use aff_g_star_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();
let mut group = c.benchmark_group("AffG* proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", aff_g_star_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", aff_g_star_proof_verify(rng));
}

fn bench_dec(c: &mut Criterion) {
use dec_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();
let mut group = c.benchmark_group("Dec proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", dec_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", dec_proof_verify(rng));
}

fn bench_elog(c: &mut Criterion) {
use elog_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();
let mut group = c.benchmark_group("Elog proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", elog_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", elog_proof_verify(rng));
}

fn bench_enc_elg(c: &mut Criterion) {
use enc_elg_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();
let mut group = c.benchmark_group("EncElg proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", enc_elg_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", enc_elg_proof_verify(rng));
}

fn bench_fac(c: &mut Criterion) {
use fac_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();

let mut group = c.benchmark_group("Fac proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", fac_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", fac_proof_verify(rng));
}

fn bench_paillier_blum_modulus(c: &mut Criterion) {
use paillier_blum_modulus_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();
let mut group = c.benchmark_group("Paillier-Blum modulus proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", paillier_blum_modulus_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", paillier_blum_modulus_proof_verify(rng));
}

fn bench_prm(c: &mut Criterion) {
use prm_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();
let mut group = c.benchmark_group("Pedersen Ring params (prm) proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", prm_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", prm_proof_verify(rng));
}

fn bench_sch(c: &mut Criterion) {
use sch_proof::*;
let _ = tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.try_init();
let mut group = c.benchmark_group("Schnorr (sch) proof");
group.sample_size(10);

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("prove", sch_proof_prove(rng));

let rng = rand_chacha::ChaCha8Rng::seed_from_u64(1234567890);
group.bench_function("verify", sch_proof_verify(rng));
}

criterion_group!(
benches,
bench_aff_g,
bench_aff_g_star,
bench_dec,
bench_elog,
bench_enc_elg,
bench_fac,
bench_paillier_blum_modulus,
bench_prm,
bench_sch
);
}

criterion::criterion_main!(bench::benches);
8 changes: 6 additions & 2 deletions synedrion/src/cggmp21.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
//! refers to the version of the paper published at <https://eprint.iacr.org/2021/060.pdf>

mod aux_gen;
mod conversion;
pub(crate) mod conversion;
mod entities;
mod interactive_signing;
mod key_init;
mod key_refresh;
mod params;
mod sigma;
pub(crate) mod sigma;

#[cfg(test)]
mod aux_gen_tests;
Expand All @@ -30,9 +30,13 @@ mod key_refresh_tests;

pub use aux_gen::{AuxGen, AuxGenAssociatedData, AuxGenProtocol};
pub use entities::{AuxInfo, KeyShare, KeyShareChange};

pub use interactive_signing::{
InteractiveSigning, InteractiveSigningAssociatedData, InteractiveSigningProtocol, PrehashedMessage,
};
pub use key_init::{KeyInit, KeyInitAssociatedData, KeyInitProtocol};
pub use key_refresh::{KeyRefresh, KeyRefreshAssociatedData, KeyRefreshProtocol};
pub use params::{ProductionParams112, SchemeParams, TestParams};

#[cfg(feature = "private_benches")]
pub(crate) use params::PaillierProduction112;
10 changes: 10 additions & 0 deletions synedrion/src/cggmp21/sigma/aff_g.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ impl<P: SchemeParams> AffGProof<P> {

#[cfg(test)]
mod tests {
use manul::{dev::BinaryFormat, session::WireFormat};
use rand_core::OsRng;

use super::{AffGProof, AffGPublicInputs, AffGSecretInputs};
Expand Down Expand Up @@ -311,6 +312,15 @@ mod tests {
&rp_params,
&aux,
);

// Roundtrip works
let res = BinaryFormat::serialize(proof);
assert!(res.is_ok());
let payload = res.unwrap();
let proof: AffGProof<Params> = BinaryFormat::deserialize(&payload).unwrap();

let rp_params = rp_params.to_wire().to_precomputed();

assert!(proof.verify(
AffGPublicInputs {
pk0,
Expand Down
11 changes: 10 additions & 1 deletion synedrion/src/cggmp21/sigma/dec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ impl<P: SchemeParams> DecProof<P> {

#[cfg(test)]
mod tests {
use manul::{dev::BinaryFormat, session::WireFormat};
use rand_core::OsRng;

use super::{DecProof, DecPublicInputs, DecSecretInputs};
Expand Down Expand Up @@ -311,6 +312,14 @@ mod tests {
&setup,
&aux,
);

// Roundtrip works
let res = BinaryFormat::serialize(proof);
assert!(res.is_ok());
let payload = res.unwrap();
let proof: DecProof<Params> = BinaryFormat::deserialize(&payload).unwrap();
let rp_params = setup.to_wire().to_precomputed();

assert!(proof.verify(
DecPublicInputs {
pk0: pk,
Expand All @@ -320,7 +329,7 @@ mod tests {
cap_s: &cap_s,
cap_g: &cap_g
},
&setup,
&rp_params,
&aux
));
}
Expand Down
12 changes: 11 additions & 1 deletion synedrion/src/cggmp21/sigma/fac.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ impl<P: SchemeParams> FacProof<P> {

#[cfg(test)]
mod tests {
use manul::{dev::BinaryFormat, session::WireFormat};
use rand_core::OsRng;

use super::FacProof;
Expand All @@ -221,6 +222,15 @@ mod tests {
let aux: &[u8] = b"abcde";

let proof = FacProof::<Params>::new(&mut OsRng, &sk, &setup, &aux);
assert!(proof.verify(pk, &setup, &aux));

// Roundtrip works
let res = BinaryFormat::serialize(proof);
assert!(res.is_ok());
let payload = res.unwrap();
let proof: FacProof<Params> = BinaryFormat::deserialize(&payload).unwrap();

let rp_params = setup.to_wire().to_precomputed();
let pubkey = pk.clone().into_wire().into_precomputed();
assert!(proof.verify(&pubkey, &rp_params, &aux));
}
}
8 changes: 8 additions & 0 deletions synedrion/src/cggmp21/sigma/mod_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ impl<P: SchemeParams> ModProof<P> {

#[cfg(test)]
mod tests {
use manul::{dev::BinaryFormat, session::WireFormat};
use rand_core::OsRng;

use super::ModProof;
Expand All @@ -220,6 +221,13 @@ mod tests {
let aux: &[u8] = b"abcde";

let proof = ModProof::<Params>::new(&mut OsRng, &sk, &aux);

// Roundtrip works
let res = BinaryFormat::serialize(proof);
assert!(res.is_ok());
let payload = res.unwrap();
let proof: ModProof<Params> = BinaryFormat::deserialize(&payload).unwrap();

assert!(proof.verify(pk, &aux));
}
}
Loading
Loading