From 27d314de4ae357bcd7357bfbe3db6a5e1593d6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Mon, 22 Sep 2025 11:44:06 -0300 Subject: [PATCH 1/6] Avoid cloning constants when compiling hints By changing the compile_hint parameter type to `Arc` instead of `Rc`, we can reuse the constants that are already included in `Program`. This avoids cloning all the constants. With this commit, there is a 9.8% performance increase when replaying mainnet block 10000, compared to 2.5.0. --- .../builtin_hint_processor_definition.rs | 4 ++-- .../cairo_1_hint_processor/hint_processor.rs | 4 ++-- .../hint_processor/hint_processor_definition.rs | 4 ++-- vm/src/serde/deserialize_program.rs | 2 +- vm/src/types/program.rs | 15 ++++++++------- vm/src/utils.rs | 12 ++++++------ vm/src/vm/runners/cairo_runner.rs | 5 +---- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs b/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs index c3cab5b58b..dca7853074 100644 --- a/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs +++ b/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs @@ -115,7 +115,7 @@ use crate::{ hint_processor_definition::HintReference, }, serde::deserialize_program::ApTracking, - stdlib::{any::Any, collections::HashMap, prelude::*, rc::Rc}, + stdlib::{any::Any, collections::HashMap, prelude::*, rc::Rc, sync::Arc}, types::exec_scope::ExecutionScopes, vm::{errors::hint_errors::HintError, vm_core::VirtualMachine}, }; @@ -132,7 +132,7 @@ pub struct HintProcessorData { pub code: String, pub ap_tracking: ApTracking, pub ids_data: HashMap, - pub constants: Rc>, + pub constants: Arc>, } impl HintProcessorData { diff --git a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs index 426df07159..87f9236a4b 100644 --- a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs +++ b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs @@ -9,7 +9,7 @@ use super::hint_processor_utils::*; use crate::any_box; use crate::hint_processor::cairo_1_hint_processor::dict_manager::DictSquashExecScope; use crate::hint_processor::hint_processor_definition::HintReference; -use crate::stdlib::rc::Rc; +use crate::stdlib::sync::Arc; use crate::stdlib::{boxed::Box, collections::HashMap, prelude::*}; use crate::types::relocatable::{MaybeRelocatable, Relocatable}; use crate::vm::runners::cairo_runner::ResourceTracker; @@ -1265,7 +1265,7 @@ impl HintProcessorLogic for Cairo1HintProcessor { //List of all references (key corresponds to element of the previous dictionary) _references: &[HintReference], // Identifiers stored in the hint's program. - _constants: Rc>, + _constants: Arc>, ) -> Result, VirtualMachineError> { let data = hint_code.parse().ok().and_then(|x: usize| self.hints.get(&x).cloned()) .ok_or_else(|| VirtualMachineError::CompileHintFail( diff --git a/vm/src/hint_processor/hint_processor_definition.rs b/vm/src/hint_processor/hint_processor_definition.rs index 60d57772ee..90d51b1ac6 100644 --- a/vm/src/hint_processor/hint_processor_definition.rs +++ b/vm/src/hint_processor/hint_processor_definition.rs @@ -1,4 +1,4 @@ -use crate::stdlib::{any::Any, boxed::Box, collections::HashMap, prelude::*, rc::Rc}; +use crate::stdlib::{any::Any, boxed::Box, collections::HashMap, prelude::*, sync::Arc}; use crate::any_box; use crate::serde::deserialize_program::ApTracking; @@ -42,7 +42,7 @@ pub trait HintProcessorLogic { //List of all references (key corresponds to element of the previous dictionary) references: &[HintReference], // Identifiers stored in the hint's program. - constants: Rc>, + constants: Arc>, ) -> Result, VirtualMachineError> { Ok(any_box!(HintProcessorData { code: hint_code.to_string(), diff --git a/vm/src/serde/deserialize_program.rs b/vm/src/serde/deserialize_program.rs index 0789e5f0c9..2c483da77d 100644 --- a/vm/src/serde/deserialize_program.rs +++ b/vm/src/serde/deserialize_program.rs @@ -493,7 +493,7 @@ pub fn parse_program_json( }; Ok(Program { shared_program_data: Arc::new(shared_program_data), - constants, + constants: Arc::new(constants), builtins: program_json.builtins, }) } diff --git a/vm/src/types/program.rs b/vm/src/types/program.rs index da5d8c69ed..f9c5a26f4c 100644 --- a/vm/src/types/program.rs +++ b/vm/src/types/program.rs @@ -201,7 +201,7 @@ pub type HintRange = (usize, NonZeroUsize); #[derive(Clone, Debug, PartialEq, Eq)] pub struct Program { pub shared_program_data: Arc, - pub constants: HashMap, + pub constants: Arc>, pub(crate) builtins: Vec, } @@ -235,7 +235,7 @@ impl Program { }; Ok(Self { shared_program_data: Arc::new(shared_program_data), - constants, + constants: Arc::new(constants), builtins, }) } @@ -269,7 +269,7 @@ impl Program { }; Ok(Self { shared_program_data: Arc::new(shared_program_data), - constants, + constants: Arc::new(constants), builtins, }) } @@ -420,7 +420,7 @@ impl Default for Program { fn default() -> Self { Self { shared_program_data: Arc::new(SharedProgramData::default()), - constants: HashMap::new(), + constants: Arc::new(HashMap::new()), builtins: Vec::new(), } } @@ -760,7 +760,8 @@ mod tests { [("__main__.main.SIZEOF_LOCALS", Felt252::ZERO)] .into_iter() .map(|(key, value)| (key.to_string(), value)) - .collect::>(), + .collect::>() + .into(), ); } @@ -1413,7 +1414,7 @@ mod tests { .map(|(key, value)| (key.to_string(), value)) .collect::>(); - assert_eq!(program.constants, constants); + assert_eq!(program.constants, constants.into()); } #[test] @@ -1439,7 +1440,7 @@ mod tests { }; let program = Program { shared_program_data: Arc::new(shared_program_data), - constants: HashMap::new(), + constants: Arc::new(HashMap::new()), builtins: Vec::new(), }; diff --git a/vm/src/utils.rs b/vm/src/utils.rs index 6824252fe2..2fca1e3a2b 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -316,7 +316,7 @@ pub mod test_utils { }; Program { shared_program_data: Arc::new(shared_program_data), - constants: crate::stdlib::collections::HashMap::new(), + constants: crate::stdlib::collections::HashMap::new().into(), builtins: vec![$( $builtin_name ),*], } }}; @@ -400,7 +400,7 @@ pub mod test_utils { identifiers: val.identifiers, reference_manager: Program::get_reference_list(&val.reference_manager), }), - constants: val.constants, + constants: val.constants.into(), builtins: val.builtins, } } @@ -476,7 +476,7 @@ pub mod test_utils { ($vm:expr, $ids_data:expr, $hint_code:expr, $exec_scopes:expr, $constants:expr) => {{ let mut hint_data = HintProcessorData::new_default($hint_code.to_string(), $ids_data); let constants: &HashMap = $constants; - hint_data.constants = crate::stdlib::rc::Rc::new(constants.clone()); + hint_data.constants = constants.clone().into(); let mut hint_processor = BuiltinHintProcessor::new_empty(); hint_processor.execute_hint(&mut $vm, $exec_scopes, &any_box!(hint_data)) }}; @@ -978,7 +978,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new(), + constants: HashMap::new().into(), builtins: Vec::new(), }; assert_eq!(program, program!()) @@ -1002,7 +1002,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new(), + constants: HashMap::new().into(), builtins: vec![BuiltinName::range_check], }; @@ -1027,7 +1027,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new(), + constants: HashMap::new().into(), builtins: vec![BuiltinName::range_check], }; diff --git a/vm/src/vm/runners/cairo_runner.rs b/vm/src/vm/runners/cairo_runner.rs index 2a0ecfe964..918ed56638 100644 --- a/vm/src/vm/runners/cairo_runner.rs +++ b/vm/src/vm/runners/cairo_runner.rs @@ -7,7 +7,6 @@ use crate::{ collections::{BTreeMap, HashMap, HashSet}, ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign}, prelude::*, - rc::Rc, }, types::{builtin_name::BuiltinName, layout::CairoLayoutParams, layout_name::LayoutName}, vm::{ @@ -644,8 +643,6 @@ impl CairoRunner { references: &[HintReference], hint_executor: &mut dyn HintProcessor, ) -> Result>, VirtualMachineError> { - let constants = Rc::new(self.program.constants.clone()); - self.program .shared_program_data .hints_collection @@ -657,7 +654,7 @@ impl CairoRunner { &hint.flow_tracking_data.ap_tracking, &hint.flow_tracking_data.reference_ids, references, - constants.clone(), + self.program.constants.clone(), ) .map_err(|_| VirtualMachineError::CompileHintFail(hint.code.clone().into())) }) From a8daa0aff977d1a215f0d2fcfbc87510187b92e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Mon, 22 Sep 2025 15:32:01 -0300 Subject: [PATCH 2/6] Using with_capacity to avoid reallocs when inserting to hashmap With this commit, there is a 10.5% performance improvement while executing block 1000, compared to 2.5.0 --- vm/src/hint_processor/hint_processor_definition.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/src/hint_processor/hint_processor_definition.rs b/vm/src/hint_processor/hint_processor_definition.rs index 90d51b1ac6..557f1b5ce7 100644 --- a/vm/src/hint_processor/hint_processor_definition.rs +++ b/vm/src/hint_processor/hint_processor_definition.rs @@ -80,7 +80,7 @@ fn get_ids_data( reference_ids: &HashMap, references: &[HintReference], ) -> Result, VirtualMachineError> { - let mut ids_data = HashMap::::new(); + let mut ids_data = HashMap::::with_capacity(reference_ids.len()); for (path, ref_id) in reference_ids { let name = path .rsplit('.') From b4c8768a9aa411d26f8324069101fe633ff888f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Tue, 23 Sep 2025 11:00:07 -0300 Subject: [PATCH 3/6] Use insert_all instead of insert With this commit, there is a 14.4% improvement while executing mainnet block 10000, compared to 2.5.0 --- vm/src/vm/vm_memory/memory.rs | 47 ++++++++++++++++++++++++++ vm/src/vm/vm_memory/memory_segments.rs | 6 ++-- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/vm/src/vm/vm_memory/memory.rs b/vm/src/vm/vm_memory/memory.rs index c3546f7d00..1d63c4e3c6 100644 --- a/vm/src/vm/vm_memory/memory.rs +++ b/vm/src/vm/vm_memory/memory.rs @@ -744,6 +744,53 @@ impl Memory { self.mark_as_accessed(key); Ok(()) } + + /// Inserts multiple values into contiguous memory addresses. + /// + /// If the address isn't contiguous with previously inserted data, memory gaps will be represented by NONE values + /// + /// Returns an error if: + /// - The segment index given by the address corresponds to a non-allocated segment. + /// - An inserted value is inconsistent with the current value at the memory cell + pub fn insert_all( + &mut self, + key: Relocatable, + vals: &[MaybeRelocatable], + ) -> Result<(), MemoryError> { + let segment = self.get_segment(key)?; + let (_, value_offset) = from_relocatable_to_indexes(key); + + // Allocate space for all new elements. + if segment.len() < value_offset + vals.len() { + segment.reserve(value_offset + vals.len() - segment.len()); + } + // Fill middle with NONE. + if segment.len() < value_offset { + segment.resize(value_offset, MemoryCell::NONE); + } + // Insert new elements. + let last_element_to_replace = segment.len().min(value_offset + vals.len()); + let replaced = segment.splice( + value_offset..last_element_to_replace, + vals.iter().map(|v| MemoryCell::new(v.clone())), + ); + + // Check for inconsistencies. + let inconsistent_cell = replaced.enumerate().find(|(idx, replaced)| { + replaced + .get_value() + .is_some_and(|replaced| replaced != vals[*idx]) + }); + if let Some((insertions_idx, current_value)) = inconsistent_cell { + return Err(MemoryError::InconsistentMemory(Box::new(( + (key + insertions_idx)?, + current_value.into(), + vals[insertions_idx].clone(), + )))); + } + + Ok(()) + } } impl From<&Memory> for CairoPieMemory { diff --git a/vm/src/vm/vm_memory/memory_segments.rs b/vm/src/vm/vm_memory/memory_segments.rs index e18e739346..504a038ac8 100644 --- a/vm/src/vm/vm_memory/memory_segments.rs +++ b/vm/src/vm/vm_memory/memory_segments.rs @@ -70,10 +70,8 @@ impl MemorySegmentManager { ptr: Relocatable, data: &[MaybeRelocatable], ) -> Result { - // Starting from the end ensures any necessary resize - // is performed once with enough room for everything - for (num, value) in data.iter().enumerate().rev() { - self.memory.insert((ptr + num)?, value)?; + if !data.is_empty() { + self.memory.insert_all(ptr, data)?; } (ptr + data.len()).map_err(MemoryError::Math) } From fa58734eaeedced7c575f1a0cd4c84da9df3dde0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Tue, 23 Sep 2025 13:06:58 -0300 Subject: [PATCH 4/6] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8c10f0fbc..c672581aab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ #### Upcoming Changes +* opt(breaking): Optimize Cairo 0 Execution [#2206](https://github.com/lambdaclass/cairo-vm/pull/2206) + #### [2.5.0] - 2025-09-11 * breaking: Store constants in Hint Data [#2191](https://github.com/lambdaclass/cairo-vm/pull/2191) From dbea70a5b4242f15bc6efc37853298b808aacf72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Thu, 25 Sep 2025 12:28:01 -0300 Subject: [PATCH 5/6] Revert "Avoid cloning constants when compiling hints" This reverts commit 27d314de4ae357bcd7357bfbe3db6a5e1593d6a5. --- .../builtin_hint_processor_definition.rs | 4 ++-- .../cairo_1_hint_processor/hint_processor.rs | 4 ++-- .../hint_processor/hint_processor_definition.rs | 4 ++-- vm/src/serde/deserialize_program.rs | 2 +- vm/src/types/program.rs | 15 +++++++-------- vm/src/utils.rs | 12 ++++++------ vm/src/vm/runners/cairo_runner.rs | 5 ++++- 7 files changed, 24 insertions(+), 22 deletions(-) diff --git a/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs b/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs index dca7853074..c3cab5b58b 100644 --- a/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs +++ b/vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs @@ -115,7 +115,7 @@ use crate::{ hint_processor_definition::HintReference, }, serde::deserialize_program::ApTracking, - stdlib::{any::Any, collections::HashMap, prelude::*, rc::Rc, sync::Arc}, + stdlib::{any::Any, collections::HashMap, prelude::*, rc::Rc}, types::exec_scope::ExecutionScopes, vm::{errors::hint_errors::HintError, vm_core::VirtualMachine}, }; @@ -132,7 +132,7 @@ pub struct HintProcessorData { pub code: String, pub ap_tracking: ApTracking, pub ids_data: HashMap, - pub constants: Arc>, + pub constants: Rc>, } impl HintProcessorData { diff --git a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs index 87f9236a4b..426df07159 100644 --- a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs +++ b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs @@ -9,7 +9,7 @@ use super::hint_processor_utils::*; use crate::any_box; use crate::hint_processor::cairo_1_hint_processor::dict_manager::DictSquashExecScope; use crate::hint_processor::hint_processor_definition::HintReference; -use crate::stdlib::sync::Arc; +use crate::stdlib::rc::Rc; use crate::stdlib::{boxed::Box, collections::HashMap, prelude::*}; use crate::types::relocatable::{MaybeRelocatable, Relocatable}; use crate::vm::runners::cairo_runner::ResourceTracker; @@ -1265,7 +1265,7 @@ impl HintProcessorLogic for Cairo1HintProcessor { //List of all references (key corresponds to element of the previous dictionary) _references: &[HintReference], // Identifiers stored in the hint's program. - _constants: Arc>, + _constants: Rc>, ) -> Result, VirtualMachineError> { let data = hint_code.parse().ok().and_then(|x: usize| self.hints.get(&x).cloned()) .ok_or_else(|| VirtualMachineError::CompileHintFail( diff --git a/vm/src/hint_processor/hint_processor_definition.rs b/vm/src/hint_processor/hint_processor_definition.rs index 557f1b5ce7..e21d7c860c 100644 --- a/vm/src/hint_processor/hint_processor_definition.rs +++ b/vm/src/hint_processor/hint_processor_definition.rs @@ -1,4 +1,4 @@ -use crate::stdlib::{any::Any, boxed::Box, collections::HashMap, prelude::*, sync::Arc}; +use crate::stdlib::{any::Any, boxed::Box, collections::HashMap, prelude::*, rc::Rc}; use crate::any_box; use crate::serde::deserialize_program::ApTracking; @@ -42,7 +42,7 @@ pub trait HintProcessorLogic { //List of all references (key corresponds to element of the previous dictionary) references: &[HintReference], // Identifiers stored in the hint's program. - constants: Arc>, + constants: Rc>, ) -> Result, VirtualMachineError> { Ok(any_box!(HintProcessorData { code: hint_code.to_string(), diff --git a/vm/src/serde/deserialize_program.rs b/vm/src/serde/deserialize_program.rs index 2c483da77d..0789e5f0c9 100644 --- a/vm/src/serde/deserialize_program.rs +++ b/vm/src/serde/deserialize_program.rs @@ -493,7 +493,7 @@ pub fn parse_program_json( }; Ok(Program { shared_program_data: Arc::new(shared_program_data), - constants: Arc::new(constants), + constants, builtins: program_json.builtins, }) } diff --git a/vm/src/types/program.rs b/vm/src/types/program.rs index f9c5a26f4c..da5d8c69ed 100644 --- a/vm/src/types/program.rs +++ b/vm/src/types/program.rs @@ -201,7 +201,7 @@ pub type HintRange = (usize, NonZeroUsize); #[derive(Clone, Debug, PartialEq, Eq)] pub struct Program { pub shared_program_data: Arc, - pub constants: Arc>, + pub constants: HashMap, pub(crate) builtins: Vec, } @@ -235,7 +235,7 @@ impl Program { }; Ok(Self { shared_program_data: Arc::new(shared_program_data), - constants: Arc::new(constants), + constants, builtins, }) } @@ -269,7 +269,7 @@ impl Program { }; Ok(Self { shared_program_data: Arc::new(shared_program_data), - constants: Arc::new(constants), + constants, builtins, }) } @@ -420,7 +420,7 @@ impl Default for Program { fn default() -> Self { Self { shared_program_data: Arc::new(SharedProgramData::default()), - constants: Arc::new(HashMap::new()), + constants: HashMap::new(), builtins: Vec::new(), } } @@ -760,8 +760,7 @@ mod tests { [("__main__.main.SIZEOF_LOCALS", Felt252::ZERO)] .into_iter() .map(|(key, value)| (key.to_string(), value)) - .collect::>() - .into(), + .collect::>(), ); } @@ -1414,7 +1413,7 @@ mod tests { .map(|(key, value)| (key.to_string(), value)) .collect::>(); - assert_eq!(program.constants, constants.into()); + assert_eq!(program.constants, constants); } #[test] @@ -1440,7 +1439,7 @@ mod tests { }; let program = Program { shared_program_data: Arc::new(shared_program_data), - constants: Arc::new(HashMap::new()), + constants: HashMap::new(), builtins: Vec::new(), }; diff --git a/vm/src/utils.rs b/vm/src/utils.rs index 2fca1e3a2b..6824252fe2 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -316,7 +316,7 @@ pub mod test_utils { }; Program { shared_program_data: Arc::new(shared_program_data), - constants: crate::stdlib::collections::HashMap::new().into(), + constants: crate::stdlib::collections::HashMap::new(), builtins: vec![$( $builtin_name ),*], } }}; @@ -400,7 +400,7 @@ pub mod test_utils { identifiers: val.identifiers, reference_manager: Program::get_reference_list(&val.reference_manager), }), - constants: val.constants.into(), + constants: val.constants, builtins: val.builtins, } } @@ -476,7 +476,7 @@ pub mod test_utils { ($vm:expr, $ids_data:expr, $hint_code:expr, $exec_scopes:expr, $constants:expr) => {{ let mut hint_data = HintProcessorData::new_default($hint_code.to_string(), $ids_data); let constants: &HashMap = $constants; - hint_data.constants = constants.clone().into(); + hint_data.constants = crate::stdlib::rc::Rc::new(constants.clone()); let mut hint_processor = BuiltinHintProcessor::new_empty(); hint_processor.execute_hint(&mut $vm, $exec_scopes, &any_box!(hint_data)) }}; @@ -978,7 +978,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new().into(), + constants: HashMap::new(), builtins: Vec::new(), }; assert_eq!(program, program!()) @@ -1002,7 +1002,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new().into(), + constants: HashMap::new(), builtins: vec![BuiltinName::range_check], }; @@ -1027,7 +1027,7 @@ mod test { }; let program = Program { shared_program_data: Arc::new(shared_data), - constants: HashMap::new().into(), + constants: HashMap::new(), builtins: vec![BuiltinName::range_check], }; diff --git a/vm/src/vm/runners/cairo_runner.rs b/vm/src/vm/runners/cairo_runner.rs index 918ed56638..2a0ecfe964 100644 --- a/vm/src/vm/runners/cairo_runner.rs +++ b/vm/src/vm/runners/cairo_runner.rs @@ -7,6 +7,7 @@ use crate::{ collections::{BTreeMap, HashMap, HashSet}, ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign}, prelude::*, + rc::Rc, }, types::{builtin_name::BuiltinName, layout::CairoLayoutParams, layout_name::LayoutName}, vm::{ @@ -643,6 +644,8 @@ impl CairoRunner { references: &[HintReference], hint_executor: &mut dyn HintProcessor, ) -> Result>, VirtualMachineError> { + let constants = Rc::new(self.program.constants.clone()); + self.program .shared_program_data .hints_collection @@ -654,7 +657,7 @@ impl CairoRunner { &hint.flow_tracking_data.ap_tracking, &hint.flow_tracking_data.reference_ids, references, - self.program.constants.clone(), + constants.clone(), ) .map_err(|_| VirtualMachineError::CompileHintFail(hint.code.clone().into())) }) From 4612ef6e116b41ed1497ac75a448c125a0a731c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Gonz=C3=A1lez=20Calder=C3=B3n?= Date: Fri, 3 Oct 2025 12:29:40 -0300 Subject: [PATCH 6/6] Validate memory cells --- vm/src/vm/vm_memory/memory.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vm/src/vm/vm_memory/memory.rs b/vm/src/vm/vm_memory/memory.rs index 1d63c4e3c6..31f7477e3b 100644 --- a/vm/src/vm/vm_memory/memory.rs +++ b/vm/src/vm/vm_memory/memory.rs @@ -789,6 +789,11 @@ impl Memory { )))); } + // Validate inserted memory cells + for i in 0..vals.len() { + self.validate_memory_cell((key + i)?)?; + } + Ok(()) } }