Skip to content

Commit e3a7f53

Browse files
Merge branch 'main' into wasm-cairo1
2 parents d249eb6 + ed31170 commit e3a7f53

File tree

8 files changed

+43
-18
lines changed

8 files changed

+43
-18
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44

55
* chore: make cairo 1.0 compatible with wasm [#1830](https://github.com/lambdaclass/cairo-vm/pull/1830)
66

7+
* fix: Added the following VM fixes: [#1820](https://github.com/lambdaclass/cairo-vm/pull/1820)
8+
* Fix zero segment location.
9+
* Fix has_zero_segment naming.
10+
* Fix prover input.
11+
* Fix version reading when no version is supplied.
12+
713
* chore: bump `cairo-lang-` dependencies to 2.7.1 [#1823](https://github.com/lambdaclass/cairo-vm/pull/1823)
814

915
#### [1.0.1] - 2024-08-12

vm/src/air_private_input.rs

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ pub struct AirPrivateInputSerializable {
1919
#[serde(skip_serializing_if = "Option::is_none")]
2020
range_check: Option<Vec<PrivateInput>>,
2121
#[serde(skip_serializing_if = "Option::is_none")]
22+
range_check96: Option<Vec<PrivateInput>>,
23+
#[serde(skip_serializing_if = "Option::is_none")]
2224
ecdsa: Option<Vec<PrivateInput>>,
2325
#[serde(skip_serializing_if = "Option::is_none")]
2426
bitwise: Option<Vec<PrivateInput>>,
@@ -157,6 +159,7 @@ impl AirPrivateInput {
157159
memory_path,
158160
pedersen: self.0.get(&BuiltinName::pedersen).cloned(),
159161
range_check: self.0.get(&BuiltinName::range_check).cloned(),
162+
range_check96: self.0.get(&BuiltinName::range_check96).cloned(),
160163
ecdsa: self.0.get(&BuiltinName::ecdsa).cloned(),
161164
bitwise: self.0.get(&BuiltinName::bitwise).cloned(),
162165
ec_op: self.0.get(&BuiltinName::ec_op).cloned(),
@@ -230,6 +233,10 @@ mod tests {
230233
index: 10000,
231234
value: Felt252::from(8000),
232235
})]),
236+
range_check96: Some(vec![PrivateInput::Value(PrivateInputValue {
237+
index: 10000,
238+
value: Felt252::from(8000),
239+
})]),
233240
ecdsa: Some(vec![PrivateInput::Signature(PrivateInputSignature {
234241
index: 0,
235242
pubkey: Felt252::from(123),

vm/src/cairo_run.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ pub fn cairo_run_pie(
173173
}
174174
}
175175
// Load previous execution memory
176-
let n_extra_segments = pie.metadata.extra_segments.len();
176+
let has_zero_segment = cairo_runner.vm.segments.has_zero_segment() as usize;
177+
let n_extra_segments = pie.metadata.extra_segments.len() - has_zero_segment;
177178
cairo_runner
178179
.vm
179180
.segments

vm/src/vm/runners/builtin_runner/modulo.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ impl ModBuiltinRunner {
118118

119119
pub fn initialize_segments(&mut self, segments: &mut MemorySegmentManager) {
120120
self.base = segments.add().segment_index as usize; // segments.add() always returns a positive index
121-
self.zero_segment_index = segments.add_zero_segment(self.zero_segment_size)
121+
}
122+
123+
pub fn initialize_zero_segment(&mut self, segments: &mut MemorySegmentManager) {
124+
self.zero_segment_index = segments.add_zero_segment(self.zero_segment_size);
122125
}
123126

124127
pub fn initial_stack(&self) -> Vec<MaybeRelocatable> {
@@ -677,17 +680,16 @@ fn apply_op(lhs: &BigUint, rhs: &BigUint, op: &Operation) -> Result<BigUint, Mat
677680

678681
#[cfg(test)]
679682
mod tests {
680-
681683
#[test]
682684
#[cfg(feature = "mod_builtin")]
683-
fn test_air_private_input_small_batch_size() {
685+
fn test_air_private_input_all_cairo() {
684686
use super::*;
685687
use crate::{
686688
air_private_input::{ModInput, ModInputInstance, ModInputMemoryVars, PrivateInput},
687689
hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor,
688690
types::layout_name::LayoutName,
689691
utils::test_utils::Program,
690-
vm::runners::{builtin_runner::BuiltinRunner, cairo_runner::CairoRunner},
692+
vm::runners::cairo_runner::CairoRunner,
691693
Felt252,
692694
};
693695

@@ -701,18 +703,14 @@ mod tests {
701703

702704
let end = runner.initialize(false).unwrap();
703705
// Modify add_mod & mul_mod params
704-
for runner in runner.vm.get_builtin_runners_as_mut() {
705-
if let BuiltinRunner::Mod(runner) = runner {
706-
runner.override_layout_params(1, 3)
707-
}
708-
}
709706

710707
runner.run_until_pc(end, &mut hint_processor).unwrap();
711708
runner.run_for_steps(1, &mut hint_processor).unwrap();
712709
runner.end_run(false, false, &mut hint_processor).unwrap();
713710
runner.read_return_values(false).unwrap();
714711
runner.finalize_segments().unwrap();
715712

713+
// We compare against the execution of python cairo-run with the same layout
716714
let air_private_input = runner.get_air_private_input();
717715
assert_eq!(
718716
air_private_input.0.get(&BuiltinName::add_mod).unwrap()[0],
@@ -779,7 +777,7 @@ mod tests {
779777
),])
780778
}
781779
],
782-
zero_value_address: 22123
780+
zero_value_address: 23019
783781
})
784782
);
785783
assert_eq!(
@@ -877,7 +875,7 @@ mod tests {
877875
),])
878876
}
879877
],
880-
zero_value_address: 22123
878+
zero_value_address: 23019
881879
})
882880
)
883881
}

