Skip to content

Commit ac2db70

Browse files
authored
Merge pull request #2845 from input-output-hk/curiecrypt/msnark/remove-basic-verifier
SNARK-friendly STM: Remove basic verifier
2 parents 0b91522 + 8b9cfc2 commit ac2db70

File tree

14 files changed

+314
-817
lines changed

14 files changed

+314
-817
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-stm/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## 0.7.0 (12-16-2025)
9+
10+
### Removed
11+
12+
- Basic verifier functionality is removed.
13+
814
## 0.6.4 (12-12-2025)
915

1016
### Changed

mithril-stm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-stm"
3-
version = "0.6.4"
3+
version = "0.7.0"
44
edition = { workspace = true }
55
authors = { workspace = true }
66
homepage = { workspace = true }

mithril-stm/benches/size_benches.rs

Lines changed: 2 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use rayon::iter::ParallelIterator;
99
use rayon::prelude::{IntoParallelIterator, IntoParallelRefIterator};
1010

1111
use mithril_stm::{
12-
AggregateSignatureType, BasicVerifier, Clerk, Initializer, KeyRegistration, Parameters, Signer,
13-
SingleSignature, SingleSignatureWithRegisteredParty, Stake, VerificationKey,
12+
AggregateSignatureType, Clerk, Initializer, KeyRegistration, Parameters, Signer,
13+
SingleSignature,
1414
};
1515

1616
fn size<H>(k: u64, m: u64, nparties: usize, hash_name: &str)
@@ -66,68 +66,6 @@ where
6666
);
6767
}
6868

69-
fn core_size<H>(k: u64, m: u64, nparties: usize)
70-
where
71-
H: Digest + Clone + Sync + Send + Default + FixedOutput,
72-
{
73-
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
74-
let mut msg = [0u8; 16];
75-
rng.fill_bytes(&mut msg);
76-
77-
let mut public_signers: Vec<(VerificationKey, Stake)> = Vec::with_capacity(nparties);
78-
let mut initializers: Vec<Initializer> = Vec::with_capacity(nparties);
79-
80-
let parties = (0..nparties).map(|_| 1 + (rng.next_u64() % 9999)).collect::<Vec<_>>();
81-
82-
let params = Parameters { k, m, phi_f: 0.2 };
83-
84-
for stake in parties {
85-
let initializer = Initializer::new(params, stake, &mut rng);
86-
initializers.push(initializer.clone());
87-
public_signers.push((
88-
initializer.get_verification_key_proof_of_possession().vk,
89-
initializer.stake,
90-
));
91-
}
92-
93-
let core_verifier = BasicVerifier::new(&public_signers);
94-
95-
let signers: Vec<Signer<H>> = initializers
96-
.into_iter()
97-
.filter_map(|s| s.create_basic_signer(&core_verifier.eligible_parties))
98-
.collect();
99-
100-
let mut signatures: Vec<SingleSignature> = Vec::with_capacity(nparties);
101-
for s in signers {
102-
if let Some(sig) = s.basic_sign(&msg, core_verifier.total_stake) {
103-
signatures.push(sig);
104-
}
105-
}
106-
107-
let sig_reg_list = signatures
108-
.iter()
109-
.map(|sig| SingleSignatureWithRegisteredParty {
110-
sig: sig.clone(),
111-
reg_party: core_verifier.eligible_parties[sig.signer_index as usize],
112-
})
113-
.collect::<Vec<SingleSignatureWithRegisteredParty>>();
114-
115-
let dedup_sigs = BasicVerifier::select_valid_signatures_for_k_indices(
116-
&core_verifier.total_stake,
117-
&params,
118-
&msg,
119-
&sig_reg_list,
120-
)
121-
.unwrap();
122-
123-
let mut size_sigs: usize = 0;
124-
for sig in dedup_sigs {
125-
size_sigs += sig.to_bytes().len();
126-
}
127-
128-
println!("k = {k} | m = {m} | nr parties = {nparties}; {size_sigs} bytes",);
129-
}
130-
13169
fn main() {
13270
println!("+-------------------+");
13371
println!("| Size of proofs |");
@@ -140,14 +78,5 @@ fn main() {
14078
size::<Blake2b<U64>>(k, m, nparties, "Blake2b 512");
14179
size::<Blake2b<U32>>(k, m, nparties, "Blake2b 256");
14280
}
143-
144-
println!("\n+-------------------------+");
145-
println!("| Size of core signatures |");
146-
println!("+-------------------------+");
147-
println!("+-------------------------+");
148-
149-
for (k, m, nparties) in params {
150-
core_size::<Blake2b<U64>>(k, m, nparties);
151-
}
15281
println!("+-------------------------+");
15382
}

mithril-stm/benches/stm.rs

