@@ -2,20 +2,17 @@ use blake2::digest::{Digest, FixedOutput};
2
2
use blake2:: { digest:: consts:: U32 , Blake2b } ;
3
3
use criterion:: { criterion_group, criterion_main, BenchmarkId , Criterion } ;
4
4
use mithril_stm:: key_reg:: KeyReg ;
5
- use mithril_stm:: stm:: { StmClerk , StmInitializer , StmParameters , StmSigner } ;
5
+ use mithril_stm:: stm:: { StmAggrSig , StmClerk , StmInitializer , StmParameters , StmSigner } ;
6
6
use rand_chacha:: ChaCha20Rng ;
7
7
use rand_core:: { RngCore , SeedableRng } ;
8
8
use rayon:: prelude:: * ;
9
9
use std:: fmt:: Debug ;
10
10
11
- ///
12
11
/// This benchmark framework is not ideal. We really have to think what is the best mechanism for
13
12
/// benchmarking these signatures, over which parameters, how many times to run them, etc:
14
13
/// * Registration depends on the number of parties (should be constant, as it is a lookup table)
15
14
/// * Signing depends on the parameter `m`, as it defines the number of lotteries a user can play
16
15
/// * Aggregation depends on `k`.
17
- /// * Verification is independent from the parameters.
18
-
19
16
fn stm_benches < H > ( c : & mut Criterion , nr_parties : usize , params : StmParameters , hashing_alg : & str )
20
17
where
21
18
H : Clone + Debug + Digest + Send + Sync + FixedOutput + Default ,
@@ -70,15 +67,97 @@ where
70
67
. collect :: < Vec < _ > > ( ) ;
71
68
72
69
let clerk = StmClerk :: from_signer ( & signers[ 0 ] ) ;
73
- let msig = clerk. aggregate ( & sigs, & msg) . unwrap ( ) ;
74
70
75
71
group. bench_function ( BenchmarkId :: new ( "Aggregation" , & param_string) , |b| {
76
72
b. iter ( || clerk. aggregate ( & sigs, & msg) )
77
73
} ) ;
74
+ }
78
75
79
- group. bench_function ( BenchmarkId :: new ( "Verification" , & param_string) , |b| {
80
- b. iter ( || msig. verify ( & msg, & clerk. compute_avk ( ) , & params) . is_ok ( ) )
81
- } ) ;
76
+ fn batch_benches < H > (
77
+ c : & mut Criterion ,
78
+ array_batches : & [ usize ] ,
79
+ nr_parties : usize ,
80
+ params : StmParameters ,
81
+ hashing_alg : & str ,
82
+ ) where
83
+ H : Clone + Debug + Digest + FixedOutput + Send + Sync ,
84
+ {
85
+ let mut group = c. benchmark_group ( format ! ( "STM/{}" , hashing_alg) ) ;
86
+ let mut rng = ChaCha20Rng :: from_seed ( [ 0u8 ; 32 ] ) ;
87
+
88
+ let param_string = format ! (
89
+ "k: {}, m: {}, nr_parties: {}" ,
90
+ params. k, params. m, nr_parties
91
+ ) ;
92
+
93
+ for & nr_batches in array_batches {
94
+ let batch_string = format ! ( "{}/batch size: {}" , param_string, nr_batches) ;
95
+
96
+ let mut batch_msgs = Vec :: with_capacity ( nr_batches) ;
97
+ let mut batch_params = Vec :: with_capacity ( nr_batches) ;
98
+ let mut batch_stms = Vec :: with_capacity ( nr_batches) ;
99
+ let mut batch_avks = Vec :: with_capacity ( nr_batches) ;
100
+
101
+ for _ in 0 ..nr_batches {
102
+ let mut msg = [ 0u8 ; 32 ] ;
103
+ rng. fill_bytes ( & mut msg) ;
104
+ batch_msgs. push ( msg. to_vec ( ) ) ;
105
+ batch_params. push ( params) ;
106
+
107
+ let stakes = ( 0 ..nr_parties)
108
+ . into_iter ( )
109
+ . map ( |_| 1 + ( rng. next_u64 ( ) % 9999 ) )
110
+ . collect :: < Vec < _ > > ( ) ;
111
+
112
+ let mut initializers: Vec < StmInitializer > = Vec :: with_capacity ( nr_parties) ;
113
+ for stake in stakes {
114
+ initializers. push ( StmInitializer :: setup ( params, stake, & mut rng) ) ;
115
+ }
116
+ let mut key_reg = KeyReg :: init ( ) ;
117
+ for p in initializers. iter ( ) {
118
+ key_reg. register ( p. stake , p. verification_key ( ) ) . unwrap ( ) ;
119
+ }
120
+
121
+ let closed_reg = key_reg. close ( ) ;
122
+
123
+ let signers = initializers
124
+ . into_par_iter ( )
125
+ . map ( |p| p. new_signer ( closed_reg. clone ( ) ) . unwrap ( ) )
126
+ . collect :: < Vec < StmSigner < H > > > ( ) ;
127
+
128
+ let sigs = signers
129
+ . par_iter ( )
130
+ . filter_map ( |p| p. sign ( & msg) )
131
+ . collect :: < Vec < _ > > ( ) ;
132
+
133
+ let clerk = StmClerk :: from_signer ( & signers[ 0 ] ) ;
134
+ let msig = clerk. aggregate ( & sigs, & msg) . unwrap ( ) ;
135
+
136
+ batch_avks. push ( clerk. compute_avk ( ) ) ;
137
+ batch_stms. push ( msig) ;
138
+ }
139
+
140
+ group. bench_function ( BenchmarkId :: new ( "Batch Verification" , batch_string) , |b| {
141
+ b. iter ( || {
142
+ StmAggrSig :: batch_verify ( & batch_stms, & batch_msgs, & batch_avks, & batch_params)
143
+ . is_ok ( )
144
+ } )
145
+ } ) ;
146
+ }
147
+ }
148
+
149
+ fn batch_stm_benches_blake_300 ( c : & mut Criterion ) {
150
+ batch_benches :: < Blake2b < U32 > > (
151
+ c,
152
+ & [ 1 , 10 , 20 , 100 ] ,
153
+ 300 ,
154
+ StmParameters {
155
+ m : 150 ,
156
+ k : 25 ,
157
+ phi_f : 0.4 ,
158
+ } ,
159
+ "Blake2b" ,
160
+ ) ;
82
161
}
83
162
84
163
fn stm_benches_blake_300 ( c : & mut Criterion ) {
@@ -94,6 +173,20 @@ fn stm_benches_blake_300(c: &mut Criterion) {
94
173
) ;
95
174
}
96
175
176
+ fn batch_stm_benches_blake_2000 ( c : & mut Criterion ) {
177
+ batch_benches :: < Blake2b < U32 > > (
178
+ c,
179
+ & [ 1 , 10 , 20 , 100 ] ,
180
+ 2000 ,
181
+ StmParameters {
182
+ m : 1523 ,
183
+ k : 250 ,
184
+ phi_f : 0.4 ,
185
+ } ,
186
+ "Blake2b" ,
187
+ ) ;
188
+ }
189
+
97
190
fn stm_benches_blake_2000 ( c : & mut Criterion ) {
98
191
stm_benches :: < Blake2b < U32 > > (
99
192
c,
@@ -109,5 +202,10 @@ fn stm_benches_blake_2000(c: &mut Criterion) {
109
202
110
203
criterion_group ! ( name = benches;
111
204
config = Criterion :: default ( ) . nresamples( 1000 ) ;
112
- targets = stm_benches_blake_300, stm_benches_blake_2000) ;
205
+ targets =
206
+ stm_benches_blake_300,
207
+ stm_benches_blake_2000,
208
+ batch_stm_benches_blake_300,
209
+ batch_stm_benches_blake_2000,
210
+ ) ;
113
211
criterion_main ! ( benches) ;
0 commit comments