Skip to content

Commit 33d75ca

Browse files
authored
use bincode for faster writing prover input info (#2074)
Added another flag to allow fast serialization of 'prover_input_info' into a binary file
2 parents 9c44e1c + 58174f3 commit 33d75ca

File tree

3 files changed

+50
-28
lines changed

3 files changed

+50
-28
lines changed

cairo-vm-cli/src/main.rs

+18-6
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ 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-
requires_all = ["proof_mode"])]
72+
#[arg(long = "prover_input_info", requires_all = ["proof_mode"])]
7473
prover_input_info: Option<String>,
74+
#[arg(long = "prover_input_info_json", requires_all = ["proof_mode"])]
75+
prover_input_info_json: Option<String>,
7576
#[arg(long = "merge_extra_segments")]
7677
merge_extra_segments: bool,
7778
#[arg(long = "allow_missing_builtins")]
@@ -175,7 +176,8 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
175176

176177
let trace_enabled = args.trace_file.is_some()
177178
|| args.air_public_input.is_some()
178-
|| args.prover_input_info.is_some();
179+
|| args.prover_input_info.is_some()
180+
|| args.prover_input_info_json.is_some();
179181

180182
let cairo_layout_params = match args.cairo_layout_params_file {
181183
Some(file) => Some(CairoLayoutParams::from_file(&file)?),
@@ -191,7 +193,8 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
191193
secure_run: args.secure_run,
192194
allow_missing_builtins: args.allow_missing_builtins,
193195
dynamic_layout_params: cairo_layout_params,
194-
disable_trace_padding: args.prover_input_info.is_some(),
196+
disable_trace_padding: args.prover_input_info.is_some()
197+
|| args.prover_input_info_json.is_some(),
195198
};
196199

197200
let mut cairo_runner = match if args.run_from_cairo_pie {
@@ -242,13 +245,22 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
242245
memory_writer.flush()?;
243246
}
244247

245-
if let Some(prover_input_info_path) = args.prover_input_info {
248+
if let Some(path) = args.prover_input_info {
249+
let prover_input_info = cairo_runner.get_prover_input_info().map_err(|error| {
250+
eprintln!("{error}");
251+
CairoRunError::Runner(error)
252+
})?;
253+
let bytes = prover_input_info.serialize()?;
254+
std::fs::write(path, bytes)?;
255+
}
256+
257+
if let Some(path) = args.prover_input_info_json {
246258
let prover_input_info = cairo_runner.get_prover_input_info().map_err(|error| {
247259
eprintln!("{error}");
248260
CairoRunError::Runner(error)
249261
})?;
250262
let json = prover_input_info.serialize_json()?;
251-
std::fs::write(prover_input_info_path, json)?;
263+
std::fs::write(path, json)?;
252264
}
253265

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

vm/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ num-integer = { workspace = true }
4747
serde = { workspace = true }
4848
serde_json = { workspace = true }
4949
hex = { workspace = true }
50-
bincode = { workspace = true }
50+
bincode = { workspace = true , features = ["alloc"]}
5151
starknet-crypto = { workspace = true }
5252
sha3 = { workspace = true }
5353
indoc = { workspace = true }

vm/src/vm/runners/cairo_runner.rs

+31-21
Original file line numberDiff line numberDiff line change
@@ -1551,7 +1551,7 @@ impl CairoRunner {
15511551
//* ----------------------
15521552
/// This struct contains all relevant data for the prover.
15531553
/// All addresses are relocatable.
1554-
#[derive(Deserialize, Serialize)]
1554+
#[derive(Deserialize, Serialize, PartialEq)]
15551555
pub struct ProverInputInfo {
15561556
/// A vector of trace entries, i.e. pc, ap, fp, where pc is relocatable.
15571557
pub relocatable_trace: Vec<TraceEntry>,
@@ -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(ProverInputInfoError::from)
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+
SerdeBincode(#[from] bincode::error::EncodeError),
1581+
#[error("Failed to (de)serialize data using json")]
1582+
SerdeJson(#[from] serde_json::Error),
15771583
}
15781584

15791585
#[derive(Clone, Debug, Eq, PartialEq)]
@@ -5708,25 +5714,29 @@ mod tests {
57085714
};
57095715
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();
57105716
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();
5714-
// 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
5717+
5718+
// Using bincode.
5719+
let serialized_prover_input_info = prover_input_info.serialize().unwrap();
5720+
let (deserialized_prover_input_info, _): (ProverInputInfo, usize) =
5721+
bincode::serde::decode_from_slice(
5722+
&serialized_prover_input_info,
5723+
bincode::config::standard(),
5724+
)
5725+
.unwrap();
5726+
5727+
assert!(
5728+
prover_input_info == deserialized_prover_input_info,
5729+
"Deserialized ProverInputInfo with bincode does not match the original one."
57265730
);
5727-
assert_eq!(
5728-
prover_input_info.public_memory_offsets,
5729-
deserialized_prover_input_info.public_memory_offsets
5731+
5732+
// Using json.
5733+
let serialized_prover_input_info_json = prover_input_info.serialize_json().unwrap();
5734+
let deserialized_prover_input_info_json: ProverInputInfo =
5735+
serde_json::from_str(&serialized_prover_input_info_json).unwrap();
5736+
5737+
assert!(
5738+
prover_input_info == deserialized_prover_input_info_json,
5739+
"Deserialized ProverInputInfo with json does not match the original one."
57305740
);
57315741
}
57325742
}

0 commit comments

Comments
 (0)