Skip to content

Commit 335f0b3

Browse files
feat(cli): add openvm version to STARK/EVM proof jsons (#1986)
1 parent 18f133c commit 335f0b3

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

crates/cli/src/commands/prove.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use openvm_sdk::{
77
config::{AggregationTreeConfig, SdkVmConfig},
88
fs::{encode_to_file, read_object_from_file, write_to_file_json},
99
keygen::AppProvingKey,
10-
types::VmStarkProofBytes,
10+
types::VersionedVmStarkProof,
1111
Sdk, F,
1212
};
1313

@@ -159,7 +159,7 @@ impl ProveCmd {
159159
println!("vm commit: {:?}", app_commit.app_vm_commit.to_bn254());
160160

161161
let stark_proof = prover.prove(read_to_stdin(&run_args.input)?)?;
162-
let stark_proof_bytes = VmStarkProofBytes::new(stark_proof)?;
162+
let stark_proof_bytes = VersionedVmStarkProof::new(stark_proof)?;
163163

164164
let proof_path = if let Some(proof) = proof {
165165
proof

crates/cli/src/commands/verify.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use std::path::{Path, PathBuf};
22

33
use clap::Parser;
4-
use eyre::Result;
4+
use eyre::{Context, Result};
55
use openvm_sdk::{
66
fs::{decode_from_file, read_from_file_json, read_object_from_file},
77
prover::verify_app_proof,
8-
types::VmStarkProofBytes,
9-
Sdk,
8+
types::VersionedVmStarkProof,
9+
Sdk, OPENVM_VERSION,
1010
};
1111

1212
use super::KeygenCargoArgs;
@@ -150,12 +150,18 @@ impl VerifyCmd {
150150
files[0].clone()
151151
};
152152
println!("Verifying STARK proof at {}", proof_path.display());
153-
let stark_proof_bytes: VmStarkProofBytes = read_from_file_json(proof_path)?;
154-
Sdk::verify_proof(&agg_vk, expected_app_commit, &stark_proof_bytes.try_into()?)?;
153+
let stark_proof: VersionedVmStarkProof = read_from_file_json(proof_path)
154+
.with_context(|| {
155+
format!("Proof needs to be compatible with openvm v{OPENVM_VERSION}",)
156+
})?;
157+
if stark_proof.version != format!("v{OPENVM_VERSION}") {
158+
eprintln!("Attempting to verify proof generated with openvm {}, but the verifier is on openvm v{OPENVM_VERSION}", stark_proof.version);
159+
}
160+
Sdk::verify_proof(&agg_vk, expected_app_commit, &stark_proof.try_into()?)?;
155161
}
156162
#[cfg(feature = "evm-verify")]
157163
VerifySubCommand::Evm { proof } => {
158-
use openvm_sdk::fs::read_evm_halo2_verifier_from_folder;
164+
use openvm_sdk::{fs::read_evm_halo2_verifier_from_folder, types::EvmProof};
159165

160166
let evm_verifier =
161167
read_evm_halo2_verifier_from_folder(default_evm_halo2_verifier_path())
@@ -178,7 +184,12 @@ impl VerifyCmd {
178184
};
179185
// The app config used here doesn't matter, it is ignored in verification
180186
println!("Verifying EVM proof at {}", proof_path.display());
181-
let evm_proof = read_from_file_json(proof_path)?;
187+
let evm_proof: EvmProof = read_from_file_json(proof_path).with_context(|| {
188+
format!("Proof needs to be compatible with openvm v{OPENVM_VERSION}",)
189+
})?;
190+
if evm_proof.version != format!("v{OPENVM_VERSION}") {
191+
eprintln!("Attempting to verify proof generated with openvm {}, but the verifier is on openvm v{OPENVM_VERSION}", evm_proof.version);
192+
}
182193
Sdk::verify_evm_halo2_proof(&evm_verifier, evm_proof)?;
183194
}
184195
}

crates/sdk/src/types.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ use {
1818
thiserror::Error,
1919
};
2020

21-
use crate::codec::{decode_vec, encode_slice, Decode, Encode};
21+
use crate::{
22+
codec::{decode_vec, encode_slice, Decode, Encode},
23+
OPENVM_VERSION,
24+
};
2225

2326
/// Number of bytes in a Bn254Fr.
2427
pub(crate) const BN254_BYTES: usize = 32;
@@ -72,6 +75,9 @@ pub struct ProofData {
7275
#[serde_as]
7376
#[derive(Clone, Debug, Deserialize, Serialize)]
7477
pub struct EvmProof {
78+
/// The openvm major and minor version v{}.{}. The proof format will not change on patch
79+
/// versions.
80+
pub version: String,
7581
#[serde(flatten)]
7682
/// Bn254Fr public value app commits.
7783
pub app_commit: AppExecutionCommit,
@@ -108,6 +114,7 @@ impl EvmProof {
108114
user_public_values,
109115
app_commit,
110116
proof_data,
117+
version: _,
111118
} = self;
112119

113120
let ProofData { accumulator, proof } = proof_data;
@@ -171,6 +178,7 @@ impl TryFrom<RawEvmProof> for EvmProof {
171178
};
172179

173180
Ok(Self {
181+
version: format!("v{}", OPENVM_VERSION),
174182
app_commit,
175183
user_public_values,
176184
proof_data: ProofData {
@@ -189,6 +197,7 @@ impl TryFrom<EvmProof> for RawEvmProof {
189197
mut app_commit,
190198
user_public_values,
191199
proof_data,
200+
version: _,
192201
} = evm_openvm_proof;
193202

194203
app_commit.app_exe_commit.reverse();
@@ -238,28 +247,32 @@ impl TryFrom<EvmProof> for RawEvmProof {
238247
/// Struct purely for encoding and decoding of [VmStarkProof].
239248
#[serde_as]
240249
#[derive(Clone, Debug, Deserialize, Serialize)]
241-
pub struct VmStarkProofBytes {
250+
pub struct VersionedVmStarkProof {
251+
/// The openvm major and minor version v{}.{}. The proof format will not change on patch
252+
/// versions.
253+
pub version: String,
242254
#[serde_as(as = "serde_with::hex::Hex")]
243255
pub user_public_values: Vec<u8>,
244256
#[serde_as(as = "serde_with::hex::Hex")]
245257
pub proof: Vec<u8>,
246258
}
247259

248-
impl VmStarkProofBytes {
260+
impl VersionedVmStarkProof {
249261
pub fn new(proof: VmStarkProof<SC>) -> Result<Self> {
250262
let mut user_public_values = Vec::new();
251263
encode_slice(&proof.user_public_values, &mut user_public_values)?;
252264
Ok(Self {
265+
version: format!("v{}", OPENVM_VERSION),
253266
user_public_values,
254267
proof: proof.inner.encode_to_vec()?,
255268
})
256269
}
257270
}
258271

259-
impl TryFrom<VmStarkProofBytes> for VmStarkProof<SC> {
272+
impl TryFrom<VersionedVmStarkProof> for VmStarkProof<SC> {
260273
type Error = std::io::Error;
261-
fn try_from(proof: VmStarkProofBytes) -> Result<Self, std::io::Error> {
262-
let VmStarkProofBytes {
274+
fn try_from(proof: VersionedVmStarkProof) -> Result<Self, std::io::Error> {
275+
let VersionedVmStarkProof {
263276
proof,
264277
user_public_values,
265278
..

0 commit comments

Comments
 (0)