1
1
use mithril_stm:: key_reg:: KeyReg ;
2
2
use mithril_stm:: stm:: {
3
- Stake , StmClerk , StmInitializer , StmParameters , StmSig , StmSigner , StmVerificationKey ,
3
+ Stake , StmAggrSig , StmAggrVerificationKey , StmClerk , StmInitializer , StmParameters , StmSig ,
4
+ StmSigner , StmVerificationKey ,
4
5
} ;
5
6
use mithril_stm:: AggregationError ;
6
7
@@ -11,56 +12,54 @@ use rayon::prelude::*;
11
12
12
13
type H = Blake2b < U32 > ;
13
14
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 ) > ) {
31
20
let parties = ( 0 ..nparties)
32
21
. into_iter ( )
33
22
. map ( |_| 1 + ( rng. next_u64 ( ) % 9999 ) )
34
23
. collect :: < Vec < _ > > ( ) ;
35
24
36
25
let mut key_reg = KeyReg :: init ( ) ;
37
26
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
+
39
29
let mut reg_parties: Vec < ( StmVerificationKey , Stake ) > = Vec :: with_capacity ( nparties as usize ) ;
30
+
40
31
for stake in parties {
41
32
let p = StmInitializer :: setup ( params, stake, & mut rng) ;
42
33
key_reg. register ( stake, p. verification_key ( ) ) . unwrap ( ) ;
43
34
reg_parties. push ( ( p. verification_key ( ) . vk , stake) ) ;
44
- ps . push ( p) ;
35
+ initializers . push ( p) ;
45
36
}
46
37
47
38
let closed_reg = key_reg. close ( ) ;
48
39
49
- let ps = ps
40
+ let signers = initializers
50
41
. into_par_iter ( )
51
42
. map ( |p| p. new_signer ( closed_reg. clone ( ) ) . unwrap ( ) )
52
43
. collect :: < Vec < StmSigner < H > > > ( ) ;
53
44
54
- /////////////////////
55
- // operation phase //
56
- /////////////////////
45
+ ( signers, reg_parties)
46
+ }
57
47
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
59
58
. par_iter ( )
60
59
. filter_map ( |p| p. sign ( & msg) )
61
60
. collect :: < Vec < StmSig > > ( ) ;
62
61
63
- let clerk = StmClerk :: from_signer ( & ps [ 0 ] ) ;
62
+ let clerk = StmClerk :: from_signer ( & signers [ 0 ] ) ;
64
63
let avk = clerk. compute_avk ( ) ;
65
64
66
65
// Check all parties can verify every sig
@@ -71,13 +70,35 @@ fn test_full_protocol() {
71
70
) ;
72
71
}
73
72
74
- // Aggregate with random parties
75
73
let msig = clerk. aggregate ( & sigs, & msg) ;
76
74
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
+
77
98
match msig {
78
99
Ok ( aggr) => {
79
100
println ! ( "Aggregate ok" ) ;
80
- assert ! ( aggr. verify( & msg, & clerk . compute_avk ( ) , & params) . is_ok( ) ) ;
101
+ assert ! ( aggr. verify( & msg, & avk , & params) . is_ok( ) ) ;
81
102
}
82
103
Err ( AggregationError :: NotEnoughSignatures ( n, k) ) => {
83
104
println ! ( "Not enough signatures" ) ;
@@ -88,3 +109,34 @@ fn test_full_protocol() {
88
109
}
89
110
}
90
111
}
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