Skip to content

Commit 1fc5054

Browse files
starknet_os: update test to mark class segments as accessed (starkware-libs#9803)
Signed-off-by: Dori Medini <[email protected]>
1 parent c2df2ac commit 1fc5054

File tree

1 file changed

+56
-20
lines changed

1 file changed

+56
-20
lines changed

crates/starknet_os/src/hints/hint_implementation/compiled_class/compiled_class_test.rs

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use starknet_api::contract_class::ContractClass;
3434
use starknet_types_core::felt::Felt;
3535

3636
use crate::hints::hint_implementation::compiled_class::utils::create_bytecode_segment_structure;
37-
use crate::hints::vars::Const;
37+
use crate::hints::vars::{CairoStruct, Const};
3838
use crate::test_utils::cairo_runner::{
3939
initialize_cairo_runner,
4040
run_cairo_0_entrypoint,
@@ -44,7 +44,7 @@ use crate::test_utils::cairo_runner::{
4444
ValueArg,
4545
};
4646
use crate::test_utils::utils::DEFAULT_PRIME;
47-
use crate::vm_utils::LoadCairoObject;
47+
use crate::vm_utils::{get_address_of_nested_fields_from_base_address, LoadCairoObject};
4848

4949
// V1 (Poseidon) HASH CONSTS
5050
/// Expected Poseidon hash for the test contract.
@@ -229,6 +229,7 @@ fn get_dummy_compiled_class(contract_segmentation: bool) -> CasmContractClass {
229229
fn run_compiled_class_hash_entry_point(
230230
contract_class: &CasmContractClass,
231231
load_full_contract: bool,
232+
mark_contract_segments_as_accessed: bool,
232233
hash_version: &HashVersion,
233234
) -> (ExecutionResources, Felt) {
234235
// Set up the entry point runner configuration.
@@ -276,6 +277,27 @@ fn run_compiled_class_hash_entry_point(
276277
// Pass the contract class base address as the function's input parameter.
277278
let contract_class_base = runner.vm.add_memory_segment();
278279
contract_class.load_into(&mut runner.vm, &program, contract_class_base, &constants).unwrap();
280+
281+
// Mark the bytecode segment as accessed if requested.
282+
if mark_contract_segments_as_accessed {
283+
// Find the bytecode segment base address.
284+
let bytecode_ptr_address = get_address_of_nested_fields_from_base_address(
285+
contract_class_base,
286+
CairoStruct::CompiledClass,
287+
&runner.vm,
288+
&["bytecode_ptr"],
289+
&program,
290+
)
291+
.unwrap();
292+
let bytecode_ptr = runner.vm.get_relocatable(bytecode_ptr_address).unwrap();
293+
// Mark as accessed.
294+
// We cannot use `mark_address_range_as_accessed` because this method cannot be called
295+
// before the run is finished.
296+
for i in 0..contract_class.bytecode.len() {
297+
runner.vm.segments.memory.mark_as_accessed((bytecode_ptr + i).unwrap());
298+
}
299+
}
300+
279301
let explicit_args = vec![
280302
// Compiled class
281303
EndpointArg::Value(ValueArg::Single(contract_class_base.into())),
@@ -322,11 +344,13 @@ fn test_compiled_class_hash_basic(
322344
#[case] expected_hash: &str,
323345
#[case] expected_n_poseidons: usize,
324346
) {
347+
let load_full_contract = false;
348+
let mark_contract_segments_as_accessed = true;
349+
325350
let (resources, compiled_class_hash) = run_compiled_class_hash_entry_point(
326351
&get_dummy_compiled_class(segmentation),
327-
// TODO(Dori): Instead of setting load_full_contract to true, we should mark all segments
328-
// as accessed.
329-
true,
352+
load_full_contract,
353+
mark_contract_segments_as_accessed,
330354
&HashVersion::V1,
331355
);
332356
assert_eq!(compiled_class_hash, Felt::from_hex_unchecked(expected_hash));
@@ -339,6 +363,7 @@ fn test_compiled_class_hash_basic(
339363
#[rstest]
340364
fn test_compiled_class_hash(
341365
#[values(true, false)] load_full_contract: bool,
366+
#[values(true, false)] mark_contract_segments_as_accessed: bool,
342367
#[values(HashVersion::V1, HashVersion::V2)] hash_version: HashVersion,
343368
) {
344369
// Get the test contract class.
@@ -349,8 +374,12 @@ fn test_compiled_class_hash(
349374
_ => panic!("Expected ContractClass::V1"),
350375
};
351376
// Run the compiled class hash entry point.
352-
let (actual_execution_resources, hash_computed_by_cairo) =
353-
run_compiled_class_hash_entry_point(&contract_class, load_full_contract, &hash_version);
377+
let (actual_execution_resources, hash_computed_by_cairo) = run_compiled_class_hash_entry_point(
378+
&contract_class,
379+
load_full_contract,
380+
mark_contract_segments_as_accessed,
381+
&hash_version,
382+
);
354383

355384
// Format builtin usage statistics for comparison with expected values.
356385
// Filter out unused builtins (count = 0), format as "name: count", sort alphabetically,
@@ -365,17 +394,18 @@ fn test_compiled_class_hash(
365394
let actual_builtin_usage = actual_builtin_usage_parts.join(", ");
366395

367396
// Select expected values based on whether we're loading full or partial contract.
368-
let (expected_builtin_usage, expected_n_steps) = if load_full_contract {
369-
(
370-
hash_version.expected_builtin_usage_full_contract(),
371-
hash_version.expected_n_steps_full_contract(),
372-
)
373-
} else {
374-
(
375-
hash_version.expected_builtin_usage_partial_contract(),
376-
hash_version.expected_n_steps_partial_contract(),
377-
)
378-
};
397+
let (expected_builtin_usage, expected_n_steps) =
398+
if load_full_contract || mark_contract_segments_as_accessed {
399+
(
400+
hash_version.expected_builtin_usage_full_contract(),
401+
hash_version.expected_n_steps_full_contract(),
402+
)
403+
} else {
404+
(
405+
hash_version.expected_builtin_usage_partial_contract(),
406+
hash_version.expected_n_steps_partial_contract(),
407+
)
408+
};
379409

380410
expected_builtin_usage.assert_eq(&actual_builtin_usage);
381411
expected_n_steps.assert_eq(&actual_execution_resources.n_steps.to_string());
@@ -445,8 +475,14 @@ fn compare_estimated_vs_actual_casm_hash_resources(
445475
hash_version: &HashVersion,
446476
) {
447477
// Run the compiled class hash entry point with full contract loading.
448-
let (actual_execution_resources, _) =
449-
run_compiled_class_hash_entry_point(&contract_class, true, hash_version);
478+
let load_full_contract = true;
479+
let mark_contract_segments_as_accessed = false;
480+
let (actual_execution_resources, _) = run_compiled_class_hash_entry_point(
481+
&contract_class,
482+
load_full_contract,
483+
mark_contract_segments_as_accessed,
484+
hash_version,
485+
);
450486

451487
let bytecode_segments = NestedFeltCounts::new(
452488
&contract_class.get_bytecode_segment_lengths(),

0 commit comments

Comments
 (0)