From 2160a0bfea18f328216323070c192b2da0309162 Mon Sep 17 00:00:00 2001 From: Yoav Gross Date: Thu, 14 May 2026 12:11:23 +0300 Subject: [PATCH] blockifier: extract CallInfo::get_visited_storage_entries Co-Authored-By: Claude Sonnet 4.6 --- crates/blockifier/src/execution/call_info.rs | 15 +++++++----- crates/blockifier/src/transaction/objects.rs | 24 +++++++++++++++++++- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/crates/blockifier/src/execution/call_info.rs b/crates/blockifier/src/execution/call_info.rs index 9b120c93a7b..ff7c451b81f 100644 --- a/crates/blockifier/src/execution/call_info.rs +++ b/crates/blockifier/src/execution/call_info.rs @@ -517,12 +517,7 @@ impl CallInfo { executed_class_hashes.insert(class_hash); // Storage entries. - let call_storage_entries = call_info - .storage_access_tracker - .accessed_storage_keys - .iter() - .map(|storage_key| (call_info.call.storage_address, *storage_key)); - visited_storage_entries.extend(call_storage_entries); + visited_storage_entries.extend(call_info.get_visited_storage_entries()); // Messages. l2_to_l1_payload_lengths.extend( @@ -582,6 +577,14 @@ impl CallInfo { }) } + pub fn get_visited_storage_entries(&self) -> impl Iterator + '_ { + let storage_address = self.call.storage_address; + self.storage_access_tracker + .accessed_storage_keys + .iter() + .map(move |key| (storage_address, *key)) + } + /// Returns a vector of Starknet Event objects collected during the execution, sorted by the /// order in which they were emitted. pub fn get_sorted_events(&self) -> Vec { diff --git a/crates/blockifier/src/transaction/objects.rs b/crates/blockifier/src/transaction/objects.rs index ffe3a844a67..d3096871a8d 100644 --- a/crates/blockifier/src/transaction/objects.rs +++ b/crates/blockifier/src/transaction/objects.rs @@ -1,10 +1,13 @@ +use std::collections::HashSet; + use cairo_vm::types::builtin_name::BuiltinName; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use starknet_api::block::{BlockInfo, FeeType}; use starknet_api::block_hash::block_hash_calculator::TransactionOutputForHash; -use starknet_api::core::{ContractAddress, Nonce}; +use starknet_api::core::{ContractAddress, Nonce, BLOCK_HASH_TABLE_ADDRESS}; use starknet_api::data_availability::DataAvailabilityMode; use starknet_api::execution_resources::GasVector; +use starknet_api::state::StorageKey; use starknet_api::transaction::constants::VALIDATE_DEPLOY_ENTRY_POINT_SELECTOR; use starknet_api::transaction::fields::{ AccountDeploymentData, @@ -42,6 +45,7 @@ use crate::execution::stack_trace::ErrorStack; use crate::fee::fee_checks::FeeCheckError; use crate::fee::fee_utils::get_fee_by_gas_vector; use crate::fee::receipt::TransactionReceipt; +use crate::state::cached_state::StorageEntry; use crate::transaction::errors::{TransactionExecutionError, TransactionPreValidationError}; use crate::utils::add_maps; @@ -267,6 +271,24 @@ impl TransactionExecutionInfo { CallInfo::summarize_many(self.non_optional_call_infos(), versioned_constants) } + /// Returns the set of storage entries (contract_address, key) visited by this transaction. + /// Mirrors the Python `TransactionExecutionInfo.get_visited_storage_entries`. + /// + /// Includes (BLOCK_HASH_TABLE_ADDRESS, block_number) entries for each block whose hash was read + /// via `get_block_hash`. + pub fn get_visited_storage_entries(&self) -> HashSet { + self.non_optional_call_infos() + .flat_map(|call_info| call_info.iter()) + .flat_map(|call_info| { + let block_hash_entries = + call_info.storage_access_tracker.accessed_blocks.iter().map(|block_number| { + (BLOCK_HASH_TABLE_ADDRESS, StorageKey::from(block_number.0)) + }); + call_info.get_visited_storage_entries().chain(block_hash_entries) + }) + .collect() + } + pub fn summarize_builtins(&self) -> CairoPrimitiveCounterMap { let mut builtin_counters = CairoPrimitiveCounterMap::new(); // Remove fee transfer builtins to avoid double-counting in `get_tx_weights`