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,10 +142,10 @@ 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
- for ( accessed_address, accessed_slots) in accessed_states. accessed_accounts . iter ( ) {
148
+ for ( accessed_address, accessed_slots) in accessed_states. accessed_accounts ( ) . iter ( ) {
147
149
let slots: Vec < B256 > = accessed_slots
148
150
. iter ( )
149
151
. map ( |el| B256 :: from_slice ( & el. to_be_bytes :: < 32 > ( ) ) )
@@ -162,7 +164,7 @@ fn extract_zkvm_input<Node: FullNodeComponents<Types: NodeTypes<Primitives = Eth
162
164
}
163
165
164
166
// Accumulate account proof of account in current block
165
- for ( accessed_address, accessed_slots) in accessed_states. accessed_accounts . iter ( ) {
167
+ for ( accessed_address, accessed_slots) in accessed_states. accessed_accounts ( ) . iter ( ) {
166
168
let slots: Vec < B256 > = accessed_slots
167
169
. iter ( )
168
170
. map ( |el| B256 :: from_slice ( & el. to_be_bytes :: < 32 > ( ) ) )
@@ -186,14 +188,11 @@ 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 = get_ancestor_headers (
192
+ ctx,
193
+ current_block_idx,
194
+ accessed_states. accessed_block_idxs ( ) ,
195
+ ) ?;
197
196
198
197
let input = EvmBlockStfInput {
199
198
beneficiary : current_block. header . beneficiary ,
@@ -213,21 +212,30 @@ fn extract_zkvm_input<Node: FullNodeComponents<Types: NodeTypes<Primitives = Eth
213
212
Ok ( input)
214
213
}
215
214
216
- fn get_ancestor_headers < Node : FullNodeComponents < Types : NodeTypes < Primitives = EthPrimitives > > > (
215
+ fn get_ancestor_headers < Node > (
217
216
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 ) ;
217
+ current_blk_idx : u64 ,
218
+ accessed_block_idxs : & HashSet < u64 > ,
219
+ ) -> eyre:: Result < Vec < Header > >
220
+ where
221
+ Node : FullNodeComponents ,
222
+ Node :: Types : NodeTypes < Primitives = EthPrimitives > ,
223
+ {
224
+ let Some ( oldest_parent_idx) = accessed_block_idxs. iter ( ) . copied ( ) . min_by ( |a, b| a. cmp ( b) )
225
+ else {
226
+ return Ok ( Vec :: new ( ) ) ;
227
+ } ;
224
228
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
- }
229
+ let provider = ctx. provider ( ) ;
230
+ let headers = ( oldest_parent_idx..current_blk_idx. saturating_sub ( 1 ) )
231
+ . rev ( )
232
+ . map ( |block_num| {
233
+ provider
234
+ . block_by_number ( block_num) ?
235
+ . map ( |block| block. header )
236
+ . ok_or_else ( || eyre ! ( "Block not found for block number {block_num}" ) )
237
+ } )
238
+ . collect :: < eyre:: Result < Vec < _ > > > ( ) ?;
231
239
232
240
Ok ( headers)
233
241
}
0 commit comments