Skip to content

Commit 5384d61

Browse files
authored
Merge pull request #18 from semiotic-ai/benches
Benches
2 parents d7f667a + 3eed370 commit 5384d61

File tree

3 files changed

+177
-0
lines changed

3 files changed

+177
-0
lines changed

h2s2/Cargo.toml

+7
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,10 @@ blake2 = {workspace = true}
2323
rayon = { workspace = true}
2424
digest = { workspace = true}
2525
once_cell = "1.20.2"
26+
27+
[dev-dependencies]
28+
criterion = "0.5.1"
29+
30+
[[bench]]
31+
name = "benchmark"
32+
harness = false

h2s2/benches/benchmark.rs

+167
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
use ark_bn254::Bn254;
2+
use ark_ff::{PrimeField, UniformRand};
3+
use ark_std::test_rng;
4+
use blake2::Blake2b512;
5+
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
6+
use digest::Digest;
7+
8+
use h2s2::{
9+
holographic_homomorphic_signature_scheme::HolographicHomomorphicSignatureScheme,
10+
ncs::{Signature, NCS},
11+
};
12+
13+
type Curve = Bn254;
14+
type Fr = ark_bn254::Fr;
15+
type Hasher = Blake2b512;
16+
17+
const N: usize = 32; // Number of generators
18+
19+
fn benchmark_sign(c: &mut Criterion) {
20+
let mut rng = test_rng();
21+
let tag = Fr::from_be_bytes_mod_order(&Hasher::digest(b"test"));
22+
let mut params = NCS::<Curve, Hasher>::setup(N, tag).expect("Setup failed");
23+
24+
let (pk, sk) = NCS::<Curve, Hasher>::keygen(&params, &mut rng).expect("Keygen failed");
25+
params.secret_key = Some(sk);
26+
params.public_key = pk;
27+
28+
let message = Fr::rand(&mut rng);
29+
let index = 1;
30+
31+
// Benchmark group setup with sample size
32+
let mut group = c.benchmark_group("sign_group");
33+
group.sample_size(100);
34+
group.measurement_time(std::time::Duration::from_secs(10));
35+
36+
group.bench_with_input(BenchmarkId::new("sign", index), &index, |b, &idx| {
37+
b.iter(|| {
38+
let signature = NCS::<Curve, Hasher>::sign(black_box(&params), idx, black_box(message))
39+
.expect("Sign failed");
40+
black_box(signature);
41+
});
42+
});
43+
group.finish();
44+
}
45+
46+
fn benchmark_verify(c: &mut Criterion) {
47+
let mut rng = test_rng();
48+
let tag = Fr::from_be_bytes_mod_order(&Hasher::digest(b"test"));
49+
let mut params = NCS::<Curve, Hasher>::setup(N, tag).expect("Setup failed");
50+
51+
let (pk, sk) = NCS::<Curve, Hasher>::keygen(&params, &mut rng).expect("Keygen failed");
52+
params.secret_key = Some(sk);
53+
params.public_key = pk;
54+
55+
let message = Fr::rand(&mut rng);
56+
let index = 1;
57+
let signature = NCS::<Curve, Hasher>::sign(&params, index, message).expect("Sign failed");
58+
59+
let mut group = c.benchmark_group("verify_group");
60+
group.sample_size(100); // Set the sample size to 100
61+
group.measurement_time(std::time::Duration::from_secs(10)); // Extend measurement time
62+
63+
group.bench_with_input(BenchmarkId::new("verify", index), &index, |b, &idx| {
64+
b.iter(|| {
65+
let result = NCS::<Curve, Hasher>::verify(
66+
black_box(&params),
67+
idx,
68+
black_box(&message),
69+
black_box(&signature),
70+
);
71+
assert!(result.unwrap());
72+
});
73+
});
74+
group.finish();
75+
}
76+
77+
fn benchmark_verify_aggregate(c: &mut Criterion) {
78+
let mut rng = test_rng();
79+
let tag = Fr::from_be_bytes_mod_order(&Hasher::digest(b"test"));
80+
let mut params = NCS::<Curve, Hasher>::setup(N, tag).expect("Setup failed");
81+
let index = 1;
82+
83+
let (pk, sk) = NCS::<Curve, Hasher>::keygen(&params, &mut rng).expect("Keygen failed");
84+
params.secret_key = Some(sk);
85+
params.public_key = pk;
86+
let messages: Vec<Fr> = (0..N).map(|_| Fr::rand(&mut rng)).collect();
87+
let weights: Vec<usize> = vec![1; N];
88+
89+
let aggregate_hash =
90+
NCS::<Curve, Hasher>::precompute(&params, &weights).expect("Precompute failed");
91+
92+
let signatures: Vec<Signature<Curve>> = messages
93+
.iter()
94+
.enumerate()
95+
.map(|(index, message)| {
96+
NCS::<Curve, Hasher>::sign(&params, index + 1, *message).expect("Sign failed")
97+
})
98+
.collect();
99+
100+
let aggregated_signature =
101+
NCS::<Curve, Hasher>::evaluate(&signatures, &weights).expect("Evaluate failed");
102+
103+
let mut group = c.benchmark_group("verify_aggregate_group");
104+
group.sample_size(100); // Set the sample size to 100
105+
group.measurement_time(std::time::Duration::from_secs(10)); // Extend measurement time
106+
107+
group.bench_with_input(
108+
BenchmarkId::new("verify_aggregate", 1),
109+
&index,
110+
|b, &_idx| {
111+
b.iter(|| {
112+
let result = NCS::<Curve, Hasher>::verify_aggregate(
113+
black_box(&params),
114+
black_box(&aggregate_hash),
115+
black_box(&aggregated_signature),
116+
);
117+
assert!(result.unwrap());
118+
});
119+
},
120+
);
121+
group.finish();
122+
}
123+
124+
fn benchmark_evaluate(c: &mut Criterion) {
125+
let mut rng = test_rng();
126+
let tag = Fr::from_be_bytes_mod_order(&Hasher::digest(b"test"));
127+
let mut params = NCS::<Curve, Hasher>::setup(N, tag).expect("Setup failed");
128+
let index = 1;
129+
130+
let (pk, sk) = NCS::<Curve, Hasher>::keygen(&params, &mut rng).expect("Keygen failed");
131+
params.secret_key = Some(sk);
132+
params.public_key = pk;
133+
134+
let messages: Vec<Fr> = (0..N).map(|_| Fr::rand(&mut rng)).collect();
135+
let weights: Vec<usize> = vec![1; N];
136+
137+
let signatures: Vec<Signature<Curve>> = messages
138+
.iter()
139+
.enumerate()
140+
.map(|(index, message)| {
141+
NCS::<Curve, Hasher>::sign(&params, index + 1, *message).expect("Sign failed")
142+
})
143+
.collect();
144+
145+
// Benchmark group setup with sample size
146+
let mut group = c.benchmark_group("evaluate_group");
147+
group.sample_size(100); // Set the sample size to 100
148+
group.measurement_time(std::time::Duration::from_secs(10)); // Extend measurement time
149+
150+
group.bench_with_input(BenchmarkId::new("evaluate", 1), &index, |b, &_idx| {
151+
b.iter(|| {
152+
let result =
153+
NCS::<Curve, Hasher>::evaluate(black_box(&signatures), black_box(&weights));
154+
assert!(result.is_ok());
155+
});
156+
});
157+
group.finish();
158+
}
159+
160+
criterion_group!(
161+
benches,
162+
benchmark_sign,
163+
benchmark_verify,
164+
benchmark_verify_aggregate,
165+
benchmark_evaluate
166+
);
167+
criterion_main!(benches);

h2s2/src/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod holographic_homomorphic_signature_scheme;
2+
pub mod lib;
3+
pub mod ncs;

0 commit comments

Comments
 (0)