Skip to content

Enable_using_secure_run_in_proof_mode #2113

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 63 additions & 6 deletions vm/src/vm/runners/cairo_runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1009,18 +1009,32 @@ impl CairoRunner {
Ok(())
}

// Returns a map from builtin base's segment index to stop_ptr offset
// Aka the builtin's segment number and its maximum offset
/// Returns a tuple of builtin base's segment index and stop_ptr offset
/// Aka the builtin's segment number and its maximum offset
pub fn get_builtin_segments_info(&self) -> Result<Vec<(usize, usize)>, RunnerError> {
let proof_mode = self.is_proof_mode();
let mut builtin_segment_info = Vec::new();

for builtin in &self.vm.builtin_runners {
let (index, stop_ptr) = builtin.get_memory_segment_addresses();

builtin_segment_info.push((
index,
stop_ptr.ok_or_else(|| RunnerError::NoStopPointer(Box::new(builtin.name())))?,
));
match (proof_mode, stop_ptr) {
// Segment present (same handling in both modes).
(_, Some(sp)) => builtin_segment_info.push((index, sp)),

// If non proof-mode, only builtins in the program are present and they must
// point to a segment (so `stop_ptr` must be set). Throw an error if not.
(false, None) => {
return Err(RunnerError::NoStopPointer(Box::new(
builtin.name().to_owned(),
)));
}

// In proof‐mode there are builtin runners for all builtins in the layout, but only
// the ones that are in the program point to a segment (so `stop_ptr` is set).
// Only collect those and silently ignore the rest.
(true, None) => {}
}
}

Ok(builtin_segment_info)
Expand Down Expand Up @@ -3915,6 +3929,49 @@ mod tests {
);
}

#[test]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
fn get_builtin_segments_info_non_proof_mode() {
let program_data =
include_bytes!("../../../../cairo_programs/proof_programs/assert_nn.json");
let cairo_run_config = CairoRunConfig {
entrypoint: "main",
trace_enabled: false,
relocate_mem: false,
layout: LayoutName::small,
proof_mode: false,
secure_run: Some(true),
..Default::default()
};
let mut hint_executor = BuiltinHintProcessor::new_empty();
let runner = cairo_run(program_data, &cairo_run_config, &mut hint_executor).unwrap();
// Only the range_check builtin is used in this program, and in non-proof mode, it will
// be the first and only builtin segment initialized (and used).
assert_eq!(runner.get_builtin_segments_info(), Ok(vec![(2, 6)]));
}

#[test]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
fn get_builtin_segments_info_proof_mode() {
let program_data =
include_bytes!("../../../../cairo_programs/proof_programs/assert_nn.json");
let cairo_run_config = CairoRunConfig {
entrypoint: "main",
trace_enabled: false,
relocate_mem: false,
layout: LayoutName::small,
proof_mode: true,
secure_run: Some(true),
..Default::default()
};
let mut hint_executor = BuiltinHintProcessor::new_empty();
let runner = cairo_run(program_data, &cairo_run_config, &mut hint_executor).unwrap();
// Only the range_check builtin is used in this program, and in proof mode, it will
// be the first and only builtin segment used, but initialized after the other builtins
// in the layout.
assert_eq!(runner.get_builtin_segments_info(), Ok(vec![(4, 6)]));
}

#[test]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
fn get_execution_resources_trace_not_enabled() {
Expand Down
Loading