Skip to content

Commit 343bbb5

Browse files
starknet_os: aliases test
1 parent 60073ba commit 343bbb5

File tree

5 files changed

+100
-1
lines changed

5 files changed

+100
-1
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
use std::collections::HashMap;
2+
3+
use blockifier::test_utils::dict_state_reader::DictStateReader;
4+
use cairo_vm::hint_processor::builtin_hint_processor::dict_hint_utils::DICT_ACCESS_SIZE;
5+
use cairo_vm::hint_processor::hint_processor_utils::felt_to_usize;
6+
use cairo_vm::types::builtin_name::BuiltinName;
7+
use rstest::rstest;
8+
use starknet_api::core::ContractAddress;
9+
use starknet_api::state::StorageKey;
10+
use starknet_types_core::felt::Felt;
11+
12+
use crate::test_utils::cairo_runner::{
13+
run_cairo_0_entry_point,
14+
EndpointArg,
15+
EntryPointRunnerConfig,
16+
ImplicitArg,
17+
PointerArg,
18+
ValueArg,
19+
};
20+
21+
#[rstest]
22+
#[case(Vec::new(), Vec::new(), HashMap::new())]
23+
fn allocate_and_replace_keys_from_empty_storage(
24+
#[case] keys: Vec<Felt>,
25+
#[case] expected_alias_per_key: Vec<Felt>,
26+
#[case] expected_alias_storage: HashMap<Felt, Felt>,
27+
) {
28+
let (actual_alias_storage, actual_alias_per_key) =
29+
allocate_aliases_for_keys_and_replace(keys, HashMap::new());
30+
assert_eq!(actual_alias_storage, expected_alias_storage);
31+
assert_eq!(actual_alias_per_key, expected_alias_per_key);
32+
}
33+
34+
fn allocate_aliases_for_keys_and_replace(
35+
keys: Vec<Felt>,
36+
initial_storage: HashMap<StorageKey, Felt>,
37+
) -> (HashMap<Felt, Felt>, Vec<Felt>) {
38+
let runner_config = EntryPointRunnerConfig::default();
39+
let entrypoint = "allocate_alias_for_keys_and_replace";
40+
let program_str = "COMPLETE";
41+
let implicit_args = vec![ImplicitArg::Builtin(BuiltinName::range_check)];
42+
let expected_explicit_return_values = vec![
43+
EndpointArg::Value(ValueArg::Single(Felt::ZERO)), // Aliases.len
44+
EndpointArg::Pointer(PointerArg::Array(vec![ // Aliases.ptr
45+
Felt::ZERO;
46+
(keys.len() + 1) * DICT_ACCESS_SIZE
47+
])),
48+
EndpointArg::Pointer(PointerArg::Array(vec![Felt::ZERO; keys.len()])),
49+
];
50+
let n_keys_arg = EndpointArg::Value(ValueArg::Single(keys.len().into()));
51+
let keys_arg = EndpointArg::Pointer(PointerArg::Array(keys));
52+
let explicit_args = vec![n_keys_arg, keys_arg];
53+
let alias_contract_address: ContractAddress = Felt::TWO.try_into().unwrap();
54+
let storage_view = initial_storage
55+
.into_iter()
56+
.map(|(key, value)| ((alias_contract_address, key), value))
57+
.collect();
58+
59+
let state_reader = DictStateReader { storage_view, ..Default::default() };
60+
let (_, explicit_return_values, _) = run_cairo_0_entry_point(
61+
&runner_config,
62+
program_str,
63+
entrypoint,
64+
&explicit_args,
65+
&implicit_args,
66+
&expected_explicit_return_values,
67+
HashMap::new(),
68+
Some(state_reader),
69+
)
70+
.unwrap();
71+
let mut actual_alias_storage = HashMap::new();
72+
if let [
73+
EndpointArg::Value(ValueArg::Single(n_aliases)),
74+
EndpointArg::Value(ValueArg::Array(aliases_storage_updates)),
75+
EndpointArg::Value(ValueArg::Array(alias_per_key)),
76+
] = explicit_return_values.as_slice()
77+
{
78+
let n_aliases = felt_to_usize(n_aliases).unwrap();
79+
assert!(aliases_storage_updates.len() % DICT_ACCESS_SIZE == 0);
80+
assert!(aliases_storage_updates.len() / DICT_ACCESS_SIZE == n_aliases);
81+
let key_offset = 0;
82+
let new_value_offset = 2;
83+
for i in 0..n_aliases {
84+
let key = aliases_storage_updates[i * DICT_ACCESS_SIZE + key_offset];
85+
let new_value = aliases_storage_updates[i * DICT_ACCESS_SIZE + new_value_offset];
86+
actual_alias_storage.insert(key, new_value);
87+
}
88+
(actual_alias_storage, alias_per_key.clone().to_vec())
89+
} else {
90+
panic!("The return value doesn't match the given format.");
91+
}
92+
}

