Skip to content

Commit 60da4a1

Browse files
committed
Get gas resources from CallInfo
commit-id:7967ca03
1 parent e60f78c commit 60da4a1

File tree

7 files changed

+77
-138
lines changed

7 files changed

+77
-138
lines changed

crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/rpc.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::runtime_extensions::{
55
},
66
common::create_execute_calldata,
77
};
8+
use blockifier::execution::call_info::ExecutionSummary;
89
use blockifier::execution::{
910
call_info::CallInfo,
1011
entry_point::{CallType, EntryPointExecutionResult},
@@ -18,22 +19,21 @@ use blockifier::state::errors::StateError;
1819
use cairo_vm::vm::runners::cairo_runner::ExecutionResources;
1920
use conversions::{byte_array::ByteArray, serde::serialize::CairoSerialize, string::IntoHexStr};
2021
use shared::utils::build_readable_text;
22+
use starknet_api::core::EntryPointSelector;
2123
use starknet_api::execution_resources::GasAmount;
2224
use starknet_api::{
2325
contract_class::EntryPointType,
2426
core::{ClassHash, ContractAddress},
2527
};
26-
use starknet_api::{core::EntryPointSelector, transaction::EventContent};
2728
use starknet_types_core::felt::Felt;
2829

2930
#[derive(Clone, Debug, Default)]
3031
pub struct UsedResources {
3132
pub syscall_usage: SyscallUsageMap,
3233
pub execution_resources: ExecutionResources,
3334
pub gas_consumed: GasAmount,
34-
pub l2_to_l1_payload_lengths: Vec<usize>,
35+
pub execution_summary: ExecutionSummary,
3536
pub l1_handler_payload_lengths: Vec<usize>,
36-
pub events: Vec<EventContent>,
3737
}
3838

3939
/// Enum representing possible call execution result, along with the data

crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs

Lines changed: 10 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use self::contracts_data::ContractsData;
22
use crate::runtime_extensions::call_to_blockifier_runtime_extension::rpc::UsedResources;
3-
use crate::runtime_extensions::common::{get_syscalls_gas_consumed, sum_syscall_usage};
3+
use crate::runtime_extensions::common::sum_syscall_usage;
44
use crate::runtime_extensions::forge_runtime_extension::cheatcodes::replace_bytecode::ReplaceBytecodeError;
55
use crate::runtime_extensions::{
66
call_to_blockifier_runtime_extension::{
@@ -19,27 +19,23 @@ use crate::runtime_extensions::{
1919
};
2020
use crate::state::{CallTrace, CallTraceNode};
2121
use anyhow::{Context, Result, anyhow};
22-
use blockifier::blockifier_versioned_constants::VersionedConstants;
2322
use blockifier::bouncer::vm_resources_to_sierra_gas;
2423
use blockifier::context::TransactionContext;
25-
use blockifier::execution::call_info::{CallExecution, CallInfo};
24+
use blockifier::execution::call_info::CallInfo;
2625
use blockifier::execution::contract_class::TrackedResource;
27-
use blockifier::execution::entry_point::CallEntryPoint;
2826
use blockifier::execution::syscalls::vm_syscall_utils::{SyscallSelector, SyscallUsageMap};
2927
use blockifier::state::errors::StateError;
3028
use cairo_vm::vm::runners::cairo_runner::CairoRunner;
3129
use cairo_vm::vm::{
3230
errors::hint_errors::HintError, runners::cairo_runner::ExecutionResources,
3331
vm_core::VirtualMachine,
3432
};
35-
use conversions::IntoConv;
3633
use conversions::byte_array::ByteArray;
3734
use conversions::felt::{ToShortString, TryInferFormat};
3835
use conversions::serde::deserialize::BufferReader;
3936
use conversions::serde::serialize::CairoSerialize;
4037
use data_transformer::cairo_types::CairoU256;
4138
use rand::prelude::StdRng;
42-
use runtime::starknet::constants::TEST_CONTRACT_CLASS_HASH;
4339
use runtime::{
4440
CheatcodeHandlingResult, EnhancedHintError, ExtendedRuntime, ExtensionLogic,
4541
SyscallHandlingResult,
@@ -730,15 +726,6 @@ pub fn update_top_call_vm_trace(runtime: &mut ForgeRuntime, cairo_runner: &mut C
730726
Some(get_relocated_vm_trace(cairo_runner));
731727
}
732728
}
733-
fn add_syscall_execution_resources(
734-
versioned_constants: &VersionedConstants,
735-
execution_resources: &ExecutionResources,
736-
syscall_usage: &SyscallUsageMap,
737-
) -> ExecutionResources {
738-
let mut total_vm_usage = execution_resources.filter_unused_builtins();
739-
total_vm_usage += &versioned_constants.get_additional_os_syscall_resources(syscall_usage);
740-
total_vm_usage
741-
}
742729

743730
fn add_sierra_gas_resources(top_call: &Rc<RefCell<CallTrace>>) -> u64 {
744731
let mut gas_consumed = top_call.borrow().gas_consumed;
@@ -766,78 +753,23 @@ fn add_execution_resources(top_call: Rc<RefCell<CallTrace>>) -> ExecutionResourc
766753

767754
#[must_use]
768755
pub fn get_all_used_resources(
769-
runtime: ForgeRuntime,
756+
call_info: &CallInfo,
757+
trace: &Rc<RefCell<CallTrace>>,
770758
transaction_context: &TransactionContext,
771-
tracked_resource: TrackedResource,
772759
) -> UsedResources {
773-
let starknet_runtime = runtime.extended_runtime.extended_runtime.extended_runtime;
774-
let top_call_l2_to_l1_messages = starknet_runtime.hint_handler.base.l2_to_l1_messages;
775-
let top_call_events = starknet_runtime.hint_handler.base.events;
776-
777760
let versioned_constants = transaction_context.block_context.versioned_constants();
778761

779-
// used just to obtain payloads of L2 -> L1 messages
780-
let runtime_call_info = CallInfo {
781-
execution: CallExecution {
782-
l2_to_l1_messages: top_call_l2_to_l1_messages,
783-
events: top_call_events,
784-
..Default::default()
785-
},
786-
call: CallEntryPoint {
787-
class_hash: Some(Felt::from_hex(TEST_CONTRACT_CLASS_HASH).unwrap().into_()),
788-
..Default::default()
789-
},
790-
inner_calls: starknet_runtime.hint_handler.base.inner_calls,
791-
tracked_resource,
792-
..Default::default()
793-
};
794-
let summary = runtime_call_info.summarize(versioned_constants);
795-
let l2_to_l1_payload_lengths = summary.l2_to_l1_payload_lengths;
796-
797-
let l1_handler_payload_lengths =
798-
get_l1_handlers_payloads_lengths(&runtime_call_info.inner_calls);
762+
let summary = call_info.summarize(versioned_constants);
799763

800-
// call representing the test code
801-
let top_call = runtime
802-
.extended_runtime
803-
.extended_runtime
804-
.extension
805-
.cheatnet_state
806-
.trace_data
807-
.current_call_stack
808-
.top();
764+
let l1_handler_payload_lengths = get_l1_handlers_payloads_lengths(&call_info.inner_calls);
809765

810-
let mut execution_resources = top_call.borrow().used_execution_resources.clone();
811-
let mut sierra_gas_consumed = top_call.borrow().gas_consumed;
812-
let top_call_syscalls = top_call.borrow().get_total_used_syscalls();
813-
814-
execution_resources = add_syscall_execution_resources(
815-
versioned_constants,
816-
&execution_resources,
817-
&top_call.borrow().used_syscalls_vm_resources,
818-
);
819-
sierra_gas_consumed += get_syscalls_gas_consumed(
820-
&top_call.borrow().used_syscalls_sierra_gas,
821-
versioned_constants,
822-
);
823-
824-
let events = runtime_call_info
825-
.iter() // This method iterates over inner calls as well
826-
.flat_map(|call_info| {
827-
call_info
828-
.execution
829-
.events
830-
.iter()
831-
.map(|evt| evt.event.clone())
832-
})
833-
.collect();
766+
let top_call_syscalls = trace.borrow().get_total_used_syscalls();
834767

835768
UsedResources {
836-
events,
837769
syscall_usage: top_call_syscalls,
838-
execution_resources,
839-
gas_consumed: GasAmount::from(sierra_gas_consumed),
770+
execution_resources: call_info.resources.clone(),
771+
gas_consumed: GasAmount::from(call_info.execution.gas_consumed),
772+
execution_summary: summary,
840773
l1_handler_payload_lengths,
841-
l2_to_l1_payload_lengths,
842774
}
843775
}

crates/forge-runner/src/gas.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ use blockifier::fee::resources::{
99
use blockifier::state::cached_state::CachedState;
1010
use blockifier::state::errors::StateError;
1111
use blockifier::transaction::objects::HasRelatedFeeType;
12-
use blockifier::utils::u64_from_usize;
1312
use cairo_vm::vm::runners::cairo_runner::ExecutionResources;
1413
use cheatnet::runtime_extensions::call_to_blockifier_runtime_extension::rpc::UsedResources;
1514
use cheatnet::runtime_extensions::forge_config_extension::config::RawAvailableResourceBoundsConfig;
1615
use cheatnet::state::ExtendedStateReader;
1716
use starknet_api::execution_resources::{GasAmount, GasVector};
18-
use starknet_api::transaction::EventContent;
1917
use starknet_api::transaction::fields::GasVectorComputationMode;
2018

2119
pub fn calculate_used_gas(
@@ -26,13 +24,14 @@ pub fn calculate_used_gas(
2624
let versioned_constants = transaction_context.block_context.versioned_constants();
2725

2826
let message_resources = get_messages_resources(
29-
&resources.l2_to_l1_payload_lengths,
27+
&resources.execution_summary.l2_to_l1_payload_lengths,
3028
&resources.l1_handler_payload_lengths,
3129
);
3230

3331
let state_resources = get_state_resources(transaction_context, state)?;
3432

35-
let archival_data_resources = get_archival_data_resources(resources.events);
33+
let archival_data_resources =
34+
get_archival_data_resources(resources.execution_summary.event_summary);
3635

3736
let starknet_resources = StarknetResources {
3837
archival_data: archival_data_resources,
@@ -63,17 +62,7 @@ pub fn calculate_used_gas(
6362
))
6463
}
6564

66-
fn get_archival_data_resources(events: Vec<EventContent>) -> ArchivalDataResources {
67-
// Based on from https://github.com/starkware-libs/sequencer/blob/fc0f06a07f3338ae1e11612dcaed9c59373bca37/crates/blockifier/src/execution/call_info.rs#L222
68-
let mut event_summary = EventSummary {
69-
n_events: events.len(),
70-
..Default::default()
71-
};
72-
for event in events {
73-
event_summary.total_event_data_size += u64_from_usize(event.data.0.len());
74-
event_summary.total_event_keys += u64_from_usize(event.keys.len());
75-
}
76-
65+
fn get_archival_data_resources(event_summary: EventSummary) -> ArchivalDataResources {
7766
// calldata length, signature length and code size are set to 0, because
7867
// we don't include them in estimations
7968
// ref: https://github.com/foundry-rs/starknet-foundry/blob/5ce15b029135545452588c00aae580c05eb11ca8/docs/src/testing/gas-and-resource-estimation.md?plain=1#L73

crates/forge-runner/src/running.rs

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ pub fn run_test_case(
273273
program_segment_size,
274274
) {
275275
Ok(()) => {
276-
let call_info = finalize_execution(
276+
let mut call_info = finalize_execution(
277277
&mut runner,
278278
&mut forge_runtime
279279
.extended_runtime
@@ -285,7 +285,12 @@ pub fn run_test_case(
285285
tracked_resource,
286286
)?;
287287

288-
// TODO(#3292) this can be done better, we can take gas directly from call info
288+
// TODO: Investigate why top call gas consumed is not always aggregated from inner calls
289+
update_top_call_gas_consumed(&mut call_info);
290+
291+
// dbg!(&call_info);
292+
293+
// TODO(#3292): Confirm if this is needed for the profiler
289294
let vm_resources_without_inner_calls = runner
290295
.get_execution_resources()
291296
.expect("Execution resources missing")
@@ -332,34 +337,38 @@ pub fn run_test_case(
332337
.clone();
333338

334339
let transaction_context = get_context(&forge_runtime).tx_context.clone();
335-
let used_resources =
336-
get_all_used_resources(forge_runtime, &transaction_context, tracked_resource);
337-
let gas_used = calculate_used_gas(
338-
&transaction_context,
339-
&mut cached_state,
340-
used_resources.clone(),
341-
)?;
342340

343341
let fork_data = cached_state
344342
.state
345343
.fork_state_reader
344+
.as_ref()
346345
.map(|fork_state_reader| ForkData::new(&fork_state_reader.compiled_contract_class_map()))
347346
.unwrap_or_default();
348347

349348
Ok(match result {
350-
Ok(result) => RunResult::Completed(Box::new(RunCompleted {
351-
status: if result.execution.failed {
352-
RunStatus::Panic(result.execution.retdata.0)
353-
} else {
354-
RunStatus::Success(result.execution.retdata.0)
355-
},
356-
call_trace: call_trace_ref,
357-
gas_used,
358-
used_resources,
359-
encountered_errors,
360-
fuzzer_args,
361-
fork_data,
362-
})),
349+
Ok(result) => {
350+
let used_resources =
351+
get_all_used_resources(&result, &call_trace_ref, &transaction_context);
352+
let gas_used = calculate_used_gas(
353+
&transaction_context,
354+
&mut cached_state,
355+
used_resources.clone(),
356+
)?;
357+
358+
RunResult::Completed(Box::new(RunCompleted {
359+
status: if result.execution.failed {
360+
RunStatus::Panic(result.execution.retdata.0)
361+
} else {
362+
RunStatus::Success(result.execution.retdata.0)
363+
},
364+
call_trace: call_trace_ref,
365+
gas_used,
366+
used_resources,
367+
encountered_errors,
368+
fuzzer_args,
369+
fork_data,
370+
}))
371+
}
363372
Err(error) => RunResult::Error(RunError {
364373
error: Box::new(error),
365374
call_trace: call_trace_ref,
@@ -462,3 +471,9 @@ fn get_call_trace_ref(runtime: &mut ForgeRuntime) -> Rc<RefCell<CallTrace>> {
462471
.current_call_stack
463472
.top()
464473
}
474+
475+
fn update_top_call_gas_consumed(call_info: &mut CallInfo) {
476+
for call in call_info.inner_calls.clone() {
477+
call_info.execution.gas_consumed += call.execution.gas_consumed;
478+
}
479+
}

crates/forge-runner/src/running/copied_code.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ pub fn get_call_result(
6060
TrackedResource::CairoSteps => 0,
6161
TrackedResource::SierraGas => syscall_handler.base.call.initial_gas - gas,
6262
};
63+
64+
// let remaining = gas - gas_consumed;
65+
// dbg!(remaining);
66+
// dbg!((i64::MAX as u64) - remaining);
67+
6368
Ok(CallResult {
6469
failed,
6570
retdata: read_execution_retdata(runner, retdata_size, retdata_start)?,

crates/forge-runner/src/test_case_summary.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ impl TestType for Single {
125125
}
126126

127127
/// Summary of running a single test case
128+
#[expect(clippy::large_enum_variant)]
128129
#[derive(Debug, Clone)]
129130
pub enum TestCaseSummary<T: TestType> {
130131
/// Test case passed

0 commit comments

Comments
 (0)