Skip to content

Commit

Permalink
feat(blockifier): add impl for GasCosts in versioned_constants (#2067)
Browse files Browse the repository at this point in the history
  • Loading branch information
Yonatan-Starkware authored Nov 24, 2024
1 parent 956a40e commit 7072ab0
Showing 1 changed file with 78 additions and 0 deletions.
78 changes: 78 additions & 0 deletions crates/blockifier/src/versioned_constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,74 @@ pub struct GasCosts {
pub sha256_process_block_gas_cost: u64,
}

impl GasCosts {
pub fn get_builtin_gas_cost(&self, builtin: &BuiltinName) -> Result<u64, GasCostsError> {
const KECCAK_BUILTIN_GAS_COST: u64 = 136189;

let gas_cost = match *builtin {
BuiltinName::range_check => self.range_check_gas_cost,
BuiltinName::pedersen => self.pedersen_gas_cost,
BuiltinName::bitwise => self.bitwise_builtin_gas_cost,
BuiltinName::ec_op => self.ecop_gas_cost,
// TODO (Yonatan): once keccak_builtin_gas_cost is being inserted to the versioned
// constants, replace the constant with field's value
BuiltinName::keccak => KECCAK_BUILTIN_GAS_COST,
BuiltinName::poseidon => self.poseidon_gas_cost,
BuiltinName::range_check96 => self.range_check_gas_cost,
BuiltinName::add_mod => self.add_mod_gas_cost,
BuiltinName::mul_mod => self.mul_mod_gas_cost,
BuiltinName::segment_arena => return Err(GasCostsError::VirtualBuiltin),
BuiltinName::output | BuiltinName::ecdsa => {
return Err(GasCostsError::UnsupportedBuiltinInCairo1 { builtin: *builtin });
}
};

Ok(gas_cost)
}

pub fn get_syscall_gas_cost(&self, selector: &SyscallSelector) -> Result<u64, GasCostsError> {
let gas_cost = match *selector {
SyscallSelector::CallContract => self.call_contract_gas_cost,
SyscallSelector::Deploy => self.deploy_gas_cost,
SyscallSelector::EmitEvent => self.emit_event_gas_cost,
SyscallSelector::GetBlockHash => self.get_block_hash_gas_cost,
SyscallSelector::GetExecutionInfo => self.get_execution_info_gas_cost,
SyscallSelector::GetClassHashAt => self.get_class_hash_at_gas_cost,
SyscallSelector::Keccak => self.keccak_gas_cost,
SyscallSelector::Sha256ProcessBlock => self.sha256_process_block_gas_cost,
SyscallSelector::LibraryCall => self.library_call_gas_cost,
SyscallSelector::ReplaceClass => self.replace_class_gas_cost,
SyscallSelector::Secp256k1Add => self.secp256k1_add_gas_cost,
SyscallSelector::Secp256k1GetPointFromX => self.secp256k1_get_point_from_x_gas_cost,
SyscallSelector::Secp256k1GetXy => self.secp256k1_get_xy_gas_cost,
SyscallSelector::Secp256k1Mul => self.secp256k1_mul_gas_cost,
SyscallSelector::Secp256k1New => self.secp256k1_new_gas_cost,
SyscallSelector::Secp256r1Add => self.secp256r1_add_gas_cost,
SyscallSelector::Secp256r1GetPointFromX => self.secp256r1_get_point_from_x_gas_cost,
SyscallSelector::Secp256r1GetXy => self.secp256r1_get_xy_gas_cost,
SyscallSelector::Secp256r1Mul => self.secp256r1_mul_gas_cost,
SyscallSelector::Secp256r1New => self.secp256r1_new_gas_cost,
SyscallSelector::SendMessageToL1 => self.send_message_to_l1_gas_cost,
SyscallSelector::StorageRead => self.storage_read_gas_cost,
SyscallSelector::StorageWrite => self.storage_write_gas_cost,
SyscallSelector::DelegateCall
| SyscallSelector::DelegateL1Handler
| SyscallSelector::GetBlockNumber
| SyscallSelector::GetBlockTimestamp
| SyscallSelector::GetCallerAddress
| SyscallSelector::GetContractAddress
| SyscallSelector::GetTxInfo
| SyscallSelector::GetSequencerAddress
| SyscallSelector::GetTxSignature
| SyscallSelector::LibraryCallL1Handler => {
return Err(GasCostsError::DeprecatedSyscall { selector: *selector });
}
};

Ok(gas_cost)
}
}

// 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.
Expand Down Expand Up @@ -761,6 +829,16 @@ pub enum OsConstantsSerdeError {
ValidationError(String),
}

#[derive(Debug, Error)]
pub enum GasCostsError {
#[error("used syscall: {:?} is not supported in a Cairo 0 contract.", selector)]
DeprecatedSyscall { selector: SyscallSelector },
#[error("used builtin: {:?} is not supported in a Cairo 1 contract.", builtin)]
UnsupportedBuiltinInCairo1 { builtin: BuiltinName },
#[error("a virtual builtin does not have a gas cost.")]
VirtualBuiltin,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(try_from = "ResourceParamsRaw")]
pub struct ResourcesParams {
Expand Down

0 comments on commit 7072ab0

Please sign in to comment.