Skip to content

Commit 28da242

Browse files
YairVaknin-starkwareStavbe
authored andcommitted
Fix_zero_offset_output_base_assumption (#2068)
1 parent 28f4004 commit 28da242

File tree

3 files changed

+69
-28
lines changed

3 files changed

+69
-28
lines changed

cairo-vm-cli/src/main.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ struct Args {
7272
#[arg(long = "prover_input_info",
7373
requires_all = ["proof_mode"])]
7474
prover_input_info: Option<String>,
75+
#[arg(long = "prover_input_info_json",
76+
requires_all = ["proof_mode"])]
77+
prover_input_info_json: Option<String>,
7578
#[arg(long = "merge_extra_segments")]
7679
merge_extra_segments: bool,
7780
#[arg(long = "allow_missing_builtins")]
@@ -175,7 +178,8 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
175178

176179
let trace_enabled = args.trace_file.is_some()
177180
|| args.air_public_input.is_some()
178-
|| args.prover_input_info.is_some();
181+
|| args.prover_input_info.is_some()
182+
|| args.prover_input_info_json.is_some();
179183

180184
let cairo_layout_params = match args.cairo_layout_params_file {
181185
Some(file) => Some(CairoLayoutParams::from_file(&file)?),
@@ -191,7 +195,8 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
191195
secure_run: args.secure_run,
192196
allow_missing_builtins: args.allow_missing_builtins,
193197
dynamic_layout_params: cairo_layout_params,
194-
disable_trace_padding: args.prover_input_info.is_some(),
198+
disable_trace_padding: args.prover_input_info.is_some()
199+
|| args.prover_input_info_json.is_some(),
195200
};
196201

197202
let mut cairo_runner = match if args.run_from_cairo_pie {
@@ -242,13 +247,22 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
242247
memory_writer.flush()?;
243248
}
244249

