@@ -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