diff --git a/Cargo.lock b/Cargo.lock index 81c7ead2892..d6dd334c4c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4781,8 +4781,8 @@ dependencies = [ [[package]] name = "cairo-program-runner-lib" -version = "1.1.0" -source = "git+https://github.com/starkware-libs/proving-utils?rev=580135e#580135ebc86cd4ece92e44e78e54e49e22bec323" +version = "1.2.2" +source = "git+https://github.com/starkware-libs/proving-utils?rev=19727da#19727da6951e2c9c26fdc302274a94733dfc78a6" dependencies = [ "anyhow", "cairo-lang-casm", @@ -10221,10 +10221,40 @@ dependencies = [ "zstd", ] +[[package]] +name = "privacy-circuit-verify" +version = "1.2.2" +source = "git+https://github.com/starkware-libs/proving-utils?rev=19727da#19727da6951e2c9c26fdc302274a94733dfc78a6" +dependencies = [ + "anyhow", + "cairo-air", + "cairo-vm", + "circuit-air", + "circuit-cairo-air", + "circuit-common", + "circuit-serialize", + "circuits", + "circuits-stark-verifier", + "clap", + "itertools 0.12.1", + "log", + "num-traits", + "serde", + "serde_json", + "sonic-rs", + "starknet-ff", + "starknet-types-core", + "stwo", + "stwo-cairo-common", + "stwo-cairo-serialize", + "tracing", + "zstd", +] + [[package]] name = "privacy-prove" -version = "1.1.0" -source = "git+https://github.com/starkware-libs/proving-utils?rev=580135e#580135ebc86cd4ece92e44e78e54e49e22bec323" +version = "1.2.2" +source = "git+https://github.com/starkware-libs/proving-utils?rev=19727da#19727da6951e2c9c26fdc302274a94733dfc78a6" dependencies = [ "anyhow", "cairo-air", @@ -10240,7 +10270,7 @@ dependencies = [ "clap", "itertools 0.12.1", "log", - "privacy-circuit-verify", + "privacy-circuit-verify 1.2.2", "serde", "serde_json", "sonic-rs", @@ -12793,7 +12823,8 @@ name = "starknet_proof_verifier" version = "0.0.0" dependencies = [ "apollo_sizeof", - "privacy-circuit-verify", + "privacy-circuit-verify 1.1.0", + "privacy-circuit-verify 1.2.2", "rstest", "serde", "starknet-types-core", @@ -12827,7 +12858,7 @@ dependencies = [ "jsonrpsee", "jsonschema", "mockito", - "privacy-circuit-verify", + "privacy-circuit-verify 1.2.2", "privacy-prove", "reqwest 0.12.24", "rstest", diff --git a/Cargo.toml b/Cargo.toml index 2af8bfdf770..d0a755fa66f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -334,8 +334,9 @@ paste = "1.0.15" phf = "0.11" pretty_assertions = "1.4.0" primitive-types = "0.12.1" -privacy-circuit-verify = { git = "https://github.com/starkware-libs/proving-utils", rev = "580135e" } -privacy-prove = { git = "https://github.com/starkware-libs/proving-utils", rev = "580135e" } +privacy-circuit-verify = { git = "https://github.com/starkware-libs/proving-utils", rev = "19727da" } +privacy-circuit-verify-v0 = { package = "privacy-circuit-verify", git = "https://github.com/starkware-libs/proving-utils", rev = "580135e" } +privacy-prove = { git = "https://github.com/starkware-libs/proving-utils", rev = "19727da" } proc-macro2 = "1.0" prometheus-parse = "0.2.4" prost = "0.12.1" diff --git a/crates/apollo_transaction_converter/resources/example_proof.bin b/crates/apollo_transaction_converter/resources/example_proof.bin index f4603197a9a..499c6da6bbe 100644 Binary files a/crates/apollo_transaction_converter/resources/example_proof.bin and b/crates/apollo_transaction_converter/resources/example_proof.bin differ diff --git a/crates/starknet_proof_verifier/Cargo.toml b/crates/starknet_proof_verifier/Cargo.toml index aa8bab882d2..036cad7bd41 100644 --- a/crates/starknet_proof_verifier/Cargo.toml +++ b/crates/starknet_proof_verifier/Cargo.toml @@ -12,6 +12,7 @@ workspace = true [dependencies] apollo_sizeof.workspace = true privacy-circuit-verify.workspace = true +privacy-circuit-verify-v0.workspace = true serde = { workspace = true, features = ["derive"] } starknet-types-core.workspace = true starknet_api.workspace = true diff --git a/crates/starknet_proof_verifier/resources/regression_test/0.14.3/example_proof.bin b/crates/starknet_proof_verifier/resources/regression_test/0.14.3/example_proof.bin index f4603197a9a..499c6da6bbe 100644 Binary files a/crates/starknet_proof_verifier/resources/regression_test/0.14.3/example_proof.bin and b/crates/starknet_proof_verifier/resources/regression_test/0.14.3/example_proof.bin differ diff --git a/crates/starknet_proof_verifier/src/proof_verifier.rs b/crates/starknet_proof_verifier/src/proof_verifier.rs index d664540ea56..78ab3daa070 100644 --- a/crates/starknet_proof_verifier/src/proof_verifier.rs +++ b/crates/starknet_proof_verifier/src/proof_verifier.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use apollo_sizeof::SizeOf; -use privacy_circuit_verify::{verify_recursive_circuit, PrivacyProofOutput}; use serde::{Deserialize, Serialize}; use starknet_api::transaction::fields::{Proof, ProofFacts, ProofVersion}; use starknet_types_core::felt::Felt; @@ -124,9 +123,9 @@ pub fn reconstruct_output_preimage( /// Verifies a submitted proof against the proof facts using the circuit verifier. /// -/// Accepts either V0 (legacy) or V1 (current) proof versions. Both currently resolve to the same -/// upstream circuit revision. When the V1 circuit revision is bumped, V0 verification should be -/// routed to a `privacy-circuit-verify-legacy` alias pinned to the old revision. +/// Dispatches on the first element of `proof_facts`: +/// - V0 → `privacy-circuit-verify-v0` (pinned to the previous upstream revision). +/// - V1 → `privacy-circuit-verify` (current upstream revision). pub fn verify_proof(proof_facts: ProofFacts, proof: Proof) -> Result<(), VerifyProofError> { // Reject empty proof payloads before running the verifier. if proof.is_empty() { @@ -134,15 +133,29 @@ pub fn verify_proof(proof_facts: ProofFacts, proof: Proof) -> Result<(), VerifyP } let proof_version_felt = proof_facts.0.first().copied().unwrap_or_default(); - let _proof_version = ProofVersion::try_from(proof_version_felt) + let proof_version = ProofVersion::try_from(proof_version_felt) .map_err(|()| VerifyProofError::InvalidProofVersion { actual: proof_version_felt })?; - // Reconstruct the output preimage from proof facts and verify the proof. let output_preimage = reconstruct_output_preimage(&proof_facts)?; // TODO(Avi): Avoid cloning the proof. - let proof_output = PrivacyProofOutput { proof: proof.0.to_vec(), output_preimage }; - verify_recursive_circuit(&proof_output) - .map_err(|e| VerifyProofError::Verification(e.to_string()))?; + let proof_bytes = proof.0.to_vec(); + + match proof_version { + ProofVersion::V0 => { + let proof_output = privacy_circuit_verify_v0::PrivacyProofOutput { + proof: proof_bytes, + output_preimage, + }; + privacy_circuit_verify_v0::verify_recursive_circuit(&proof_output) + .map_err(|e| VerifyProofError::Verification(e.to_string()))?; + } + ProofVersion::V1 => { + let proof_output = + privacy_circuit_verify::PrivacyProofOutput { proof: proof_bytes, output_preimage }; + privacy_circuit_verify::verify_recursive_circuit(&proof_output) + .map_err(|e| VerifyProofError::Verification(e.to_string()))?; + } + } Ok(()) }