@@ -7,7 +7,7 @@ use tokio::time::sleep;
77use crate :: certificate_handler:: CertificateHandlerError ;
88use crate :: single_signer:: SingleSignerError ;
99use mithril_common:: crypto_helper:: { key_encode_hex, Bytes } ;
10- use mithril_common:: digesters:: Digester ;
10+ use mithril_common:: digesters:: { Digester , DigesterError } ;
1111use mithril_common:: entities:: { self , Beacon , CertificatePending , SignerWithStake } ;
1212use 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
3840impl 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}
0 commit comments