@@ -4,8 +4,10 @@ use std::time::Duration;
44use thiserror:: Error ;
55use tokio:: time:: sleep;
66
7- use mithril_common:: crypto_helper:: key_encode_hex;
8- use mithril_common:: entities:: { self , Beacon , SignerWithStake } ;
7+ use crate :: certificate_handler:: CertificateHandlerError ;
8+ use crate :: single_signer:: SingleSignerError ;
9+ use mithril_common:: crypto_helper:: { key_encode_hex, Bytes } ;
10+ use mithril_common:: entities:: { self , Beacon , CertificatePending , SignerWithStake } ;
911use mithril_common:: fake_data;
1012
1113use super :: certificate_handler:: CertificateHandler ;
@@ -17,12 +19,12 @@ pub struct Runtime {
1719 current_beacon : Option < Beacon > ,
1820}
1921
20- #[ derive( Error , Debug , PartialEq ) ]
22+ #[ derive( Error , Debug ) ]
2123pub enum RuntimeError {
2224 #[ error( "single signatures computation failed: `{0}`" ) ]
23- SingleSignaturesComputeFailed ( String ) ,
25+ SingleSignaturesComputeFailed ( # [ from ] SingleSignerError ) ,
2426 #[ error( "could not retrieve pending certificate: `{0}`" ) ]
25- RetrievePendingCertificateFailed ( String ) ,
27+ RetrievePendingCertificateFailed ( # [ from ] CertificateHandlerError ) ,
2628 #[ error( "could not retrieve protocol initializer" ) ]
2729 RetrieveProtocolInitializerFailed ( ) ,
2830 #[ error( "register signer failed: `{0}`" ) ]
@@ -58,74 +60,89 @@ impl Runtime {
5860 if let Some ( pending_certificate) = self
5961 . certificate_handler
6062 . retrieve_pending_certificate ( )
61- . await
62- . map_err ( |e| RuntimeError :: RetrievePendingCertificateFailed ( e. to_string ( ) ) ) ?
63+ . await ?
6364 {
6465 let message = fake_data:: digest ( & pending_certificate. beacon ) ;
65- let must_register_signature = match & self . current_beacon {
66- None => true ,
67- Some ( beacon) => beacon != & pending_certificate. beacon ,
68- } ;
69-
70- let must_register_signer = !self . single_signer . get_is_registered ( ) ;
71- if must_register_signer {
72- if let Some ( protocol_initializer) = self . single_signer . get_protocol_initializer ( ) {
73- let verification_key = protocol_initializer. verification_key ( ) ;
74- let verification_key =
75- key_encode_hex ( verification_key) . map_err ( RuntimeError :: Codec ) ?;
76- let signer =
77- entities:: Signer :: new ( self . single_signer . get_party_id ( ) , verification_key) ;
78- self . certificate_handler
79- . register_signer ( & signer)
80- . await
81- . map_err ( |e| RuntimeError :: RegisterSignerFailed ( e. to_string ( ) ) ) ?;
82- self . single_signer
83- . update_is_registered ( true )
84- . map_err ( |e| RuntimeError :: RegisterSignerFailed ( e. to_string ( ) ) ) ?;
85- }
86- }
8766
88- if must_register_signature {
89- let stake_distribution = fake_data:: signers_with_stakes ( 5 ) ;
90- let verification_keys = pending_certificate
91- . signers
92- . iter ( )
93- . map ( |signer| ( signer. party_id , signer. verification_key . as_str ( ) ) )
94- . collect :: < HashMap < u64 , & str > > ( ) ;
95- let stake_distribution_extended = stake_distribution
96- . into_iter ( )
97- . map ( |signer| {
98- let verification_key = match verification_keys. get ( & signer. party_id ) {
99- Some ( verification_key_found) => * verification_key_found,
100- None => "" ,
101- } ;
102- SignerWithStake :: new (
103- signer. party_id ,
104- verification_key. to_string ( ) ,
105- signer. stake ,
106- )
107- } )
108- . collect :: < Vec < SignerWithStake > > ( ) ;
109- let signatures = self
110- . single_signer
111- . compute_single_signatures (
112- message,
113- stake_distribution_extended,
114- & pending_certificate. protocol_parameters ,
115- )
116- . map_err ( |e| RuntimeError :: SingleSignaturesComputeFailed ( e. to_string ( ) ) ) ?;
117- if !signatures. is_empty ( ) {
118- let _ = self
119- . certificate_handler
120- . register_signatures ( & signatures)
121- . await ;
122- }
123- self . current_beacon = Some ( pending_certificate. beacon ) ;
67+ self . register_to_aggregator_if_needed ( ) . await ?;
68+
69+ if self . should_register_signature ( & pending_certificate. beacon ) {
70+ self . register_signature ( message, pending_certificate)
71+ . await ?;
12472 }
12573 }
12674
12775 Ok ( ( ) )
12876 }
77+
78+ fn should_register_signature ( & self , new_beacon : & Beacon ) -> bool {
79+ match & self . current_beacon {
80+ None => true ,
81+ Some ( beacon) => beacon != new_beacon,
82+ }
83+ }
84+
85+ async fn register_to_aggregator_if_needed ( & mut self ) -> Result < ( ) , RuntimeError > {
86+ let must_register_to_aggregator = !self . single_signer . get_is_registered ( ) ;
87+ if !must_register_to_aggregator {
88+ return Ok ( ( ) ) ;
89+ }
90+
91+ if let Some ( protocol_initializer) = self . single_signer . get_protocol_initializer ( ) {
92+ let verification_key = protocol_initializer. verification_key ( ) ;
93+ let verification_key = key_encode_hex ( verification_key) . map_err ( RuntimeError :: Codec ) ?;
94+ let signer = entities:: Signer :: new ( self . single_signer . get_party_id ( ) , verification_key) ;
95+ self . certificate_handler
96+ . register_signer ( & signer)
97+ . await
98+ . map_err ( |e| RuntimeError :: RegisterSignerFailed ( e. to_string ( ) ) ) ?;
99+ self . single_signer
100+ . update_is_registered ( true )
101+ . map_err ( |e| RuntimeError :: RegisterSignerFailed ( e. to_string ( ) ) ) ?;
102+ }
103+
104+ Ok ( ( ) )
105+ }
106+
107+ async fn register_signature (
108+ & mut self ,
109+ message : Bytes ,
110+ pending_certificate : CertificatePending ,
111+ ) -> Result < ( ) , RuntimeError > {
112+ let verification_keys = pending_certificate
113+ . signers
114+ . iter ( )
115+ . map ( |signer| ( signer. party_id , signer. verification_key . as_str ( ) ) )
116+ . collect :: < HashMap < u64 , & str > > ( ) ;
117+
118+ let stake_distribution = fake_data:: signers_with_stakes ( 5 ) ;
119+ let stake_distribution_extended = stake_distribution
120+ . into_iter ( )
121+ . map ( |signer| {
122+ let verification_key = match verification_keys. get ( & signer. party_id ) {
123+ Some ( verification_key_found) => * verification_key_found,
124+ None => "" ,
125+ } ;
126+ SignerWithStake :: new ( signer. party_id , verification_key. to_string ( ) , signer. stake )
127+ } )
128+ . collect :: < Vec < SignerWithStake > > ( ) ;
129+
130+ let signatures = self . single_signer . compute_single_signatures (
131+ message,
132+ stake_distribution_extended,
133+ & pending_certificate. protocol_parameters ,
134+ ) ?;
135+
136+ if !signatures. is_empty ( ) {
137+ let _ = self
138+ . certificate_handler
139+ . register_signatures ( & signatures)
140+ . await ;
141+ }
142+ self . current_beacon = Some ( pending_certificate. beacon ) ;
143+
144+ Ok ( ( ) )
145+ }
129146}
130147
131148#[ cfg( test) ]
@@ -190,9 +207,10 @@ mod tests {
190207 ) ;
191208 assert_eq ! (
192209 RuntimeError :: RetrievePendingCertificateFailed (
193- CertificateHandlerError :: RemoteServerTechnical ( "An Error" . to_string( ) ) . to_string( )
194- ) ,
195- signer. run( ) . await . unwrap_err( )
210+ CertificateHandlerError :: RemoteServerTechnical ( "An Error" . to_string( ) )
211+ )
212+ . to_string( ) ,
213+ signer. run( ) . await . unwrap_err( ) . to_string( )
196214 ) ;
197215 }
198216
@@ -355,9 +373,10 @@ mod tests {
355373 ) ;
356374 assert_eq ! (
357375 RuntimeError :: SingleSignaturesComputeFailed (
358- SingleSignerError :: UnregisteredVerificationKey ( ) . to_string( )
359- ) ,
360- signer. run( ) . await . unwrap_err( )
376+ SingleSignerError :: UnregisteredVerificationKey ( )
377+ )
378+ . to_string( ) ,
379+ signer. run( ) . await . unwrap_err( ) . to_string( )
361380 ) ;
362381 }
363382
@@ -398,10 +417,11 @@ mod tests {
398417 ) ;
399418 assert_eq ! (
400419 RuntimeError :: RegisterSignerFailed (
401- CertificateHandlerError :: RemoteServerLogical ( "an error occurred" . to_string( ) , )
420+ CertificateHandlerError :: RemoteServerLogical ( "an error occurred" . to_string( ) )
402421 . to_string( )
403- ) ,
404- signer. run( ) . await . unwrap_err( )
422+ )
423+ . to_string( ) ,
424+ signer. run( ) . await . unwrap_err( ) . to_string( )
405425 ) ;
406426 }
407427}
0 commit comments