1
- use std:: { collections:: HashMap , sync:: Arc } ;
1
+ use std:: {
2
+ collections:: { HashMap , HashSet } ,
3
+ sync:: Arc ,
4
+ } ;
2
5
3
6
use alloy_consensus:: Header ;
4
7
use alloy_rpc_types:: { serde_helpers:: JsonStorageKey , BlockNumHash , EIP1186AccountProofResponse } ;
@@ -15,7 +18,6 @@ use reth_trie_common::KeccakKeyHasher;
15
18
use revm_primitives:: alloy_primitives:: { Address , B256 } ;
16
19
use strata_proofimpl_evm_ee_stf:: { mpt:: proofs_to_tries, EvmBlockStfInput } ;
17
20
use strata_reth_db:: WitnessStore ;
18
- use strata_reth_evm:: constants:: MAX_ANCESTOR_DEPTH ;
19
21
use tracing:: { debug, error} ;
20
22
21
23
use crate :: {
@@ -140,7 +142,7 @@ fn extract_zkvm_input<Node: FullNodeComponents<Types: NodeTypes<Primitives = Eth
140
142
141
143
let mut parent_proofs: HashMap < Address , EIP1186AccountProofResponse > = HashMap :: new ( ) ;
142
144
let mut current_proofs: HashMap < Address , EIP1186AccountProofResponse > = HashMap :: new ( ) ;
143
- let contracts = accessed_states. accessed_contracts ;
145
+ let contracts = accessed_states. accessed_contracts . clone ( ) ;
144
146
145
147
// Accumulate account proof of account in previous block
146
148
for ( accessed_address, accessed_slots) in accessed_states. accessed_accounts . iter ( ) {
@@ -186,14 +188,8 @@ fn extract_zkvm_input<Node: FullNodeComponents<Types: NodeTypes<Primitives = Eth
186
188
)
187
189
. expect ( "Proof to tries infallible" ) ;
188
190
189
- // Get ancestor headers
190
- let ancestor_headers = get_ancestor_headers ( ctx, current_block_idx) ?;
191
-
192
- println ! (
193
- "Abishek got ancestor_headers: num {:?} {:?}" ,
194
- ancestor_headers. len( ) ,
195
- ancestor_headers
196
- ) ;
191
+ let ancestor_headers =
192
+ get_ancestor_headers ( ctx, current_block_idx, accessed_states. accessed_block_ids ( ) ) ?;
197
193
198
194
let input = EvmBlockStfInput {
199
195
beneficiary : current_block. header . beneficiary ,
@@ -213,21 +209,30 @@ fn extract_zkvm_input<Node: FullNodeComponents<Types: NodeTypes<Primitives = Eth
213
209
Ok ( input)
214
210
}
215
211
216
- fn get_ancestor_headers < Node : FullNodeComponents < Types : NodeTypes < Primitives = EthPrimitives > > > (
212
+ fn get_ancestor_headers < Node > (
217
213
ctx : & ExExContext < Node > ,
218
- block_idx : u64 ,
219
- ) -> eyre:: Result < Vec < Header > > {
220
- let oldest_parent = block_idx. saturating_sub ( MAX_ANCESTOR_DEPTH ) ;
221
- let prev_block_idx = block_idx. saturating_sub ( 1 ) ;
222
- let provider = ctx. provider ( ) ;
223
- let mut headers = Vec :: with_capacity ( ( block_idx - oldest_parent) as usize ) ;
214
+ current_blk_idx : u64 ,
215
+ accessed_block_idxs : & HashSet < u64 > ,
216
+ ) -> eyre:: Result < Vec < Header > >
217
+ where
218
+ Node : FullNodeComponents ,
219
+ Node :: Types : NodeTypes < Primitives = EthPrimitives > ,
220
+ {
221
+ let Some ( oldest_parent_idx) = accessed_block_idxs. iter ( ) . copied ( ) . min_by ( |a, b| a. cmp ( b) )
222
+ else {
223
+ return Ok ( Vec :: new ( ) ) ;
224
+ } ;
224
225
225
- for block_num in ( oldest_parent..prev_block_idx) . rev ( ) {
226
- let block = provider
227
- . block_by_number ( block_num) ?
228
- . ok_or_else ( || eyre ! ( "Block not found for block number {block_num}" ) ) ?;
229
- headers. push ( block. header ) ;
230
- }
226
+ let provider = ctx. provider ( ) ;
227
+ let headers = ( oldest_parent_idx..current_blk_idx. saturating_sub ( 1 ) )
228
+ . rev ( )
229
+ . map ( |block_num| {
230
+ provider
231
+ . block_by_number ( block_num) ?
232
+ . map ( |block| block. header )
233
+ . ok_or_else ( || eyre ! ( "Block not found for block number {block_num}" ) )
234
+ } )
235
+ . collect :: < eyre:: Result < Vec < _ > > > ( ) ?;
231
236
232
237
Ok ( headers)
233
238
}
0 commit comments