Skip to content

Commit 26e1cd4

Browse files
committed
use postcard for faster binary serialization
1 parent 9c44e1c commit 26e1cd4

File tree

4 files changed

+139
-31
lines changed

4 files changed

+139
-31
lines changed

Cargo.lock

Lines changed: 73 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cairo-vm-cli/src/main.rs

Lines changed: 17 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,7 @@ 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() || args.prover_input_info_json.is_some(),
195199
};
196200

197201
let mut cairo_runner = match if args.run_from_cairo_pie {
@@ -242,13 +246,22 @@ fn run(args: impl Iterator<Item = String>) -> Result<(), Error> {
242246
memory_writer.flush()?;
243247
}
244248

245-
if let Some(prover_input_info_path) = args.prover_input_info {
249+
if let Some(path) = args.prover_input_info {
250+
let prover_input_info = cairo_runner.get_prover_input_info().map_err(|error| {
251+
eprintln!("{error}");
252+
CairoRunError::Runner(error)
253+
})?;
254+
let bytes = prover_input_info.serialize()?;
255+
std::fs::write(path, bytes)?;
256+
}
257+
258+
if let Some(path) = args.prover_input_info_json {
246259
let prover_input_info = cairo_runner.get_prover_input_info().map_err(|error| {
247260
eprintln!("{error}");
248261
CairoRunError::Runner(error)
249262
})?;
250263
let json = prover_input_info.serialize_json()?;
251-
std::fs::write(prover_input_info_path, json)?;
264+
std::fs::write(path, json)?;
252265
}
253266

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

vm/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ anyhow = { workspace = true }
6161
thiserror = { workspace = true }
6262
starknet-types-core = { version = "0.1.2", default-features = false, features = ["serde", "curve", "num-traits", "hash"] }
6363
rust_decimal = { version = "1.35.0", default-features = false }
64+
postcard = { version = "1.0", features = ["alloc"]}
6465

6566
# only for std
6667
num-prime = { version = "0.4.3", features = ["big-int"], optional = true }

vm/src/vm/runners/cairo_runner.rs

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,13 +1500,13 @@ impl CairoRunner {
15001500
.clone();
15011501

15021502
let relocatable_memory = self
1503-
.vm
1504-
.segments
1505-
.memory
1506-
.data
1507-
.iter()
1508-
.map(|segment| segment.iter().map(|cell| cell.get_value()).collect())
1509-
.collect();
1503+
.vm
1504+
.segments
1505+
.memory
1506+
.data
1507+
.iter()
1508+
.map(|segment| segment.iter().map(|cell| cell.get_value()).collect())
1509+
.collect();
15101510

15111511
let public_memory_offsets = self
15121512
.vm
@@ -1567,13 +1567,18 @@ 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+
postcard::to_allocvec(&self).map_err(ProverInputInfoError::from)
1572+
}
15701573
}
15711574

15721575
// TODO(Stav): add TraceNotEnabled error.
15731576
#[derive(Debug, Error)]
15741577
pub enum ProverInputInfoError {
1575-
#[error("Failed to (de)serialize data")]
1576-
Serde(#[from] serde_json::Error),
1578+
#[error("Failed to (de)serialize data using postcard")]
1579+
SerdePostcard(#[from] postcard::Error),
1580+
#[error("Failed to (de)serialize data using json")]
1581+
SerdeJson(#[from] serde_json::Error),
15771582
}
15781583

15791584
#[derive(Clone, Debug, Eq, PartialEq)]
@@ -5699,6 +5704,24 @@ mod tests {
56995704
fn serialize_and_deserialize_prover_input_info(#[case] program_content: &[u8]) {
57005705
use crate::types::layout_name::LayoutName;
57015706

5707+
fn compare_prover_input_info(
5708+
original: &ProverInputInfo,
5709+
deserialized: &ProverInputInfo,
5710+
) {
5711+
assert_eq!(
5712+
original.relocatable_memory, deserialized.relocatable_memory
5713+
);
5714+
assert_eq!(
5715+
original.relocatable_trace, deserialized.relocatable_trace
5716+
);
5717+
assert_eq!(
5718+
original.builtins_segments, deserialized.builtins_segments
5719+
);
5720+
assert_eq!(
5721+
original.public_memory_offsets, deserialized.public_memory_offsets
5722+
);
5723+
}
5724+
57025725
let config = crate::cairo_run::CairoRunConfig {
57035726
proof_mode: false,
57045727
relocate_mem: false,
@@ -5708,25 +5731,23 @@ mod tests {
57085731
};
57095732
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();
57105733
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();
5734+
5735+
// Using postcard.
5736+
let serialized_prover_input_info = prover_input_info.serialize().unwrap();
5737+
let deserialized_prover_input_info : ProverInputInfo= postcard::from_bytes(&serialized_prover_input_info).unwrap();
5738+
57145739
// 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
5740+
compare_prover_input_info(&prover_input_info, &deserialized_prover_input_info);
5741+
5742+
// Using json.
5743+
let serialized_prover_input_info_json = prover_input_info.serialize_json().unwrap();
5744+
let deserialized_prover_input_info_json: ProverInputInfo =
5745+
serde_json::from_str(&serialized_prover_input_info_json).unwrap();
5746+
5747+
// Check that the deserialized prover input info is equal to the original one.
5748+
compare_prover_input_info(
5749+
&prover_input_info,
5750+
&deserialized_prover_input_info_json,
57305751
);
57315752
}
57325753
}

0 commit comments

Comments
 (0)