Skip to content

Commit 3d7d771

Browse files
committed
Signer signs local snapshots #178
Signed-off-by: DJO <[email protected]>
1 parent 9c80039 commit 3d7d771

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

mithril-common/src/fake_data.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![allow(dead_code)]
22

3+
use crate::digesters::DigesterResult;
34
use std::time::{SystemTime, UNIX_EPOCH};
45

56
use crate::entities;
@@ -26,6 +27,14 @@ pub fn digest(beacon: &entities::Beacon) -> Vec<u8> {
2627
.to_vec()
2728
}
2829

30+
/// Fake DigesterResult
31+
pub fn digester_result(digest: &str) -> DigesterResult {
32+
DigesterResult {
33+
digest: digest.to_string(),
34+
last_immutable_file_number: 0,
35+
}
36+
}
37+
2938
/// Fake ProtocolParameters
3039
pub fn protocol_parameters() -> entities::ProtocolParameters {
3140
let k = 5;

mithril-signer/src/runtime.rs

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use tokio::time::sleep;
77
use crate::certificate_handler::CertificateHandlerError;
88
use crate::single_signer::SingleSignerError;
99
use mithril_common::crypto_helper::{key_encode_hex, Bytes};
10-
use mithril_common::digesters::Digester;
10+
use mithril_common::digesters::{Digester, DigesterError};
1111
use mithril_common::entities::{self, Beacon, CertificatePending, SignerWithStake};
1212
use mithril_common::fake_data;
1313

@@ -33,6 +33,8 @@ pub enum RuntimeError {
3333
RegisterSignerFailed(String),
3434
#[error("codec error:`{0}`")]
3535
Codec(String),
36+
#[error("digest computation failed: `{0}`")]
37+
Digester(#[from] DigesterError),
3638
}
3739

3840
impl Runtime {
@@ -66,12 +68,12 @@ impl Runtime {
6668
.retrieve_pending_certificate()
6769
.await?
6870
{
69-
let message = fake_data::digest(&pending_certificate.beacon);
70-
7171
self.register_to_aggregator_if_needed().await?;
7272

7373
if self.should_register_signature(&pending_certificate.beacon) {
74-
self.register_signature(message, pending_certificate)
74+
let message = self.digester.compute_digest()?;
75+
info!("Signing digest"; "digester_result" => #?message);
76+
self.register_signature(message.digest.into_bytes(), pending_certificate)
7577
.await?;
7678
}
7779
}
@@ -81,8 +83,19 @@ impl Runtime {
8183

8284
fn should_register_signature(&self, new_beacon: &Beacon) -> bool {
8385
match &self.current_beacon {
84-
None => true,
85-
Some(beacon) => beacon != new_beacon,
86+
None => {
87+
info!("Unknown beacon, signatures will be registered ...");
88+
true
89+
}
90+
Some(beacon) => {
91+
if beacon != new_beacon {
92+
info!("The beacon changed, signatures will be registered ...");
93+
true
94+
} else {
95+
info!("Signatures already registered for this beacon");
96+
false
97+
}
98+
}
8699
}
87100
}
88101

@@ -263,13 +276,16 @@ mod tests {
263276
.return_once(move || party_id);
264277
mock_single_signer
265278
.expect_get_protocol_initializer()
266-
.return_once(move || Some(protocol_initializer.clone()));
279+
.return_once(move || Some(protocol_initializer));
267280
mock_single_signer
268281
.expect_get_is_registered()
269282
.return_once(|| false);
270283
mock_single_signer
271284
.expect_update_is_registered()
272285
.return_once(move |_| Ok(()));
286+
mock_digester
287+
.expect_compute_digest()
288+
.return_once(|| Ok(fake_data::digester_result("digest")));
273289

274290
let mut signer = Runtime::new(
275291
Box::new(mock_certificate_handler),
@@ -321,6 +337,9 @@ mod tests {
321337
mock_single_signer
322338
.expect_get_protocol_initializer()
323339
.return_once(move || Some(protocol_initializer.clone()));
340+
mock_digester
341+
.expect_compute_digest()
342+
.return_once(|| Ok(fake_data::digester_result("digest")));
324343

325344
let mut signer = Runtime::new(
326345
Box::new(mock_certificate_handler),
@@ -364,6 +383,9 @@ mod tests {
364383
mock_single_signer
365384
.expect_update_is_registered()
366385
.return_once(move |_| Ok(()));
386+
mock_digester
387+
.expect_compute_digest()
388+
.return_once(|| Ok(fake_data::digester_result("digest")));
367389

368390
let mut signer = Runtime::new(
369391
Box::new(mock_certificate_handler),
@@ -391,6 +413,9 @@ mod tests {
391413
mock_single_signer
392414
.expect_get_protocol_initializer()
393415
.return_once(move || None);
416+
mock_digester
417+
.expect_compute_digest()
418+
.return_once(|| Ok(fake_data::digester_result("digest")));
394419

395420
let mut signer = Runtime::new(
396421
Box::new(mock_certificate_handler),
@@ -414,7 +439,7 @@ mod tests {
414439
let pending_certificate = fake_data::certificate_pending();
415440
let mut mock_certificate_handler = MockCertificateHandler::new();
416441
let mut mock_single_signer = MockSingleSigner::new();
417-
let mut mock_digester = MockDigesterImpl::new();
442+
let mock_digester = MockDigesterImpl::new();
418443
mock_certificate_handler
419444
.expect_retrieve_pending_certificate()
420445
.return_once(|| Ok(Some(pending_certificate)));
@@ -452,4 +477,37 @@ mod tests {
452477
signer.run().await.unwrap_err().to_string()
453478
);
454479
}
480+
481+
#[tokio::test]
482+
async fn signer_fails_if_digest_computation_fails() {
483+
let mut mock_certificate_handler = MockCertificateHandler::new();
484+
let mut mock_single_signer = MockSingleSigner::new();
485+
let mut mock_digester = MockDigesterImpl::new();
486+
let pending_certificate = fake_data::certificate_pending();
487+
mock_certificate_handler
488+
.expect_retrieve_pending_certificate()
489+
.return_once(|| Ok(Some(pending_certificate)));
490+
mock_single_signer
491+
.expect_compute_single_signatures()
492+
.never();
493+
mock_single_signer
494+
.expect_get_is_registered()
495+
.return_once(|| false);
496+
mock_single_signer
497+
.expect_get_protocol_initializer()
498+
.return_once(move || None);
499+
mock_digester
500+
.expect_compute_digest()
501+
.return_once(|| Err(DigesterError::NotEnoughImmutable()));
502+
503+
let mut signer = Runtime::new(
504+
Box::new(mock_certificate_handler),
505+
Box::new(mock_single_signer),
506+
Box::new(mock_digester),
507+
);
508+
assert_eq!(
509+
RuntimeError::Digester(DigesterError::NotEnoughImmutable()).to_string(),
510+
signer.run().await.unwrap_err().to_string()
511+
);
512+
}
455513
}

mithril-test-lab/mithril-end-to-end/src/Mithril/Signer.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ signerProcess cwd aggregatorEndpoint = do
5656
[ ("AGGREGATOR_ENDPOINT", toString aggregatorEndpoint),
5757
("NETWORK", "testnet"),
5858
("PARTY_ID", "0"),
59-
("RUN_INTERVAL", "2")
59+
("RUN_INTERVAL", "2"),
60+
("DB_DIRECTORY", "db")
6061
]
6162
<> baseEnv
6263

0 commit comments

Comments
 (0)