Lines changed: 2 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use rand_core::{RngCore, SeedableRng};
88
use rayon::prelude::*;
99

1010
use mithril_stm::{
11-
AggregateSignature, AggregateSignatureType, BasicVerifier, Clerk, Initializer, KeyRegistration,
12-
Parameters, Signer, Stake, VerificationKey,
11+
AggregateSignature, AggregateSignatureType, Clerk, Initializer, KeyRegistration, Parameters,
12+
Signer,
1313
};
1414

1515
/// This benchmark framework is not ideal. We really have to think what is the best mechanism for
@@ -155,59 +155,6 @@ fn batch_benches<H>(
155155
}
156156
}
157157

158-
fn basic_verifier_benches<H>(c: &mut Criterion, nr_parties: usize, params: Parameters)
159-
where
160-
H: Clone + Debug + Digest + Send + Sync + FixedOutput + Default,
161-
{
162-
let mut group = c.benchmark_group("Core verifier");
163-
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
164-
let mut msg = [0u8; 16];
165-
rng.fill_bytes(&mut msg);
166-
167-
let mut public_signers: Vec<(VerificationKey, Stake)> = Vec::with_capacity(nr_parties);
168-
let mut initializers: Vec<Initializer> = Vec::with_capacity(nr_parties);
169-
170-
let param_string = format!(
171-
"k: {}, m: {}, nr_parties: {}",
172-
params.k, params.m, nr_parties
173-
);
174-
175-
let stakes = (0..nr_parties)
176-
.map(|_| 1 + (rng.next_u64() % 9999))
177-
.collect::<Vec<_>>();
178-
179-
for stake in stakes {
180-
let initializer = Initializer::new(params, stake, &mut rng);
181-
initializers.push(initializer.clone());
182-
public_signers.push((
183-
initializer.get_verification_key_proof_of_possession().vk,
184-
initializer.stake,
185-
));
186-
}
187-
188-
let core_verifier = BasicVerifier::new(&public_signers);
189-
190-
let signers: Vec<Signer<H>> = initializers
191-
.into_iter()
192-
.filter_map(|s| s.create_basic_signer(&core_verifier.eligible_parties))
193-
.collect();
194-
195-
group.bench_function(BenchmarkId::new("Play all lotteries", &param_string), |b| {
196-
b.iter(|| {
197-
signers[0].basic_sign(&msg, core_verifier.total_stake);
198-
})
199-
});
200-
201-
let signatures = signers
202-
.par_iter()
203-
.filter_map(|p| p.basic_sign(&msg, core_verifier.total_stake))
204-
.collect::<Vec<_>>();
205-
206-
group.bench_function(BenchmarkId::new("Core verification", &param_string), |b| {
207-
b.iter(|| core_verifier.verify(&signatures, &params, &msg))
208-
});
209-
}
210-
211158
fn batch_stm_benches_blake_300(c: &mut Criterion) {
212159
batch_benches::<Blake2b<U32>>(
213160
c,
@@ -235,18 +182,6 @@ fn stm_benches_blake_300(c: &mut Criterion) {
235182
);
236183
}
237184

238-
fn core_verifier_benches_blake_300(c: &mut Criterion) {
239-
basic_verifier_benches::<Blake2b<U32>>(
240-
c,
241-
300,
242-
Parameters {
243-
m: 150,
244-
k: 25,
245-
phi_f: 0.2,
246-
},
247-
);
248-
}
249-
250185
fn batch_stm_benches_blake_2000(c: &mut Criterion) {
251186
batch_benches::<Blake2b<U32>>(
252187
c,
@@ -274,23 +209,9 @@ fn stm_benches_blake_2000(c: &mut Criterion) {
274209
);
275210
}
276211

277-
fn core_verifier_benches_blake_2000(c: &mut Criterion) {
278-
basic_verifier_benches::<Blake2b<U32>>(
279-
c,
280-
2000,
281-
Parameters {
282-
m: 1523,
283-
k: 250,
284-
phi_f: 0.2,
285-
},
286-
);
287-
}
288-
289212
criterion_group!(name = benches;
290213
config = Criterion::default().nresamples(1000);
291214
targets =
292-
core_verifier_benches_blake_300,
293-
core_verifier_benches_blake_2000,
294215
stm_benches_blake_300,
295216
stm_benches_blake_2000,
296217
batch_stm_benches_blake_300,

mithril-stm/src/proof_system/concatenation.rs

Lines changed: 58 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
use anyhow::Context;
1+
use anyhow::{Context, anyhow};
22
use blake2::digest::{Digest, FixedOutput};
33
use serde::{Deserialize, Serialize};
4+
use std::collections::HashSet;
45

56
use crate::{
6-
AggregateSignatureError, AggregateVerificationKey, BasicVerifier, Clerk, Parameters,
7+
AggregateSignatureError, AggregateVerificationKey, AggregationError, Clerk, Parameters,
78
RegisteredParty, SingleSignature, SingleSignatureWithRegisteredParty, StmResult,
89
membership_commitment::MerkleBatchPath,
910
signature_scheme::{BlsSignature, BlsVerificationKey},
@@ -43,17 +44,12 @@ impl<D: Clone + Digest + FixedOutput + Send + Sync> ConcatenationProof<D> {
4344
})
4445
.collect::<Vec<SingleSignatureWithRegisteredParty>>();
4546

46-
let avk = AggregateVerificationKey::from(&clerk.closed_reg);
47-
let msgp = avk.get_merkle_tree_batch_commitment().concatenate_with_message(msg);
48-
let mut unique_sigs = BasicVerifier::select_valid_signatures_for_k_indices(
49-
&clerk.closed_reg.total_stake,
50-
&clerk.params,
51-
&msgp,
52-
&sig_reg_list,
53-
)
54-
.with_context(
55-
|| "Failed to aggregate unique signatures during selection for the k indices.",
56-
)?;
47+
let avk = clerk.compute_aggregate_verification_key();
48+
let mut unique_sigs =
49+
Clerk::select_valid_signatures_for_k_indices(&clerk.params, msg, &sig_reg_list, &avk)
50+
.with_context(
51+
|| "Failed to aggregate unique signatures during selection for the k indices.",
52+
)?;
5753

5854
unique_sigs.sort_unstable();
5955

@@ -86,13 +82,35 @@ impl<D: Clone + Digest + FixedOutput + Send + Sync> ConcatenationProof<D> {
8682
parameters: &Parameters,
8783
) -> StmResult<(Vec<BlsSignature>, Vec<BlsVerificationKey>)> {
8884
let msgp = avk.get_merkle_tree_batch_commitment().concatenate_with_message(msg);
89-
BasicVerifier::preliminary_verify(
90-
&avk.get_total_stake(),
91-
&self.signatures,
92-
parameters,
93-
&msgp,
94-
)
95-
.with_context(|| "Preliminary verification of aggregate signatures failed.")?;
85+
86+
let mut nr_indices = 0;
87+
let mut unique_indices = HashSet::new();
88+
89+
for sig_reg in self.signatures.clone() {
90+
sig_reg
91+
.sig
92+
.check_indices(
93+
parameters,
94+
&sig_reg.reg_party.1,
95+
&msgp,
96+
&avk.get_total_stake(),
97+
)
98+
.with_context(|| "Preliminary verification for basic verifier failed.")?;
99+
for &index in &sig_reg.sig.indexes {
100+
unique_indices.insert(index);
101+
nr_indices += 1;
102+
}
103+
}
104+
105+
if nr_indices != unique_indices.len() {
106+
return Err(anyhow!(AggregationError::IndexNotUnique));
107+
}
108+
if (nr_indices as u64) < parameters.k {
109+
return Err(anyhow!(AggregationError::NotEnoughSignatures(
110+
nr_indices as u64,
111+
parameters.k
112+
)));
113+
}
96114

97115
let leaves = self
98116
.signatures
@@ -104,9 +122,7 @@ impl<D: Clone + Digest + FixedOutput + Send + Sync> ConcatenationProof<D> {
104122
.verify_leaves_membership_from_batch_path(&leaves, &self.batch_proof)
105123
.with_context(|| "Batch proof is invalid in preliminary verification.")?;
106124

107-
Ok(BasicVerifier::collect_signatures_verification_keys(
108-
&self.signatures,
109-
))
125+
Ok(self.collect_signatures_verification_keys())
110126
}
111127

112128
/// Verify concatenation proof, by checking that
@@ -243,4 +259,23 @@ impl<D: Clone + Digest + FixedOutput + Send + Sync> ConcatenationProof<D> {
243259
batch_proof,
244260
})
245261
}
262+
263+
/// Collect and return `Vec<BlsSignature>, Vec<BlsVerificationKey>` which will be used
264+
/// by the aggregate verification.
265+
pub(crate) fn collect_signatures_verification_keys(
266+
&self,
267+
) -> (Vec<BlsSignature>, Vec<BlsVerificationKey>) {
268+
let sigs = self
269+
.signatures
270+
.iter()
271+
.map(|sig_reg| sig_reg.sig.sigma)
272+
.collect::<Vec<BlsSignature>>();
273+
let vks = self
274+
.signatures
275+
.iter()
276+
.map(|sig_reg| sig_reg.reg_party.0)
277+
.collect::<Vec<BlsVerificationKey>>();
278+
279+
(sigs, vks)
280+
}
246281
}

0 commit comments

Comments
 (0)