Skip to content

Commit a555e0b

Browse files
authored
Merge pull request #774 from input-output-hk/test-batch-verify-stm
Test for batch verify
2 parents 220dafa + fcb4134 commit a555e0b

File tree

1 file changed

+80
-28
lines changed

1 file changed

+80
-28
lines changed
Lines changed: 80 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use mithril_stm::key_reg::KeyReg;
22
use mithril_stm::stm::{
3-
Stake, StmClerk, StmInitializer, StmParameters, StmSig, StmSigner, StmVerificationKey,
3+
Stake, StmAggrSig, StmAggrVerificationKey, StmClerk, StmInitializer, StmParameters, StmSig,
4+
StmSigner, StmVerificationKey,
45
};
56
use mithril_stm::AggregationError;
67

@@ -11,56 +12,54 @@ use rayon::prelude::*;
1112

1213
type H = Blake2b<U32>;
1314

14-
#[test]
15-
fn test_full_protocol() {
16-
let nparties = 32;
17-
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
18-
let mut msg = [0u8; 16];
19-
rng.fill_bytes(&mut msg);
20-
21-
//////////////////////////
22-
// initialization phase //
23-
//////////////////////////
24-
25-
let params = StmParameters {
26-
k: 357,
27-
m: 2642,
28-
phi_f: 0.2,
29-
};
30-
15+
fn initialization_phase(
16+
nparties: u64,
17+
mut rng: ChaCha20Rng,
18+
params: StmParameters,
19+
) -> (Vec<StmSigner<H>>, Vec<(StmVerificationKey, Stake)>) {
3120
let parties = (0..nparties)
3221
.into_iter()
3322
.map(|_| 1 + (rng.next_u64() % 9999))
3423
.collect::<Vec<_>>();
3524

3625
let mut key_reg = KeyReg::init();
3726

38-
let mut ps: Vec<StmInitializer> = Vec::with_capacity(nparties as usize);
27+
let mut initializers: Vec<StmInitializer> = Vec::with_capacity(nparties as usize);
28+
3929
let mut reg_parties: Vec<(StmVerificationKey, Stake)> = Vec::with_capacity(nparties as usize);
30+
4031
for stake in parties {
4132
let p = StmInitializer::setup(params, stake, &mut rng);
4233
key_reg.register(stake, p.verification_key()).unwrap();
4334
reg_parties.push((p.verification_key().vk, stake));
44-
ps.push(p);
35+
initializers.push(p);
4536
}
4637

4738
let closed_reg = key_reg.close();
4839

49-
let ps = ps
40+
let signers = initializers
5041
.into_par_iter()
5142
.map(|p| p.new_signer(closed_reg.clone()).unwrap())
5243
.collect::<Vec<StmSigner<H>>>();
5344

54-
/////////////////////
55-
// operation phase //
56-
/////////////////////
45+
(signers, reg_parties)
46+
}
5747

58-
let sigs = ps
48+
fn operation_phase(
49+
params: StmParameters,
50+
signers: Vec<StmSigner<H>>,
51+
reg_parties: Vec<(StmVerificationKey, Stake)>,
52+
msg: [u8; 32],
53+
) -> (
54+
Result<StmAggrSig<H>, AggregationError>,
55+
StmAggrVerificationKey<H>,
56+
) {
57+
let sigs = signers
5958
.par_iter()
6059
.filter_map(|p| p.sign(&msg))
6160
.collect::<Vec<StmSig>>();
6261

63-
let clerk = StmClerk::from_signer(&ps[0]);
62+
let clerk = StmClerk::from_signer(&signers[0]);
6463
let avk = clerk.compute_avk();
6564

6665
// Check all parties can verify every sig
@@ -71,13 +70,35 @@ fn test_full_protocol() {
7170
);
7271
}
7372

74-
// Aggregate with random parties
7573
let msig = clerk.aggregate(&sigs, &msg);
7674

75+
(msig, avk)
76+
}
77+
78+
#[test]
79+
fn test_full_protocol() {
80+
let nparties = 32;
81+
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
82+
let mut msg = [0u8; 32];
83+
rng.fill_bytes(&mut msg);
84+
85+
//////////////////////////
86+
// initialization phase //
87+
//////////////////////////
88+
89+
let params = StmParameters {
90+
k: 357,
91+
m: 2642,
92+
phi_f: 0.2,
93+
};
94+
95+
let (signers, reg_parties) = initialization_phase(nparties, rng.clone(), params);
96+
let (msig, avk) = operation_phase(params, signers, reg_parties, msg);
97+
7798
match msig {
7899
Ok(aggr) => {
79100
println!("Aggregate ok");
80-
assert!(aggr.verify(&msg, &clerk.compute_avk(), &params).is_ok());
101+
assert!(aggr.verify(&msg, &avk, &params).is_ok());
81102
}
82103
Err(AggregationError::NotEnoughSignatures(n, k)) => {
83104
println!("Not enough signatures");
@@ -88,3 +109,34 @@ fn test_full_protocol() {
88109
}
89110
}
90111
}
112+
113+
#[test]
114+
fn test_full_protocol_batch_verify() {
115+
let batch_size = 5;
116+
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
117+
118+
let mut aggr_avks = Vec::new();
119+
let mut aggr_stms = Vec::new();
120+
let mut batch_msgs = Vec::new();
121+
let mut batch_params = Vec::new();
122+
123+
let params = StmParameters {
124+
k: 357,
125+
m: 2642,
126+
phi_f: 0.2,
127+
};
128+
129+
for _ in 0..batch_size {
130+
let mut msg = [0u8; 32];
131+
rng.fill_bytes(&mut msg);
132+
let nparties = rng.next_u64() % 33;
133+
let (signers, reg_parties) = initialization_phase(nparties, rng.clone(), params);
134+
let operation = operation_phase(params, signers, reg_parties, msg);
135+
136+
aggr_avks.push(operation.1);
137+
aggr_stms.push(operation.0.unwrap());
138+
batch_msgs.push(msg.to_vec());
139+
batch_params.push(params);
140+
}
141+
assert!(StmAggrSig::batch_verify(&aggr_stms, &batch_msgs, &aggr_avks, &batch_params).is_ok());
142+
}

0 commit comments

Comments
 (0)