11use std:: collections:: HashSet ;
22
33use blockifier:: blockifier_versioned_constants:: {
4+ RawStepGasCost ,
45 RawVersionedConstants ,
56 ResourcesParams ,
67 VariableCallDataFactor ,
@@ -43,7 +44,7 @@ use crate::test_manager::{
4344use crate :: tests:: NON_TRIVIAL_RESOURCE_BOUNDS ;
4445
4546// TODO(Dori): Delete this, or at least reduce it to a minimal set of unmeasurable syscalls.
46- const UNMEASURABLE_SYSCALLS : [ Selector ; 28 ] = [
47+ const UNMEASURABLE_SYSCALLS : [ Selector ; 26 ] = [
4748 Selector :: DelegateCall ,
4849 Selector :: DelegateL1Handler ,
4950 Selector :: GetBlockNumber ,
@@ -53,8 +54,6 @@ const UNMEASURABLE_SYSCALLS: [Selector; 28] = [
5354 Selector :: GetSequencerAddress ,
5455 Selector :: GetTxInfo ,
5556 Selector :: GetTxSignature ,
56- Selector :: Keccak ,
57- Selector :: KeccakRound ,
5857 Selector :: Sha256ProcessBlock ,
5958 Selector :: Sha512ProcessBlock ,
6059 Selector :: LibraryCallL1Handler ,
@@ -74,7 +73,10 @@ const UNMEASURABLE_SYSCALLS: [Selector; 28] = [
7473 Selector :: StorageWrite ,
7574] ;
7675
77- const SYSCALLS_WITH_LINEAR_FACTOR : [ Selector ; 2 ] = [ Selector :: Deploy , Selector :: MetaTxV0 ] ;
76+ /// Keccak does not store the linear factor in the same entry in the versioned constants, but it
77+ /// does have a measurable linear factor stored under [Selector::KeccakRound].
78+ const SYSCALLS_WITH_LINEAR_FACTOR : [ Selector ; 3 ] =
79+ [ Selector :: Deploy , Selector :: Keccak , Selector :: MetaTxV0 ] ;
7880
7981/// Expected syscalls in the fee transfer call. Should be removed from the list of syscalls during
8082/// measurement iteration - only the syscalls called during __execute__ should be measured.
@@ -159,6 +161,9 @@ async fn test_fee_transfer_syscalls() {
159161#[ tokio:: test]
160162async fn test_os_resources_regression ( ) {
161163 let os_resources_contract = FeatureContract :: OsResourcesTest ( RunnableCairo1 :: Casm ) ;
164+ let version = StarknetVersion :: LATEST ;
165+ let mut raw_vc: RawVersionedConstants =
166+ serde_json:: from_str ( VersionedConstants :: json_str ( & version) . unwrap ( ) ) . unwrap ( ) ;
162167
163168 // Setup the test initial state and test builder.
164169 // Need to explicitly set up the state to be able to override the minimal sierra version for gas
@@ -319,7 +324,7 @@ async fn test_os_resources_regression() {
319324
320325 // If this if a syscall with a linear factor, the next syscall should be the linear cost.
321326 // Otherwise, this syscall has a constant cost.
322- let syscall_cost = if SYSCALLS_WITH_LINEAR_FACTOR . contains ( & selector) {
327+ if SYSCALLS_WITH_LINEAR_FACTOR . contains ( & selector) {
323328 let next_syscall_trace = syscalls_iter. next ( ) . unwrap ( ) ;
324329 assert_eq ! (
325330 selector,
@@ -333,16 +338,38 @@ async fn test_os_resources_regression() {
333338 - & next_inner_overhead)
334339 . filter_unused_builtins ( ) ;
335340 let linear_factor_resources = ( & next_resources - & resources) . filter_unused_builtins ( ) ;
336- VariableResourceParams :: WithFactor ( ResourcesParams {
337- constant : resources,
338- // Syscalls with a linear factor have an unscaled linear factor cost.
339- calldata_factor : VariableCallDataFactor :: Unscaled ( linear_factor_resources) ,
340- } )
341+ // Keccak is a special case - we store the linear cost as a separate syscall.
342+ if selector == Selector :: Keccak {
343+ // TODO(Dori): Currently, the Keccak base cost is enforced in the OS to equal the
344+ // syscall base cost. If and when this is no longer the case, no need to replace
345+ // `resources` (measured keccak base cost) with the syscall base cost, and no need
346+ // to recompute the linear factor.
347+ let RawStepGasCost { step_gas_cost : n_steps } =
348+ raw_vc. os_constants . syscall_base_gas_cost . clone ( ) ;
349+ let resources = ExecutionResources {
350+ n_steps : n_steps. 0 . try_into ( ) . unwrap ( ) ,
351+ ..Default :: default ( )
352+ } ;
353+ let linear_factor_resources =
354+ ( & next_resources - & resources) . filter_unused_builtins ( ) ;
355+ measurements. insert ( Selector :: Keccak , VariableResourceParams :: Constant ( resources) ) ;
356+ measurements. insert (
357+ Selector :: KeccakRound ,
358+ VariableResourceParams :: Constant ( linear_factor_resources) ,
359+ ) ;
360+ } else {
361+ measurements. insert (
362+ selector,
363+ VariableResourceParams :: WithFactor ( ResourcesParams {
364+ constant : resources,
365+ // Syscalls with a linear factor have an unscaled linear factor cost.
366+ calldata_factor : VariableCallDataFactor :: Unscaled ( linear_factor_resources) ,
367+ } ) ,
368+ ) ;
369+ }
341370 } else {
342- VariableResourceParams :: Constant ( resources)
343- } ;
344-
345- measurements. insert ( selector, syscall_cost) ;
371+ measurements. insert ( selector, VariableResourceParams :: Constant ( resources) ) ;
372+ }
346373 }
347374
348375 // Make sure we covered all syscalls we expect to.
@@ -363,9 +390,6 @@ async fn test_os_resources_regression() {
363390 ) ;
364391
365392 // Compare the measurements with the expected values on the latest VC.
366- let version = StarknetVersion :: LATEST ;
367- let mut raw_vc: RawVersionedConstants =
368- serde_json:: from_str ( VersionedConstants :: json_str ( & version) . unwrap ( ) ) . unwrap ( ) ;
369393 for ( syscall, resources) in measurements {
370394 raw_vc. os_resources . execute_syscalls . insert ( syscall, resources) ;
371395 }
0 commit comments