1
1
use std:: collections:: HashMap ;
2
- use std:: env;
3
2
use std:: time:: Instant ;
4
3
use time_test:: time_test;
5
- use rocket:: { http:: ContentType , http:: { Header , Status } , local:: blocking:: Client } ;
6
- use two_party_ecdsa:: curv:: arithmetic:: traits:: Converter ;
4
+ use rocket:: { http:: ContentType , http:: { Status } , local:: blocking:: Client } ;
7
5
use two_party_ecdsa:: curv:: cryptographic_primitives:: twoparty:: dh_key_exchange_variant_with_pok_comm:: * ;
8
- use two_party_ecdsa:: { party_one, party_two , curv :: BigInt } ;
6
+ use two_party_ecdsa:: { party_one} ;
9
7
use floating_duration:: TimeFormat ;
10
8
use kms:: chain_code:: two_party as chain_code;
11
9
use kms:: ecdsa:: two_party:: { MasterKey2 , party1} ;
12
- use crate :: routes:: ecdsa:: SignSecondMsgRequest ;
13
- use criterion:: { criterion_group, criterion_main, Criterion } ;
10
+ use criterion:: { criterion_group, criterion_main, Criterion , BenchmarkId } ;
14
11
use pprof:: criterion:: { Output , PProfProfiler } ;
15
12
use server_lib:: * ;
16
13
17
- fn key_gen ( client : & Client ) -> ( String , MasterKey2 ) {
18
- time_test ! ( ) ;
19
-
14
+ pub fn keygen ( client : & Client ) -> ( String , MasterKey2 ) {
20
15
/*************** START: FIRST MESSAGE ***************/
21
- let start = Instant :: now ( ) ;
22
16
23
17
let response = client
24
18
. post ( "/ecdsa/keygen/first" )
25
19
. header ( ContentType :: JSON )
26
20
. dispatch ( ) ;
27
21
assert_eq ! ( response. status( ) , Status :: Ok ) ;
28
22
29
- println ! (
30
- "{} Network/Server: party1 first message" ,
31
- TimeFormat ( start. elapsed( ) )
32
- ) ;
33
23
let res_body = response. into_string ( ) . unwrap ( ) ;
34
24
35
25
let ( id, kg_party_one_first_message) : ( String , party_one:: KeyGenFirstMsg ) =
36
26
serde_json:: from_str ( & res_body) . unwrap ( ) ;
37
27
38
- let start = Instant :: now ( ) ;
39
-
40
28
let ( kg_party_two_first_message, kg_ec_key_pair_party2) = MasterKey2 :: key_gen_first_message ( ) ;
41
29
42
- println ! (
43
- "{} Client: party2 first message" ,
44
- TimeFormat ( start. elapsed( ) )
45
- ) ;
46
30
/*************** END: FIRST MESSAGE ***************/
47
31
48
32
/*************** START: SECOND MESSAGE ***************/
49
33
let body = serde_json:: to_string ( & kg_party_two_first_message. d_log_proof ) . unwrap ( ) ;
50
34
51
- let start = Instant :: now ( ) ;
52
-
53
35
let response = client
54
36
. post ( format ! ( "/ecdsa/keygen/{}/second" , id) )
55
37
. body ( body)
56
38
. header ( ContentType :: JSON )
57
39
. dispatch ( ) ;
58
40
assert_eq ! ( response. status( ) , Status :: Ok ) ;
59
41
60
- println ! (
61
- "{} Network/Server: party1 second message" ,
62
- TimeFormat ( start. elapsed( ) )
63
- ) ;
64
-
65
42
let res_body = response. into_string ( ) . unwrap ( ) ;
66
43
let kg_party_one_second_message: party1:: KeyGenParty1Message2 =
67
44
serde_json:: from_str ( & res_body) . unwrap ( ) ;
68
45
69
- let start = Instant :: now ( ) ;
70
-
71
46
let key_gen_second_message = MasterKey2 :: key_gen_second_message (
72
47
& kg_party_one_first_message,
73
48
& kg_party_one_second_message,
74
49
) ;
75
50
assert ! ( key_gen_second_message. is_ok( ) ) ;
76
51
77
- println ! (
78
- "{} Client: party2 second message" ,
79
- TimeFormat ( start. elapsed( ) )
80
- ) ;
81
-
82
52
let ( party_two_second_message, party_two_paillier, party_two_pdl_chal) =
83
53
key_gen_second_message. unwrap ( ) ;
84
54
@@ -87,32 +57,19 @@ fn key_gen(client: &Client) -> (String, MasterKey2) {
87
57
/*************** START: THIRD MESSAGE ***************/
88
58
let body = serde_json:: to_string ( & party_two_second_message. pdl_first_message ) . unwrap ( ) ;
89
59
90
- let start = Instant :: now ( ) ;
91
-
92
60
let response = client
93
61
. post ( format ! ( "/ecdsa/keygen/{}/third" , id) )
94
62
. body ( body)
95
63
. header ( ContentType :: JSON )
96
64
. dispatch ( ) ;
97
65
assert_eq ! ( response. status( ) , Status :: Ok ) ;
98
66
99
- println ! (
100
- "{} Network/Server: party1 third message" ,
101
- TimeFormat ( start. elapsed( ) )
102
- ) ;
103
-
104
67
let res_body = response. into_string ( ) . unwrap ( ) ;
105
68
let party_one_third_message: party_one:: PDLFirstMessage =
106
69
serde_json:: from_str ( & res_body) . unwrap ( ) ;
107
70
108
- let start = Instant :: now ( ) ;
109
-
110
71
let pdl_decom_party2 = MasterKey2 :: key_gen_third_message ( & party_two_pdl_chal) ;
111
72
112
- println ! (
113
- "{} Client: party2 third message" ,
114
- TimeFormat ( start. elapsed( ) )
115
- ) ;
116
73
/*************** END: THIRD MESSAGE ***************/
117
74
118
75
/*************** START: FOURTH MESSAGE ***************/
@@ -121,117 +78,70 @@ fn key_gen(client: &Client) -> (String, MasterKey2) {
121
78
let request = party_2_pdl_second_message;
122
79
let body = serde_json:: to_string ( & request) . unwrap ( ) ;
123
80
124
- let start = Instant :: now ( ) ;
125
-
126
81
let response = client
127
82
. post ( format ! ( "/ecdsa/keygen/{}/fourth" , id) )
128
83
. body ( body)
129
84
. header ( ContentType :: JSON )
130
85
. dispatch ( ) ;
131
86
assert_eq ! ( response. status( ) , Status :: Ok ) ;
132
87
133
- println ! (
134
- "{} Network/Server: party1 fourth message" ,
135
- TimeFormat ( start. elapsed( ) )
136
- ) ;
137
-
138
88
let res_body = response. into_string ( ) . unwrap ( ) ;
139
89
let party_one_pdl_second_message: party_one:: PDLSecondMessage =
140
90
serde_json:: from_str ( & res_body) . unwrap ( ) ;
141
91
142
- let start = Instant :: now ( ) ;
143
-
144
92
MasterKey2 :: key_gen_fourth_message (
145
93
& party_two_pdl_chal,
146
94
& party_one_third_message,
147
95
& party_one_pdl_second_message,
148
96
)
149
97
. expect ( "pdl error party1" ) ;
150
98
151
- println ! (
152
- "{} Client: party2 fourth message" ,
153
- TimeFormat ( start. elapsed( ) )
154
- ) ;
155
99
/*************** END: FOURTH MESSAGE ***************/
156
100
157
101
/*************** START: CHAINCODE FIRST MESSAGE ***************/
158
- let start = Instant :: now ( ) ;
159
102
160
103
let response = client
161
104
. post ( format ! ( "/ecdsa/keygen/{}/chaincode/first" , id) )
162
105
. header ( ContentType :: JSON )
163
106
. dispatch ( ) ;
164
107
assert_eq ! ( response. status( ) , Status :: Ok ) ;
165
108
166
- println ! (
167
- "{} Network/Server: party1 chain code first message" ,
168
- TimeFormat ( start. elapsed( ) )
169
- ) ;
170
-
171
109
let res_body = response. into_string ( ) . unwrap ( ) ;
172
110
let cc_party_one_first_message: Party1FirstMessage = serde_json:: from_str ( & res_body) . unwrap ( ) ;
173
111
174
- let start = Instant :: now ( ) ;
175
112
let ( cc_party_two_first_message, cc_ec_key_pair2) =
176
113
chain_code:: party2:: ChainCode2 :: chain_code_first_message ( ) ;
177
114
178
- println ! (
179
- "{} Client: party2 chain code first message" ,
180
- TimeFormat ( start. elapsed( ) )
181
- ) ;
182
115
/*************** END: CHAINCODE FIRST MESSAGE ***************/
183
116
184
117
/*************** START: CHAINCODE SECOND MESSAGE ***************/
185
118
let body = serde_json:: to_string ( & cc_party_two_first_message. d_log_proof ) . unwrap ( ) ;
186
119
187
- let start = Instant :: now ( ) ;
188
-
189
120
let response = client
190
121
. post ( format ! ( "/ecdsa/keygen/{}/chaincode/second" , id) )
191
122
. body ( body)
192
123
. header ( ContentType :: JSON )
193
124
. dispatch ( ) ;
194
125
assert_eq ! ( response. status( ) , Status :: Ok ) ;
195
126
196
- println ! (
197
- "{} Network/Server: party1 chain code second message" ,
198
- TimeFormat ( start. elapsed( ) )
199
- ) ;
200
-
201
127
let res_body = response. into_string ( ) . unwrap ( ) ;
202
128
let cc_party_one_second_message: Party1SecondMessage = serde_json:: from_str ( & res_body) . unwrap ( ) ;
203
129
204
- let start = Instant :: now ( ) ;
205
130
let _cc_party_two_second_message = chain_code:: party2:: ChainCode2 :: chain_code_second_message (
206
131
& cc_party_one_first_message,
207
132
& cc_party_one_second_message,
208
133
) ;
209
134
210
- println ! (
211
- "{} Client: party2 chain code second message" ,
212
- TimeFormat ( start. elapsed( ) )
213
- ) ;
214
135
/*************** END: CHAINCODE SECOND MESSAGE ***************/
215
136
216
- let start = Instant :: now ( ) ;
217
137
let party2_cc = chain_code:: party2:: ChainCode2 :: compute_chain_code (
218
138
& cc_ec_key_pair2,
219
139
& cc_party_one_second_message. comm_witness . public_share ,
220
140
)
221
141
. chain_code ;
222
142
223
- println ! (
224
- "{} Client: party2 chain code second message" ,
225
- TimeFormat ( start. elapsed( ) )
226
- ) ;
227
143
/*************** END: CHAINCODE COMPUTE MESSAGE ***************/
228
144
229
- println ! (
230
- "{} Network/Server: party1 master key" ,
231
- TimeFormat ( start. elapsed( ) )
232
- ) ;
233
-
234
- let start = Instant :: now ( ) ;
235
145
let party_two_master_key = MasterKey2 :: set_master_key (
236
146
& party2_cc,
237
147
& kg_ec_key_pair_party2,
@@ -242,25 +152,29 @@ fn key_gen(client: &Client) -> (String, MasterKey2) {
242
152
& party_two_paillier,
243
153
) ;
244
154
245
- println ! ( "{} Client: party2 master_key" , TimeFormat ( start. elapsed( ) ) ) ;
246
155
/*************** END: MASTER KEYS MESSAGE ***************/
247
156
248
157
( id, party_two_master_key)
249
158
}
250
159
251
160
/// Benchmarks keygen phase from client side invoking gotham server endpoints
252
161
pub fn criterion_benchmark ( c : & mut Criterion ) {
253
- c. bench_function ( "keygen benchmarking" , |b| {
254
- b. iter ( || {
255
- let settings = HashMap :: < String , String > :: from ( [
256
- ( "db" . to_string ( ) , "local" . to_string ( ) ) ,
257
- ( "db_name" . to_string ( ) , "KeyGenAndSign" . to_string ( ) ) ,
258
- ] ) ;
259
- let server = server:: get_server ( settings) ;
260
- let client = Client :: tracked ( server) . expect ( "valid rocket instance" ) ;
261
- let ( _, _) : ( String , MasterKey2 ) = key_gen ( & client) ;
262
- } )
263
- } ) ;
162
+ let settings = HashMap :: < String , String > :: from ( [
163
+ ( "db" . to_string ( ) , "local" . to_string ( ) ) ,
164
+ ( "db_name" . to_string ( ) , "KeyGenAndSign" . to_string ( ) ) ,
165
+ ] ) ;
166
+ let server = server:: get_server ( settings) ;
167
+ let client = Client :: tracked ( server) . expect ( "valid rocket instance" ) ;
168
+
169
+ c. bench_with_input (
170
+ BenchmarkId :: new ( "keygen_benchmark" , 1 ) ,
171
+ & client,
172
+ |b, client| {
173
+ b. iter ( || {
174
+ let ( _, _) : ( String , MasterKey2 ) = keygen ( & client) ;
175
+ } )
176
+ } ,
177
+ ) ;
264
178
}
265
179
266
180
criterion_group ! {
0 commit comments