From 91c2b1056f76443847991d00b8bf7c08f71d59fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Wed, 11 Jun 2025 13:48:16 -0300 Subject: [PATCH 1/4] Capture time of transaction execution --- crates/blockifier/src/transaction/account_transaction.rs | 4 ++++ crates/blockifier/src/transaction/objects.rs | 4 ++++ crates/blockifier/src/transaction/transaction_execution.rs | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/crates/blockifier/src/transaction/account_transaction.rs b/crates/blockifier/src/transaction/account_transaction.rs index fcc673c2789..d90c2d5c78c 100644 --- a/crates/blockifier/src/transaction/account_transaction.rs +++ b/crates/blockifier/src/transaction/account_transaction.rs @@ -1,4 +1,5 @@ use std::sync::Arc; +use std::time::Instant; use starknet_api::abi::abi_utils::selector_from_name; use starknet_api::block::GasPriceVector; @@ -796,6 +797,8 @@ impl ExecutableTransaction for AccountTransaction { block_context: &BlockContext, concurrency_mode: bool, ) -> TransactionExecutionResult { + let pre_execution_instant = Instant::now(); + let tx_context = Arc::new(block_context.to_tx_context(self)); self.verify_tx_version(tx_context.tx_info.version())?; @@ -836,6 +839,7 @@ impl ExecutableTransaction for AccountTransaction { gas: total_gas, }, revert_error, + time: Some(pre_execution_instant.elapsed()), }; Ok(tx_execution_info) } diff --git a/crates/blockifier/src/transaction/objects.rs b/crates/blockifier/src/transaction/objects.rs index 573517cd1a3..88647c371f1 100644 --- a/crates/blockifier/src/transaction/objects.rs +++ b/crates/blockifier/src/transaction/objects.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::time::Duration; use cairo_vm::types::builtin_name::BuiltinName; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; @@ -209,6 +210,9 @@ pub struct TransactionExecutionInfo { /// (including L1 gas and additional OS resources estimation), /// and total gas consumed. pub receipt: TransactionReceipt, + /// Total execution time of the transaction. + /// None implies that the time was not measured. + pub time: Option, } impl TransactionExecutionInfo { diff --git a/crates/blockifier/src/transaction/transaction_execution.rs b/crates/blockifier/src/transaction/transaction_execution.rs index 43f8f911eea..97d66d8f28a 100644 --- a/crates/blockifier/src/transaction/transaction_execution.rs +++ b/crates/blockifier/src/transaction/transaction_execution.rs @@ -1,4 +1,5 @@ use std::sync::Arc; +use std::time::Instant; use starknet_api::contract_class::ClassInfo; use starknet_api::core::{calculate_contract_address, ContractAddress, Nonce}; @@ -142,6 +143,8 @@ impl ExecutableTransaction for L1HandlerTransaction { block_context: &BlockContext, _concurrency_mode: bool, ) -> TransactionExecutionResult { + let pre_execution_instant = Instant::now(); + let tx_context = Arc::new(block_context.to_tx_context(self)); let limit_steps_by_resources = false; // The Sierra gas limit for L1 handler transaction is set to max_execute_sierra_gas. @@ -184,6 +187,7 @@ impl ExecutableTransaction for L1HandlerTransaction { gas: total_gas, }, revert_error: None, + time: Some(pre_execution_instant.elapsed()), }) } } From 00581206b2f87541c1d81cf810b29d1115e96ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Wed, 11 Jun 2025 13:58:50 -0300 Subject: [PATCH 2/4] Capture time for inner calls --- crates/blockifier/src/execution/call_info.rs | 5 ++++- .../src/execution/entry_point_execution.rs | 2 +- crates/blockifier/src/execution/execution_utils.rs | 12 +++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/crates/blockifier/src/execution/call_info.rs b/crates/blockifier/src/execution/call_info.rs index 56d126ca048..2e04ff05930 100644 --- a/crates/blockifier/src/execution/call_info.rs +++ b/crates/blockifier/src/execution/call_info.rs @@ -1,6 +1,7 @@ use std::collections::HashSet; use std::iter::Sum; use std::ops::{Add, AddAssign}; +use std::time::Duration; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use serde::Serialize; @@ -207,12 +208,14 @@ pub struct CallInfo { pub tracked_resource: TrackedResource, // Additional information gathered during execution. - pub time: std::time::Duration, pub call_counter: usize, pub storage_read_values: Vec, pub accessed_storage_keys: HashSet, pub read_class_hash_values: Vec, pub accessed_contract_addresses: HashSet, + /// Execution time of the contract call. + /// None implies that the time was not measured. + pub time: Option, } impl CallInfo { diff --git a/crates/blockifier/src/execution/entry_point_execution.rs b/crates/blockifier/src/execution/entry_point_execution.rs index 59bcfda18fb..482250c1eba 100644 --- a/crates/blockifier/src/execution/entry_point_execution.rs +++ b/crates/blockifier/src/execution/entry_point_execution.rs @@ -393,8 +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, - time: std::time::Duration::default(), call_counter: 0, + time: None, }) } diff --git a/crates/blockifier/src/execution/execution_utils.rs b/crates/blockifier/src/execution/execution_utils.rs index 658a6db07f7..85cb4a6b9f4 100644 --- a/crates/blockifier/src/execution/execution_utils.rs +++ b/crates/blockifier/src/execution/execution_utils.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::time::Instant; use cairo_vm::serde::deserialize_program::{ deserialize_array_of_bigint_hex, @@ -115,10 +116,8 @@ pub fn execute_entry_point_call( state: &mut dyn State, context: &mut EntryPointExecutionContext, ) -> EntryPointExecutionResult { - let current_call_counter = context.call_counter; - context.call_counter += 1; - let pre_time = std::time::Instant::now(); - let mut result = match compiled_class { + let pre_execution_instant = Instant::now(); + let mut call_info = match compiled_class { RunnableCompiledClass::V0(compiled_class) => { deprecated_entry_point_execution::execute_entry_point_call( call, @@ -153,9 +152,8 @@ pub fn execute_entry_point_call( } } }?; - result.time = pre_time.elapsed(); - result.call_counter = current_call_counter; - Ok(result) + call_info.time = Some(pre_execution_instant.elapsed()); + Ok(call_info) } pub fn update_remaining_gas(remaining_gas: &mut u64, call_info: &CallInfo) { From 58c8c5c2c109de603e3b691c30b85600544a1e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Thu, 12 Jun 2025 16:00:10 -0300 Subject: [PATCH 3/4] Remove call counter --- crates/blockifier/src/execution/call_info.rs | 1 - crates/blockifier/src/execution/entry_point_execution.rs | 1 - crates/blockifier/src/execution/native/entry_point_execution.rs | 1 - 3 files changed, 3 deletions(-) diff --git a/crates/blockifier/src/execution/call_info.rs b/crates/blockifier/src/execution/call_info.rs index 2e04ff05930..9d60636ee4e 100644 --- a/crates/blockifier/src/execution/call_info.rs +++ b/crates/blockifier/src/execution/call_info.rs @@ -208,7 +208,6 @@ pub struct CallInfo { pub tracked_resource: TrackedResource, // Additional information gathered during execution. - pub call_counter: usize, pub storage_read_values: Vec, pub accessed_storage_keys: HashSet, pub read_class_hash_values: Vec, diff --git a/crates/blockifier/src/execution/entry_point_execution.rs b/crates/blockifier/src/execution/entry_point_execution.rs index 482250c1eba..4ec74a42c3b 100644 --- a/crates/blockifier/src/execution/entry_point_execution.rs +++ b/crates/blockifier/src/execution/entry_point_execution.rs @@ -393,7 +393,6 @@ 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, - call_counter: 0, time: None, }) } diff --git a/crates/blockifier/src/execution/native/entry_point_execution.rs b/crates/blockifier/src/execution/native/entry_point_execution.rs index 66687e9773c..e21dd866756 100644 --- a/crates/blockifier/src/execution/native/entry_point_execution.rs +++ b/crates/blockifier/src/execution/native/entry_point_execution.rs @@ -103,6 +103,5 @@ fn create_callinfo( read_class_hash_values: syscall_handler.base.read_class_hash_values, tracked_resource: TrackedResource::SierraGas, time: std::time::Duration::default(), - call_counter: 0, }) } From 42d9a4de7d2a90359904318cb7086794ec3d5d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Thu, 12 Jun 2025 16:01:05 -0300 Subject: [PATCH 4/4] Fix build --- .../blockifier/src/execution/native/entry_point_execution.rs | 2 +- crates/blockifier/src/transaction/transactions_test.rs | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/blockifier/src/execution/native/entry_point_execution.rs b/crates/blockifier/src/execution/native/entry_point_execution.rs index e21dd866756..835493aed15 100644 --- a/crates/blockifier/src/execution/native/entry_point_execution.rs +++ b/crates/blockifier/src/execution/native/entry_point_execution.rs @@ -102,6 +102,6 @@ fn create_callinfo( accessed_contract_addresses: syscall_handler.base.accessed_contract_addresses, read_class_hash_values: syscall_handler.base.read_class_hash_values, tracked_resource: TrackedResource::SierraGas, - time: std::time::Duration::default(), + time: None, }) } diff --git a/crates/blockifier/src/transaction/transactions_test.rs b/crates/blockifier/src/transaction/transactions_test.rs index 85e40d1dd31..c3001e3e031 100644 --- a/crates/blockifier/src/transaction/transactions_test.rs +++ b/crates/blockifier/src/transaction/transactions_test.rs @@ -656,6 +656,7 @@ fn test_invoke_tx( gas: total_gas, }, revert_error: None, + time: None, }; // Test execution info result. @@ -1702,6 +1703,7 @@ fn test_declare_tx( gas: expected_total_gas, }, revert_error: None, + time: None, }; // Test execution info result. @@ -1947,6 +1949,7 @@ fn test_deploy_account_tx( gas: expected_total_gas, }, revert_error: None, + time: None, }; // Test execution info result. @@ -2538,6 +2541,7 @@ fn test_l1_handler(#[values(false, true)] use_kzg_da: bool) { gas: total_gas, }, revert_error: None, + time: None, }; // Check the actual returned execution info.