diff --git a/crates/blockifier/src/execution/call_info.rs b/crates/blockifier/src/execution/call_info.rs index 643a459d1e..80ff326a4d 100644 --- a/crates/blockifier/src/execution/call_info.rs +++ b/crates/blockifier/src/execution/call_info.rs @@ -4,6 +4,7 @@ use std::ops::{Add, AddAssign}; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use serde::Serialize; +use starknet_api::block::{BlockHash, BlockNumber}; use starknet_api::core::{ClassHash, ContractAddress, EthAddress}; use starknet_api::execution_resources::GasAmount; use starknet_api::state::StorageKey; @@ -145,6 +146,9 @@ pub struct StorageAccessTracker { pub accessed_storage_keys: HashSet, pub read_class_hash_values: Vec, pub accessed_contract_addresses: HashSet, + // TODO(Aner): add tests for storage tracking of contract 0x1 + pub read_block_hash_values: Vec, + pub accessed_blocks: HashSet, } /// Represents the full effects of executing an entry point, including the inner calls it invoked. diff --git a/crates/blockifier/src/execution/entry_point_execution.rs b/crates/blockifier/src/execution/entry_point_execution.rs index 9a0d685ede..f4f63148c3 100644 --- a/crates/blockifier/src/execution/entry_point_execution.rs +++ b/crates/blockifier/src/execution/entry_point_execution.rs @@ -393,6 +393,8 @@ pub fn finalize_execution( accessed_storage_keys: syscall_handler_base.accessed_keys, read_class_hash_values: syscall_handler_base.read_class_hash_values, accessed_contract_addresses: syscall_handler_base.accessed_contract_addresses, + read_block_hash_values: syscall_handler_base.read_block_hash_values, + accessed_blocks: syscall_handler_base.accessed_blocks, }, }) } diff --git a/crates/blockifier/src/execution/native/syscall_handler.rs b/crates/blockifier/src/execution/native/syscall_handler.rs index a818540fbb..84d6a2fa92 100644 --- a/crates/blockifier/src/execution/native/syscall_handler.rs +++ b/crates/blockifier/src/execution/native/syscall_handler.rs @@ -234,6 +234,7 @@ impl<'state> NativeSyscallHandler<'state> { impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> { fn get_block_hash( + // HERE??? &mut self, block_number: u64, remaining_gas: &mut u64, diff --git a/crates/blockifier/src/execution/syscalls/syscall_base.rs b/crates/blockifier/src/execution/syscalls/syscall_base.rs index 5de5129173..00c4920b49 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_base.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_base.rs @@ -2,6 +2,7 @@ use std::collections::{hash_map, HashMap, HashSet}; use std::convert::From; +use starknet_api::block::{BlockHash, BlockNumber}; use starknet_api::core::{calculate_contract_address, ClassHash, ContractAddress}; use starknet_api::state::StorageKey; use starknet_api::transaction::fields::{Calldata, ContractAddressSalt}; @@ -49,7 +50,9 @@ pub struct SyscallHandlerBase<'state> { pub read_class_hash_values: Vec, // Accessed addresses by the `get_class_hash_at` syscall. pub accessed_contract_addresses: HashSet, - + pub read_block_hash_values: Vec, + // Accessed block hashes by the `get_block_hash` syscall. + pub accessed_blocks: HashSet, // The original storage value of the executed contract. // Should be moved back `context.revert_info` before executing an inner call. pub original_values: HashMap, @@ -83,12 +86,14 @@ impl<'state> SyscallHandlerBase<'state> { accessed_keys: HashSet::new(), read_class_hash_values: Vec::new(), accessed_contract_addresses: HashSet::new(), + read_block_hash_values: Vec::new(), + accessed_blocks: HashSet::new(), original_values, revert_info_idx, } } - pub fn get_block_hash(&self, requested_block_number: u64) -> SyscallResult { + pub fn get_block_hash(&mut self, requested_block_number: u64) -> SyscallResult { // Note: we take the actual block number (and not the rounded one for validate) // in any case; it is consistent with the OS implementation and safe (see `Validate` arm). let current_block_number = self.context.tx_context.block_context.block_info.block_number.0; @@ -123,6 +128,7 @@ impl<'state> SyscallHandlerBase<'state> { } } + self.accessed_blocks.insert(BlockNumber(requested_block_number)); let key = StorageKey::try_from(Felt::from(requested_block_number))?; let block_hash_contract_address = self .context @@ -132,7 +138,9 @@ impl<'state> SyscallHandlerBase<'state> { .os_constants .os_contract_addresses .block_hash_contract_address(); - Ok(self.state.get_storage_at(block_hash_contract_address, key)?) + let block_hash = self.state.get_storage_at(block_hash_contract_address, key)?; + self.read_block_hash_values.push(BlockHash(block_hash)); + Ok(block_hash) } pub fn storage_read(&mut self, key: StorageKey) -> SyscallResult { diff --git a/crates/starknet_consensus_orchestrator/resources/central_transaction_execution_info.json b/crates/starknet_consensus_orchestrator/resources/central_transaction_execution_info.json index 53af04bb3b..26e2d4b09b 100644 --- a/crates/starknet_consensus_orchestrator/resources/central_transaction_execution_info.json +++ b/crates/starknet_consensus_orchestrator/resources/central_transaction_execution_info.json @@ -137,6 +137,12 @@ "0x0", "0x1", "0x2" + ], + "read_block_hash_values": [ + "0xdeafbee" + ], + "accessed_blocks": [ + 100 ] }, "tracked_resource": "SierraGas", @@ -165,6 +171,12 @@ "0x0", "0x1", "0x2" + ], + "read_block_hash_values": [ + "0xdeafbee" + ], + "accessed_blocks": [ + 100 ] }, "tracked_resource": "SierraGas" @@ -296,6 +308,12 @@ "0x0", "0x1", "0x2" + ], + "read_block_hash_values": [ + "0xdeafbee" + ], + "accessed_blocks": [ + 100 ] }, "tracked_resource": "SierraGas", @@ -324,6 +342,12 @@ "0x0", "0x1", "0x2" + ], + "read_block_hash_values": [ + "0xdeafbee" + ], + "accessed_blocks": [ + 100 ] }, "tracked_resource": "SierraGas" @@ -461,6 +485,12 @@ "0x0", "0x1", "0x2" + ], + "read_block_hash_values": [ + "0xdeafbee" + ], + "accessed_blocks": [ + 100 ] }, "tracked_resource": "SierraGas", @@ -489,6 +519,12 @@ "0x0", "0x1", "0x2" + ], + "read_block_hash_values": [ + "0xdeafbee" + ], + "accessed_blocks": [ + 100 ] }, "tracked_resource": "SierraGas" diff --git a/crates/starknet_consensus_orchestrator/src/cende/central_objects_test.rs b/crates/starknet_consensus_orchestrator/src/cende/central_objects_test.rs index d553c0ad99..d29a4659c4 100644 --- a/crates/starknet_consensus_orchestrator/src/cende/central_objects_test.rs +++ b/crates/starknet_consensus_orchestrator/src/cende/central_objects_test.rs @@ -46,6 +46,7 @@ use num_bigint::BigUint; use rstest::rstest; use serde_json::Value; use starknet_api::block::{ + BlockHash, BlockInfo, BlockNumber, BlockTimestamp, @@ -491,6 +492,8 @@ fn call_info() -> CallInfo { accessed_storage_keys: HashSet::from([StorageKey::from(1_u128)]), read_class_hash_values: vec![ClassHash(felt!("0x80020000"))], accessed_contract_addresses: HashSet::from([contract_address!("0x1")]), + read_block_hash_values: vec![BlockHash(felt!("0xdeafbee"))], + accessed_blocks: HashSet::from([BlockNumber(100)]), }, } }