1+ use slog_scope:: { error, info} ;
12use std:: collections:: HashMap ;
3+ use std:: time:: Duration ;
24use thiserror:: Error ;
5+ use tokio:: time:: sleep;
36
47use mithril_common:: crypto_helper:: key_encode_hex;
58use mithril_common:: entities:: { self , Beacon , SignerWithStake } ;
@@ -8,14 +11,14 @@ use mithril_common::fake_data;
811use super :: certificate_handler:: CertificateHandler ;
912use super :: single_signer:: SingleSigner ;
1013
11- pub struct Signer {
14+ pub struct Runtime {
1215 certificate_handler : Box < dyn CertificateHandler > ,
1316 single_signer : Box < dyn SingleSigner > ,
1417 current_beacon : Option < Beacon > ,
1518}
1619
1720#[ derive( Error , Debug , PartialEq ) ]
18- pub enum SignerError {
21+ pub enum RuntimeError {
1922 #[ error( "single signatures computation failed: `{0}`" ) ]
2023 SingleSignaturesComputeFailed ( String ) ,
2124 #[ error( "could not retrieve pending certificate: `{0}`" ) ]
@@ -28,7 +31,7 @@ pub enum SignerError {
2831 Codec ( String ) ,
2932}
3033
31- impl Signer {
34+ impl Runtime {
3235 pub fn new (
3336 certificate_handler : Box < dyn CertificateHandler > ,
3437 single_signer : Box < dyn SingleSigner > ,
@@ -40,12 +43,23 @@ impl Signer {
4043 }
4144 }
4245
43- pub async fn run ( & mut self ) -> Result < ( ) , SignerError > {
46+ pub async fn infinite_loop ( & mut self , loop_interval : u64 ) {
47+ loop {
48+ if let Err ( e) = self . run ( ) . await {
49+ error ! ( "{:?}" , e)
50+ }
51+
52+ info ! ( "Sleeping for {}" , loop_interval) ;
53+ sleep ( Duration :: from_millis ( loop_interval) ) . await ;
54+ }
55+ }
56+
57+ pub async fn run ( & mut self ) -> Result < ( ) , RuntimeError > {
4458 if let Some ( pending_certificate) = self
4559 . certificate_handler
4660 . retrieve_pending_certificate ( )
4761 . await
48- . map_err ( |e| SignerError :: RetrievePendingCertificateFailed ( e. to_string ( ) ) ) ?
62+ . map_err ( |e| RuntimeError :: RetrievePendingCertificateFailed ( e. to_string ( ) ) ) ?
4963 {
5064 let message = fake_data:: digest ( & pending_certificate. beacon ) ;
5165 let must_register_signature = match & self . current_beacon {
@@ -58,16 +72,16 @@ impl Signer {
5872 if let Some ( protocol_initializer) = self . single_signer . get_protocol_initializer ( ) {
5973 let verification_key = protocol_initializer. verification_key ( ) ;
6074 let verification_key =
61- key_encode_hex ( verification_key) . map_err ( SignerError :: Codec ) ?;
75+ key_encode_hex ( verification_key) . map_err ( RuntimeError :: Codec ) ?;
6276 let signer =
6377 entities:: Signer :: new ( self . single_signer . get_party_id ( ) , verification_key) ;
6478 self . certificate_handler
6579 . register_signer ( & signer)
6680 . await
67- . map_err ( |e| SignerError :: RegisterSignerFailed ( e. to_string ( ) ) ) ?;
81+ . map_err ( |e| RuntimeError :: RegisterSignerFailed ( e. to_string ( ) ) ) ?;
6882 self . single_signer
6983 . update_is_registered ( true )
70- . map_err ( |e| SignerError :: RegisterSignerFailed ( e. to_string ( ) ) ) ?;
84+ . map_err ( |e| RuntimeError :: RegisterSignerFailed ( e. to_string ( ) ) ) ?;
7185 }
7286 }
7387
@@ -99,7 +113,7 @@ impl Signer {
99113 stake_distribution_extended,
100114 & pending_certificate. protocol_parameters ,
101115 )
102- . map_err ( |e| SignerError :: SingleSignaturesComputeFailed ( e. to_string ( ) ) ) ?;
116+ . map_err ( |e| RuntimeError :: SingleSignaturesComputeFailed ( e. to_string ( ) ) ) ?;
103117 if !signatures. is_empty ( ) {
104118 let _ = self
105119 . certificate_handler
@@ -148,7 +162,7 @@ mod tests {
148162 . expect_get_is_registered ( )
149163 . return_once ( || false ) ;
150164
151- let mut signer = Signer :: new (
165+ let mut signer = Runtime :: new (
152166 Box :: new ( mock_certificate_handler) ,
153167 Box :: new ( mock_single_signer) ,
154168 ) ;
@@ -170,12 +184,12 @@ mod tests {
170184 . expect_get_protocol_initializer ( )
171185 . return_once ( move || None ) ;
172186
173- let mut signer = Signer :: new (
187+ let mut signer = Runtime :: new (
174188 Box :: new ( mock_certificate_handler) ,
175189 Box :: new ( mock_single_signer) ,
176190 ) ;
177191 assert_eq ! (
178- SignerError :: RetrievePendingCertificateFailed (
192+ RuntimeError :: RetrievePendingCertificateFailed (
179193 CertificateHandlerError :: RemoteServerTechnical ( "An Error" . to_string( ) ) . to_string( )
180194 ) ,
181195 signer. run( ) . await . unwrap_err( )
@@ -220,7 +234,7 @@ mod tests {
220234 . expect_update_is_registered ( )
221235 . return_once ( move |_| Ok ( ( ) ) ) ;
222236
223- let mut signer = Signer :: new (
237+ let mut signer = Runtime :: new (
224238 Box :: new ( mock_certificate_handler) ,
225239 Box :: new ( mock_single_signer) ,
226240 ) ;
@@ -269,7 +283,7 @@ mod tests {
269283 . expect_get_protocol_initializer ( )
270284 . return_once ( move || Some ( protocol_initializer. clone ( ) ) ) ;
271285
272- let mut signer = Signer :: new (
286+ let mut signer = Runtime :: new (
273287 Box :: new ( mock_certificate_handler) ,
274288 Box :: new ( mock_single_signer) ,
275289 ) ;
@@ -310,7 +324,7 @@ mod tests {
310324 . expect_update_is_registered ( )
311325 . return_once ( move |_| Ok ( ( ) ) ) ;
312326
313- let mut signer = Signer :: new (
327+ let mut signer = Runtime :: new (
314328 Box :: new ( mock_certificate_handler) ,
315329 Box :: new ( mock_single_signer) ,
316330 ) ;
@@ -335,12 +349,12 @@ mod tests {
335349 . expect_get_protocol_initializer ( )
336350 . return_once ( move || None ) ;
337351
338- let mut signer = Signer :: new (
352+ let mut signer = Runtime :: new (
339353 Box :: new ( mock_certificate_handler) ,
340354 Box :: new ( mock_single_signer) ,
341355 ) ;
342356 assert_eq ! (
343- SignerError :: SingleSignaturesComputeFailed (
357+ RuntimeError :: SingleSignaturesComputeFailed (
344358 SingleSignerError :: UnregisteredVerificationKey ( ) . to_string( )
345359 ) ,
346360 signer. run( ) . await . unwrap_err( )
@@ -378,12 +392,12 @@ mod tests {
378392 . expect_get_is_registered ( )
379393 . return_once ( || false ) ;
380394
381- let mut signer = Signer :: new (
395+ let mut signer = Runtime :: new (
382396 Box :: new ( mock_certificate_handler) ,
383397 Box :: new ( mock_single_signer) ,
384398 ) ;
385399 assert_eq ! (
386- SignerError :: RegisterSignerFailed (
400+ RuntimeError :: RegisterSignerFailed (
387401 CertificateHandlerError :: RemoteServerLogical ( "an error occurred" . to_string( ) , )
388402 . to_string( )
389403 ) ,
0 commit comments