245-
if let Some(prover_input_info_path) = args.prover_input_info {
250+
if let Some(path) = args.prover_input_info {
251+
let prover_input_info = cairo_runner.get_prover_input_info().map_err(|error| {
252+
eprintln!("{error}");
253+
CairoRunError::Runner(error)
254+
})?;
255+
let bytes = prover_input_info.serialize()?;
256+
std::fs::write(path, bytes)?;
257+
}
258+
259+
if let Some(path) = args.prover_input_info_json {
246260
let prover_input_info = cairo_runner.get_prover_input_info().map_err(|error| {
247261
eprintln!("{error}");
248262
CairoRunError::Runner(error)
249263
})?;
250264
let json = prover_input_info.serialize_json()?;
251-
std::fs::write(prover_input_info_path, json)?;
265+
std::fs::write(path, json)?;
252266
}
253267

254268
if let Some(file_path) = args.air_public_input {

vm/src/vm/runners/builtin_runner/output.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ use crate::vm::vm_memory::memory_segments::MemorySegmentManager;
1212
#[derive(Debug, Clone, PartialEq)]
1313
pub struct OutputBuiltinState {
1414
pub base: usize,
15+
pub base_offset: usize,
1516
pub pages: Pages,
1617
pub attributes: Attributes,
1718
}
1819

1920
#[derive(Debug, Clone)]
2021
pub struct OutputBuiltinRunner {
2122
base: usize,
23+
pub base_offset: usize,
2224
pub(crate) pages: Pages,
2325
pub(crate) attributes: Attributes,
2426
pub(crate) stop_ptr: Option<usize>,
@@ -29,15 +31,17 @@ impl OutputBuiltinRunner {
2931
pub fn new(included: bool) -> OutputBuiltinRunner {
3032
OutputBuiltinRunner {
3133
base: 0,
34+
base_offset: 0,
3235
pages: HashMap::default(),
3336
attributes: HashMap::default(),
3437
stop_ptr: None,
3538
included,
3639
}
3740
}
3841

39-
pub fn new_state(&mut self, base: usize, included: bool) {
42+
pub fn new_state(&mut self, base: usize, base_offset: usize, included: bool) {
4043
self.base = base;
44+
self.base_offset = base_offset;
4145
self.pages = HashMap::default();
4246
self.attributes = HashMap::default();
4347
self.stop_ptr = None;
@@ -143,13 +147,15 @@ impl OutputBuiltinRunner {
143147

144148
pub fn set_state(&mut self, new_state: OutputBuiltinState) {
145149
self.base = new_state.base;
150+
self.base_offset = new_state.base_offset;
146151
self.pages = new_state.pages;
147152
self.attributes = new_state.attributes;
148153
}
149154

150155
pub fn get_state(&mut self) -> OutputBuiltinState {
151156
OutputBuiltinState {
152157
base: self.base,
158+
base_offset: self.base_offset,
153159
pages: self.pages.clone(),
154160
attributes: self.attributes.clone(),
155161
}
@@ -168,7 +174,7 @@ impl OutputBuiltinRunner {
168174
self.pages.insert(
169175
page_id,
170176
PublicMemoryPage {
171-
start: page_start.offset,
177+
start: page_start.offset - self.base_offset,
172178
size: page_size,
173179
},
174180
);
@@ -493,6 +499,7 @@ mod tests {
493499

494500
let new_state = OutputBuiltinState {
495501
base: 10,
502+
base_offset: 0,
496503
pages: HashMap::from([(1, PublicMemoryPage { start: 0, size: 3 })]),
497504
attributes: HashMap::from([("gps_fact_topology".to_string(), vec![0, 2, 0])]),
498505
};
@@ -510,6 +517,7 @@ mod tests {
510517
fn new_state() {
511518
let mut builtin = OutputBuiltinRunner {
512519
base: 10,
520+
base_offset: 0,
513521
pages: HashMap::from([(1, PublicMemoryPage { start: 0, size: 3 })]),
514522
attributes: HashMap::from([("gps_fact_topology".to_string(), vec![0, 2, 0])]),
515523
stop_ptr: Some(10),
@@ -518,9 +526,10 @@ mod tests {
518526

519527
let new_base = 11;
520528
let new_included = false;
521-
builtin.new_state(new_base, new_included);
529+
builtin.new_state(new_base, 2, new_included);
522530

523531
assert_eq!(builtin.base, new_base);
532+
assert_eq!(builtin.base_offset, 2);
524533
assert!(builtin.pages.is_empty());
525534
assert!(builtin.attributes.is_empty());
526535
assert_eq!(builtin.stop_ptr, None);
@@ -614,6 +623,7 @@ mod tests {
614623
fn get_and_extend_additional_data() {
615624
let builtin_a = OutputBuiltinRunner {
616625
base: 0,
626+
base_offset: 0,
617627
pages: HashMap::from([(1, PublicMemoryPage { start: 0, size: 3 })]),
618628
attributes: HashMap::from([("gps_fact_topology".to_string(), vec![0, 2, 0])]),
619629
stop_ptr: None,
@@ -622,6 +632,7 @@ mod tests {
622632
let additional_data = builtin_a.get_additional_data();
623633
let mut builtin_b = OutputBuiltinRunner {
624634
base: 0,
635+
base_offset: 0,
625636
pages: Default::default(),
626637
attributes: Default::default(),
627638
stop_ptr: None,

vm/src/vm/runners/cairo_runner.rs

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,13 +1567,19 @@ impl ProverInputInfo {
15671567
pub fn serialize_json(&self) -> Result<String, ProverInputInfoError> {
15681568
serde_json::to_string_pretty(&self).map_err(ProverInputInfoError::from)
15691569
}
1570+
pub fn serialize(&self) -> Result<Vec<u8>, ProverInputInfoError> {
1571+
bincode::serde::encode_to_vec(self, bincode::config::standard())
1572+
.map_err(|e| ProverInputInfoError::SerializationError(format!("{:?}", e)))
1573+
}
15701574
}
15711575

15721576
// TODO(Stav): add TraceNotEnabled error.
15731577
#[derive(Debug, Error)]
15741578
pub enum ProverInputInfoError {
1575-
#[error("Failed to (de)serialize data")]
1576-
Serde(#[from] serde_json::Error),
1579+
#[error("Failed to (de)serialize data using bincode")]
1580+
SerializationError(String),
1581+
#[error("Failed to (de)serialize data using json")]
1582+
SerdeJson(#[from] serde_json::Error),
15771583
}
15781584

15791585
#[derive(Clone, Debug, Eq, PartialEq)]
@@ -5699,6 +5705,16 @@ mod tests {
56995705
fn serialize_and_deserialize_prover_input_info(#[case] program_content: &[u8]) {
57005706
use crate::types::layout_name::LayoutName;
57015707

5708+
fn compare_prover_input_info(original: &ProverInputInfo, deserialized: &ProverInputInfo) {
5709+
assert_eq!(original.relocatable_memory, deserialized.relocatable_memory);
5710+
assert_eq!(original.relocatable_trace, deserialized.relocatable_trace);
5711+
assert_eq!(original.builtins_segments, deserialized.builtins_segments);
5712+
assert_eq!(
5713+
original.public_memory_offsets,
5714+
deserialized.public_memory_offsets
5715+
);
5716+
}
5717+
57025718
let config = crate::cairo_run::CairoRunConfig {
57035719
proof_mode: false,
57045720
relocate_mem: false,
@@ -5708,25 +5724,25 @@ mod tests {
57085724
};
57095725
let runner = crate::cairo_run::cairo_run(program_content, &config, &mut crate::hint_processor::builtin_hint_processor::builtin_hint_processor_definition::BuiltinHintProcessor::new_empty()).unwrap();
57105726
let prover_input_info = runner.get_prover_input_info().unwrap();
5711-
let serialized_prover_input_info = prover_input_info.serialize_json().unwrap();
5712-
let deserialized_prover_input_info: ProverInputInfo =
5713-
serde_json::from_str(&serialized_prover_input_info).unwrap();
5727+
5728+
// Using bincode.
5729+
let serialized_prover_input_info = prover_input_info.serialize().unwrap();
5730+
let (deserialized_prover_input_info, _): (ProverInputInfo, usize) =
5731+
bincode::serde::decode_from_slice(
5732+
&serialized_prover_input_info,
5733+
bincode::config::standard(),
5734+
)
5735+
.unwrap();
5736+
57145737
// Check that the deserialized prover input info is equal to the original one.
5715-
assert_eq!(
5716-
prover_input_info.relocatable_memory,
5717-
deserialized_prover_input_info.relocatable_memory
5718-
);
5719-
assert_eq!(
5720-
prover_input_info.relocatable_trace,
5721-
deserialized_prover_input_info.relocatable_trace
5722-
);
5723-
assert_eq!(
5724-
prover_input_info.builtins_segments,
5725-
deserialized_prover_input_info.builtins_segments
5726-
);
5727-
assert_eq!(
5728-
prover_input_info.public_memory_offsets,
5729-
deserialized_prover_input_info.public_memory_offsets
5730-
);
5738+
compare_prover_input_info(&prover_input_info, &deserialized_prover_input_info);
5739+
5740+
// Using json.
5741+
let serialized_prover_input_info_json = prover_input_info.serialize_json().unwrap();
5742+
let deserialized_prover_input_info_json: ProverInputInfo =
5743+
serde_json::from_str(&serialized_prover_input_info_json).unwrap();
5744+
5745+
// Check that the deserialized prover input info is equal to the original one.
5746+
compare_prover_input_info(&prover_input_info, &deserialized_prover_input_info_json);
57315747
}
57325748
}

0 commit comments

Comments
 (0)