Skip to content

Commit f30d4c1

Browse files
starknet_os: os resources test - add meta tx
1 parent 9711ff8 commit f30d4c1

5 files changed

Lines changed: 51 additions & 8 deletions

File tree

crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/constants.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ const STORAGE_READ_GAS_COST = 24070;
117117
const STORAGE_WRITE_GAS_COST = 59970;
118118
const EMIT_EVENT_GAS_COST = 10000;
119119
const SEND_MESSAGE_TO_L1_GAS_COST = 14470;
120-
const META_TX_V0_GAS_COST = 167950;
120+
const META_TX_V0_GAS_COST = 186850;
121121
const META_TX_V0_CALLDATA_FACTOR_GAS_COST = 4850;
122122

123123
// Note the the following costs include `SYSCALL_BASE_GAS_COST` implicitly.

crates/apollo_starknet_os_program/src/program_hash.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"os": "0x461af643b9206b0b94aa080b26242e9269bc49fc36ed856b2e74a92ad3c64c4",
2+
"os": "0xad3b2efb91d0a035ca3acde2c0428869e997a1cf9631d6d947433aa91f71ec",
33
"virtual_os": "0x4fb8c0cb28349d61091f3fc633493c01385f77cd0d4ebfd577251b3941d49b9",
44
"aggregator": "0x700786d51b3854af43d8e12180380bda3029be6c1767e007858de6ca2edac40",
55
"aggregator_with_prefix": "0xe08d300e3f5996e43d6d7cc5a20068e0e58cf1309089f2348317ac580f6c1f"

