@@ -62,7 +62,7 @@ use chain_relay::{
6262use sp_runtime:: OpaqueExtrinsic ;
6363use sp_runtime:: { generic:: SignedBlock , traits:: Header as HeaderT } ;
6464use substrate_api_client:: extrinsic:: xt_primitives:: UncheckedExtrinsicV4 ;
65- use substratee_stf:: sgx:: OpaqueCall ;
65+ use substratee_stf:: sgx:: { OpaqueCall , shards_key_hash , storage_hashes_to_update_per_shard } ;
6666
6767mod aes;
6868mod attestation;
@@ -218,9 +218,16 @@ pub unsafe extern "C" fn get_state(
218218 return sgx_status_t:: SGX_ERROR_UNEXPECTED ;
219219 }
220220
221+ if !state:: exists ( & shard) {
222+ info ! ( "Initialized new shard that was queried chain: {:?}" , shard) ;
223+ if let Err ( e) = state:: init_shard ( & shard) {
224+ return e;
225+ }
226+ }
227+
221228 let mut state = match state:: load ( & shard) {
222229 Ok ( s) => s,
223- Err ( status) => return status,
230+ Err ( status) => return status
224231 } ;
225232
226233 let validator = match io:: light_validation:: unseal ( ) {
@@ -348,14 +355,15 @@ pub unsafe extern "C" fn sync_chain_relay(
348355 return sgx_status_t:: SGX_ERROR_UNEXPECTED ;
349356 }
350357
358+ if update_states ( signed_block. block . header . clone ( ) ) . is_err ( ) {
359+ error ! ( "Error performing state updates upon block import" )
360+ }
361+
351362 match scan_block_for_relevant_xt ( & signed_block. block ) {
352363 Ok ( c) => calls. extend ( c. into_iter ( ) ) ,
353364 Err ( _) => error ! ( "Error executing relevant extrinsics" ) ,
354365 } ;
355366
356- if update_states ( signed_block. block . header ) . is_err ( ) {
357- error ! ( "Error performing state updates upon block import" )
358- }
359367 }
360368
361369 if let Err ( _e) = stf_post_actions ( validator, calls, xt_slice, * nonce) {
@@ -376,16 +384,37 @@ pub fn update_states(header: Header) -> SgxResult<()> {
376384 return Ok ( ( ) ) ;
377385 }
378386
387+ // global requests they are the same for every shard
379388 let responses: Vec < WorkerResponse < Vec < u8 > > > = worker_request ( requests) ?;
380- let update_map = verify_worker_responses ( responses, header) ?;
381-
382- let shards = state:: list_shards ( ) ?;
383- debug ! ( "found shards: {:?}" , shards) ;
384- for s in shards {
385- let mut state = state:: load ( & s) ?;
386- Stf :: update_storage ( & mut state, & update_map) ;
387- state:: write ( state, & s) ?;
388- }
389+ let update_map = verify_worker_responses ( responses, header. clone ( ) ) ?;
390+ // look for new shards an initialize them
391+ if let Some ( maybe_shards) = update_map. get ( & shards_key_hash ( ) ) {
392+ match maybe_shards {
393+ Some ( shards) => {
394+ let shards: Vec < ShardIdentifier > = Decode :: decode ( & mut shards. as_slice ( ) ) . sgx_error_with_log ( "error decoding shards" ) ?;
395+ for s in shards {
396+ if !state:: exists ( & s) {
397+ info ! ( "Initialized new shard that was found on chain: {:?}" , s) ;
398+ state:: init_shard ( & s) ?;
399+ }
400+ // per shard (cid) requests
401+ let per_shard_request = storage_hashes_to_update_per_shard ( & s)
402+ . into_iter ( )
403+ . map ( |key| WorkerRequest :: ChainStorage ( key, Some ( header. hash ( ) ) ) )
404+ . collect ( ) ;
405+
406+ let responses: Vec < WorkerResponse < Vec < u8 > > > = worker_request ( per_shard_request) ?;
407+ let per_shard_update_map = verify_worker_responses ( responses, header. clone ( ) ) ?;
408+
409+ let mut state = state:: load ( & s) ?;
410+ Stf :: update_storage ( & mut state, & per_shard_update_map) ;
411+ Stf :: update_storage ( & mut state, & update_map) ;
412+ state:: write ( state, & s) ?;
413+ }
414+ }
415+ None => info ! ( "No shards are on the chain yet" )
416+ } ;
417+ } ;
389418 Ok ( ( ) )
390419}
391420
@@ -500,12 +529,7 @@ fn handle_call_worker_xt(
500529 return Ok ( ( ) ) ;
501530 }
502531
503- let mut state = if state:: exists ( & shard) {
504- state:: load ( & shard) ?
505- } else {
506- state:: init_shard ( & shard) ?;
507- Stf :: init_state ( )
508- } ;
532+ let mut state = state:: load ( & shard) ?;
509533
510534 debug ! ( "Update STF storage!" ) ;
511535 let requests = Stf :: get_storage_hashes_to_update ( & stf_call_signed)
@@ -541,7 +565,7 @@ fn handle_call_worker_xt(
541565fn verify_worker_responses (
542566 responses : Vec < WorkerResponse < Vec < u8 > > > ,
543567 header : Header ,
544- ) -> SgxResult < HashMap < Vec < u8 > , Vec < u8 > > > {
568+ ) -> SgxResult < HashMap < Vec < u8 > , Option < Vec < u8 > > > > {
545569 let mut update_map = HashMap :: new ( ) ;
546570 for response in responses. iter ( ) {
547571 match response {
@@ -562,10 +586,7 @@ fn verify_worker_responses(
562586 error ! ( "Wrong storage value supplied" ) ;
563587 return Err ( sgx_status_t:: SGX_ERROR_UNEXPECTED ) ;
564588 }
565-
566- if let Some ( val) = value {
567- update_map. insert ( key. clone ( ) , val. clone ( ) ) ;
568- }
589+ update_map. insert ( key. clone ( ) , value. clone ( ) ) ;
569590 }
570591 }
571592 }
@@ -658,7 +679,7 @@ fn worker_request<V: Encode + Decode>(
658679 req : Vec < WorkerRequest > ,
659680) -> SgxResult < Vec < WorkerResponse < V > > > {
660681 let mut rt: sgx_status_t = sgx_status_t:: SGX_ERROR_UNEXPECTED ;
661- let mut resp: Vec < u8 > = vec ! [ 0 ; 4196 ] ;
682+ let mut resp: Vec < u8 > = vec ! [ 0 ; 4196 * 4 ] ;
662683
663684 let res = unsafe {
664685 ocall_worker_request (
0 commit comments