@@ -37,17 +37,46 @@ use {
37
37
Bytes ,
38
38
} ,
39
39
} ,
40
+ futures:: future:: join_all,
40
41
std:: sync:: Arc ,
42
+ tokio:: spawn,
41
43
tracing:: Instrument ,
42
44
} ;
43
45
44
46
/// Setup provider for all the chains.
45
47
pub async fn setup_provider ( opts : & SetupProviderOptions ) -> Result < ( ) > {
46
48
let config = Config :: load ( & opts. config . config ) ?;
47
- for ( chain_id, chain_config) in & config. chains {
48
- setup_chain_provider ( & config, & chain_id, & chain_config) . await ?;
49
+ let setup_tasks = config
50
+ . chains
51
+ . clone ( )
52
+ . into_iter ( )
53
+ . map ( |( chain_id, chain_config) | {
54
+ let config = config. clone ( ) ;
55
+ spawn ( async move {
56
+ (
57
+ setup_chain_provider ( & config, & chain_id, & chain_config) . await ,
58
+ chain_id,
59
+ )
60
+ } )
61
+ } )
62
+ . collect :: < Vec < _ > > ( ) ;
63
+ let join_results = join_all ( setup_tasks) . await ;
64
+ let mut all_ok = true ;
65
+ for join_result in join_results {
66
+ let ( setup_result, chain_id) = join_result?;
67
+ match setup_result {
68
+ Ok ( ( ) ) => { }
69
+ Err ( e) => {
70
+ tracing:: error!( "Failed to setup {} {}" , chain_id, e) ;
71
+ all_ok = false ;
72
+ }
73
+ }
74
+ }
75
+
76
+ match all_ok {
77
+ true => Ok ( ( ) ) ,
78
+ false => Err ( anyhow ! ( "Failed to setup provider for all chains" ) ) ,
49
79
}
50
- Ok ( ( ) )
51
80
}
52
81
53
82
@@ -57,7 +86,7 @@ pub async fn setup_provider(opts: &SetupProviderOptions) -> Result<()> {
57
86
/// 3. Re-register if there is a mismatch in generated hash chain.
58
87
/// 4. Update provider fee if there is a mismatch with the fee set on contract.
59
88
/// 5. Update provider uri if there is a mismatch with the uri set on contract.
60
- #[ tracing:: instrument( name= "setup_chain_provider" , skip_all, fields( chain_id= chain_id) ) ]
89
+ #[ tracing:: instrument( name = "setup_chain_provider" , skip_all, fields( chain_id = chain_id) ) ]
61
90
async fn setup_chain_provider (
62
91
config : & Config ,
63
92
chain_id : & ChainId ,
@@ -101,31 +130,41 @@ async fn setup_chain_provider(
101
130
let secret = provider_config. secret . load ( ) ?. ok_or ( anyhow ! (
102
131
"Please specify a provider secret in the config file."
103
132
) ) ?;
104
- let hash_chain = PebbleHashChain :: from_config (
105
- & secret,
106
- & chain_id,
107
- & provider_address,
108
- & chain_config. contract_addr ,
109
- & metadata. seed ,
110
- provider_config. chain_length ,
111
- provider_config. chain_sample_interval ,
112
- ) ?;
113
- let chain_state = HashChainState {
114
- offsets : vec ! [ provider_info
115
- . original_commitment_sequence_number
116
- . try_into( ) ?] ,
117
- hash_chains : vec ! [ hash_chain] ,
118
- } ;
119
-
120
-
121
- if chain_state. reveal ( provider_info. original_commitment_sequence_number ) ?
122
- != provider_info. original_commitment
123
- {
124
- tracing:: info!( "The root of the generated hash chain does not match the commitment" , ) ;
133
+ if metadata. chain_length != provider_config. chain_length {
134
+ tracing:: info!(
135
+ "Chain length mismatch. metadata.chain_length={}, provider_config.chain_length={}" ,
136
+ metadata. chain_length,
137
+ provider_config. chain_length
138
+ ) ;
125
139
register = true ;
140
+ } else {
141
+ let hash_chain = PebbleHashChain :: from_config (
142
+ & secret,
143
+ & chain_id,
144
+ & provider_address,
145
+ & chain_config. contract_addr ,
146
+ & metadata. seed ,
147
+ provider_config. chain_length ,
148
+ provider_config. chain_sample_interval ,
149
+ ) ?;
150
+ let chain_state = HashChainState {
151
+ offsets : vec ! [ provider_info
152
+ . original_commitment_sequence_number
153
+ . try_into( ) ?] ,
154
+ hash_chains : vec ! [ hash_chain] ,
155
+ } ;
156
+
157
+
158
+ if chain_state. reveal ( provider_info. original_commitment_sequence_number ) ?
159
+ != provider_info. original_commitment
160
+ {
161
+ tracing:: info!(
162
+ "The root of the generated hash chain does not match the commitment" ,
163
+ ) ;
164
+ register = true ;
165
+ }
126
166
}
127
167
}
128
-
129
168
if register {
130
169
tracing:: info!( "Registering" ) ;
131
170
register_provider_from_config ( & provider_config, & chain_id, & chain_config)
0 commit comments