Skip to content

Commit 07942ed

Browse files
committed
Cleanup protocol message from multi-signer
1 parent 0291a14 commit 07942ed

File tree

4 files changed

+33
-146
lines changed

4 files changed

+33
-146
lines changed

mithril-aggregator/src/multi_signer.rs

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use async_trait::async_trait;
2-
use hex::ToHex;
32
use slog_scope::{debug, warn};
43
use std::sync::Arc;
54
use thiserror::Error;
@@ -78,15 +77,6 @@ pub enum ProtocolError {
7877
#[cfg_attr(test, automock)]
7978
#[async_trait]
8079
pub trait MultiSigner: Sync + Send {
81-
/// Get current message
82-
async fn get_current_message(&self) -> Option<entities::ProtocolMessage>;
83-
84-
/// Update current message
85-
async fn update_current_message(
86-
&mut self,
87-
message: entities::ProtocolMessage,
88-
) -> Result<(), ProtocolError>;
89-
9080
/// Get current beacon
9181
async fn get_current_beacon(&self) -> Option<entities::Beacon>;
9282

@@ -200,9 +190,6 @@ pub trait MultiSigner: Sync + Send {
200190

201191
/// MultiSignerImpl is an implementation of the MultiSigner
202192
pub struct MultiSignerImpl {
203-
/// Message that is currently signed
204-
current_message: Option<entities::ProtocolMessage>,
205-
206193
/// Beacon that is currently used
207194
current_beacon: Option<entities::Beacon>,
208195

@@ -225,7 +212,6 @@ impl MultiSignerImpl {
225212
) -> Self {
226213
debug!("New MultiSignerImpl created");
227214
Self {
228-
current_message: None,
229215
current_beacon: None,
230216
verification_key_store,
231217
stake_store,
@@ -321,23 +307,6 @@ impl MultiSignerImpl {
321307

322308
#[async_trait]
323309
impl MultiSigner for MultiSignerImpl {
324-
/// Get current message
325-
async fn get_current_message(&self) -> Option<entities::ProtocolMessage> {
326-
debug!("Get current message");
327-
self.current_message.clone()
328-
}
329-
330-
/// Update current message
331-
async fn update_current_message(
332-
&mut self,
333-
message: entities::ProtocolMessage,
334-
) -> Result<(), ProtocolError> {
335-
debug!("Update current_message"; "protocol_message" => #?message, "signed message" => message.compute_hash().encode_hex::<String>());
336-
337-
self.current_message = Some(message);
338-
Ok(())
339-
}
340-
341310
async fn get_current_beacon(&self) -> Option<entities::Beacon> {
342311
self.current_beacon.clone()
343312
}
@@ -698,23 +667,6 @@ mod tests {
698667
result
699668
}
700669

701-
#[tokio::test]
702-
async fn test_multi_signer_current_message_ok() {
703-
let mut multi_signer = setup_multi_signer().await;
704-
705-
let current_message_expected = setup_message();
706-
multi_signer
707-
.update_current_message(current_message_expected.clone())
708-
.await
709-
.expect("update current message failed");
710-
711-
let current_message = multi_signer
712-
.get_current_message()
713-
.await
714-
.expect("current message should have been retrieved");
715-
assert_eq!(current_message_expected, current_message)
716-
}
717-
718670
#[tokio::test]
719671
async fn test_multi_signer_protocol_parameters_ok() {
720672
let mut multi_signer = setup_multi_signer().await;
@@ -816,14 +768,7 @@ mod tests {
816768
Epoch::SIGNER_RECORDING_OFFSET as i64 - Epoch::SIGNER_RETRIEVAL_OFFSET,
817769
)
818770
.await;
819-
// We have to update the current message AFTER we reached the epoch for
820-
// which the signers registered for the stake distribution to be valid
821-
// hence the multisigner be able to create a Clerk and being able to
822-
// register single signatures
823-
multi_signer
824-
.update_current_message(message.clone())
825-
.await
826-
.expect("update current message failed");
771+
827772
let mut signatures = Vec::new();
828773

829774
let mut expected_certificate_signers: Vec<SignerWithStake> = Vec::new();

mithril-aggregator/src/runtime/runner.rs

Lines changed: 9 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,8 @@ pub trait AggregatorRunnerTrait: Sync + Send {
100100
new_beacon: &Beacon,
101101
) -> Result<(), Box<dyn StdError + Sync + Send>>;
102102

103-
/// Set the message to sign in the multisigner. The digest is only one part
104-
/// of the message, the next signing stake distribution must also be signed
105-
/// as part of the message.
106-
async fn update_message_in_multisigner(
103+
/// Compute the protocol message
104+
async fn compute_protocol_message(
107105
&self,
108106
digest: String,
109107
) -> Result<ProtocolMessage, Box<dyn StdError + Sync + Send>>;
@@ -138,6 +136,7 @@ pub trait AggregatorRunnerTrait: Sync + Send {
138136
async fn create_snapshot_archive(
139137
&self,
140138
beacon: &Beacon,
139+
protocol_message: &ProtocolMessage,
141140
) -> Result<OngoingSnapshot, Box<dyn StdError + Sync + Send>>;
142141

143142
/// Upload the snapshot at the given location using the configured uploader(s).
@@ -378,12 +377,12 @@ impl AggregatorRunnerTrait for AggregatorRunner {
378377
.map_err(|e| e.into())
379378
}
380379

381-
async fn update_message_in_multisigner(
380+
async fn compute_protocol_message(
382381
&self,
383382
digest: String,
384383
) -> Result<ProtocolMessage, Box<dyn StdError + Sync + Send>> {
385-
debug!("RUNNER: update message in multisigner");
386-
let mut multi_signer = self.dependencies.multi_signer.write().await;
384+
debug!("RUNNER: compute protocol message");
385+
let multi_signer = self.dependencies.multi_signer.write().await;
387386
let mut protocol_message = ProtocolMessage::new();
388387
protocol_message.set_message_part(ProtocolMessagePartKey::SnapshotDigest, digest);
389388
protocol_message.set_message_part(
@@ -393,9 +392,6 @@ impl AggregatorRunnerTrait for AggregatorRunner {
393392
.await?
394393
.unwrap_or_default(),
395394
);
396-
multi_signer
397-
.update_current_message(protocol_message.clone())
398-
.await?;
399395

400396
Ok(protocol_message)
401397
}
@@ -491,22 +487,11 @@ impl AggregatorRunnerTrait for AggregatorRunner {
491487
async fn create_snapshot_archive(
492488
&self,
493489
beacon: &Beacon,
490+
protocol_message: &ProtocolMessage,
494491
) -> Result<OngoingSnapshot, Box<dyn StdError + Sync + Send>> {
495492
debug!("RUNNER: create snapshot archive");
496493

497494
let snapshotter = self.dependencies.snapshotter.clone();
498-
let protocol_message = self
499-
.dependencies
500-
.multi_signer
501-
.read()
502-
.await
503-
.get_current_message()
504-
.await
505-
.ok_or_else(|| {
506-
RunnerError::MissingProtocolMessage(format!(
507-
"no message found for beacon '{beacon:?}'."
508-
))
509-
})?;
510495
let snapshot_digest = protocol_message
511496
.get_message_part(&ProtocolMessagePartKey::SnapshotDigest)
512497
.ok_or_else(|| {
@@ -899,41 +884,6 @@ pub mod tests {
899884
assert_eq!(expected, certificate);
900885
}
901886

902-
#[tokio::test]
903-
async fn test_update_message_in_multisigner() {
904-
let (deps, config) = initialize_dependencies().await;
905-
let deps = Arc::new(deps);
906-
let runner = AggregatorRunner::new(config, deps.clone());
907-
let digest = "1+2+3+4=10".to_string();
908-
runner.update_beacon(&fake_data::beacon()).await.unwrap();
909-
let fixture = MithrilFixtureBuilder::default().build();
910-
deps.prepare_for_genesis(
911-
fixture.signers_with_stake(),
912-
fixture.signers_with_stake(),
913-
&fixture.protocol_parameters(),
914-
)
915-
.await;
916-
917-
runner
918-
.update_message_in_multisigner(digest)
919-
.await
920-
.expect("update_message_in_multisigner should not fail");
921-
let message = deps
922-
.multi_signer
923-
.read()
924-
.await
925-
.get_current_message()
926-
.await
927-
.unwrap();
928-
929-
assert_eq!(
930-
"1+2+3+4=10",
931-
message
932-
.get_message_part(&ProtocolMessagePartKey::SnapshotDigest)
933-
.unwrap()
934-
);
935-
}
936-
937887
#[tokio::test]
938888
async fn test_save_pending_certificate() {
939889
let (deps, config) = initialize_dependencies().await;
@@ -1012,16 +962,13 @@ pub mod tests {
1012962
ProtocolMessagePartKey::SnapshotDigest,
1013963
"test+digest".to_string(),
1014964
);
1015-
let mut mock_multi_signer = MockMultiSigner::new();
1016-
mock_multi_signer
1017-
.expect_get_current_message()
1018-
.return_once(move || Some(message));
965+
let mock_multi_signer = MockMultiSigner::new();
1019966
let (mut deps, config) = initialize_dependencies().await;
1020967
deps.multi_signer = Arc::new(RwLock::new(mock_multi_signer));
1021968
let runner = AggregatorRunner::new(config, Arc::new(deps));
1022969

1023970
let ongoing_snapshot = runner
1024-
.create_snapshot_archive(&beacon)
971+
.create_snapshot_archive(&beacon, &message)
1025972
.await
1026973
.expect("create_snapshot_archive should not fail");
1027974

mithril-aggregator/src/runtime/state_machine.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use crate::runtime::{AggregatorRunnerTrait, RuntimeError};
1+
use crate::{
2+
database::provider::OpenMessage,
3+
runtime::{AggregatorRunnerTrait, RuntimeError},
4+
};
25

36
use mithril_common::entities::{Beacon, SignedEntityType};
47
use slog_scope::{crit, info, trace, warn};
@@ -19,6 +22,7 @@ pub struct ReadyState {
1922
#[derive(Clone, Debug, PartialEq)]
2023
pub struct SigningState {
2124
current_beacon: Beacon,
25+
open_message: OpenMessage,
2226
}
2327

2428
#[derive(Clone, Debug, PartialEq)]
@@ -270,12 +274,9 @@ impl AggregatorRuntime {
270274
state: SigningState,
271275
) -> Result<IdleState, RuntimeError> {
272276
trace!("launching transition from SIGNING to IDLE state");
273-
// TODO: Temporary, we need to compute the signed entity type from the current open message
274-
let signed_entity_type =
275-
SignedEntityType::CardanoImmutableFilesFull(state.current_beacon.clone());
276277
let certificate = self
277278
.runner
278-
.create_certificate(&signed_entity_type)
279+
.create_certificate(&state.open_message.signed_entity_type)
279280
.await?
280281
.ok_or_else(|| RuntimeError::KeepState {
281282
message: "not enough signature yet to create a certificate, waiting…".to_string(),
@@ -285,7 +286,7 @@ impl AggregatorRuntime {
285286
self.runner.drop_pending_certificate().await?;
286287
let ongoing_snapshot = self
287288
.runner
288-
.create_snapshot_archive(&state.current_beacon)
289+
.create_snapshot_archive(&state.current_beacon, &state.open_message.protocol_message)
289290
.await?;
290291
let locations = self
291292
.runner
@@ -323,16 +324,16 @@ impl AggregatorRuntime {
323324
new_beacon: Beacon,
324325
) -> Result<SigningState, RuntimeError> {
325326
trace!("launching transition from READY to SIGNING state");
326-
// TODO: Temporary, we need to compute the signed entity type from the current open message
327+
// TODO: Temporary, we need to compute the signed entity type for other types than Cardano immutable files
327328
let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(new_beacon.clone());
328329
self.runner.update_beacon(&new_beacon).await?;
329330

330331
let digester_result = self.runner.compute_digest(&new_beacon).await?;
331332
let protocol_message = self
332333
.runner
333-
.update_message_in_multisigner(digester_result)
334+
.compute_protocol_message(digester_result)
334335
.await?;
335-
let _open_message = self
336+
let open_message = self
336337
.runner
337338
.create_open_message(&signed_entity_type, &protocol_message)
338339
.await?;
@@ -348,6 +349,7 @@ impl AggregatorRuntime {
348349
.await?;
349350
let state = SigningState {
350351
current_beacon: new_beacon,
352+
open_message,
351353
};
352354

353355
Ok(state)
@@ -589,7 +591,7 @@ mod tests {
589591
.once()
590592
.returning(|_| Ok(()));
591593
runner
592-
.expect_update_message_in_multisigner()
594+
.expect_compute_protocol_message()
593595
.with(predicate::eq("whatever".to_string()))
594596
.once()
595597
.returning(|_| Ok(ProtocolMessage::new()));
@@ -640,6 +642,7 @@ mod tests {
640642

641643
beacon
642644
},
645+
open_message: OpenMessage::dummy(),
643646
};
644647
let mut runtime = init_runtime(Some(AggregatorState::Signing(state)), runner).await;
645648
runtime.cycle().await.unwrap();
@@ -660,6 +663,7 @@ mod tests {
660663
.returning(|_| Ok(None));
661664
let state = SigningState {
662665
current_beacon: fake_data::beacon(),
666+
open_message: OpenMessage::dummy(),
663667
};
664668
let mut runtime = init_runtime(Some(AggregatorState::Signing(state)), runner).await;
665669
runtime

mithril-aggregator/tests/test_extensions/runtime_tester.rs

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ use mithril_aggregator::{
1515
AggregatorRuntime, Configuration, DumbSnapshotUploader, DumbSnapshotter,
1616
ProtocolParametersStorer, SignerRegisterer,
1717
};
18-
use mithril_common::crypto_helper::{key_encode_hex, ProtocolClerk, ProtocolGenesisSigner};
18+
use mithril_common::crypto_helper::{ProtocolClerk, ProtocolGenesisSigner};
1919
use mithril_common::digesters::DumbImmutableFileObserver;
2020
use mithril_common::entities::{
21-
Certificate, Epoch, ImmutableFileNumber, SignedEntityType, SignerWithStake, SingleSignatures,
22-
Snapshot, StakeDistribution,
21+
Certificate, Epoch, ImmutableFileNumber, SignedEntityType, SignerWithStake, Snapshot,
22+
StakeDistribution,
2323
};
2424
use mithril_common::{chain_observer::FakeObserver, digesters::DumbImmutableDigester};
2525

@@ -268,24 +268,15 @@ impl RuntimeTester {
268268
signers: &[SignerFixture],
269269
) -> Result<(), String> {
270270
let certifier_service = self.deps_builder.get_certifier_service().await.unwrap();
271-
let lock = self.deps_builder.get_multi_signer().await.unwrap();
272-
let multisigner = lock.read().await;
273-
let message = multisigner
274-
.get_current_message()
271+
let message = certifier_service
272+
.get_open_message(signed_entity_type)
275273
.await
276-
.ok_or("There should be a message to be signed.")?;
274+
.unwrap()
275+
.ok_or("There should be a message to be signed.")?
276+
.protocol_message;
277277

278278
for signer_fixture in signers {
279-
if let Some(signature) = signer_fixture
280-
.protocol_signer
281-
.sign(message.compute_hash().as_bytes())
282-
{
283-
let single_signatures = SingleSignatures::new(
284-
signer_fixture.signer_with_stake.party_id.to_owned(),
285-
key_encode_hex(&signature).expect("hex encoding should not fail"),
286-
signature.indexes,
287-
);
288-
279+
if let Some(single_signatures) = signer_fixture.sign(&message) {
289280
certifier_service
290281
.register_single_signature(signed_entity_type, &single_signatures)
291282
.await

0 commit comments

Comments
 (0)