Skip to content

Commit fa4087c

Browse files
blockifier: encode_and_blake into trait
1 parent 75548a3 commit fa4087c

File tree

4 files changed

+48
-46
lines changed

4 files changed

+48
-46
lines changed

crates/blockifier/src/execution/casm_hash_estimation.rs

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ impl From<(ExecutionResources, HashVersion)> for EstimatedExecutionResources {
149149
/// This provides resource estimates rather than exact values.
150150
// TODO(AvivG): Remove allow once used.
151151
#[allow(unused)]
152-
trait EstimateCasmHashResources {
152+
pub trait EstimateCasmHashResources {
153153
/// Specifies the hash function variant that the estimate is for.
154154
fn hash_version(&self) -> HashVersion;
155155

@@ -190,19 +190,44 @@ impl EstimateCasmHashResources for CasmV1HashResourceEstimate {
190190
}
191191
}
192192

193-
// TODO(AvivG): Remove allow once used.
194-
#[allow(unused)]
195-
struct CasmV2HashResourceEstimate {}
193+
pub struct CasmV2HashResourceEstimate {}
196194

197195
impl EstimateCasmHashResources for CasmV2HashResourceEstimate {
198196
fn hash_version(&self) -> HashVersion {
199197
HashVersion::V2
200198
}
201199

200+
/// Estimates resource usage for `encode_felt252_data_and_calc_blake_hash` in the Starknet OS.
201+
///
202+
/// # Encoding Details
203+
/// - Small felts → 2 `u32`s each; Big felts → 8 `u32`s each.
204+
/// - Each felt requires one `range_check` operation.
205+
///
206+
/// # Returns:
207+
/// - `ExecutionResources`: VM resource usage (e.g., n_steps, range checks).
208+
/// - `usize`: number of Blake opcodes used, accounted for separately as those are not reported
209+
/// via `ExecutionResources`.
202210
fn estimated_resources_of_hash_function(
203211
felt_size_groups: &FeltSizeCount,
204212
) -> EstimatedExecutionResources {
205-
encode_and_blake_hash_resources(felt_size_groups)
213+
let n_steps = estimate_steps_of_encode_felt252_data_and_calc_blake_hash(felt_size_groups);
214+
let builtin_instance_counter = match felt_size_groups.n_felts() {
215+
// The empty case does not use builtins at all.
216+
0 => HashMap::new(),
217+
// One `range_check` per input felt to validate its size + Overhead for the non empty
218+
// case.
219+
_ => HashMap::from([(
220+
BuiltinName::range_check,
221+
felt_size_groups.n_felts() + blake_estimation::BASE_RANGE_CHECK_NON_EMPTY,
222+
)]),
223+
};
224+
225+
let resources = ExecutionResources { n_steps, n_memory_holes: 0, builtin_instance_counter };
226+
227+
EstimatedExecutionResources::V2Hash {
228+
resources,
229+
blake_count: felt_size_groups.blake_opcode_count(),
230+
}
206231
}
207232
}
208233

@@ -267,38 +292,6 @@ fn estimate_steps_of_encode_felt252_data_and_calc_blake_hash(
267292
base_steps.checked_add(felt_steps).expect("Overflow computing total Blake hash steps")
268293
}
269294

270-
/// Estimates resource usage for `encode_felt252_data_and_calc_blake_hash` in the Starknet OS.
271-
///
272-
/// # Encoding Details
273-
/// - Small felts → 2 `u32`s each; Big felts → 8 `u32`s each.
274-
/// - Each felt requires one `range_check` operation.
275-
///
276-
/// # Returns:
277-
/// - `ExecutionResources`: VM resource usage (e.g., n_steps, range checks).
278-
/// - `usize`: number of Blake opcodes used, accounted for separately as those are not reported via
279-
/// `ExecutionResources`.
280-
pub fn encode_and_blake_hash_resources(
281-
felt_size_groups: &FeltSizeCount,
282-
) -> EstimatedExecutionResources {
283-
let n_steps = estimate_steps_of_encode_felt252_data_and_calc_blake_hash(felt_size_groups);
284-
let builtin_instance_counter = match felt_size_groups.n_felts() {
285-
// The empty case does not use builtins at all.
286-
0 => HashMap::new(),
287-
// One `range_check` per input felt to validate its size + Overhead for the non empty case.
288-
_ => HashMap::from([(
289-
BuiltinName::range_check,
290-
felt_size_groups.n_felts() + blake_estimation::BASE_RANGE_CHECK_NON_EMPTY,
291-
)]),
292-
};
293-
294-
let resources = ExecutionResources { n_steps, n_memory_holes: 0, builtin_instance_counter };
295-
296-
EstimatedExecutionResources::V2Hash {
297-
resources,
298-
blake_count: felt_size_groups.blake_opcode_count(),
299-
}
300-
}
301-
302295
/// Converts the execution resources and blake opcode count to L2 gas.
303296
///
304297
/// Used for both Stwo ("proving_gas") and Stone ("sierra_gas") estimations, which differ in

crates/blockifier/src/execution/casm_hash_estimation_test.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ use starknet_types_core::felt::Felt;
99

1010
use crate::execution::casm_hash_estimation::blake_estimation::STEPS_EMPTY_INPUT;
1111
use crate::execution::casm_hash_estimation::{
12-
encode_and_blake_hash_resources,
1312
estimate_steps_of_encode_felt252_data_and_calc_blake_hash,
13+
CasmV2HashResourceEstimate,
14+
EstimateCasmHashResources,
1415
EstimatedExecutionResources,
1516
};
1617
use crate::execution::contract_class::FeltSizeCount;
@@ -133,7 +134,8 @@ fn test_zero_inputs() {
133134
assert_eq!(opcodes, 0, "Expected zero BLAKE opcodes for zero inputs");
134135

135136
// Should result in base cost only (no opcode cost).
136-
let resources = encode_and_blake_hash_resources(&FeltSizeCount::default());
137+
let resources =
138+
CasmV2HashResourceEstimate::estimated_resources_of_hash_function(&FeltSizeCount::default());
137139
let expected = ExecutionResources { n_steps: STEPS_EMPTY_INPUT, ..Default::default() };
138140
assert_eq!(resources.resources(), &expected, "Unexpected resources values for zero-input hash");
139141
assert_eq!(resources.blake_count(), 0, "Expected zero BLAKE opcodes for zero inputs");

crates/blockifier/src/execution/contract_class.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ use crate::abi::constants::{self};
4343
use crate::blockifier_versioned_constants::VersionedConstants;
4444
use crate::bouncer::vm_resources_to_sierra_gas;
4545
use crate::execution::call_info::BuiltinCounterMap;
46-
use crate::execution::casm_hash_estimation::EstimatedExecutionResources;
4746
use crate::execution::casm_hash_estimation::{
4847
blake_execution_resources_estimation_to_gas,
49-
encode_and_blake_hash_resources,
48+
CasmV2HashResourceEstimate,
49+
EstimateCasmHashResources,
50+
EstimatedExecutionResources,
5051
};
5152
use crate::execution::entry_point::{EntryPointExecutionContext, EntryPointTypeAndSelector};
5253
use crate::execution::errors::PreExecutionError;
@@ -591,8 +592,7 @@ pub fn estimate_casm_poseidon_hash_computation_resources(
591592

592593
/// Cost to hash a single flat segment of `len` felts.
593594
fn leaf_cost(felt_size_groups: &FeltSizeCount) -> EstimatedExecutionResources {
594-
// All `len` inputs treated as “big” felts; no small-felt optimization here.
595-
encode_and_blake_hash_resources(felt_size_groups)
595+
CasmV2HashResourceEstimate::estimated_resources_of_hash_function(felt_size_groups)
596596
}
597597

598598
/// Cost to hash a multi-segment contract:
@@ -617,7 +617,10 @@ fn node_cost(segs: &[NestedFeltCounts]) -> EstimatedExecutionResources {
617617
// Node‐level hash over (hash1, len1, hash2, len2, …): one segment hash (“big” felt))
618618
// and one segment length (“small” felt) per segment.
619619
resources +=
620-
&encode_and_blake_hash_resources(&FeltSizeCount { large: segs.len(), small: segs.len() });
620+
&CasmV2HashResourceEstimate::estimated_resources_of_hash_function(&FeltSizeCount {
621+
large: segs.len(),
622+
small: segs.len(),
623+
});
621624

622625
resources
623626
}

crates/starknet_os/src/hints/hint_implementation/blake2s/blake2s_test.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use std::collections::HashMap;
22

33
use blake2s::encode_felt252_data_and_calc_blake_hash;
4-
use blockifier::execution::casm_hash_estimation::encode_and_blake_hash_resources;
4+
use blockifier::execution::casm_hash_estimation::{
5+
CasmV2HashResourceEstimate,
6+
EstimateCasmHashResources,
7+
};
58
use blockifier::execution::contract_class::FeltSizeCount;
69
use cairo_vm::types::builtin_name::BuiltinName;
710
use cairo_vm::types::layout_name::LayoutName;
@@ -40,7 +43,8 @@ fn data_to_felt_count(data: &[Felt]) -> FeltSizeCount {
4043
/// Return the estimated execution resources for Blake2s hashing.
4144
fn estimated_encode_and_blake_hash_execution_resources(data: &[Felt]) -> ExecutionResources {
4245
let felt_size_groups = data_to_felt_count(data);
43-
let estimated = encode_and_blake_hash_resources(&felt_size_groups);
46+
let estimated =
47+
CasmV2HashResourceEstimate::estimated_resources_of_hash_function(&felt_size_groups);
4448

4549
let mut resources = estimated.resources().clone();
4650
resources.n_steps -= 1;

0 commit comments

Comments
 (0)