@@ -12,8 +12,10 @@ use clap::Parser;
12
12
use indicatif:: { ProgressBar , ProgressDrawTarget } ;
13
13
use mithril_common:: {
14
14
digesters:: DummyImmutablesDbBuilder ,
15
- entities:: { Epoch , PartyId , ProtocolParameters } ,
16
- messages:: { EpochSettingsMessage , RegisterSignerMessage } ,
15
+ entities:: {
16
+ Epoch , PartyId , ProtocolMessage , ProtocolParameters , SignedEntityType , SingleSignatures ,
17
+ } ,
18
+ messages:: { EpochSettingsMessage , RegisterSignatureMessage , RegisterSignerMessage } ,
17
19
test_utils:: { MithrilFixture , MithrilFixtureBuilder } ,
18
20
StdResult ,
19
21
} ;
@@ -54,6 +56,13 @@ pub enum LoadError {
54
56
got_http_code : u32 ,
55
57
error_message : String ,
56
58
} ,
59
+ #[ error( "Registering signatures for party_id={party_id}, expected HTTP code {expected_http_code} got {got_http_code} with the message: {error_message}." ) ]
60
+ SignaturesRegistrationError {
61
+ party_id : PartyId ,
62
+ expected_http_code : u32 ,
63
+ got_http_code : u32 ,
64
+ error_message : String ,
65
+ } ,
57
66
}
58
67
59
68
fn init_logger ( opts : & MainOpts ) -> slog_scope:: GlobalLoggerGuard {
@@ -68,14 +77,18 @@ fn init_logger(opts: &MainOpts) -> slog_scope::GlobalLoggerGuard {
68
77
}
69
78
70
79
/// Generate signer data
71
- pub fn generate_signer_data ( number_of_signers : usize ) -> MithrilFixture {
80
+ pub fn generate_signer_data (
81
+ number_of_signers : usize ,
82
+ protocol_parameters : ProtocolParameters ,
83
+ ) -> MithrilFixture {
72
84
MithrilFixtureBuilder :: default ( )
73
85
. with_signers ( number_of_signers)
86
+ . with_protocol_parameters ( protocol_parameters)
74
87
. build ( )
75
88
}
76
89
77
- /// Generate signer registration
78
- pub fn generate_register_message (
90
+ /// Generate signer registration message
91
+ pub fn generate_register_signer_message (
79
92
signers_fixture : & MithrilFixture ,
80
93
epoch : Epoch ,
81
94
) -> Vec < RegisterSignerMessage > {
@@ -93,6 +106,22 @@ pub fn generate_register_message(
93
106
. collect :: < Vec < _ > > ( )
94
107
}
95
108
109
+ /// Generate register signature message
110
+ pub fn generate_register_signature_message (
111
+ signatures : & [ SingleSignatures ] ,
112
+ signed_entity_type : SignedEntityType ,
113
+ ) -> Vec < RegisterSignatureMessage > {
114
+ signatures
115
+ . iter ( )
116
+ . map ( |s| RegisterSignatureMessage {
117
+ signed_entity_type : Some ( signed_entity_type. clone ( ) ) ,
118
+ party_id : s. party_id . clone ( ) ,
119
+ signature : s. signature . clone ( ) . to_json_hex ( ) . unwrap ( ) ,
120
+ won_indexes : s. won_indexes . clone ( ) ,
121
+ } )
122
+ . collect :: < Vec < _ > > ( )
123
+ }
124
+
96
125
/// Wait for http response until timeout
97
126
pub async fn wait_for_http_response ( url : & str , timeout : Duration , message : & str ) -> StdResult < ( ) > {
98
127
spin_while_waiting ! (
@@ -178,7 +207,7 @@ pub async fn register_signers_to_aggregator(
178
207
signers_fixture : & MithrilFixture ,
179
208
epoch : Epoch ,
180
209
) -> StdResult < usize > {
181
- let register_messages = generate_register_message ( signers_fixture, epoch) ;
210
+ let register_messages = generate_register_signer_message ( signers_fixture, epoch) ;
182
211
183
212
let mut join_set: JoinSet < StdResult < ( ) > > = JoinSet :: new ( ) ;
184
213
let progress_bar = ProgressBar :: with_draw_target (
@@ -214,7 +243,56 @@ pub async fn register_signers_to_aggregator(
214
243
progress_bar. inc ( 1 ) ;
215
244
216
245
if res. is_err ( ) {
217
- // eprintln!("Signer error caught: {res:?}");
246
+ warn ! ( "Signer Registration error caught: {res:?}" ) ;
247
+ errors += 1 ;
248
+ }
249
+ }
250
+
251
+ Ok ( errors)
252
+ }
253
+
254
+ pub async fn register_signatures_to_aggregator (
255
+ aggregator : & Aggregator ,
256
+ signatures : & [ SingleSignatures ] ,
257
+ signed_entity_type : SignedEntityType ,
258
+ ) -> StdResult < usize > {
259
+ let register_messages = generate_register_signature_message ( signatures, signed_entity_type) ;
260
+
261
+ let mut join_set: JoinSet < StdResult < ( ) > > = JoinSet :: new ( ) ;
262
+ let progress_bar = ProgressBar :: with_draw_target (
263
+ Some ( register_messages. len ( ) as u64 ) ,
264
+ ProgressDrawTarget :: stdout ( ) ,
265
+ ) ;
266
+ for register in register_messages {
267
+ let endpoint = aggregator. endpoint ( ) ;
268
+ join_set. spawn ( async move {
269
+ let response = reqwest:: Client :: new ( )
270
+ . post ( format ! ( "{}/register-signatures" , endpoint) )
271
+ . json ( & register)
272
+ . send ( )
273
+ . await
274
+ . unwrap ( ) ;
275
+
276
+ match response. status ( ) {
277
+ StatusCode :: CREATED => Ok ( ( ) ) ,
278
+ status => Err ( LoadError :: SignaturesRegistrationError {
279
+ expected_http_code : 201 ,
280
+ got_http_code : status. as_u16 ( ) as u32 ,
281
+ party_id : register. party_id ,
282
+ error_message : response. text ( ) . await . unwrap ( ) ,
283
+ }
284
+ . into ( ) ) ,
285
+ }
286
+ } ) ;
287
+ }
288
+ let mut errors = 0 ;
289
+
290
+ while let Some ( res) = join_set. join_next ( ) . await {
291
+ let res = res. expect ( "Tokio task join failed!" ) ;
292
+ progress_bar. inc ( 1 ) ;
293
+
294
+ if res. is_err ( ) {
295
+ warn ! ( "Signer Signature Registration error caught: {res:?}" ) ;
218
296
errors += 1 ;
219
297
}
220
298
}
@@ -363,7 +441,25 @@ async fn main() -> StdResult<()> {
363
441
info ! ( ">> Starting stress test with options: {opts:?}" ) ;
364
442
365
443
info ! ( ">> Creation of the Signer Key Registrations payloads" ) ;
366
- let signers_fixture = generate_signer_data ( opts. num_signers ) ;
444
+ let signers_fixture =
445
+ generate_signer_data ( opts. num_signers , ProtocolParameters :: new ( 5 , 100 , 0.65 ) ) ;
446
+
447
+ info ! ( ">> Precompute message & signatures for MithrilStakeDistribution signed entity" ) ;
448
+ let mithril_stake_distribution_message = {
449
+ let mut message = ProtocolMessage :: new ( ) ;
450
+ message. set_message_part (
451
+ mithril_common:: entities:: ProtocolMessagePartKey :: NextAggregateVerificationKey ,
452
+ signers_fixture. compute_and_encode_avk ( ) ,
453
+ ) ;
454
+
455
+ message
456
+ } ;
457
+ let mithril_stake_distribution_signatures: Vec < SingleSignatures > = signers_fixture
458
+ . signers_fixture ( )
459
+ . iter ( )
460
+ // filter map to exclude signers that could not sign because they lost the lottery
461
+ . filter_map ( |s| s. sign ( & mithril_stake_distribution_message) )
462
+ . collect ( ) ;
367
463
368
464
info ! ( ">> Launch Aggregator" ) ;
369
465
let mut aggregator = Aggregator :: new (
@@ -382,7 +478,7 @@ async fn main() -> StdResult<()> {
382
478
aggregator. change_run_interval ( Duration :: from_secs ( 6 ) ) ;
383
479
aggregator
384
480
. set_mock_cardano_cli_file_path ( & mock_stake_distribution_file_path, & mock_epoch_file_path) ;
385
- aggregator. set_protocol_parameters ( & ProtocolParameters :: default ( ) ) ;
481
+ aggregator. set_protocol_parameters ( & signers_fixture . protocol_parameters ( ) ) ;
386
482
aggregator. serve ( ) . unwrap ( ) ;
387
483
388
484
wait_for_http_response (
@@ -430,6 +526,18 @@ async fn main() -> StdResult<()> {
430
526
info ! ( ">> Wait for pending certificate to be available" ) ;
431
527
wait_for_pending_certificate ( & aggregator, Duration :: from_secs ( 30 ) ) . await ?;
432
528
529
+ info ! (
530
+ ">> Send the Signer Signatures Registrations payloads for MithrilStakeDistribution({:?})" ,
531
+ current_epoch
532
+ ) ;
533
+ let errors = register_signatures_to_aggregator (
534
+ & aggregator,
535
+ & mithril_stake_distribution_signatures,
536
+ SignedEntityType :: MithrilStakeDistribution ( current_epoch) ,
537
+ )
538
+ . await ?;
539
+ assert_eq ! ( 0 , errors) ;
540
+
433
541
info ! ( ">> All steps executed successfully, stopping all tasks..." ) ;
434
542
435
543
aggregator. stop ( ) . await . unwrap ( ) ;
0 commit comments