@@ -19,6 +19,8 @@ use rand::prelude::IteratorRandom;
19
19
use rand:: thread_rng;
20
20
use std:: collections:: { BTreeMap , HashSet } ;
21
21
use std:: fmt:: { Display , Formatter } ;
22
+ use strum:: IntoEnumIterator ;
23
+ use strum_macros:: EnumIter ;
22
24
23
25
criterion_main ! ( benches) ;
24
26
criterion_group ! ( benches, crypto_idkg_benchmarks) ;
@@ -45,22 +47,29 @@ fn crypto_idkg_benchmarks(criterion: &mut Criterion) {
45
47
. sample_size ( test_case. sample_size )
46
48
. sampling_mode ( test_case. sampling_mode ) ;
47
49
48
- bench_create_dealing ( group, & test_case) ;
49
- bench_verify_dealing_public ( group, & test_case) ;
50
- bench_verify_dealing_private ( group, & test_case) ;
50
+ IDkgMode :: iter ( ) . for_each ( |mode| bench_create_dealing ( group, & test_case, & mode) ) ;
51
+ IDkgMode :: iter ( ) . for_each ( |mode| bench_verify_dealing_public ( group, & test_case, & mode) ) ;
52
+ IDkgMode :: iter ( ) . for_each ( |mode| bench_verify_dealing_private ( group, & test_case, & mode) ) ;
53
+
51
54
bench_verify_initial_dealings ( group, & test_case) ;
52
- bench_create_transcript ( group, & test_case) ;
53
- bench_verify_transcript ( group, & test_case) ;
54
- bench_load_transcript ( group, & test_case) ;
55
+
56
+ IDkgMode :: iter ( ) . for_each ( |mode| bench_create_transcript ( group, & test_case, & mode) ) ;
57
+ IDkgMode :: iter ( ) . for_each ( |mode| bench_verify_transcript ( group, & test_case, & mode) ) ;
58
+ IDkgMode :: iter ( ) . for_each ( |mode| bench_load_transcript ( group, & test_case, & mode) ) ;
59
+
55
60
bench_retain_active_transcripts ( group, & test_case, 1 ) ;
56
61
}
57
62
}
58
63
59
- fn bench_create_dealing < M : Measurement > ( group : & mut BenchmarkGroup < ' _ , M > , test_case : & TestCase ) {
64
+ fn bench_create_dealing < M : Measurement > (
65
+ group : & mut BenchmarkGroup < ' _ , M > ,
66
+ test_case : & TestCase ,
67
+ mode : & IDkgMode ,
68
+ ) {
60
69
let env = test_case. new_test_environment ( ) ;
61
- let params = env . params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
70
+ let params = mode . setup_params ( & env ) ;
62
71
63
- group. bench_function ( "create_dealing" , |bench| {
72
+ group. bench_function ( format ! ( "create_dealing_{mode}" ) , |bench| {
64
73
bench. iter_batched (
65
74
|| crypto_for ( random_dealer_id ( & params) , & env. crypto_components ) ,
66
75
|dealer| create_dealing ( dealer, & params) ,
@@ -72,11 +81,12 @@ fn bench_create_dealing<M: Measurement>(group: &mut BenchmarkGroup<'_, M>, test_
72
81
fn bench_verify_dealing_public < M : Measurement > (
73
82
group : & mut BenchmarkGroup < ' _ , M > ,
74
83
test_case : & TestCase ,
84
+ mode : & IDkgMode ,
75
85
) {
76
86
let env = test_case. new_test_environment ( ) ;
77
- let params = env . params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
87
+ let params = mode . setup_params ( & env ) ;
78
88
79
- group. bench_function ( "verify_dealing_public" , |bench| {
89
+ group. bench_function ( format ! ( "verify_dealing_public_{mode}" ) , |bench| {
80
90
bench. iter_batched (
81
91
|| {
82
92
let receiver = crypto_for ( random_receiver_id ( & params) , & env. crypto_components ) ;
@@ -93,11 +103,12 @@ fn bench_verify_dealing_public<M: Measurement>(
93
103
fn bench_verify_dealing_private < M : Measurement > (
94
104
group : & mut BenchmarkGroup < ' _ , M > ,
95
105
test_case : & TestCase ,
106
+ mode : & IDkgMode ,
96
107
) {
97
108
let env = test_case. new_test_environment ( ) ;
98
- let params = env . params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
109
+ let params = mode . setup_params ( & env ) ;
99
110
100
- group. bench_function ( "verify_dealing_private" , |bench| {
111
+ group. bench_function ( format ! ( "verify_dealing_private_{mode}" ) , |bench| {
101
112
bench. iter_batched (
102
113
|| {
103
114
let receiver = crypto_for ( random_receiver_id ( & params) , & env. crypto_components ) ;
@@ -164,11 +175,12 @@ fn bench_verify_initial_dealings<M: Measurement>(
164
175
fn bench_create_transcript < M : Measurement > (
165
176
group : & mut BenchmarkGroup < ' _ , M > ,
166
177
test_case : & TestCase ,
178
+ mode : & IDkgMode ,
167
179
) {
168
180
let env = test_case. new_test_environment ( ) ;
169
- let params = env . params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
181
+ let params = mode . setup_params ( & env ) ;
170
182
171
- group. bench_function ( "create_transcript" , |bench| {
183
+ group. bench_function ( format ! ( "create_transcript_{mode}" ) , |bench| {
172
184
bench. iter_batched (
173
185
|| {
174
186
let receiver = crypto_for ( random_receiver_id ( & params) , & env. crypto_components ) ;
@@ -186,11 +198,12 @@ fn bench_create_transcript<M: Measurement>(
186
198
fn bench_verify_transcript < M : Measurement > (
187
199
group : & mut BenchmarkGroup < ' _ , M > ,
188
200
test_case : & TestCase ,
201
+ mode : & IDkgMode ,
189
202
) {
190
203
let env = test_case. new_test_environment ( ) ;
191
- let params = env . params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
204
+ let params = mode . setup_params ( & env ) ;
192
205
193
- group. bench_function ( "verify_transcript" , |bench| {
206
+ group. bench_function ( format ! ( "verify_transcript_{mode}" ) , |bench| {
194
207
bench. iter_batched (
195
208
|| {
196
209
let dealings = create_dealings ( & params, & env. crypto_components ) ;
@@ -211,11 +224,15 @@ fn bench_verify_transcript<M: Measurement>(
211
224
} ) ;
212
225
}
213
226
214
- fn bench_load_transcript < M : Measurement > ( group : & mut BenchmarkGroup < ' _ , M > , test_case : & TestCase ) {
227
+ fn bench_load_transcript < M : Measurement > (
228
+ group : & mut BenchmarkGroup < ' _ , M > ,
229
+ test_case : & TestCase ,
230
+ mode : & IDkgMode ,
231
+ ) {
215
232
let env = test_case. new_test_environment ( ) ;
216
- let params = env . params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
233
+ let params = mode . setup_params ( & env ) ;
217
234
218
- group. bench_function ( "load_transcript" , |bench| {
235
+ group. bench_function ( format ! ( "load_transcript_{mode}" ) , |bench| {
219
236
bench. iter_batched (
220
237
|| {
221
238
let dealings = create_dealings ( & params, & env. crypto_components ) ;
@@ -239,7 +256,7 @@ fn bench_load_transcript<M: Measurement>(group: &mut BenchmarkGroup<'_, M>, test
239
256
fn bench_retain_active_transcripts < M : Measurement > (
240
257
group : & mut BenchmarkGroup < ' _ , M > ,
241
258
test_case : & TestCase ,
242
- num_pre_sig_quadruples : usize ,
259
+ num_pre_sig_quadruples : i32 ,
243
260
) {
244
261
let env = test_case. new_test_environment ( ) ;
245
262
let key_transcript = generate_key_transcript ( & env) ;
@@ -545,11 +562,64 @@ fn generate_pre_sig_quadruple(
545
562
. unwrap_or_else ( |error| panic ! ( "failed to create pre-signature quadruple: {:?}" , error) )
546
563
}
547
564
565
+ fn setup_reshare_of_masked_params (
566
+ env : & CanisterThresholdSigTestEnvironment ,
567
+ ) -> IDkgTranscriptParams {
568
+ let params = env. params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
569
+ let masked_transcript = run_idkg_without_complaint ( & params, & env. crypto_components ) ;
570
+ let reshare_params = build_params_from_previous (
571
+ params,
572
+ IDkgTranscriptOperation :: ReshareOfMasked ( masked_transcript) ,
573
+ ) ;
574
+ load_previous_transcripts_for_all_dealers ( & reshare_params, & env. crypto_components ) ;
575
+ reshare_params
576
+ }
577
+
578
+ fn setup_reshare_of_unmasked_params (
579
+ env : & CanisterThresholdSigTestEnvironment ,
580
+ ) -> IDkgTranscriptParams {
581
+ let params = env. params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
582
+ let masked_transcript = run_idkg_without_complaint ( & params, & env. crypto_components ) ;
583
+ let unmasked_params = build_params_from_previous (
584
+ params,
585
+ IDkgTranscriptOperation :: ReshareOfMasked ( masked_transcript) ,
586
+ ) ;
587
+ load_previous_transcripts_for_all_dealers ( & unmasked_params, & env. crypto_components ) ;
588
+ let unmasked_transcript = run_idkg_without_complaint ( & unmasked_params, & env. crypto_components ) ;
589
+ let unmasked_reshare_params = build_params_from_previous (
590
+ unmasked_params,
591
+ IDkgTranscriptOperation :: ReshareOfUnmasked ( unmasked_transcript) ,
592
+ ) ;
593
+ load_previous_transcripts_for_all_dealers ( & unmasked_reshare_params, & env. crypto_components ) ;
594
+ unmasked_reshare_params
595
+ }
596
+
597
+ fn setup_unmasked_times_masked_params (
598
+ env : & CanisterThresholdSigTestEnvironment ,
599
+ ) -> IDkgTranscriptParams {
600
+ let masked_params = env. params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ;
601
+ let masked_random_transcript =
602
+ run_idkg_without_complaint ( & masked_params, & env. crypto_components ) ;
603
+
604
+ let unmasked_params = build_params_from_previous (
605
+ masked_params,
606
+ IDkgTranscriptOperation :: ReshareOfMasked ( masked_random_transcript. clone ( ) ) ,
607
+ ) ;
608
+ load_previous_transcripts_for_all_dealers ( & unmasked_params, & env. crypto_components ) ;
609
+ let unmasked_transcript = run_idkg_without_complaint ( & unmasked_params, & env. crypto_components ) ;
610
+
611
+ let product_params = build_params_from_previous (
612
+ unmasked_params,
613
+ IDkgTranscriptOperation :: UnmaskedTimesMasked ( unmasked_transcript, masked_random_transcript) ,
614
+ ) ;
615
+ load_previous_transcripts_for_all_dealers ( & product_params, & env. crypto_components ) ;
616
+ product_params
617
+ }
618
+
548
619
struct TestCase {
549
620
sample_size : usize ,
550
621
sampling_mode : SamplingMode ,
551
622
num_of_nodes : usize ,
552
- operation_type : IDkgMode ,
553
623
}
554
624
555
625
impl Default for TestCase {
@@ -558,7 +628,6 @@ impl Default for TestCase {
558
628
sample_size : 100 ,
559
629
sampling_mode : SamplingMode :: Auto ,
560
630
num_of_nodes : 0 ,
561
- operation_type : IDkgMode :: Random ,
562
631
}
563
632
}
564
633
}
@@ -570,8 +639,7 @@ impl TestCase {
570
639
571
640
fn name ( & self ) -> String {
572
641
format ! (
573
- "crypto_idkg_{}_{}_nodes_{}_dealers_{}_receivers" ,
574
- self . operation_type,
642
+ "crypto_idkg_{}_nodes_{}_dealers_{}_receivers" ,
575
643
self . num_of_nodes,
576
644
self . num_of_dealers( ) ,
577
645
self . num_of_receivers( )
@@ -587,12 +655,23 @@ impl TestCase {
587
655
}
588
656
}
589
657
590
- #[ derive( Clone , Debug , PartialEq , Eq , Hash ) ]
658
+ #[ derive( Clone , Debug , PartialEq , Eq , Hash , EnumIter ) ]
591
659
enum IDkgMode {
592
660
Random ,
593
- // TODO CRP-1471: add benchmarks for resharing and product
594
- // ReshareOfMasked,
595
- // UnmaskedTimesMasked,
661
+ ReshareOfMasked ,
662
+ ReshareOfUnmasked ,
663
+ UnmaskedTimesMasked ,
664
+ }
665
+
666
+ impl IDkgMode {
667
+ fn setup_params ( & self , env : & CanisterThresholdSigTestEnvironment ) -> IDkgTranscriptParams {
668
+ match self {
669
+ IDkgMode :: Random => env. params_for_random_sharing ( AlgorithmId :: ThresholdEcdsaSecp256k1 ) ,
670
+ IDkgMode :: ReshareOfMasked => setup_reshare_of_masked_params ( env) ,
671
+ IDkgMode :: ReshareOfUnmasked => setup_reshare_of_unmasked_params ( env) ,
672
+ IDkgMode :: UnmaskedTimesMasked => setup_unmasked_times_masked_params ( env) ,
673
+ }
674
+ }
596
675
}
597
676
598
677
impl Display for IDkgMode {
@@ -602,9 +681,9 @@ impl Display for IDkgMode {
602
681
"{}" ,
603
682
match self {
604
683
IDkgMode :: Random => "random" ,
605
- // TODO CRP-1471: add benchmarks for resharing and product
606
- // IDkgMode::ReshareOfMasked => "reshare ",
607
- // IDkgMode::UnmaskedTimesMasked => "product",
684
+ IDkgMode :: ReshareOfMasked => "reshare_of_masked" ,
685
+ IDkgMode :: ReshareOfUnmasked => "reshare_of_unmasked " ,
686
+ IDkgMode :: UnmaskedTimesMasked => "product" ,
608
687
}
609
688
)
610
689
}
0 commit comments