Skip to content

Commit dc1c49b

Browse files
Use_btreemap_for_deterministic_order_of_pie_keys (#2085)
1 parent 33d75ca commit dc1c49b

File tree

4 files changed

+35
-32
lines changed

4 files changed

+35
-32
lines changed

vm/src/tests/cairo_pie_test.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use wasm_bindgen_test::*;
99
use crate::{
1010
cairo_run::{cairo_run, CairoRunConfig},
1111
hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor,
12-
stdlib::collections::HashMap,
12+
stdlib::collections::{BTreeMap, HashMap},
1313
types::relocatable::Relocatable,
1414
vm::runners::{
1515
cairo_pie::{
@@ -45,7 +45,7 @@ fn pedersen_test() {
4545
// ret_pc_segment
4646
assert_eq!(pie_metadata.ret_pc_segment, SegmentInfo::from((6, 0)));
4747
// builtin_segments
48-
let expected_builtin_segments = HashMap::from([
48+
let expected_builtin_segments = BTreeMap::from([
4949
(BuiltinName::output, SegmentInfo::from((2, 1))),
5050
(BuiltinName::pedersen, SegmentInfo::from((3, 3))),
5151
(BuiltinName::range_check, SegmentInfo::from((4, 0))),
@@ -71,15 +71,15 @@ fn pedersen_test() {
7171
let expected_execution_resources = ExecutionResources {
7272
n_steps: 14,
7373
n_memory_holes: 0,
74-
builtin_instance_counter: HashMap::from([
74+
builtin_instance_counter: BTreeMap::from([
7575
(BuiltinName::range_check, 0),
7676
(BuiltinName::output, 1),
7777
(BuiltinName::pedersen, 1),
7878
]),
7979
};
8080
assert_eq!(cairo_pie.execution_resources, expected_execution_resources);
8181
// additional_data
82-
let expected_additional_data = HashMap::from([
82+
let expected_additional_data = BTreeMap::from([
8383
(
8484
BuiltinName::output,
8585
BuiltinAdditionalData::Output(OutputBuiltinAdditionalData {
@@ -128,7 +128,7 @@ fn common_signature() {
128128
assert_eq!(pie_metadata.ret_pc_segment, SegmentInfo::from((4, 0)));
129129
// builtin_segments
130130
let expected_builtin_segments =
131-
HashMap::from([(BuiltinName::ecdsa, SegmentInfo::from((2, 2)))]);
131+
BTreeMap::from([(BuiltinName::ecdsa, SegmentInfo::from((2, 2)))]);
132132
assert_eq!(pie_metadata.builtin_segments, expected_builtin_segments);
133133
// program_segment
134134
assert_eq!(pie_metadata.program_segment, SegmentInfo::from((0, 21)));
@@ -150,11 +150,11 @@ fn common_signature() {
150150
let expected_execution_resources = ExecutionResources {
151151
n_steps: 11,
152152
n_memory_holes: 0,
153-
builtin_instance_counter: HashMap::from([(BuiltinName::ecdsa, 1)]),
153+
builtin_instance_counter: BTreeMap::from([(BuiltinName::ecdsa, 1)]),
154154
};
155155
assert_eq!(cairo_pie.execution_resources, expected_execution_resources);
156156
// additional_data
157-
let expected_additional_data = HashMap::from([(
157+
let expected_additional_data = BTreeMap::from([(
158158
BuiltinName::ecdsa,
159159
BuiltinAdditionalData::Signature(HashMap::from([(
160160
Relocatable::from((2, 0)),
@@ -223,7 +223,7 @@ fn relocate_segments() {
223223
let expected_execution_resources = ExecutionResources {
224224
n_steps: 22,
225225
n_memory_holes: 0,
226-
builtin_instance_counter: HashMap::default(),
226+
builtin_instance_counter: BTreeMap::default(),
227227
};
228228
assert_eq!(cairo_pie.execution_resources, expected_execution_resources);
229229
// additional_data

vm/src/types/builtin_name.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const MUL_MOD_BUILTIN_NAME_WITH_SUFFIX: &str = "mul_mod_builtin";
3232

3333
/// Enum representing the name of a cairo builtin
3434
#[cfg_attr(feature = "test_utils", derive(Arbitrary))]
35-
#[derive(Serialize, Deserialize, Debug, PartialEq, Copy, Clone, Eq, Hash)]
35+
#[derive(Serialize, Deserialize, Debug, PartialEq, Copy, Clone, Eq, Hash, Ord, PartialOrd)]
3636
#[allow(non_camel_case_types)]
3737
pub enum BuiltinName {
3838
output,
@@ -179,11 +179,11 @@ impl core::fmt::Display for BuiltinName {
179179
// Implementation of custom serialization & deserialization for maps using builtin names with suffixes as keys
180180
pub(crate) mod serde_generic_map_impl {
181181
use super::BuiltinName;
182-
use crate::stdlib::{collections::HashMap, string::String};
182+
use crate::stdlib::{collections::BTreeMap, string::String};
183183
use serde::{de::Error, ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer};
184184

185185
pub fn serialize<S, V>(
186-
values: &HashMap<BuiltinName, V>,
186+
values: &BTreeMap<BuiltinName, V>,
187187
serializer: S,
188188
) -> Result<S::Ok, S::Error>
189189
where
@@ -199,13 +199,13 @@ pub(crate) mod serde_generic_map_impl {
199199

200200
pub fn deserialize<'de, D: Deserializer<'de>, V: Deserialize<'de>>(
201201
d: D,
202-
) -> Result<HashMap<BuiltinName, V>, D::Error> {
202+
) -> Result<BTreeMap<BuiltinName, V>, D::Error> {
203203
// First deserialize keys into String
204-
let map = HashMap::<String, V>::deserialize(d)?;
204+
let map = BTreeMap::<String, V>::deserialize(d)?;
205205
// Then match keys to BuiltinName and handle invalid names
206206
map.into_iter()
207207
.map(|(k, v)| BuiltinName::from_str_with_suffix(&k).map(|k| (k, v)))
208-
.collect::<Option<HashMap<_, _>>>()
208+
.collect::<Option<BTreeMap<_, _>>>()
209209
.ok_or(D::Error::custom("Invalid builtin name"))
210210
}
211211
}

vm/src/vm/runners/cairo_pie.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use crate::stdlib::prelude::{String, Vec};
33
use crate::types::builtin_name::BuiltinName;
44
use crate::vm::errors::cairo_pie_errors::CairoPieValidationError;
55
use crate::{
6-
stdlib::{collections::HashMap, prelude::*},
6+
stdlib::{
7+
collections::{BTreeMap, HashMap},
8+
prelude::*,
9+
},
710
types::relocatable::{MaybeRelocatable, Relocatable},
811
Felt252,
912
};
@@ -125,7 +128,7 @@ impl PartialEq for BuiltinAdditionalData {
125128
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
126129
pub struct CairoPieAdditionalData(
127130
#[serde(with = "crate::types::builtin_name::serde_generic_map_impl")]
128-
pub HashMap<BuiltinName, BuiltinAdditionalData>,
131+
pub BTreeMap<BuiltinName, BuiltinAdditionalData>,
129132
);
130133

131134
#[derive(Serialize, Clone, Debug, PartialEq, Eq)]
@@ -145,7 +148,7 @@ pub struct CairoPieMetadata {
145148
pub ret_fp_segment: SegmentInfo,
146149
pub ret_pc_segment: SegmentInfo,
147150
#[serde(serialize_with = "serde_impl::serialize_builtin_segments")]
148-
pub builtin_segments: HashMap<BuiltinName, SegmentInfo>,
151+
pub builtin_segments: BTreeMap<BuiltinName, SegmentInfo>,
149152
pub extra_segments: Vec<SegmentInfo>,
150153
}
151154

@@ -435,7 +438,7 @@ impl CairoPie {
435438
}
436439

437440
pub(super) mod serde_impl {
438-
use crate::stdlib::collections::HashMap;
441+
use crate::stdlib::collections::{BTreeMap, HashMap};
439442
use crate::types::builtin_name::BuiltinName;
440443
use num_traits::Num;
441444

@@ -840,7 +843,7 @@ pub(super) mod serde_impl {
840843
}
841844

842845
pub fn serialize_builtin_segments<S>(
843-
values: &HashMap<BuiltinName, SegmentInfo>,
846+
values: &BTreeMap<BuiltinName, SegmentInfo>,
844847
serializer: S,
845848
) -> Result<S::Ok, S::Error>
846849
where

vm/src/vm/runners/cairo_runner.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ impl CairoRunner {
10681068
Ok(ExecutionResources {
10691069
n_steps,
10701070
n_memory_holes,
1071-
builtin_instance_counter,
1071+
builtin_instance_counter: builtin_instance_counter.into_iter().collect(),
10721072
})
10731073
}
10741074

@@ -1415,7 +1415,7 @@ impl CairoRunner {
14151415
execution_segment: (execution_base.segment_index, execution_size).into(),
14161416
ret_fp_segment: (return_fp.segment_index, 0).into(),
14171417
ret_pc_segment: (return_pc.segment_index, 0).into(),
1418-
builtin_segments,
1418+
builtin_segments: builtin_segments.into_iter().collect(),
14191419
extra_segments,
14201420
};
14211421

@@ -1597,7 +1597,7 @@ pub struct ExecutionResources {
15971597
pub n_steps: usize,
15981598
pub n_memory_holes: usize,
15991599
#[serde(with = "crate::types::builtin_name::serde_generic_map_impl")]
1600-
pub builtin_instance_counter: HashMap<BuiltinName, usize>,
1600+
pub builtin_instance_counter: BTreeMap<BuiltinName, usize>,
16011601
}
16021602

16031603
/// Returns a copy of the execution resources where all the builtins with a usage counter
@@ -3965,7 +3965,7 @@ mod tests {
39653965
Ok(ExecutionResources {
39663966
n_steps: 10,
39673967
n_memory_holes: 0,
3968-
builtin_instance_counter: HashMap::new(),
3968+
builtin_instance_counter: BTreeMap::new(),
39693969
}),
39703970
);
39713971
}
@@ -4020,7 +4020,7 @@ mod tests {
40204020
Ok(ExecutionResources {
40214021
n_steps: 10,
40224022
n_memory_holes: 0,
4023-
builtin_instance_counter: HashMap::new(),
4023+
builtin_instance_counter: BTreeMap::new(),
40244024
}),
40254025
);
40264026
}
@@ -4045,7 +4045,7 @@ mod tests {
40454045
Ok(ExecutionResources {
40464046
n_steps: 10,
40474047
n_memory_holes: 0,
4048-
builtin_instance_counter: HashMap::from([(BuiltinName::output, 4)]),
4048+
builtin_instance_counter: BTreeMap::from([(BuiltinName::output, 4)]),
40494049
}),
40504050
);
40514051
}
@@ -4989,7 +4989,7 @@ mod tests {
49894989
}
49904990

49914991
fn setup_execution_resources() -> (ExecutionResources, ExecutionResources) {
4992-
let mut builtin_instance_counter: HashMap<BuiltinName, usize> = HashMap::new();
4992+
let mut builtin_instance_counter: BTreeMap<BuiltinName, usize> = BTreeMap::new();
49934993
builtin_instance_counter.insert(BuiltinName::output, 8);
49944994

49954995
let execution_resources_1 = ExecutionResources {
@@ -5181,7 +5181,7 @@ mod tests {
51815181
let execution_resources_1 = ExecutionResources {
51825182
n_steps: 800,
51835183
n_memory_holes: 0,
5184-
builtin_instance_counter: HashMap::from([
5184+
builtin_instance_counter: BTreeMap::from([
51855185
(BuiltinName::pedersen, 7),
51865186
(BuiltinName::range_check, 16),
51875187
]),
@@ -5192,7 +5192,7 @@ mod tests {
51925192
ExecutionResources {
51935193
n_steps: 1600,
51945194
n_memory_holes: 0,
5195-
builtin_instance_counter: HashMap::from([
5195+
builtin_instance_counter: BTreeMap::from([
51965196
(BuiltinName::pedersen, 14),
51975197
(BuiltinName::range_check, 32)
51985198
])
@@ -5202,30 +5202,30 @@ mod tests {
52025202
let execution_resources_2 = ExecutionResources {
52035203
n_steps: 545,
52045204
n_memory_holes: 0,
5205-
builtin_instance_counter: HashMap::from([(BuiltinName::range_check, 17)]),
5205+
builtin_instance_counter: BTreeMap::from([(BuiltinName::range_check, 17)]),
52065206
};
52075207

52085208
assert_eq!(
52095209
&execution_resources_2 * 8,
52105210
ExecutionResources {
52115211
n_steps: 4360,
52125212
n_memory_holes: 0,
5213-
builtin_instance_counter: HashMap::from([(BuiltinName::range_check, 136)])
5213+
builtin_instance_counter: BTreeMap::from([(BuiltinName::range_check, 136)])
52145214
}
52155215
);
52165216

52175217
let execution_resources_3 = ExecutionResources {
52185218
n_steps: 42,
52195219
n_memory_holes: 0,
5220-
builtin_instance_counter: HashMap::new(),
5220+
builtin_instance_counter: BTreeMap::new(),
52215221
};
52225222

52235223
assert_eq!(
52245224
&execution_resources_3 * 18,
52255225
ExecutionResources {
52265226
n_steps: 756,
52275227
n_memory_holes: 0,
5228-
builtin_instance_counter: HashMap::new()
5228+
builtin_instance_counter: BTreeMap::new()
52295229
}
52305230
);
52315231
}

0 commit comments

Comments
 (0)