@@ -3,8 +3,9 @@ use criterion::BatchSize::SmallInput;
3
3
use criterion:: { criterion_group, criterion_main, BenchmarkGroup , Criterion , SamplingMode } ;
4
4
use ic_crypto_test_utils_canister_threshold_sigs:: node:: { Node , Nodes } ;
5
5
use ic_crypto_test_utils_canister_threshold_sigs:: {
6
- build_params_from_previous, random_transcript_id, CanisterThresholdSigTestEnvironment ,
7
- IDkgParticipants ,
6
+ build_params_from_previous, corrupt_single_dealing_and_generate_complaint,
7
+ generate_and_verify_openings_for_complaint, random_transcript_id,
8
+ CanisterThresholdSigTestEnvironment , IDkgParticipants ,
8
9
} ;
9
10
use ic_crypto_test_utils_reproducible_rng:: ReproducibleRng ;
10
11
use ic_interfaces:: crypto:: IDkgProtocol ;
@@ -65,6 +66,11 @@ fn crypto_idkg_benchmarks(criterion: &mut Criterion) {
65
66
66
67
bench_retain_active_transcripts ( group, & test_case, 1 , vault_type, rng) ;
67
68
69
+ if test_case. num_of_nodes > 1 {
70
+ bench_open_transcript ( group, & test_case, vault_type, rng) ;
71
+ bench_load_transcript_with_openings ( group, & test_case, vault_type, rng) ;
72
+ }
73
+
68
74
// The following benchmarks are not affected by the choice of the
69
75
// vault, we benchmark them only once with the default vault type.
70
76
if vault_type == VaultType :: default ( ) {
@@ -79,6 +85,12 @@ fn crypto_idkg_benchmarks(criterion: &mut Criterion) {
79
85
IDkgMode :: iter ( ) . for_each ( |mode| {
80
86
bench_verify_transcript ( group, & test_case, & mode, vault_type, rng)
81
87
} ) ;
88
+
89
+ bench_verify_complaint ( group, & test_case, vault_type, rng) ;
90
+
91
+ if test_case. num_of_nodes > 1 {
92
+ bench_verify_opening ( group, & test_case, vault_type, rng) ;
93
+ }
82
94
}
83
95
}
84
96
}
@@ -118,14 +130,14 @@ fn bench_verify_dealing_public<M: Measurement, R: RngCore + CryptoRng>(
118
130
let params = mode. setup_params ( & env, test_case. alg ( ) , & dealers, & receivers, rng) ;
119
131
120
132
group. bench_function ( format ! ( "verify_dealing_public_{mode}" ) , |bench| {
121
- bench. iter_batched (
133
+ bench. iter_batched_ref (
122
134
|| {
123
135
let receiver = env. nodes . random_receiver ( params. receivers ( ) , rng) ;
124
136
let dealer = env. nodes . random_dealer ( & params, rng) ;
125
137
let dealing = create_dealing ( dealer, & params) ;
126
138
( receiver, dealing)
127
139
} ,
128
- |( receiver, dealing) | verify_dealing_public ( receiver, & params, & dealing) ,
140
+ |( receiver, dealing) | verify_dealing_public ( receiver, & params, dealing) ,
129
141
SmallInput ,
130
142
)
131
143
} ) ;
@@ -144,14 +156,14 @@ fn bench_verify_dealing_private<M: Measurement, R: RngCore + CryptoRng>(
144
156
let params = mode. setup_params ( & env, test_case. alg ( ) , & dealers, & receivers, rng) ;
145
157
146
158
group. bench_function ( format ! ( "verify_dealing_private_{mode}" ) , |bench| {
147
- bench. iter_batched (
159
+ bench. iter_batched_ref (
148
160
|| {
149
161
let receiver = env. nodes . random_receiver ( params. receivers ( ) , rng) ;
150
162
let dealer = env. nodes . random_dealer ( & params, rng) ;
151
163
let dealing = create_dealing ( dealer, & params) ;
152
164
( receiver, dealing)
153
165
} ,
154
- |( receiver, dealing) | verify_dealing_private ( receiver, & params, & dealing) ,
166
+ |( receiver, dealing) | verify_dealing_private ( receiver, & params, dealing) ,
155
167
SmallInput ,
156
168
)
157
169
} ) ;
@@ -179,7 +191,7 @@ fn bench_verify_initial_dealings<M: Measurement, R: RngCore + CryptoRng>(
179
191
. choose_dealers_and_receivers ( & IDkgParticipants :: AllNodesAsDealersAndReceivers , rng) ;
180
192
181
193
group. bench_function ( "verify_initial_dealings" , |bench| {
182
- bench. iter_batched (
194
+ bench. iter_batched_ref (
183
195
|| {
184
196
let initial_params = dealers_env. params_for_random_sharing (
185
197
& src_dealers,
@@ -224,7 +236,7 @@ fn bench_verify_initial_dealings<M: Measurement, R: RngCore + CryptoRng>(
224
236
( reshare_of_unmasked_params, initial_dealings, receiver)
225
237
} ,
226
238
|( params, initial_dealings, receiver) | {
227
- verify_initial_dealings ( receiver, & params, & initial_dealings)
239
+ verify_initial_dealings ( receiver, params, initial_dealings)
228
240
} ,
229
241
SmallInput ,
230
242
)
@@ -244,7 +256,7 @@ fn bench_create_transcript<M: Measurement, R: RngCore + CryptoRng>(
244
256
let params = mode. setup_params ( & env, test_case. alg ( ) , & dealers, & receivers, rng) ;
245
257
246
258
group. bench_function ( format ! ( "create_transcript_{mode}" ) , |bench| {
247
- bench. iter_batched (
259
+ bench. iter_batched_ref (
248
260
|| {
249
261
let receiver = env. nodes . random_receiver ( params. receivers ( ) , rng) ;
250
262
let dealings = env. nodes . create_dealings ( & params) ;
@@ -253,7 +265,7 @@ fn bench_create_transcript<M: Measurement, R: RngCore + CryptoRng>(
253
265
. support_dealings_from_all_receivers ( dealings, & params) ;
254
266
( receiver, dealings_with_receivers_support)
255
267
} ,
256
- |( receiver, dealings) | create_transcript ( receiver, & params, & dealings) ,
268
+ |( receiver, dealings) | create_transcript ( receiver, & params, dealings) ,
257
269
SmallInput ,
258
270
)
259
271
} ) ;
@@ -272,7 +284,7 @@ fn bench_verify_transcript<M: Measurement, R: RngCore + CryptoRng>(
272
284
let params = mode. setup_params ( & env, test_case. alg ( ) , & dealers, & receivers, rng) ;
273
285
274
286
group. bench_function ( format ! ( "verify_transcript_{mode}" ) , |bench| {
275
- bench. iter_batched (
287
+ bench. iter_batched_ref (
276
288
|| {
277
289
let dealings = env. nodes . create_dealings ( & params) ;
278
290
let dealings_with_receivers_support = env
@@ -289,7 +301,7 @@ fn bench_verify_transcript<M: Measurement, R: RngCore + CryptoRng>(
289
301
) ;
290
302
( other_receiver, transcript)
291
303
} ,
292
- |( receiver, transcript) | verify_transcript ( receiver, & params, & transcript) ,
304
+ |( receiver, transcript) | verify_transcript ( receiver, & params, transcript) ,
293
305
SmallInput ,
294
306
)
295
307
} ) ;
@@ -308,7 +320,7 @@ fn bench_load_transcript<M: Measurement, R: RngCore + CryptoRng>(
308
320
let params = mode. setup_params ( & env, test_case. alg ( ) , & dealers, & receivers, rng) ;
309
321
310
322
group. bench_function ( format ! ( "load_transcript_{mode}" ) , |bench| {
311
- bench. iter_batched (
323
+ bench. iter_batched_ref (
312
324
|| {
313
325
let dealings = env. nodes . create_dealings ( & params) ;
314
326
let dealings_with_receivers_support = env
@@ -325,7 +337,7 @@ fn bench_load_transcript<M: Measurement, R: RngCore + CryptoRng>(
325
337
) ;
326
338
( other_receiver, transcript)
327
339
} ,
328
- |( receiver, transcript) | load_transcript ( receiver, & transcript) ,
340
+ |( receiver, transcript) | load_transcript ( receiver, transcript) ,
329
341
SmallInput ,
330
342
)
331
343
} ) ;
@@ -370,13 +382,175 @@ fn bench_retain_active_transcripts<M: Measurement, R: RngCore + CryptoRng>(
370
382
load_pre_signature_quadruple ( receiver, & pre_sig_quadruple) ;
371
383
}
372
384
} ,
373
- |_ | retain_active_transcripts ( receiver, & transcripts_to_keep) ,
385
+ |( ) | retain_active_transcripts ( receiver, & transcripts_to_keep) ,
374
386
SmallInput ,
375
387
)
376
388
} ,
377
389
) ;
378
390
}
379
391
392
+ fn bench_verify_complaint < M : Measurement , R : RngCore + CryptoRng > (
393
+ group : & mut BenchmarkGroup < ' _ , M > ,
394
+ test_case : & TestCase ,
395
+ vault_type : VaultType ,
396
+ rng : & mut R ,
397
+ ) {
398
+ let env = test_case. new_test_environment ( vault_type, rng) ;
399
+ let ( dealers, receivers) =
400
+ env. choose_dealers_and_receivers ( & IDkgParticipants :: AllNodesAsDealersAndReceivers , rng) ;
401
+ let params = env. params_for_random_sharing ( & dealers, & receivers, test_case. alg , rng) ;
402
+
403
+ group. bench_function ( "verify_complaint_random" , |bench| {
404
+ bench. iter_batched_ref (
405
+ || {
406
+ let mut transcript = env
407
+ . nodes
408
+ . run_idkg_and_create_and_verify_transcript ( & params, rng) ;
409
+ let ( complainer, complaint) = corrupt_single_dealing_and_generate_complaint (
410
+ & mut transcript,
411
+ & params,
412
+ & env,
413
+ rng,
414
+ ) ;
415
+ let receiver = env. nodes . random_receiver ( params. receivers ( ) , rng) ;
416
+ ( receiver, transcript, complainer. id ( ) , complaint)
417
+ } ,
418
+ |( receiver, transcript, complainer_id, complaint) | {
419
+ receiver
420
+ . verify_complaint ( transcript, * complainer_id, complaint)
421
+ . expect ( "failed to verify complaint" )
422
+ } ,
423
+ SmallInput ,
424
+ )
425
+ } ) ;
426
+ }
427
+
428
+ fn bench_open_transcript < M : Measurement , R : RngCore + CryptoRng > (
429
+ group : & mut BenchmarkGroup < ' _ , M > ,
430
+ test_case : & TestCase ,
431
+ vault_type : VaultType ,
432
+ rng : & mut R ,
433
+ ) {
434
+ let env = test_case. new_test_environment ( vault_type, rng) ;
435
+ let ( dealers, receivers) =
436
+ env. choose_dealers_and_receivers ( & IDkgParticipants :: AllNodesAsDealersAndReceivers , rng) ;
437
+ let params = env. params_for_random_sharing ( & dealers, & receivers, test_case. alg , rng) ;
438
+
439
+ group. bench_function ( "open_transcript_random" , |bench| {
440
+ bench. iter_batched_ref (
441
+ || {
442
+ let mut transcript = env
443
+ . nodes
444
+ . run_idkg_and_create_and_verify_transcript ( & params, rng) ;
445
+ let ( complainer, complaint) = corrupt_single_dealing_and_generate_complaint (
446
+ & mut transcript,
447
+ & params,
448
+ & env,
449
+ rng,
450
+ ) ;
451
+ let opener =
452
+ env. nodes
453
+ . random_receiver_excluding ( complainer, params. receivers ( ) , rng) ;
454
+ ( opener, transcript, complainer. id ( ) , complaint)
455
+ } ,
456
+ |( opener, transcript, complainer_id, complaint) | {
457
+ opener
458
+ . open_transcript ( transcript, * complainer_id, complaint)
459
+ . expect ( "failed to open transcript" )
460
+ } ,
461
+ SmallInput ,
462
+ )
463
+ } ) ;
464
+ }
465
+
466
+ fn bench_verify_opening < M : Measurement , R : RngCore + CryptoRng > (
467
+ group : & mut BenchmarkGroup < ' _ , M > ,
468
+ test_case : & TestCase ,
469
+ vault_type : VaultType ,
470
+ rng : & mut R ,
471
+ ) {
472
+ let env = test_case. new_test_environment ( vault_type, rng) ;
473
+ let ( dealers, receivers) =
474
+ env. choose_dealers_and_receivers ( & IDkgParticipants :: AllNodesAsDealersAndReceivers , rng) ;
475
+ let params = env. params_for_random_sharing ( & dealers, & receivers, test_case. alg , rng) ;
476
+
477
+ group. bench_function ( "verify_opening_random" , |bench| {
478
+ bench. iter_batched_ref (
479
+ || {
480
+ let mut transcript = env
481
+ . nodes
482
+ . run_idkg_and_create_and_verify_transcript ( & params, rng) ;
483
+ let ( complainer, complaint) = corrupt_single_dealing_and_generate_complaint (
484
+ & mut transcript,
485
+ & params,
486
+ & env,
487
+ rng,
488
+ ) ;
489
+ let opener =
490
+ env. nodes
491
+ . random_receiver_excluding ( complainer, & transcript. receivers , rng) ;
492
+ let opening = opener
493
+ . open_transcript ( & transcript, complainer. id ( ) , & complaint)
494
+ . expect ( "Unexpected failure of open_transcript" ) ;
495
+ let opener_id = opener. id ( ) ;
496
+ let verifier = env. nodes . random_receiver ( params. receivers ( ) , rng) ;
497
+ ( verifier, transcript, opener_id, complaint, opening)
498
+ } ,
499
+ |( verifier, transcript, opener_id, complaint, opening) | {
500
+ verifier
501
+ . verify_opening ( transcript, * opener_id, opening, complaint)
502
+ . expect ( "failed to verify opening" )
503
+ } ,
504
+ SmallInput ,
505
+ )
506
+ } ) ;
507
+ }
508
+
509
+ fn bench_load_transcript_with_openings < M : Measurement , R : RngCore + CryptoRng > (
510
+ group : & mut BenchmarkGroup < ' _ , M > ,
511
+ test_case : & TestCase ,
512
+ vault_type : VaultType ,
513
+ rng : & mut R ,
514
+ ) {
515
+ let env = test_case. new_test_environment ( vault_type, rng) ;
516
+ let ( dealers, receivers) =
517
+ env. choose_dealers_and_receivers ( & IDkgParticipants :: AllNodesAsDealersAndReceivers , rng) ;
518
+ let params = env. params_for_random_sharing ( & dealers, & receivers, test_case. alg , rng) ;
519
+
520
+ group. bench_function ( "load_transcript_with_openings_random" , |bench| {
521
+ bench. iter_batched_ref (
522
+ || {
523
+ let mut transcript = env
524
+ . nodes
525
+ . run_idkg_and_create_and_verify_transcript ( & params, rng) ;
526
+ let reconstruction_threshold =
527
+ usize:: try_from ( transcript. reconstruction_threshold ( ) . get ( ) )
528
+ . expect ( "invalid number" ) ;
529
+ let number_of_openings = reconstruction_threshold;
530
+
531
+ let ( complainer, complaint) = corrupt_single_dealing_and_generate_complaint (
532
+ & mut transcript,
533
+ & params,
534
+ & env,
535
+ rng,
536
+ ) ;
537
+ let complaint_with_openings = generate_and_verify_openings_for_complaint (
538
+ number_of_openings,
539
+ & transcript,
540
+ & env,
541
+ complainer,
542
+ complaint,
543
+ ) ;
544
+ ( complainer, transcript, complaint_with_openings)
545
+ } ,
546
+ |( complainer, transcript, complaint_with_openings) | {
547
+ complainer. load_transcript_with_openings ( transcript, complaint_with_openings)
548
+ } ,
549
+ SmallInput ,
550
+ )
551
+ } ) ;
552
+ }
553
+
380
554
fn create_dealing ( dealer : & Node , params : & IDkgTranscriptParams ) -> SignedIDkgDealing {
381
555
dealer. create_dealing ( params) . unwrap_or_else ( |error| {
382
556
panic ! (
0 commit comments