Skip to content

Commit 2c59ece

Browse files
blockifier: convert builtins_to_gas to cairo_primitives_to_gas
1 parent 8469e09 commit 2c59ece

File tree

3 files changed

+47
-28
lines changed

3 files changed

+47
-28
lines changed

crates/blockifier/src/blockifier_versioned_constants.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,7 @@ pub struct BuiltinGasCosts {
947947
}
948948

949949
impl BuiltinGasCosts {
950+
// TODO(AvivG): Make this function private and use get_cairo_primitive_gas_cost instead.
950951
pub fn get_builtin_gas_cost(&self, builtin: &BuiltinName) -> Result<u64, GasCostsError> {
951952
let gas_cost = match *builtin {
952953
BuiltinName::range_check => self.range_check,

crates/blockifier/src/bouncer.rs

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::blockifier::transaction_executor::{
1616
};
1717
use crate::blockifier_versioned_constants::{BuiltinGasCosts, VersionedConstants};
1818
use crate::execution::call_info::{
19+
cairo_primitive_counter_map,
1920
BuiltinCounterMap,
2021
CairoPrimitiveCounterMap,
2122
CairoPrimitiveName,
@@ -688,11 +689,15 @@ fn proving_gas_from_builtins_and_sierra_gas(
688689
proving_builtin_gas_costs: &BuiltinGasCosts,
689690
sierra_builtin_gas_costs: &BuiltinGasCosts,
690691
) -> GasAmount {
691-
let builtins_proving_gas = builtins_to_gas(builtin_counters, proving_builtin_gas_costs);
692+
// TODO(AvivG): To support opcodes in the computation, pass cairo_primitive_counter_map to this
693+
// function
694+
let cairo_primitives_counters = cairo_primitive_counter_map(builtin_counters.clone());
695+
let cairo_primitives_proving_gas =
696+
cairo_primitives_to_gas(&cairo_primitives_counters, proving_builtin_gas_costs);
692697
let steps_proving_gas =
693-
sierra_gas_to_steps_gas(sierra_gas, builtin_counters, sierra_builtin_gas_costs);
698+
sierra_gas_to_steps_gas(sierra_gas, &cairo_primitives_counters, sierra_builtin_gas_costs);
694699

695-
steps_proving_gas.checked_add_panic_on_overflow(builtins_proving_gas)
700+
steps_proving_gas.checked_add_panic_on_overflow(cairo_primitives_proving_gas)
696701
}
697702

698703
/// Generic function to convert VM resources to gas with configurable builtin gas calculation
@@ -701,7 +706,11 @@ pub fn vm_resources_to_gas(
701706
builtin_gas_cost: &BuiltinGasCosts,
702707
versioned_constants: &VersionedConstants,
703708
) -> GasAmount {
704-
let builtins_gas_cost = builtins_to_gas(&resources.prover_builtins(), builtin_gas_cost);
709+
// TODO(AvivG): To support opcodes in the computation, resources should include opcode counters.
710+
let builtins_gas_cost = cairo_primitives_to_gas(
711+
&cairo_primitive_counter_map(resources.prover_builtins()),
712+
builtin_gas_cost,
713+
);
705714
let n_steps_gas_cost = n_steps_to_gas(resources.total_n_steps(), versioned_constants);
706715
let n_memory_holes_gas_cost =
707716
memory_holes_to_gas(resources.n_memory_holes, versioned_constants);
@@ -714,38 +723,45 @@ pub fn vm_resources_to_gas(
714723
/// Computes the steps gas by subtracting the builtins' contribution from the Sierra gas.
715724
pub fn sierra_gas_to_steps_gas(
716725
sierra_gas: GasAmount,
717-
builtin_counters: &BuiltinCounterMap,
726+
cairo_primitives_counters: &CairoPrimitiveCounterMap,
718727
sierra_builtin_gas_costs: &BuiltinGasCosts,
719728
) -> GasAmount {
720-
let builtins_gas_cost = builtins_to_gas(builtin_counters, sierra_builtin_gas_costs);
729+
let cairo_primitives_gas =
730+
cairo_primitives_to_gas(cairo_primitives_counters, sierra_builtin_gas_costs);
721731

722-
sierra_gas.checked_sub(builtins_gas_cost).unwrap_or_else(|| {
732+
sierra_gas.checked_sub(cairo_primitives_gas).unwrap_or_else(|| {
723733
log::debug!(
724-
"Sierra gas underflow: builtins gas exceeds total. Sierra gas: {sierra_gas:?}, \
725-
Builtins gas: {builtins_gas_cost:?}, Builtins: {builtin_counters:?}"
734+
"Sierra gas underflow: cairo primitives gas exceeds total. Sierra gas: \
735+
{sierra_gas:?}, Cairo primitives gas: {cairo_primitives_gas:?}, Cairo primitives: \
736+
{cairo_primitives_counters:?}"
726737
);
727738
GasAmount::ZERO
728739
})
729740
}
730741

731-
pub fn builtins_to_gas(
732-
builtin_counters: &BuiltinCounterMap,
733-
builtin_gas_costs: &BuiltinGasCosts,
742+
pub fn cairo_primitives_to_gas(
743+
cairo_primitives_counters: &CairoPrimitiveCounterMap,
744+
// NOTE: 'blake' is currently the only supported opcode, by being included in the
745+
// builtin_gas_costs.
746+
cairo_primitives_gas_costs: &BuiltinGasCosts,
734747
) -> GasAmount {
735-
let builtin_gas = builtin_counters.iter().fold(0u64, |accumulated_gas, (name, &count)| {
736-
let builtin_weight = builtin_gas_costs.get_builtin_gas_cost(name).unwrap();
737-
builtin_weight
738-
.checked_mul(u64_from_usize(count))
739-
.and_then(|builtin_gas| accumulated_gas.checked_add(builtin_gas))
740-
.unwrap_or_else(|| {
741-
panic!(
742-
"Overflow while converting builtin counters to gas.\nBuiltin: {name}, Weight: \
743-
{builtin_weight}, Count: {count}, Accumulated gas: {accumulated_gas}"
744-
)
745-
})
746-
});
748+
let cairo_primitives_gas =
749+
cairo_primitives_counters.iter().fold(0u64, |accumulated_gas, (name, &count)| {
750+
let cairo_primitive_weight =
751+
cairo_primitives_gas_costs.get_cairo_primitive_gas_cost(name).unwrap();
752+
cairo_primitive_weight
753+
.checked_mul(u64_from_usize(count))
754+
.and_then(|builtin_gas| accumulated_gas.checked_add(builtin_gas))
755+
.unwrap_or_else(|| {
756+
panic!(
757+
"Overflow while converting cairo primitives counters to gas.\nCairo \
758+
primitive: {name:?}, Weight: {cairo_primitive_weight}, Count: {count}, \
759+
Accumulated gas: {accumulated_gas}"
760+
)
761+
})
762+
});
747763

748-
GasAmount(builtin_gas)
764+
GasAmount(cairo_primitives_gas)
749765
}
750766

751767
fn add_casm_hash_computation_gas_cost(

crates/blockifier/src/bouncer_test.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use starknet_api::{class_hash, contract_address, felt, storage_key};
1616
use super::BouncerConfig;
1717
use crate::blockifier::transaction_executor::TransactionExecutorError;
1818
use crate::bouncer::{
19-
builtins_to_gas,
19+
cairo_primitives_to_gas,
2020
get_patricia_update_resources,
2121
get_tx_weights,
2222
map_class_hash_to_casm_hash_computation_resources,
@@ -299,8 +299,10 @@ fn test_bouncer_try_update_gas_based(#[case] scenario: &'static str, block_conte
299299
_ => panic!("Unexpected scenario: {scenario}"),
300300
};
301301

302-
let proving_gas_max_capacity =
303-
builtins_to_gas(&max_capacity_builtin_counters, &builtin_weights.gas_costs);
302+
let proving_gas_max_capacity = cairo_primitives_to_gas(
303+
&cairo_primitive_counter_map(max_capacity_builtin_counters),
304+
&builtin_weights.gas_costs,
305+
);
304306

305307
let block_max_capacity = BouncerWeights {
306308
l1_gas: 20,

0 commit comments

Comments
 (0)