Skip to content

Commit a591e99

Browse files
add syscall_counting
1 parent 373c325 commit a591e99

File tree

5 files changed

+96
-3
lines changed

5 files changed

+96
-3
lines changed

crates/blockifier/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ workspace = true
1212
[features]
1313
cairo_native = ["dep:cairo-native", "starknet_sierra_multicompile/cairo_native", "dep:sierra-emu"]
1414
with-trace-dump = ["cairo_native", "cairo-native/with-trace-dump"]
15+
block-composition = []
1516
jemalloc = ["dep:tikv-jemallocator"]
1617
native_blockifier = []
1718
node_api = []

crates/blockifier/src/execution/call_info.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use starknet_types_core::felt::Felt;
1313

1414
use crate::execution::contract_class::TrackedResource;
1515
use crate::execution::entry_point::CallEntryPoint;
16+
use crate::execution::native::syscall_handler::SyscallCounts;
1617
use crate::state::cached_state::StorageEntry;
1718
use crate::utils::u64_from_usize;
1819
use crate::versioned_constants::VersionedConstants;
@@ -200,6 +201,8 @@ impl AddAssign<&ChargedResources> for ChargedResources {
200201
#[cfg_attr(feature = "transaction_serde", derive(serde::Deserialize))]
201202
#[derive(Debug, Default, Eq, PartialEq, Serialize)]
202203
pub struct CallInfo {
204+
#[cfg(feature = "block_composition")]
205+
pub syscall_counts: SyscallCounts,
203206
pub call: CallEntryPoint,
204207
pub execution: CallExecution,
205208
pub inner_calls: Vec<CallInfo>,

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::execution::entry_point::{
1010
};
1111
use crate::execution::errors::{EntryPointExecutionError, PostExecutionError, PreExecutionError};
1212
use crate::execution::native::contract_class::NativeCompiledClassV1;
13-
use crate::execution::native::syscall_handler::NativeSyscallHandler;
13+
use crate::execution::native::syscall_handler::{NativeSyscallHandler, SYSCALL_COUNTER};
1414
use crate::state::state_api::State;
1515

1616
// todo(rodrigo): add an `entry point not found` test for Native
@@ -86,7 +86,12 @@ fn create_callinfo(
8686
let gas_consumed = syscall_handler.base.call.initial_gas - remaining_gas;
8787
let vm_resources = CallInfo::summarize_vm_resources(syscall_handler.base.inner_calls.iter());
8888

89+
#[cfg(feature = "block_composition")]
90+
let syscalls_coutnts = *SYSCALL_COUNTER.lock().unwrap();
91+
8992
Ok(CallInfo {
93+
#[cfg(feature = "block_composition")]
94+
syscall_counts,
9095
call: syscall_handler.base.call.into(),
9196
execution: CallExecution {
9297
retdata: Retdata(call_result.return_values),

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use sierra_emu::VirtualMachine;
1616
use starknet_types_core::felt::Felt;
1717

1818
use super::syscall_handler::NativeSyscallHandler;
19+
use crate::execution::native::syscall_handler::{SyscallCounts, SYSCALL_COUNTER};
1920

2021
#[derive(Debug)]
2122
pub enum ContractExecutor {
@@ -48,7 +49,13 @@ impl ContractExecutor {
4849
) -> cairo_native::error::Result<ContractExecutionResult> {
4950
match self {
5051
ContractExecutor::Aot(aot_contract_executor) => {
51-
aot_contract_executor.run(selector, args, gas, builtin_costs, syscall_handler)
52+
let result =
53+
aot_contract_executor.run(selector, args, gas, builtin_costs, syscall_handler);
54+
55+
#[cfg(feature = "block_composition")]
56+
SYSCALL_COUNTER.set(SyscallCounts::default())?;
57+
58+
result
5259
}
5360
ContractExecutor::Emu((program, entrypoints, version)) => {
5461
let mut virtual_machine =

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

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::convert::From;
22
use std::fmt;
3-
use std::sync::Arc;
3+
use std::sync::{Arc, LazyLock, Mutex};
44

55
use ark_ec::short_weierstrass::{Affine, Projective, SWCurveConfig};
66
use ark_ff::{BigInt, PrimeField};
@@ -45,6 +45,39 @@ use crate::versioned_constants::GasCosts;
4545

4646
pub const CALL_CONTRACT_SELECTOR_NAME: &str = "call_contract";
4747
pub const LIBRARY_CALL_SELECTOR_NAME: &str = "library_call";
48+
49+
pub static SYSCALL_COUNTER: LazyLock<Mutex<SyscallCounts>> =
50+
LazyLock::new(|| Mutex::new(SyscallCounts::default()));
51+
52+
#[derive(Default, Clone, Copy)]
53+
pub struct SyscallCounts {
54+
pub get_block_hash: u64,
55+
pub get_execution_info: u64,
56+
pub get_execution_info_v2: u64,
57+
pub deploy: u64,
58+
pub replace_class: u64,
59+
pub library_call: u64,
60+
pub call_contract: u64,
61+
pub storage_read: u64,
62+
pub storage_write: u64,
63+
pub emit_event: u64,
64+
pub send_message_to_l1: u64,
65+
pub keccak: u64,
66+
pub secp256k1_new: u64,
67+
pub secp256k1_add: u64,
68+
pub secp256k1_mul: u64,
69+
pub secp256k1_get_point_from_x: u64,
70+
pub secp256k1_get_xy: u64,
71+
pub secp256r1_new: u64,
72+
pub secp256r1_add: u64,
73+
pub secp256r1_mul: u64,
74+
pub secp256r1_get_point_from_x: u64,
75+
pub secp256r1_get_xy: u64,
76+
pub sha256_process_block: u64,
77+
pub get_class_hash_at: u64,
78+
pub meta_tx_v0: u64,
79+
}
80+
4881
pub struct NativeSyscallHandler<'state> {
4982
pub base: Box<SyscallHandlerBase<'state>>,
5083

@@ -239,6 +272,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
239272
block_number: u64,
240273
remaining_gas: &mut u64,
241274
) -> SyscallResult<Felt> {
275+
SYSCALL_COUNTER.lock().unwrap().get_block_hash += 1;
276+
242277
self.pre_execute_syscall(
243278
remaining_gas,
244279
self.gas_costs().syscalls.get_block_hash.base_syscall_cost(),
@@ -251,6 +286,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
251286
}
252287

253288
fn get_execution_info(&mut self, remaining_gas: &mut u64) -> SyscallResult<ExecutionInfo> {
289+
SYSCALL_COUNTER.lock().unwrap().get_execution_info += 1;
290+
254291
self.pre_execute_syscall(
255292
remaining_gas,
256293
self.gas_costs().syscalls.get_execution_info.base_syscall_cost(),
@@ -270,6 +307,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
270307
contract_address: Felt,
271308
remaining_gas: &mut u64,
272309
) -> SyscallResult<Felt> {
310+
SYSCALL_COUNTER.lock().unwrap().get_class_hash_at += 1;
311+
273312
self.pre_execute_syscall(
274313
remaining_gas,
275314
self.gas_costs().syscalls.get_class_hash_at.base_syscall_cost(),
@@ -285,6 +324,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
285324
}
286325

287326
fn get_execution_info_v2(&mut self, remaining_gas: &mut u64) -> SyscallResult<ExecutionInfoV2> {
327+
SYSCALL_COUNTER.lock().unwrap().get_execution_info_v2 += 1;
328+
288329
self.pre_execute_syscall(
289330
remaining_gas,
290331
self.gas_costs().syscalls.get_execution_info.base_syscall_cost(),
@@ -307,6 +348,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
307348
deploy_from_zero: bool,
308349
remaining_gas: &mut u64,
309350
) -> SyscallResult<(Felt, Vec<Felt>)> {
351+
SYSCALL_COUNTER.lock().unwrap().deploy += 1;
310352
// The cost of deploying a contract is the base cost plus the linear cost of the calldata
311353
// len.
312354
let total_gas_cost =
@@ -330,6 +372,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
330372
Ok((Felt::from(deployed_contract_address), constructor_retdata))
331373
}
332374
fn replace_class(&mut self, class_hash: Felt, remaining_gas: &mut u64) -> SyscallResult<()> {
375+
SYSCALL_COUNTER.lock().unwrap().replace_class += 1;
333376
self.pre_execute_syscall(
334377
remaining_gas,
335378
self.gas_costs().syscalls.replace_class.base_syscall_cost(),
@@ -348,6 +391,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
348391
calldata: &[Felt],
349392
remaining_gas: &mut u64,
350393
) -> SyscallResult<Vec<Felt>> {
394+
SYSCALL_COUNTER.lock().unwrap().library_call += 1;
351395
self.pre_execute_syscall(
352396
remaining_gas,
353397
self.gas_costs().syscalls.library_call.base_syscall_cost(),
@@ -392,6 +436,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
392436
calldata: &[Felt],
393437
remaining_gas: &mut u64,
394438
) -> SyscallResult<Vec<Felt>> {
439+
SYSCALL_COUNTER.lock().unwrap().call_contract += 1;
440+
395441
self.pre_execute_syscall(
396442
remaining_gas,
397443
self.gas_costs().syscalls.call_contract.base_syscall_cost(),
@@ -448,6 +494,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
448494
address: Felt,
449495
remaining_gas: &mut u64,
450496
) -> SyscallResult<Felt> {
497+
SYSCALL_COUNTER.lock().unwrap().storage_read += 1;
498+
451499
self.pre_execute_syscall(
452500
remaining_gas,
453501
self.gas_costs().syscalls.storage_read.base_syscall_cost(),
@@ -473,6 +521,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
473521
value: Felt,
474522
remaining_gas: &mut u64,
475523
) -> SyscallResult<()> {
524+
SYSCALL_COUNTER.lock().unwrap().storage_write += 1;
525+
476526
self.pre_execute_syscall(
477527
remaining_gas,
478528
self.gas_costs().syscalls.storage_write.base_syscall_cost(),
@@ -497,6 +547,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
497547
data: &[Felt],
498548
remaining_gas: &mut u64,
499549
) -> SyscallResult<()> {
550+
SYSCALL_COUNTER.lock().unwrap().emit_event += 1;
551+
500552
self.pre_execute_syscall(
501553
remaining_gas,
502554
self.gas_costs().syscalls.emit_event.base_syscall_cost(),
@@ -517,6 +569,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
517569
payload: &[Felt],
518570
remaining_gas: &mut u64,
519571
) -> SyscallResult<()> {
572+
SYSCALL_COUNTER.lock().unwrap().send_message_to_l1 += 1;
573+
520574
self.pre_execute_syscall(
521575
remaining_gas,
522576
self.gas_costs().syscalls.send_message_to_l1.base_syscall_cost(),
@@ -530,6 +584,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
530584
}
531585

532586
fn keccak(&mut self, input: &[u64], remaining_gas: &mut u64) -> SyscallResult<U256> {
587+
SYSCALL_COUNTER.lock().unwrap().keccak += 1;
588+
533589
self.pre_execute_syscall(
534590
remaining_gas,
535591
self.gas_costs().syscalls.keccak.base_syscall_cost(),
@@ -550,6 +606,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
550606
y: U256,
551607
remaining_gas: &mut u64,
552608
) -> SyscallResult<Option<Secp256k1Point>> {
609+
SYSCALL_COUNTER.lock().unwrap().secp256k1_new += 1;
610+
553611
self.pre_execute_syscall(
554612
remaining_gas,
555613
self.gas_costs().syscalls.secp256k1_new.base_syscall_cost(),
@@ -566,6 +624,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
566624
p1: Secp256k1Point,
567625
remaining_gas: &mut u64,
568626
) -> SyscallResult<Secp256k1Point> {
627+
SYSCALL_COUNTER.lock().unwrap().secp256k1_add += 1;
569628
self.pre_execute_syscall(
570629
remaining_gas,
571630
self.gas_costs().syscalls.secp256k1_add.base_syscall_cost(),
@@ -580,6 +639,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
580639
m: U256,
581640
remaining_gas: &mut u64,
582641
) -> SyscallResult<Secp256k1Point> {
642+
SYSCALL_COUNTER.lock().unwrap().secp256k1_mul += 1;
643+
583644
self.pre_execute_syscall(
584645
remaining_gas,
585646
self.gas_costs().syscalls.secp256k1_mul.base_syscall_cost(),
@@ -594,6 +655,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
594655
y_parity: bool,
595656
remaining_gas: &mut u64,
596657
) -> SyscallResult<Option<Secp256k1Point>> {
658+
SYSCALL_COUNTER.lock().unwrap().secp256k1_get_point_from_x += 1;
659+
597660
self.pre_execute_syscall(
598661
remaining_gas,
599662
self.gas_costs().syscalls.secp256k1_get_point_from_x.base_syscall_cost(),
@@ -609,6 +672,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
609672
p: Secp256k1Point,
610673
remaining_gas: &mut u64,
611674
) -> SyscallResult<(U256, U256)> {
675+
SYSCALL_COUNTER.lock().unwrap().secp256k1_get_xy += 1;
612676
self.pre_execute_syscall(
613677
remaining_gas,
614678
self.gas_costs().syscalls.secp256k1_get_xy.base_syscall_cost(),
@@ -623,6 +687,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
623687
y: U256,
624688
remaining_gas: &mut u64,
625689
) -> SyscallResult<Option<Secp256r1Point>> {
690+
SYSCALL_COUNTER.lock().unwrap().secp256r1_new += 1;
691+
626692
self.pre_execute_syscall(
627693
remaining_gas,
628694
self.gas_costs().syscalls.secp256r1_new.base_syscall_cost(),
@@ -639,6 +705,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
639705
p1: Secp256r1Point,
640706
remaining_gas: &mut u64,
641707
) -> SyscallResult<Secp256r1Point> {
708+
SYSCALL_COUNTER.lock().unwrap().secp256r1_add += 1;
709+
642710
self.pre_execute_syscall(
643711
remaining_gas,
644712
self.gas_costs().syscalls.secp256r1_add.base_syscall_cost(),
@@ -652,6 +720,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
652720
m: U256,
653721
remaining_gas: &mut u64,
654722
) -> SyscallResult<Secp256r1Point> {
723+
SYSCALL_COUNTER.lock().unwrap().secp256r1_mul += 1;
724+
655725
self.pre_execute_syscall(
656726
remaining_gas,
657727
self.gas_costs().syscalls.secp256r1_mul.base_syscall_cost(),
@@ -666,6 +736,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
666736
y_parity: bool,
667737
remaining_gas: &mut u64,
668738
) -> SyscallResult<Option<Secp256r1Point>> {
739+
SYSCALL_COUNTER.lock().unwrap().secp256r1_get_point_from_x += 1;
740+
669741
self.pre_execute_syscall(
670742
remaining_gas,
671743
self.gas_costs().syscalls.secp256r1_get_point_from_x.base_syscall_cost(),
@@ -681,6 +753,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
681753
p: Secp256r1Point,
682754
remaining_gas: &mut u64,
683755
) -> SyscallResult<(U256, U256)> {
756+
SYSCALL_COUNTER.lock().unwrap().secp256r1_get_xy += 1;
757+
684758
self.pre_execute_syscall(
685759
remaining_gas,
686760
self.gas_costs().syscalls.secp256r1_get_xy.base_syscall_cost(),
@@ -695,6 +769,8 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
695769
current_block: &[u32; 16],
696770
remaining_gas: &mut u64,
697771
) -> SyscallResult<()> {
772+
SYSCALL_COUNTER.lock().unwrap().sha256_process_block += 1;
773+
698774
self.pre_execute_syscall(
699775
remaining_gas,
700776
self.gas_costs().syscalls.sha256_process_block.base_syscall_cost(),
@@ -720,6 +796,7 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> {
720796
signature: &[Felt],
721797
remaining_gas: &mut u64,
722798
) -> SyscallResult<Vec<Felt>> {
799+
SYSCALL_COUNTER.lock().unwrap().meta_tx_v0 += 1;
723800
todo!(
724801
"implement meta_tx_v0 {:?}",
725802
(address, entry_point_selector, calldata, signature, remaining_gas)

0 commit comments

Comments
 (0)