@@ -23,6 +23,7 @@ extern crate sgx_tstd as std;
2323#[ cfg( all( feature = "std" , feature = "sgx" ) ) ]
2424compile_error ! ( "feature \" std\" and feature \" sgx\" cannot be enabled at the same time" ) ;
2525
26+ use core:: time:: Duration ;
2627#[ cfg( feature = "std" ) ]
2728use threadpool:: ThreadPool ;
2829
@@ -35,34 +36,45 @@ use std::sync::Mutex;
3536#[ cfg( feature = "sgx" ) ]
3637use std:: sync:: SgxMutex as Mutex ;
3738
38- use bc_musig2_ceremony:: { CeremonyEvent , CeremonyId } ;
39+ #[ cfg( feature = "std" ) ]
40+ use std:: sync:: RwLock ;
41+
42+ #[ cfg( feature = "sgx" ) ]
43+ use std:: sync:: SgxRwLock as RwLock ;
44+
45+ use bc_enclave_registry:: EnclaveRegistryLookup ;
46+ use bc_musig2_ceremony:: { CeremonyEvent , CeremonyId , CeremonyRegistry , SignerId } ;
3947use codec:: Encode ;
40- use itc_direct_rpc_client:: { DirectRpcClient , RpcClient } ;
48+ use itc_direct_rpc_client:: { DirectRpcClient , DirectRpcClientFactory , RpcClient , RpcClientFactory } ;
4149use itc_direct_rpc_server:: SendRpcResponse ;
4250use itp_ocall_api:: EnclaveAttestationOCallApi ;
4351use itp_rpc:: { Id , RpcRequest } ;
44- use itp_sgx_crypto:: key_repository:: AccessKey ;
52+ use itp_sgx_crypto:: { key_repository:: AccessKey , schnorr :: Pair as SchnorrPair } ;
4553pub use itp_types:: { DirectRequestStatus , Hash } ;
4654use itp_utils:: hex:: ToHexPrefixed ;
4755use lc_direct_call:: CeremonyRoundCall ;
4856use litentry_primitives:: { Address32 , Identity , PlainRequest , ShardIdentifier } ;
4957use log:: * ;
5058use sp_core:: { blake2_256, ed25519, Pair as SpCorePair , H256 } ;
51- use std:: { collections:: HashMap , string:: ToString , sync:: Arc , vec} ;
59+ use std:: { collections:: HashMap , string:: ToString , sync:: Arc , thread :: sleep , vec} ;
5260
5361#[ allow( clippy:: too_many_arguments) ]
54- pub fn process_event < OCallApi , SIGNINGAK , Responder > (
62+ pub fn process_event < OCallApi , SIGNINGAK , Responder , ECL , BKR > (
5563 signing_key_access : Arc < SIGNINGAK > ,
5664 ocall_api : Arc < OCallApi > ,
5765 responder : Arc < Responder > ,
66+ enclave_registry_lookup : Arc < ECL > ,
5867 event : CeremonyEvent ,
5968 ceremony_id : CeremonyId ,
6069 event_threads_pool : ThreadPool ,
6170 peers_map : Arc < Mutex < HashMap < [ u8 ; 32 ] , DirectRpcClient > > > ,
71+ ceremony_registry : Arc < RwLock < CeremonyRegistry < BKR > > > ,
6272) where
6373 OCallApi : EnclaveAttestationOCallApi + ' static ,
6474 SIGNINGAK : AccessKey < KeyType = ed25519:: Pair > + Send + Sync + ' static ,
6575 Responder : SendRpcResponse < Hash = H256 > + ' static ,
76+ ECL : EnclaveRegistryLookup + Send + Sync + ' static ,
77+ BKR : AccessKey < KeyType = SchnorrPair > + Send + Sync + ' static ,
6678{
6779 let my_identity: Address32 = signing_key_access. retrieve_key ( ) . unwrap ( ) . public ( ) . 0 . into ( ) ;
6880 let identity = Identity :: Substrate ( my_identity) ;
@@ -80,20 +92,21 @@ pub fn process_event<OCallApi, SIGNINGAK, Responder>(
8092 ) ;
8193
8294 let signer_id = * signer_id;
83- let client = peers_map. lock ( ) . unwrap ( ) . get ( & signer_id) . cloned ( ) ;
84- if let Some ( mut client) = client {
85- let request = request. clone ( ) ;
86- event_threads_pool. execute ( move || {
87- if let Err ( e) = client. send ( & request) {
88- error ! (
89- "Could not send request to signer: {:?}, reason: {:?}" ,
90- signer_id, e
91- )
92- }
93- } ) ;
94- } else {
95- error ! ( "Fail to share nonce, unknown signer: {:?}" , signer_id) ;
96- }
95+ let peers_map_clone = peers_map. clone ( ) ;
96+ let request = request. clone ( ) ;
97+ let enclave_lookup_cloned = enclave_registry_lookup. clone ( ) ;
98+ let ceremony_registry_cloned = ceremony_registry. clone ( ) ;
99+ let ceremony_id_cloned = ceremony_id. clone ( ) ;
100+ event_threads_pool. execute ( move || {
101+ send_request (
102+ signer_id,
103+ & ceremony_id_cloned,
104+ request,
105+ peers_map_clone,
106+ enclave_lookup_cloned,
107+ ceremony_registry_cloned,
108+ ) ;
109+ } ) ;
97110 } ) ;
98111 } ,
99112 CeremonyEvent :: SecondRoundStarted ( signers, message, signature) => {
@@ -108,20 +121,21 @@ pub fn process_event<OCallApi, SIGNINGAK, Responder>(
108121 ) ;
109122
110123 let signer_id = * signer_id;
111- let client = peers_map. lock ( ) . unwrap ( ) . get ( & signer_id) . cloned ( ) ;
112- if let Some ( mut client) = client {
113- let request = request. clone ( ) ;
114- event_threads_pool. execute ( move || {
115- if let Err ( e) = client. send ( & request) {
116- error ! (
117- "Could not send request to signer: {:?}, reason: {:?}" ,
118- signer_id, e
119- )
120- }
121- } ) ;
122- } else {
123- error ! ( "Fail to share partial signature, unknown signer: {:?}" , signer_id) ;
124- }
124+ let peers_map_clone = peers_map. clone ( ) ;
125+ let request = request. clone ( ) ;
126+ let enclave_lookup_cloned = enclave_registry_lookup. clone ( ) ;
127+ let ceremony_registry_cloned = ceremony_registry. clone ( ) ;
128+ let ceremony_id_cloned = ceremony_id. clone ( ) ;
129+ event_threads_pool. execute ( move || {
130+ send_request (
131+ signer_id,
132+ & ceremony_id_cloned,
133+ request,
134+ peers_map_clone,
135+ enclave_lookup_cloned,
136+ ceremony_registry_cloned,
137+ ) ;
138+ } ) ;
125139 } ) ;
126140 } ,
127141 CeremonyEvent :: CeremonyEnded ( signature, is_check_run, verification_result) => {
@@ -168,25 +182,75 @@ pub fn process_event<OCallApi, SIGNINGAK, Responder>(
168182 ) ;
169183
170184 let signer_id = * signer_id;
171- let client = peers_map. lock ( ) . unwrap ( ) . get ( & signer_id) . cloned ( ) ;
172- if let Some ( mut client) = client {
173- let request = request. clone ( ) ;
174- event_threads_pool. execute ( move || {
175- if let Err ( e) = client. send ( & request) {
176- error ! (
177- "Could not send request to signer: {:?}, reason: {:?}" ,
178- signer_id, e
179- )
180- }
181- } ) ;
182- } else {
183- error ! ( "Fail to share killing info, unknown signer: {:?}" , signer_id) ;
184- }
185+ let peers_map_clone = peers_map. clone ( ) ;
186+ let request = request. clone ( ) ;
187+ let enclave_lookup_cloned = enclave_registry_lookup. clone ( ) ;
188+ let ceremony_registry_cloned = ceremony_registry. clone ( ) ;
189+ let ceremony_id_cloned = ceremony_id. clone ( ) ;
190+ event_threads_pool. execute ( move || {
191+ send_request (
192+ signer_id,
193+ & ceremony_id_cloned,
194+ request,
195+ peers_map_clone,
196+ enclave_lookup_cloned,
197+ ceremony_registry_cloned,
198+ ) ;
199+ } ) ;
185200 } ) ;
186201 } ,
187202 }
188203}
189204
205+ // it will try to send request until it succeeds, the peer is removed from registry or ceremony is removed
206+ fn send_request < ECL , BKR > (
207+ signer_id : SignerId ,
208+ ceremony_id : & CeremonyId ,
209+ request : RpcRequest ,
210+ peers_map : Arc < Mutex < HashMap < [ u8 ; 32 ] , DirectRpcClient > > > ,
211+ enclave_registry_lookup : Arc < ECL > ,
212+ ceremony_registry : Arc < RwLock < CeremonyRegistry < BKR > > > ,
213+ ) where
214+ ECL : EnclaveRegistryLookup ,
215+ BKR : AccessKey < KeyType = SchnorrPair > ,
216+ {
217+ loop {
218+ let client = peers_map. lock ( ) . unwrap ( ) . get ( & signer_id) . cloned ( ) ;
219+ if let Some ( mut client) = client {
220+ if let Err ( e) = client. send ( & request) {
221+ error ! ( "Could not send request to signer: {:?}, reason: {:?}" , signer_id, e) ;
222+ sleep ( Duration :: from_secs ( 5 ) ) ;
223+ let mut peers_lock = peers_map. lock ( ) . unwrap ( ) ;
224+ peers_lock. remove ( & signer_id) ;
225+ } else {
226+ // finish if request was sent
227+ break
228+ }
229+ } else {
230+ // check if ceremony still exists, if not stop
231+ if !ceremony_registry. read ( ) . unwrap ( ) . contains_key ( ceremony_id) {
232+ break
233+ }
234+
235+ if let Some ( url) = enclave_registry_lookup. get_worker_url ( & Address32 :: from ( signer_id) ) {
236+ match ( DirectRpcClientFactory { } ) . create ( & url) {
237+ Ok ( new_client) => {
238+ peers_map. lock ( ) . unwrap ( ) . insert ( signer_id, new_client. clone ( ) ) ;
239+ } ,
240+ Err ( e) => {
241+ error ! ( "Could not connect to peer {}, reason: {:?}" , url, e) ;
242+ sleep ( Duration :: from_secs ( 5 ) ) ;
243+ } ,
244+ }
245+ } else {
246+ error ! ( "Could not find {:?} in registry" , signer_id. to_hex( ) ) ;
247+ // stop if peer is not found in registry
248+ break
249+ }
250+ }
251+ }
252+ }
253+
190254fn prepare_request < SIGNINGAK > (
191255 signing_key_access : & SIGNINGAK ,
192256 mr_enclave : [ u8 ; 32 ] ,
0 commit comments