Skip to content

Commit 4de3ab9

Browse files
refactor(blockifier): storage access tracker
1 parent 7939fe8 commit 4de3ab9

File tree

12 files changed

+102
-46
lines changed

12 files changed

+102
-46
lines changed

crates/blockifier/src/concurrency/fee_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ pub fn fill_sequencer_balance_reads(
6969
sequencer_balance: (Felt, Felt),
7070
) {
7171
let storage_read_values = if fee_transfer_call_info.inner_calls.is_empty() {
72-
&mut fee_transfer_call_info.storage_read_values
72+
&mut fee_transfer_call_info.storage_access_tracker.storage_read_values
7373
} else
7474
// Proxy pattern.
7575
{
@@ -78,7 +78,7 @@ pub fn fill_sequencer_balance_reads(
7878
1,
7979
"Proxy pattern should have one inner call"
8080
);
81-
&mut fee_transfer_call_info.inner_calls[0].storage_read_values
81+
&mut fee_transfer_call_info.inner_calls[0].storage_access_tracker.storage_read_values
8282
};
8383
assert_eq!(storage_read_values.len(), 4, "Storage read values should have 4 elements");
8484

crates/blockifier/src/concurrency/worker_logic_test.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ pub fn test_commit_tx() {
165165
.fee_transfer_call_info
166166
.as_ref()
167167
.unwrap()
168+
.storage_access_tracker
168169
.storage_read_values[read_storage_index];
169170
assert_eq!(felt!(expected_sequencer_storage_read), actual_sequencer_storage_read,);
170171
}
@@ -221,7 +222,8 @@ fn test_commit_tx_when_sender_is_sequencer() {
221222
let execution_result = &execution_task_outputs.as_ref().unwrap().result;
222223
let fee_transfer_call_info =
223224
execution_result.as_ref().unwrap().fee_transfer_call_info.as_ref().unwrap();
224-
let read_values_before_commit = fee_transfer_call_info.storage_read_values.clone();
225+
let read_values_before_commit =
226+
fee_transfer_call_info.storage_access_tracker.storage_read_values.clone();
225227
drop(execution_task_outputs);
226228

227229
let tx_context = &executor.block_context.to_tx_context(&sequencer_tx[0]);
@@ -239,7 +241,10 @@ fn test_commit_tx_when_sender_is_sequencer() {
239241
let fee_transfer_call_info =
240242
commit_result.as_ref().unwrap().fee_transfer_call_info.as_ref().unwrap();
241243
// Check that the result call info is the same as before the commit.
242-
assert_eq!(read_values_before_commit, fee_transfer_call_info.storage_read_values);
244+
assert_eq!(
245+
read_values_before_commit,
246+
fee_transfer_call_info.storage_access_tracker.storage_read_values
247+
);
243248

244249
let sequencer_balance_low_after =
245250
tx_versioned_state.get_storage_at(fee_token_address, sequencer_balance_key_low).unwrap();

crates/blockifier/src/execution/call_info.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,16 @@ impl AddAssign<&ChargedResources> for ChargedResources {
137137
}
138138
}
139139

140+
#[cfg_attr(any(test, feature = "testing"), derive(Clone))]
141+
#[cfg_attr(feature = "transaction_serde", derive(serde::Deserialize))]
142+
#[derive(Debug, Default, Eq, PartialEq, Serialize)]
143+
pub struct StorageAccessTracker {
144+
pub storage_read_values: Vec<Felt>,
145+
pub accessed_storage_keys: HashSet<StorageKey>,
146+
pub read_class_hash_values: Vec<ClassHash>,
147+
pub accessed_contract_addresses: HashSet<ContractAddress>,
148+
}
149+
140150
/// Represents the full effects of executing an entry point, including the inner calls it invoked.
141151
#[cfg_attr(any(test, feature = "testing"), derive(Clone))]
142152
#[cfg_attr(feature = "transaction_serde", derive(serde::Deserialize))]
@@ -149,10 +159,11 @@ pub struct CallInfo {
149159
pub tracked_resource: TrackedResource,
150160

151161
// Additional information gathered during execution.
152-
pub storage_read_values: Vec<Felt>,
153-
pub accessed_storage_keys: HashSet<StorageKey>,
154-
pub read_class_hash_values: Vec<ClassHash>,
155-
pub accessed_contract_addresses: HashSet<ContractAddress>,
162+
pub storage_access_tracker: StorageAccessTracker,
163+
// pub storage_read_values: Vec<Felt>,
164+
// pub accessed_storage_keys: HashSet<StorageKey>,
165+
// pub read_class_hash_values: Vec<ClassHash>,
166+
// pub accessed_contract_addresses: HashSet<ContractAddress>,
156167
}
157168

158169
impl CallInfo {
@@ -185,6 +196,7 @@ impl CallInfo {
185196

186197
// Storage entries.
187198
let call_storage_entries = call_info
199+
.storage_access_tracker
188200
.accessed_storage_keys
189201
.iter()
190202
.map(|storage_key| (call_info.call.storage_address, *storage_key));

crates/blockifier/src/execution/deprecated_entry_point_execution.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use starknet_api::contract_class::EntryPointType;
1111
use starknet_api::core::EntryPointSelector;
1212
use starknet_api::hash::StarkHash;
1313

14+
use super::call_info::StorageAccessTracker;
1415
use super::execution_utils::SEGMENT_ARENA_BUILTIN_SIZE;
1516
use crate::execution::call_info::{CallExecution, CallInfo};
1617
use crate::execution::contract_class::{CompiledClassV0, TrackedResource};
@@ -268,9 +269,11 @@ pub fn finalize_execution(
268269
inner_calls: syscall_handler.inner_calls,
269270
tracked_resource: TrackedResource::CairoSteps,
270271
resources: vm_resources,
271-
storage_read_values: syscall_handler.read_values,
272-
accessed_storage_keys: syscall_handler.accessed_keys,
273-
..Default::default()
272+
storage_access_tracker: StorageAccessTracker {
273+
storage_read_values: syscall_handler.read_values,
274+
accessed_storage_keys: syscall_handler.accessed_keys,
275+
..Default::default()
276+
},
274277
})
275278
}
276279

crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use starknet_types_core::felt::Felt;
2727
use test_case::test_case;
2828

2929
use crate::context::ChainInfo;
30-
use crate::execution::call_info::{CallExecution, CallInfo, OrderedEvent};
30+
use crate::execution::call_info::{CallExecution, CallInfo, OrderedEvent, StorageAccessTracker};
3131
use crate::execution::common_hints::ExecutionMode;
3232
use crate::execution::deprecated_syscalls::DeprecatedSyscallSelector;
3333
use crate::execution::entry_point::{CallEntryPoint, CallType};
@@ -156,8 +156,11 @@ fn test_nested_library_call() {
156156
call: nested_storage_entry_point,
157157
execution: CallExecution::from_retdata(retdata![felt!(value + 1)]),
158158
resources: storage_entry_point_resources.clone(),
159-
storage_read_values: vec![felt!(value + 1)],
160-
accessed_storage_keys: HashSet::from([storage_key!(key + 1)]),
159+
storage_access_tracker: StorageAccessTracker {
160+
storage_read_values: vec![felt!(value + 1)],
161+
accessed_storage_keys: HashSet::from([storage_key!(key + 1)]),
162+
..Default::default()
163+
},
161164
..Default::default()
162165
};
163166
let mut library_call_resources = &get_syscall_resources(DeprecatedSyscallSelector::LibraryCall)
@@ -178,8 +181,11 @@ fn test_nested_library_call() {
178181
call: storage_entry_point,
179182
execution: CallExecution::from_retdata(retdata![felt!(value)]),
180183
resources: storage_entry_point_resources.clone(),
181-
storage_read_values: vec![felt!(value)],
182-
accessed_storage_keys: HashSet::from([storage_key!(key)]),
184+
storage_access_tracker: StorageAccessTracker {
185+
storage_read_values: vec![felt!(value)],
186+
accessed_storage_keys: HashSet::from([storage_key!(key)]),
187+
..Default::default()
188+
},
183189
..Default::default()
184190
};
185191

@@ -244,8 +250,11 @@ fn test_call_contract() {
244250
n_memory_holes: 0,
245251
builtin_instance_counter: HashMap::from([(BuiltinName::range_check, 2)]),
246252
},
247-
storage_read_values: vec![value],
248-
accessed_storage_keys: HashSet::from([storage_key!(key_int)]),
253+
storage_access_tracker: StorageAccessTracker {
254+
storage_read_values: vec![value],
255+
accessed_storage_keys: HashSet::from([storage_key!(key_int)]),
256+
..Default::default()
257+
},
249258
..Default::default()
250259
};
251260
let expected_call_info = CallInfo {

crates/blockifier/src/execution/entry_point_execution.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use cairo_vm::vm::security::verify_secure_runner;
1010
use num_traits::{ToPrimitive, Zero};
1111
use starknet_types_core::felt::Felt;
1212

13+
use super::call_info::StorageAccessTracker;
1314
use crate::execution::call_info::{CallExecution, CallInfo, Retdata};
1415
use crate::execution::contract_class::{CompiledClassV1, EntryPointV1, TrackedResource};
1516
use crate::execution::entry_point::{
@@ -387,10 +388,12 @@ pub fn finalize_execution(
387388
inner_calls: syscall_handler_base.inner_calls,
388389
tracked_resource,
389390
resources: vm_resources,
390-
storage_read_values: syscall_handler_base.read_values,
391-
accessed_storage_keys: syscall_handler_base.accessed_keys,
392-
read_class_hash_values: syscall_handler_base.read_class_hash_values,
393-
accessed_contract_addresses: syscall_handler_base.accessed_contract_addresses,
391+
storage_access_tracker: StorageAccessTracker {
392+
storage_read_values: syscall_handler_base.read_values,
393+
accessed_storage_keys: syscall_handler_base.accessed_keys,
394+
read_class_hash_values: syscall_handler_base.read_class_hash_values,
395+
accessed_contract_addresses: syscall_handler_base.accessed_contract_addresses,
396+
},
394397
})
395398
}
396399

crates/blockifier/src/execution/entry_point_test.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -491,9 +491,9 @@ fn test_storage_related_members() {
491491
..trivial_external_entry_point_new(test_contract)
492492
};
493493
let actual_call_info = entry_point_call.execute_directly(&mut state).unwrap();
494-
assert_eq!(actual_call_info.storage_read_values, vec![felt!(39_u8)]);
494+
assert_eq!(actual_call_info.storage_access_tracker.storage_read_values, vec![felt!(39_u8)]);
495495
assert_eq!(
496-
actual_call_info.accessed_storage_keys,
496+
actual_call_info.storage_access_tracker.accessed_storage_keys,
497497
HashSet::from([get_storage_var_address("number_map", &[felt!(1_u8)])])
498498
);
499499

@@ -508,8 +508,11 @@ fn test_storage_related_members() {
508508
..trivial_external_entry_point_new(test_contract)
509509
};
510510
let actual_call_info = entry_point_call.execute_directly(&mut state).unwrap();
511-
assert_eq!(actual_call_info.storage_read_values, vec![value]);
512-
assert_eq!(actual_call_info.accessed_storage_keys, HashSet::from([storage_key!(key_int)]));
511+
assert_eq!(actual_call_info.storage_access_tracker.storage_read_values, vec![value]);
512+
assert_eq!(
513+
actual_call_info.storage_access_tracker.accessed_storage_keys,
514+
HashSet::from([storage_key!(key_int)])
515+
);
513516
}
514517

