From 2004e1b8790b36a1aa5f218133d5edeb8a9e2f12 Mon Sep 17 00:00:00 2001 From: Yonatan-Starkware Date: Thu, 14 Nov 2024 15:27:26 +0200 Subject: [PATCH] feat(blockifier): add impl for GasCosts in versioned_constants --- crates/blockifier/cairo_native | 2 +- crates/blockifier/src/versioned_constants.rs | 69 ++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/crates/blockifier/cairo_native b/crates/blockifier/cairo_native index 0bc6f40888..564f7e2136 160000 --- a/crates/blockifier/cairo_native +++ b/crates/blockifier/cairo_native @@ -1 +1 @@ -Subproject commit 0bc6f408884370e4fbbf421c4e8e109911c3d73e +Subproject commit 564f7e2136e53a1e43033aefa3836b4dc591ffc1 diff --git a/crates/blockifier/src/versioned_constants.rs b/crates/blockifier/src/versioned_constants.rs index d2d6eb7237..ad27baf3b1 100644 --- a/crates/blockifier/src/versioned_constants.rs +++ b/crates/blockifier/src/versioned_constants.rs @@ -565,6 +565,65 @@ pub struct GasCosts { pub sha256_process_block_gas_cost: u64, } +impl GasCosts { + pub fn get_builtin_gas_cost(&self, builtin: &BuiltinName) -> Result { + match *builtin { + BuiltinName::range_check => Ok(self.range_check_gas_cost), + BuiltinName::pedersen => Ok(self.pedersen_gas_cost), + BuiltinName::keccak => Ok(self.keccak_gas_cost), + BuiltinName::bitwise => Ok(self.bitwise_builtin_gas_cost), + BuiltinName::ec_op => Ok(self.ecop_gas_cost), + BuiltinName::poseidon => Ok(self.poseidon_gas_cost), + BuiltinName::range_check96 => Ok(self.range_check_gas_cost), + BuiltinName::add_mod => Ok(self.add_mod_gas_cost), + BuiltinName::mul_mod => Ok(self.mul_mod_gas_cost), + BuiltinName::segment_arena => Err(GasCostsError::VirtualBuiltin), + // The following are unsupported builtins in Cairo 1 + BuiltinName::output => Err(GasCostsError::UnsupportedCairo1Builtin {builtin: *builtin,}), + BuiltinName::ecdsa => Err(GasCostsError::UnsupportedCairo1Builtin {builtin: *builtin,}), + } + } + + pub fn get_syscall_gas_cost(&self, selector: &SyscallSelector) -> Result { + match selector { + SyscallSelector::CallContract => Ok(self.call_contract_gas_cost), + SyscallSelector::Deploy => Ok(self.deploy_gas_cost), + SyscallSelector::EmitEvent => Ok(self.emit_event_gas_cost), + SyscallSelector::GetBlockHash => Ok(self.get_block_hash_gas_cost), + SyscallSelector::GetExecutionInfo => Ok(self.get_execution_info_gas_cost), + SyscallSelector::GetClassHashAt => Ok(self.get_class_hash_at_gas_cost), + SyscallSelector::Keccak => Ok(self.keccak_gas_cost), + SyscallSelector::Sha256ProcessBlock => Ok(self.sha256_process_block_gas_cost), + SyscallSelector::LibraryCall => Ok(self.library_call_gas_cost), + SyscallSelector::ReplaceClass => Ok(self.replace_class_gas_cost), + SyscallSelector::Secp256k1Add => Ok(self.secp256k1_add_gas_cost), + SyscallSelector::Secp256k1GetPointFromX => Ok(self.secp256k1_get_point_from_x_gas_cost), + SyscallSelector::Secp256k1GetXy => Ok(self.secp256k1_get_xy_gas_cost), + SyscallSelector::Secp256k1Mul => Ok(self.secp256k1_mul_gas_cost), + SyscallSelector::Secp256k1New => Ok(self.secp256k1_new_gas_cost), + SyscallSelector::Secp256r1Add => Ok(self.secp256r1_add_gas_cost), + SyscallSelector::Secp256r1GetPointFromX => Ok(self.secp256r1_get_point_from_x_gas_cost), + SyscallSelector::Secp256r1GetXy => Ok(self.secp256r1_get_xy_gas_cost), + SyscallSelector::Secp256r1Mul => Ok(self.secp256r1_mul_gas_cost), + SyscallSelector::Secp256r1New => Ok(self.secp256r1_new_gas_cost), + SyscallSelector::SendMessageToL1 => Ok(self.send_message_to_l1_gas_cost), + SyscallSelector::StorageRead => Ok(self.storage_read_gas_cost), + SyscallSelector::StorageWrite => Ok(self.storage_write_gas_cost), + // The following are unsupported syscalls in Cairo 1 + SyscallSelector::DelegateCall => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::DelegateL1Handler => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::GetBlockNumber => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::GetBlockTimestamp => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::GetCallerAddress => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::GetContractAddress => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::GetTxInfo => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::GetSequencerAddress => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::GetTxSignature => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + SyscallSelector::LibraryCallL1Handler => Err(GasCostsError::UnsupportedCairo1Syscall{selector: *selector,}), + } + } +} + // Below, serde first deserializes the json into a regular IndexMap wrapped by the newtype // `OsConstantsRawJson`, then calls the `try_from` of the newtype, which handles the // conversion into actual values. @@ -760,6 +819,16 @@ pub enum OsConstantsSerdeError { ValidationError(String), } +#[derive(Debug, Error)] +pub enum GasCostsError { + #[error("used syscall: {:?} is not supported in a Cairo 0 contract", selector)] + UnsupportedCairo1Syscall {selector: SyscallSelector}, + #[error("used builtin: {:?} is not supported in a Cairo 1 contract", builtin)] + UnsupportedCairo1Builtin {builtin: BuiltinName}, + #[error("a virtual builtin cannot be used in a smart contract")] + VirtualBuiltin, +} + #[derive(Clone, Debug, Deserialize)] #[serde(try_from = "ResourceParamsRaw")] pub struct ResourcesParams {