crates/blockifier/resources/blockifier_versioned_constants_0_14_3.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,11 @@
360360
},
361361
"MetaTxV0": {
362362
"constant": {
363-
"n_steps": 1301,
363+
"n_steps": 1328,
364364
"n_memory_holes": 0,
365365
"builtin_instance_counter": {
366366
"range_check_builtin": 20,
367-
"pedersen_builtin": 9
367+
"pedersen_builtin": 13
368368
}
369369
},
370370
"calldata_factor": {

crates/blockifier_test_utils/resources/feature_contracts/cairo1/os_resources_test_contract.cairo

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
// Contract for measuring per-syscall OS resource costs.
22
#[starknet::contract(account)]
33
mod OsResourcesTestContract {
4+
use starknet::class_hash::ClassHashZero;
45
use starknet::info::SyscallResultTrait;
56
use starknet::syscalls::{call_contract_syscall, deploy_syscall, library_call_syscall};
67
use starknet::{ClassHash, ContractAddress};
78

89
const EMPTY_FUNCTION_SELECTOR: felt252 = selector!("empty_function");
10+
const EXECUTE_FUNCTION_SELECTOR: felt252 = selector!("__execute__");
911

1012
#[storage]
1113
struct Storage {}
@@ -23,18 +25,32 @@ mod OsResourcesTestContract {
2325
self_class_hash: ClassHash,
2426
self_address: ContractAddress,
2527
deployable_class_hash: ClassHash,
28+
extra_args: Span<felt252>,
2629
) -> felt252 {
2730
starknet::VALIDATED
2831
}
2932

33+
extern fn meta_tx_v0_syscall(
34+
address: ContractAddress,
35+
entry_point_selector: felt252,
36+
calldata: Span<felt252>,
37+
signature: Span<felt252>,
38+
) -> starknet::SyscallResult<Span<felt252>> implicits(GasBuiltin, System) nopanic;
39+
3040
// Calls every measured syscall in order.
3141
#[external(v0)]
3242
fn __execute__(
3343
ref self: ContractState,
3444
self_class_hash: ClassHash,
3545
self_address: ContractAddress,
3646
deployable_class_hash: ClassHash,
47+
extra_args: Span<felt252>,
3748
) {
49+
// If called from the meta-tx-v0 syscall, just return.
50+
if self_class_hash == ClassHashZero::zero() {
51+
return;
52+
}
53+
3854
// call_contract syscall — calls empty_function on self.
3955
call_contract_syscall(self_address, EMPTY_FUNCTION_SELECTOR, ArrayTrait::new().span())
4056
.unwrap_syscall();
@@ -43,6 +59,25 @@ mod OsResourcesTestContract {
4359
library_call_syscall(self_class_hash, EMPTY_FUNCTION_SELECTOR, ArrayTrait::new().span())
4460
.unwrap_syscall();
4561

62+
// meta_tx_v0 syscall - base.
63+
meta_tx_v0_syscall(
64+
address: self_address,
65+
entry_point_selector: EXECUTE_FUNCTION_SELECTOR,
66+
// class hash, address, deployable class hash, extra args len.
67+
calldata: array![0, 0, 0, 0].span(),
68+
signature: array![].span(),
69+
)
70+
.unwrap_syscall();
71+
// meta_tx_v0 syscall - linear factor.
72+
meta_tx_v0_syscall(
73+
address: self_address,
74+
entry_point_selector: EXECUTE_FUNCTION_SELECTOR,
75+
// class hash, address, deployable class hash, extra args len, extra arg.
76+
calldata: array![0, 0, 0, 1, 0].span(),
77+
signature: array![].span(),
78+
)
79+
.unwrap_syscall();
80+
4681
// deploy syscall. The resources this syscall consumes can vary depending on the deployed
4782
// contract address, in a non-trivial way (see `normalize_address` in the cairo0 core). For
4883
// this reason we deploy from zero, and choose a specific salt.

crates/starknet_os_flow_tests/src/os_resources_test.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use starknet_api::test_utils::invoke::invoke_tx;
2424
use starknet_api::versioned_constants_logic::VersionedConstantsTrait;
2525
use starknet_api::{calldata, declare_tx_args, invoke_tx_args};
2626
use starknet_os::hint_processor::os_logger::ResourceFinalizer;
27+
use starknet_types_core::felt::Felt;
2728
use strum::IntoEnumIterator;
2829

2930
use crate::initial_state::create_default_initial_state_data;
@@ -36,7 +37,7 @@ use crate::tests::NON_TRIVIAL_RESOURCE_BOUNDS;
3637
use crate::utils::get_class_hash_of_feature_contract;
3738

3839
// TODO(Dori): Delete this, or at least reduce it to a minimal set of unmeasurable syscalls.
39-
const UNMEASURABLE_SYSCALLS: [Selector; 32] = [
40+
const UNMEASURABLE_SYSCALLS: [Selector; 31] = [
4041
Selector::DelegateCall,
4142
Selector::DelegateL1Handler,
4243
Selector::EmitEvent,
@@ -54,7 +55,6 @@ const UNMEASURABLE_SYSCALLS: [Selector; 32] = [
5455
Selector::KeccakRound,
5556
Selector::Sha256ProcessBlock,
5657
Selector::LibraryCallL1Handler,
57-
Selector::MetaTxV0,
5858
Selector::ReplaceClass,
5959
Selector::Secp256k1Add,
6060
Selector::Secp256k1GetPointFromX,
@@ -168,7 +168,10 @@ async fn test_os_resources_regression() {
168168
invoke_tx(invoke_tx_args! {
169169
sender_address: os_resources_contract_address,
170170
calldata: calldata![
171-
*os_resources_class_hash, **os_resources_contract_address, *deployable_class_hash
171+
*os_resources_class_hash,
172+
**os_resources_contract_address,
173+
*deployable_class_hash,
174+
Felt::ZERO
172175
],
173176
resource_bounds: *NON_TRIVIAL_RESOURCE_BOUNDS,
174177
}),
@@ -209,7 +212,12 @@ async fn test_os_resources_regression() {
209212
let mut fetch_inner_resources = |selector: Selector| -> ExecutionResources {
210213
if selector.is_calling_syscall() {
211214
// TODO(Dori): Take opcodes (like blake) into account.
212-
inner_calls_iter.next().unwrap().resources.vm_resources
215+
// TODO(Dori): Consider supporting memory-hole counting in the OsLogger. Until then, we
216+
// cannot subtract inner calls with positive memory-hole counts from the OsLogger
217+
// resources.
218+
let mut inner_resources = inner_calls_iter.next().unwrap().resources.vm_resources;
219+
inner_resources.n_memory_holes = 0;
220+
inner_resources
213221
} else {
214222
ExecutionResources::default()
215223
}

0 commit comments

Comments
 (0)