Skip to content

Commit 1575d78

Browse files
committed
perf(crypto): CRP-2039 add benchmarks for IDKG with complaints
1 parent 1782b6a commit 1575d78

File tree

3 files changed

+342
-167
lines changed

3 files changed

+342
-167
lines changed

rs/crypto/benches/idkg.rs

Lines changed: 189 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ use criterion::BatchSize::SmallInput;
33
use criterion::{criterion_group, criterion_main, BenchmarkGroup, Criterion, SamplingMode};
44
use ic_crypto_test_utils_canister_threshold_sigs::node::{Node, Nodes};
55
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,
89
};
910
use ic_crypto_test_utils_reproducible_rng::ReproducibleRng;
1011
use ic_interfaces::crypto::IDkgProtocol;
@@ -65,6 +66,11 @@ fn crypto_idkg_benchmarks(criterion: &mut Criterion) {
6566

6667
bench_retain_active_transcripts(group, &test_case, 1, vault_type, rng);
6768

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+
6874
// The following benchmarks are not affected by the choice of the
6975
// vault, we benchmark them only once with the default vault type.
7076
if vault_type == VaultType::default() {
@@ -79,6 +85,12 @@ fn crypto_idkg_benchmarks(criterion: &mut Criterion) {
7985
IDkgMode::iter().for_each(|mode| {
8086
bench_verify_transcript(group, &test_case, &mode, vault_type, rng)
8187
});
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+
}
8294
}
8395
}
8496
}
@@ -118,14 +130,14 @@ fn bench_verify_dealing_public<M: Measurement, R: RngCore + CryptoRng>(
118130
let params = mode.setup_params(&env, test_case.alg(), &dealers, &receivers, rng);
119131

120132
group.bench_function(format!("verify_dealing_public_{mode}"), |bench| {
121-
bench.iter_batched(
133+
bench.iter_batched_ref(
122134
|| {
123135
let receiver = env.nodes.random_receiver(params.receivers(), rng);
124136
let dealer = env.nodes.random_dealer(&params, rng);
125137
let dealing = create_dealing(dealer, &params);
126138
(receiver, dealing)
127139
},
128-
|(receiver, dealing)| verify_dealing_public(receiver, &params, &dealing),
140+
|(receiver, dealing)| verify_dealing_public(receiver, &params, dealing),
129141
SmallInput,
130142
)
131143
});
@@ -144,14 +156,14 @@ fn bench_verify_dealing_private<M: Measurement, R: RngCore + CryptoRng>(
144156
let params = mode.setup_params(&env, test_case.alg(), &dealers, &receivers, rng);
145157

146158
group.bench_function(format!("verify_dealing_private_{mode}"), |bench| {
147-
bench.iter_batched(
159+
bench.iter_batched_ref(
148160
|| {
149161
let receiver = env.nodes.random_receiver(params.receivers(), rng);
150162
let dealer = env.nodes.random_dealer(&params, rng);
151163
let dealing = create_dealing(dealer, &params);
152164
(receiver, dealing)
153165
},
154-
|(receiver, dealing)| verify_dealing_private(receiver, &params, &dealing),
166+
|(receiver, dealing)| verify_dealing_private(receiver, &params, dealing),
155167
SmallInput,
156168
)
157169
});
@@ -179,7 +191,7 @@ fn bench_verify_initial_dealings<M: Measurement, R: RngCore + CryptoRng>(
179191
.choose_dealers_and_receivers(&IDkgParticipants::AllNodesAsDealersAndReceivers, rng);
180192

181193
group.bench_function("verify_initial_dealings", |bench| {
182-
bench.iter_batched(
194+
bench.iter_batched_ref(
183195
|| {
184196
let initial_params = dealers_env.params_for_random_sharing(
185197
&src_dealers,
@@ -224,7 +236,7 @@ fn bench_verify_initial_dealings<M: Measurement, R: RngCore + CryptoRng>(
224236
(reshare_of_unmasked_params, initial_dealings, receiver)
225237
},
226238
|(params, initial_dealings, receiver)| {
227-
verify_initial_dealings(receiver, &params, &initial_dealings)
239+
verify_initial_dealings(receiver, params, initial_dealings)
228240
},
229241
SmallInput,
230242
)
@@ -244,7 +256,7 @@ fn bench_create_transcript<M: Measurement, R: RngCore + CryptoRng>(
244256
let params = mode.setup_params(&env, test_case.alg(), &dealers, &receivers, rng);
245257

246258
group.bench_function(format!("create_transcript_{mode}"), |bench| {
247-
bench.iter_batched(
259+
bench.iter_batched_ref(
248260
|| {
249261
let receiver = env.nodes.random_receiver(params.receivers(), rng);
250262
let dealings = env.nodes.create_dealings(&params);
@@ -253,7 +265,7 @@ fn bench_create_transcript<M: Measurement, R: RngCore + CryptoRng>(
253265
.support_dealings_from_all_receivers(dealings, &params);
254266
(receiver, dealings_with_receivers_support)
255267
},
256-
|(receiver, dealings)| create_transcript(receiver, &params, &dealings),
268+
|(receiver, dealings)| create_transcript(receiver, &params, dealings),
257269
SmallInput,
258270
)
259271
});
@@ -272,7 +284,7 @@ fn bench_verify_transcript<M: Measurement, R: RngCore + CryptoRng>(
272284
let params = mode.setup_params(&env, test_case.alg(), &dealers, &receivers, rng);
273285

274286
group.bench_function(format!("verify_transcript_{mode}"), |bench| {
275-
bench.iter_batched(
287+
bench.iter_batched_ref(
276288
|| {
277289
let dealings = env.nodes.create_dealings(&params);
278290
let dealings_with_receivers_support = env
@@ -289,7 +301,7 @@ fn bench_verify_transcript<M: Measurement, R: RngCore + CryptoRng>(
289301
);
290302
(other_receiver, transcript)
291303
},
292-
|(receiver, transcript)| verify_transcript(receiver, &params, &transcript),
304+
|(receiver, transcript)| verify_transcript(receiver, &params, transcript),
293305
SmallInput,
294306
)
295307
});
@@ -308,7 +320,7 @@ fn bench_load_transcript<M: Measurement, R: RngCore + CryptoRng>(
308320
let params = mode.setup_params(&env, test_case.alg(), &dealers, &receivers, rng);
309321

310322
group.bench_function(format!("load_transcript_{mode}"), |bench| {
311-
bench.iter_batched(
323+
bench.iter_batched_ref(
312324
|| {
313325
let dealings = env.nodes.create_dealings(&params);
314326
let dealings_with_receivers_support = env
@@ -325,7 +337,7 @@ fn bench_load_transcript<M: Measurement, R: RngCore + CryptoRng>(
325337
);
326338
(other_receiver, transcript)
327339
},
328-
|(receiver, transcript)| load_transcript(receiver, &transcript),
340+
|(receiver, transcript)| load_transcript(receiver, transcript),
329341
SmallInput,
330342
)
331343
});
@@ -370,13 +382,175 @@ fn bench_retain_active_transcripts<M: Measurement, R: RngCore + CryptoRng>(
370382
load_pre_signature_quadruple(receiver, &pre_sig_quadruple);
371383
}
372384
},
373-
|_| retain_active_transcripts(receiver, &transcripts_to_keep),
385+
|()| retain_active_transcripts(receiver, &transcripts_to_keep),
374386
SmallInput,
375387
)
376388
},
377389
);
378390
}
379391

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+
380554
fn create_dealing(dealer: &Node, params: &IDkgTranscriptParams) -> SignedIDkgDealing {
381555
dealer.create_dealing(params).unwrap_or_else(|error| {
382556
panic!(

0 commit comments

Comments
 (0)