Skip to content

Commit 75a794d

Browse files
jpraynaudAlenar
authored andcommitted
Send single signatures for Mithil Stake Distribution
1 parent 6daf046 commit 75a794d

File tree

1 file changed

+117
-9
lines changed
  • mithril-test-lab/mithril-end-to-end/src/bin/load-aggregator

1 file changed

+117
-9
lines changed

mithril-test-lab/mithril-end-to-end/src/bin/load-aggregator/main.rs

Lines changed: 117 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ use clap::Parser;
1212
use indicatif::{ProgressBar, ProgressDrawTarget};
1313
use mithril_common::{
1414
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},
1719
test_utils::{MithrilFixture, MithrilFixtureBuilder},
1820
StdResult,
1921
};
@@ -54,6 +56,13 @@ pub enum LoadError {
5456
got_http_code: u32,
5557
error_message: String,
5658
},
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+
},
5766
}
5867

5968
fn init_logger(opts: &MainOpts) -> slog_scope::GlobalLoggerGuard {
@@ -68,14 +77,18 @@ fn init_logger(opts: &MainOpts) -> slog_scope::GlobalLoggerGuard {
6877
}
6978

7079
/// 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 {
7284
MithrilFixtureBuilder::default()
7385
.with_signers(number_of_signers)
86+
.with_protocol_parameters(protocol_parameters)
7487
.build()
7588
}
7689

77-
/// Generate signer registration
78-
pub fn generate_register_message(
90+
/// Generate signer registration message
91+
pub fn generate_register_signer_message(
7992
signers_fixture: &MithrilFixture,
8093
epoch: Epoch,
8194
) -> Vec<RegisterSignerMessage> {
@@ -93,6 +106,22 @@ pub fn generate_register_message(
93106
.collect::<Vec<_>>()
94107
}
95108

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+
96125
/// Wait for http response until timeout
97126
pub async fn wait_for_http_response(url: &str, timeout: Duration, message: &str) -> StdResult<()> {
98127
spin_while_waiting!(
@@ -178,7 +207,7 @@ pub async fn register_signers_to_aggregator(
178207
signers_fixture: &MithrilFixture,
179208
epoch: Epoch,
180209
) -> StdResult<usize> {
181-
let register_messages = generate_register_message(signers_fixture, epoch);
210+
let register_messages = generate_register_signer_message(signers_fixture, epoch);
182211

183212
let mut join_set: JoinSet<StdResult<()>> = JoinSet::new();
184213
let progress_bar = ProgressBar::with_draw_target(
@@ -214,7 +243,56 @@ pub async fn register_signers_to_aggregator(
214243
progress_bar.inc(1);
215244

216245
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:?}");
218296
errors += 1;
219297
}
220298
}
@@ -363,7 +441,25 @@ async fn main() -> StdResult<()> {
363441
info!(">> Starting stress test with options: {opts:?}");
364442

365443
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();
367463

368464
info!(">> Launch Aggregator");
369465
let mut aggregator = Aggregator::new(
@@ -382,7 +478,7 @@ async fn main() -> StdResult<()> {
382478
aggregator.change_run_interval(Duration::from_secs(6));
383479
aggregator
384480
.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());
386482
aggregator.serve().unwrap();
387483

388484
wait_for_http_response(
@@ -430,6 +526,18 @@ async fn main() -> StdResult<()> {
430526
info!(">> Wait for pending certificate to be available");
431527
wait_for_pending_certificate(&aggregator, Duration::from_secs(30)).await?;
432528

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+
433541
info!(">> All steps executed successfully, stopping all tasks...");
434542

435543
aggregator.stop().await.unwrap();

0 commit comments

Comments
 (0)