515518
#[test]

crates/blockifier/src/execution/native/entry_point_execution.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,12 @@ fn create_callinfo(
131131
},
132132
resources: vm_resources,
133133
inner_calls: syscall_handler.base.inner_calls,
134-
storage_read_values: syscall_handler.base.read_values,
135-
accessed_storage_keys: syscall_handler.base.accessed_keys,
136-
accessed_contract_addresses: syscall_handler.base.accessed_contract_addresses,
137-
read_class_hash_values: syscall_handler.base.read_class_hash_values,
134+
storage_access_tracker: StorageAccessTracker {
135+
storage_read_values: syscall_handler.base.read_values,
136+
accessed_storage_keys: syscall_handler.base.accessed_keys,
137+
accessed_contract_addresses: syscall_handler.base.accessed_contract_addresses,
138+
read_class_hash_values: syscall_handler.base.read_class_hash_values,
139+
},
138140
tracked_resource: TrackedResource::SierraGas,
139141
})
140142
}

crates/blockifier/src/execution/syscalls/syscall_tests/get_class_hash_at.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ fn test_get_class_hash_at(runnable_version: RunnableCairo1) {
3636
let positive_call_info =
3737
positive_entry_point_call.clone().execute_directly(&mut state).unwrap();
3838
let redeposit_gas = 300;
39-
assert!(positive_call_info.accessed_contract_addresses.contains(&address));
40-
assert!(positive_call_info.read_class_hash_values[0] == class_hash);
39+
assert!(
40+
positive_call_info.storage_access_tracker.accessed_contract_addresses.contains(&address)
41+
);
42+
assert!(positive_call_info.storage_access_tracker.read_class_hash_values[0] == class_hash);
4143
assert_eq!(
4244
positive_call_info.execution,
4345
CallExecution {

crates/blockifier/src/execution/syscalls/syscall_tests/library_call.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use starknet_api::{calldata, felt, storage_key};
66
use test_case::test_case;
77

88
use crate::context::ChainInfo;
9-
use crate::execution::call_info::{CallExecution, CallInfo, Retdata};
9+
use crate::execution::call_info::{CallExecution, CallInfo, Retdata, StorageAccessTracker};
1010
use crate::execution::entry_point::{CallEntryPoint, CallType};
1111
use crate::execution::syscalls::syscall_tests::constants::{
1212
REQUIRED_GAS_LIBRARY_CALL_TEST,
@@ -161,8 +161,11 @@ fn test_nested_library_call(runnable_version: RunnableCairo1) {
161161
..CallExecution::default()
162162
},
163163
tracked_resource,
164-
storage_read_values: vec![felt!(value + 1)],
165-
accessed_storage_keys: HashSet::from([storage_key!(key + 1)]),
164+
storage_access_tracker: StorageAccessTracker {
165+
storage_read_values: vec![felt!(value + 1)],
166+
accessed_storage_keys: HashSet::from([storage_key!(key + 1)]),
167+
..Default::default()
168+
},
166169
..Default::default()
167170
};
168171

@@ -185,8 +188,11 @@ fn test_nested_library_call(runnable_version: RunnableCairo1) {
185188
gas_consumed: REQUIRED_GAS_STORAGE_READ_WRITE_TEST,
186189
..CallExecution::default()
187190
},
188-
storage_read_values: vec![felt!(value)],
189-
accessed_storage_keys: HashSet::from([storage_key!(key)]),
191+
storage_access_tracker: StorageAccessTracker {
192+
storage_read_values: vec![felt!(value)],
193+
accessed_storage_keys: HashSet::from([storage_key!(key)]),
194+
..Default::default()
195+
},
190196
tracked_resource,
191197
..Default::default()
192198
};

0 commit comments

Comments
 (0)