vm/src/vm/runners/builtin_runner/signature.rs

-1
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,6 @@ impl SignatureBuiltinRunner {
220220
private_inputs.push(PrivateInput::Signature(PrivateInputSignature {
221221
index: addr
222222
.offset
223-
.saturating_sub(self.base)
224223
.checked_div(CELLS_PER_SIGNATURE as usize)
225224
.unwrap_or_default(),
226225
pubkey: *pubkey,

vm/src/vm/runners/cairo_pie.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,13 @@ impl CairoPie {
322322
) -> Result<CairoPie, std::io::Error> {
323323
use std::io::Read;
324324

325-
let reader = std::io::BufReader::new(zip_reader.by_name("version.json")?);
326-
let version: CairoPieVersion = serde_json::from_reader(reader)?;
325+
let version = match zip_reader.by_name("version.json") {
326+
Ok(version_buffer) => {
327+
let reader = std::io::BufReader::new(version_buffer);
328+
serde_json::from_reader(reader)?
329+
}
330+
Err(_) => CairoPieVersion { cairo_pie: () },
331+
};
327332

328333
let reader = std::io::BufReader::new(zip_reader.by_name("metadata.json")?);
329334
let metadata: CairoPieMetadata = serde_json::from_reader(reader)?;

vm/src/vm/runners/cairo_runner.rs

+5
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,11 @@ impl CairoRunner {
234234
self.initialize_builtins(allow_missing_builtins)?;
235235
self.initialize_segments(None);
236236
let end = self.initialize_main_entrypoint()?;
237+
for builtin_runner in self.vm.builtin_runners.iter_mut() {
238+
if let BuiltinRunner::Mod(runner) = builtin_runner {
239+
runner.initialize_zero_segment(&mut self.vm.segments);
240+
}
241+
}
237242
self.initialize_vm()?;
238243
Ok(end)
239244
}

vm/src/vm/vm_memory/memory_segments.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ impl MemorySegmentManager {
217217
}
218218
let accessed_amount =
219219
// Instead of marking the values in the zero segment until zero_segment_size as accessed we use zero_segment_size as accessed_amount
220-
if !self.zero_segment_index.is_zero() && i == self.zero_segment_index {
220+
if self.has_zero_segment() && i == self.zero_segment_index {
221221
self.zero_segment_size
222222
} else {
223223
match self.memory.get_amount_of_accessed_addresses_for_segment(i) {
@@ -278,11 +278,15 @@ impl MemorySegmentManager {
278278
.insert(segment_index, public_memory.cloned().unwrap_or_default());
279279
}
280280

281+
pub fn has_zero_segment(&self) -> bool {
282+
!self.zero_segment_index.is_zero()
283+
}
284+
281285
// Creates the zero segment if it wasn't previously created
282286
// Fills the segment with the value 0 until size is reached
283287
// Returns the index of the zero segment
284288
pub(crate) fn add_zero_segment(&mut self, size: usize) -> usize {
285-
if self.zero_segment_index.is_zero() {
289+
if !self.has_zero_segment() {
286290
self.zero_segment_index = self.add().segment_index as usize;
287291
}
288292

@@ -298,7 +302,7 @@ impl MemorySegmentManager {
298302

299303
// Finalizes the zero segment and clears it's tracking data from the manager
300304
pub(crate) fn finalize_zero_segment(&mut self) {
301-
if !self.zero_segment_index.is_zero() {
305+
if self.has_zero_segment() {
302306
self.finalize(Some(self.zero_segment_size), self.zero_segment_index, None);
303307
self.zero_segment_index = 0;
304308
self.zero_segment_size = 0;

0 commit comments

Comments
 (0)