crates/starknet_os/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#[cfg(any(test, feature = "testing"))]
2+
pub mod aliases_test;
13
pub mod errors;
24
pub mod hint_processor;
35
pub mod hints;

crates/starknet_os/src/test_utils/cairo_runner.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::any::Any;
22
use std::collections::{HashMap, HashSet};
33

44
use blockifier::blockifier_versioned_constants::VersionedConstants;
5+
use blockifier::test_utils::dict_state_reader::DictStateReader;
56
use cairo_vm::serde::deserialize_program::Member;
67
use cairo_vm::types::builtin_name::BuiltinName;
78
use cairo_vm::types::layout_name::LayoutName;
@@ -553,6 +554,7 @@ fn get_return_values(
553554
/// Hint locals are added to the outermost exec scope.
554555
/// If the endpoint used builtins, the respective returned (implicit) arg is the builtin instance
555556
/// usage, unless the builtin is the output builtin, in which case the arg is the output.
557+
#[allow(clippy::too_many_arguments)]
556558
pub fn run_cairo_0_entry_point(
557559
runner_config: &EntryPointRunnerConfig,
558560
program_bytes: &[u8],
@@ -561,6 +563,7 @@ pub fn run_cairo_0_entry_point(
561563
implicit_args: &[ImplicitArg],
562564
expected_explicit_return_values: &[EndpointArg],
563565
hint_locals: HashMap<String, Box<dyn Any>>,
566+
state_reader: Option<DictStateReader>,
564567
) -> Cairo0EntryPointRunnerResult<(Vec<EndpointArg>, Vec<EndpointArg>, CairoRunner)> {
565568
let mut entrypoint = entrypoint.to_string();
566569
if runner_config.add_main_prefix_to_entrypoint {
@@ -571,7 +574,7 @@ pub fn run_cairo_0_entry_point(
571574
let program = inject_builtins(program_bytes, implicit_args)?;
572575
info!("Successfully injected builtins into program.");
573576

574-
let (state_reader, os_hints_config, os_state_input) = (None, None, None);
577+
let (os_hints_config, os_state_input) = (None, None);
575578
let os_block_input = OsBlockInput::default();
576579
let mut hint_processor = SnosHintProcessor::new_for_testing(
577580
state_reader,

crates/starknet_os/src/test_utils/utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub fn run_cairo_function_and_check_result(
3838
implicit_args,
3939
expected_explicit_retdata,
4040
hint_locals,
41+
None,
4142
)?;
4243
assert_eq!(expected_explicit_retdata, &actual_explicit_retdata);
4344
assert_eq!(expected_implicit_retdata, &actual_implicit_retdata);

crates/starknet_os/src/tests/bls_field.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ fn test_horner_eval() {
155155
&implicit_args,
156156
&[EndpointArg::Value(ValueArg::Array(vec![Felt::ZERO, Felt::ZERO, Felt::ZERO]))],
157157
HashMap::new(),
158+
None,
158159
)
159160
.unwrap();
160161

0 commit comments

Comments
 (0)