Skip to content

Commit b9330cd

Browse files
authored
Stav/add prover input info flag (#2047)
2 parents 895be71 + d729b9f commit b9330cd

File tree

2 files changed

+77
-2
lines changed

2 files changed

+77
-2
lines changed

cairo-vm-cli/src/main.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use cairo_vm::vm::errors::vm_errors::VirtualMachineError;
1414
use cairo_vm::vm::runners::cairo_pie::CairoPie;
1515
#[cfg(feature = "with_tracer")]
1616
use cairo_vm::vm::runners::cairo_runner::CairoRunner;
17-
use cairo_vm::vm::runners::cairo_runner::RunResources;
17+
use cairo_vm::vm::runners::cairo_runner::{ProverInputInfoError, RunResources};
1818
#[cfg(feature = "with_tracer")]
1919
use cairo_vm_tracer::error::trace_data_errors::TraceDataError;
2020
#[cfg(feature = "with_tracer")]
@@ -69,6 +69,8 @@ struct Args {
6969
conflicts_with_all = ["proof_mode", "air_private_input", "air_public_input"]
7070
)]
7171
cairo_pie_output: Option<String>,
72+
#[arg(long = "prover_input_info")]
73+
prover_input_info: Option<String>,
7274
#[arg(long = "merge_extra_segments")]
7375
merge_extra_segments: bool,
7476
#[arg(long = "allow_missing_builtins")]
@@ -102,6 +104,8 @@ enum Error {
102104
#[error(transparent)]
103105
PublicInput(#[from] PublicInputError),
104106
#[error(transparent)]
107+
ProveInputInfo(#[from] ProverInputInfoError),
108+
#[error(transparent)]
105109
#[cfg(feature = "with_tracer")]
106110
TraceData(#[from] TraceDataError),
107111
}
@@ -168,7 +172,9 @@ fn start_tracer(cairo_runner: &CairoRunner) -> Result<(), TraceDataError> {
168172
fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
169173
let args = Args::try_parse_from(args)?;
170174

171-
let trace_enabled = args.trace_file.is_some() || args.air_public_input.is_some();
175+
let trace_enabled = args.trace_file.is_some()
176+
|| args.air_public_input.is_some()
177+
|| args.prover_input_info.is_some();
172178

173179
let cairo_layout_params = match args.cairo_layout_params_file {
174180
Some(file) => Some(CairoLayoutParams::from_file(&file)?),
@@ -235,6 +241,15 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
235241
memory_writer.flush()?;
236242
}
237243

244+
if let Some(prover_input_info_path) = args.prover_input_info {
245+
let prover_input_info = cairo_runner.get_prover_input_info().map_err(|error| {
246+
eprintln!("{error}");
247+
CairoRunError::Runner(error)
248+
})?;
249+
let json = prover_input_info.serialize_json()?;
250+
std::fs::write(prover_input_info_path, json)?;
251+
}
252+
238253
if let Some(file_path) = args.air_public_input {
239254
let json = cairo_runner.get_air_public_input()?.serialize_json()?;
240255
std::fs::write(file_path, json)?;
@@ -358,6 +373,7 @@ mod tests {
358373
#[values(false, true)] air_public_input: bool,
359374
#[values(false, true)] air_private_input: bool,
360375
#[values(false, true)] cairo_pie_output: bool,
376+
#[values(false, true)] prover_input_info: bool,
361377
) {
362378
let mut args = vec!["cairo-vm-cli".to_string()];
363379
if let Some(layout) = layout {
@@ -388,6 +404,9 @@ mod tests {
388404
if print_output {
389405
args.extend_from_slice(&["--print_output".to_string()]);
390406
}
407+
if prover_input_info {
408+
args.extend_from_slice(&["--prover_input_info".to_string(), "/dev/null".to_string()]);
409+
}
391410

392411
args.push("../cairo_programs/proof_programs/fibonacci.json".to_string());
393412
if air_public_input && !proof_mode

vm/src/vm/runners/cairo_runner.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ use crate::{
4848
use num_integer::div_rem;
4949
use num_traits::{ToPrimitive, Zero};
5050
use serde::{Deserialize, Serialize};
51+
use thiserror::Error;
5152

5253
use super::{builtin_runner::ModBuiltinRunner, cairo_pie::CairoPieAdditionalData};
5354
use super::{
@@ -1542,6 +1543,7 @@ impl CairoRunner {
15421543
}
15431544
}
15441545

1546+
// TODO(Stav): move to specified file.
15451547
//* ----------------------
15461548
//* ProverInputInfo
15471549
//* ----------------------
@@ -1559,6 +1561,19 @@ pub struct ProverInputInfo {
15591561
pub builtins_segments: BTreeMap<usize, BuiltinName>,
15601562
}
15611563

1564+
impl ProverInputInfo {
1565+
pub fn serialize_json(&self) -> Result<String, ProverInputInfoError> {
1566+
serde_json::to_string_pretty(&self).map_err(ProverInputInfoError::from)
1567+
}
1568+
}
1569+
1570+
// TODO(Stav): add TraceNotEnabled error.
1571+
#[derive(Debug, Error)]
1572+
pub enum ProverInputInfoError {
1573+
#[error("Failed to (de)serialize data")]
1574+
Serde(#[from] serde_json::Error),
1575+
}
1576+
15621577
#[derive(Clone, Debug, Eq, PartialEq)]
15631578
pub struct SegmentInfo {
15641579
pub index: isize,
@@ -1666,6 +1681,7 @@ mod tests {
16661681
use crate::types::instance_definitions::bitwise_instance_def::CELLS_PER_BITWISE;
16671682
use crate::types::instance_definitions::keccak_instance_def::CELLS_PER_KECCAK;
16681683
use crate::vm::vm_memory::memory::MemoryCell;
1684+
use rstest::rstest;
16691685

16701686
use crate::felt_hex;
16711687
use crate::{
@@ -5671,4 +5687,44 @@ mod tests {
56715687
assert!(prover_input.relocatable_memory[6].len() as u32 % CELLS_PER_BITWISE == 0);
56725688
assert!(cairo_runner.vm.segments.memory.data[8].len() as u32 % CELLS_PER_KECCAK == 0);
56735689
}
5690+
5691+
#[rstest]
5692+
#[case(include_bytes!("../../../../cairo_programs/proof_programs/fibonacci.json"))]
5693+
#[case(include_bytes!("../../../../cairo_programs/proof_programs/bitwise_output.json"))]
5694+
#[case(include_bytes!("../../../../cairo_programs/proof_programs/poseidon_builtin.json"))]
5695+
#[case(include_bytes!("../../../../cairo_programs/proof_programs/relocate_temporary_segment_append.json"))]
5696+
#[case(include_bytes!("../../../../cairo_programs/proof_programs/pedersen_test.json"))]
5697+
fn serialize_and_deserialize_prover_input_info(#[case] program_content: &[u8]) {
5698+
use crate::types::layout_name::LayoutName;
5699+
5700+
let config = crate::cairo_run::CairoRunConfig {
5701+
proof_mode: false,
5702+
relocate_mem: false,
5703+
trace_enabled: true,
5704+
layout: LayoutName::all_cairo_stwo,
5705+
..Default::default()
5706+
};
5707+
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();
5708+
let prover_input_info = runner.get_prover_input_info().unwrap();
5709+
let serialized_prover_input_info = prover_input_info.serialize_json().unwrap();
5710+
let deserialized_prover_input_info: ProverInputInfo =
5711+
serde_json::from_str(&serialized_prover_input_info).unwrap();
5712+
// Check that the deserialized prover input info is equal to the original one.
5713+
assert_eq!(
5714+
prover_input_info.relocatable_memory,
5715+
deserialized_prover_input_info.relocatable_memory
5716+
);
5717+
assert_eq!(
5718+
prover_input_info.relocatable_trace,
5719+
deserialized_prover_input_info.relocatable_trace
5720+
);
5721+
assert_eq!(
5722+
prover_input_info.builtins_segments,
5723+
deserialized_prover_input_info.builtins_segments
5724+
);
5725+
assert_eq!(
5726+
prover_input_info.public_memory_offsets,
5727+
deserialized_prover_input_info.public_memory_offsets
5728+
);
5729+
}
56745730
}

0 commit comments

Comments
 (0)