From 215da8b30c70d82218a88312ef371e80f878fef2 Mon Sep 17 00:00:00 2001 From: Yonatan-Starkware Date: Tue, 19 Nov 2024 18:46:58 +0200 Subject: [PATCH] feat(blockifier): Add get_syscall_gas_cost to versioned constants impl --- crates/blockifier/src/versioned_constants.rs | 23 +++++++++++++++++++ .../src/versioned_constants_test.rs | 14 +++++++++++ 2 files changed, 37 insertions(+) diff --git a/crates/blockifier/src/versioned_constants.rs b/crates/blockifier/src/versioned_constants.rs index 59b63b5e6fb..e750dd59fd2 100644 --- a/crates/blockifier/src/versioned_constants.rs +++ b/crates/blockifier/src/versioned_constants.rs @@ -20,6 +20,7 @@ use starknet_api::execution_resources::GasAmount; use starknet_api::transaction::fields::GasVectorComputationMode; use strum::IntoEnumIterator; use thiserror::Error; +use crate::utils::u64_from_usize; use crate::execution::deprecated_syscalls::hint_processor::SyscallCounter; use crate::execution::execution_utils::poseidon_hash_many_cost; @@ -330,6 +331,28 @@ impl VersionedConstants { GasVectorComputationMode::NoL2Gas => &self.deprecated_l2_resource_gas_costs, } } + + /// Calculates a syscall's gas costs from the os resources + pub fn get_syscall_gas_cost(&self, syscall_selector: &SyscallSelector) -> u64 { + let gas_costs = &self.os_constants.gas_costs; + let execution_resources = &self + .os_resources + .execute_syscalls + .get(syscall_selector) + .expect("Fetching the execution resources of a syscall should not fail."); + let n_steps = std::cmp::max(u64_from_usize(execution_resources.n_steps), 100); + let n_memory_holes = u64_from_usize(execution_resources.n_memory_holes); + let mut total_builtin_gas_cost: u64 = 0; + for (builtin, amount) in &execution_resources.builtin_instance_counter { + let builtin_cost = gas_costs.get_builtin_gas_cost(builtin).unwrap_or_else(|err| panic!("Failed to get gas cost: {}", err)); + total_builtin_gas_cost += builtin_cost * u64_from_usize(*amount); + } + + + n_steps * gas_costs.step_gas_cost + + n_memory_holes * gas_costs.memory_hole_gas_cost + + total_builtin_gas_cost + } } #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] diff --git a/crates/blockifier/src/versioned_constants_test.rs b/crates/blockifier/src/versioned_constants_test.rs index 7947afc52a7..f8067c0646a 100644 --- a/crates/blockifier/src/versioned_constants_test.rs +++ b/crates/blockifier/src/versioned_constants_test.rs @@ -167,3 +167,17 @@ fn test_all_jsons_in_enum() { fn test_latest_no_panic() { VersionedConstants::latest_constants(); } + +#[test] +fn test_correct_syscall_gas_cost_calculation() { + const EXPECTED_CALL_CONTRACT_GAS_COST : u64 = 87650; + const EXPECTED_SECP256K1MUL_GAS_COST : u64 = 8143650; + const EXPECTED_SHA256PROCESSBLOCK_GAS_COST : u64 = 841095; + + + let versioned_constants = VersionedConstants::latest_constants().clone(); + + assert_eq!(versioned_constants.get_syscall_gas_cost(&SyscallSelector::CallContract), EXPECTED_CALL_CONTRACT_GAS_COST); + assert_eq!(versioned_constants.get_syscall_gas_cost(&SyscallSelector::Secp256k1Mul), EXPECTED_SECP256K1MUL_GAS_COST); + assert_eq!(versioned_constants.get_syscall_gas_cost(&SyscallSelector::Sha256ProcessBlock), EXPECTED_SHA256PROCESSBLOCK_GAS_COST); +} \ No newline at end of file