9
9
hashers:: keccak256_160:: Keccak160 ,
10
10
wormhole:: { AccumulatorSequenceTracker , MessageData , PostedMessageUnreliableData } ,
11
11
} ,
12
+ solana_measure:: measure:: Measure ,
12
13
solana_sdk:: {
13
14
account:: { AccountSharedData , ReadableAccount } ,
14
15
borsh, feature_set,
@@ -136,10 +137,20 @@ pub fn update_v1(
136
137
137
138
let message_buffer_accounts;
138
139
let v1_messages = if use_message_buffers {
140
+ let mut measure = Measure :: start ( "update_v1_load_program_accounts" ) ;
141
+
139
142
message_buffer_accounts = bank
140
143
. get_program_accounts ( & MESSAGE_BUFFER_PID , & ScanConfig :: new ( true ) )
141
144
. map_err ( AccumulatorUpdateErrorV1 :: GetProgramAccounts ) ?;
142
145
146
+ measure. stop ( ) ;
147
+ debug ! (
148
+ "Accumulator: Loaded message buffer accounts in {}us" ,
149
+ measure. as_us( )
150
+ ) ;
151
+
152
+ let mut measure = Measure :: start ( "update_v1_extract_message_data" ) ;
153
+
143
154
let preimage = b"account:MessageBuffer" ;
144
155
let mut expected_sighash = [ 0u8 ; 8 ] ;
145
156
expected_sighash. copy_from_slice ( & hashv ( & [ preimage] ) . to_bytes ( ) [ ..8 ] ) ;
@@ -154,7 +165,7 @@ pub fn update_v1(
154
165
155
166
// This code, using the offsets in each Account, extracts the various data versions from
156
167
// the account. We deduplicate this result because the accumulator expects a set.
157
- message_buffer_accounts
168
+ let res = message_buffer_accounts
158
169
. map ( |( _, account) | {
159
170
let data = account. data ( ) ;
160
171
let mut cursor = std:: io:: Cursor :: new ( & data) ;
@@ -185,11 +196,21 @@ pub fn update_v1(
185
196
. collect :: < std:: result:: Result < Vec < _ > , std:: io:: Error > > ( ) ?
186
197
. into_iter ( )
187
198
. flatten ( )
188
- . collect ( )
199
+ . collect ( ) ;
200
+
201
+ measure. stop ( ) ;
202
+ debug ! (
203
+ "Accumulator: Extracted message data in {}us" ,
204
+ measure. as_us( )
205
+ ) ;
206
+
207
+ res
189
208
} else {
190
209
Vec :: new ( )
191
210
} ;
192
211
212
+ let mut measure = Measure :: start ( "create_message_set" ) ;
213
+
193
214
let mut messages = v1_messages;
194
215
messages. extend ( v2_messages. iter ( ) . map ( |x| & * * x) ) ;
195
216
messages. sort_unstable ( ) ;
@@ -220,11 +241,27 @@ pub fn update_v1(
220
241
account
221
242
} ;
222
243
244
+ measure. stop ( ) ;
245
+ debug ! ( "Accumulator: Created message set in {}us" , measure. as_us( ) ) ;
246
+
223
247
// Generate a Message owned by Wormhole to be sent cross-chain. This short-circuits the
224
248
// Wormhole message generation code that would normally be called, but the Guardian
225
249
// set filters our messages so this does not pose a security risk.
226
- if let Some ( accumulator) = MerkleAccumulator :: < Keccak160 > :: from_set ( messages. into_iter ( ) ) {
250
+ let mut measure = Measure :: start ( "create_accumulator" ) ;
251
+
252
+ let maybe_accumulator = MerkleAccumulator :: < Keccak160 > :: from_set ( messages. into_iter ( ) ) ;
253
+
254
+ measure. stop ( ) ;
255
+ debug ! ( "Accumulator: Created accumulator in {}us" , measure. as_us( ) ) ;
256
+
257
+ if let Some ( accumulator) = maybe_accumulator {
258
+ let mut measure = Measure :: start ( "post_accumulator_attestation" ) ;
227
259
post_accumulator_attestation ( bank, accumulator, ring_index) ?;
260
+ measure. stop ( ) ;
261
+ debug ! (
262
+ "Accumulator: Posted accumulator attestation in {}us" ,
263
+ measure. as_us( )
264
+ ) ;
228
265
}
229
266
230
267
// Write the Account Set into `accumulator_state` so that the hermes application can
@@ -233,7 +270,14 @@ pub fn update_v1(
233
270
"Accumulator: Writing accumulator state to {:?}" ,
234
271
accumulator_account
235
272
) ;
273
+
274
+ let mut measure = Measure :: start ( "store_account_and_update_capitalization" ) ;
236
275
bank. store_account_and_update_capitalization ( & accumulator_account, & accumulator_data) ;
276
+ measure. stop ( ) ;
277
+ debug ! (
278
+ "Accumulator: Stored accumulator state in {}us" ,
279
+ measure. as_us( )
280
+ ) ;
237
281
238
282
Ok ( ( ) )
239
283
}
@@ -333,10 +377,20 @@ fn post_accumulator_attestation(
333
377
}
334
378
335
379
pub fn update_v2 ( bank : & Bank ) -> std:: result:: Result < ( ) , AccumulatorUpdateErrorV1 > {
380
+ let mut measure = Measure :: start ( "update_v2_load_program_accounts" ) ;
381
+
336
382
let accounts = bank
337
383
. get_program_accounts ( & ORACLE_PID , & ScanConfig :: new ( true ) )
338
384
. map_err ( AccumulatorUpdateErrorV1 :: GetProgramAccounts ) ?;
339
385
386
+ measure. stop ( ) ;
387
+ debug ! (
388
+ "Accumulator: Loaded oracle program accounts in {}us" ,
389
+ measure. as_us( )
390
+ ) ;
391
+
392
+ let mut measure = Measure :: start ( "update_v2_aggregate_price" ) ;
393
+
340
394
let mut any_v1_aggregations = false ;
341
395
let mut v2_messages = Vec :: new ( ) ;
342
396
@@ -364,5 +418,12 @@ pub fn update_v2(bank: &Bank) -> std::result::Result<(), AccumulatorUpdateErrorV
364
418
}
365
419
}
366
420
421
+ measure. stop ( ) ;
422
+ debug ! (
423
+ "Accumulator: Aggregated oracle prices in {}us and generated {} messages" ,
424
+ measure. as_us( ) ,
425
+ v2_messages. len( )
426
+ ) ;
427
+
367
428
update_v1 ( bank, & v2_messages, any_v1_aggregations)
368
429
}
0 commit comments