diff --git a/stwo_cairo_prover/crates/cairo-air/src/air.rs b/stwo_cairo_prover/crates/cairo-air/src/air.rs index d8843d4ac..213f0aacc 100644 --- a/stwo_cairo_prover/crates/cairo-air/src/air.rs +++ b/stwo_cairo_prover/crates/cairo-air/src/air.rs @@ -61,9 +61,25 @@ where stark_proof, channel_salt, } = self; + + assert_eq!(output.len(), 0); + + output.push(0_u32.into()); CairoSerialize::serialize(claim, output); + + for item in output.iter() { + let bytes = item.to_bytes_be(); + for byte in bytes.iter().rev().skip(4){ + assert_eq!(*byte, 0); + } + } + output[0] = (output.len() -1).into(); CairoSerialize::serialize(interaction_pow, output); CairoSerialize::serialize(interaction_claim, output); + + + + CairoSerialize::serialize(stark_proof, output); CairoSerialize::serialize(channel_salt, output); } diff --git a/stwo_cairo_prover/test_data/test_prove_verify_all_opcode_components/proof.json b/stwo_cairo_prover/test_data/test_prove_verify_all_opcode_components/proof.json index fa57c1b1e..8942cbf00 100644 --- a/stwo_cairo_prover/test_data/test_prove_verify_all_opcode_components/proof.json +++ b/stwo_cairo_prover/test_data/test_prove_verify_all_opcode_components/proof.json @@ -1,4 +1,5 @@ [ + "0x2f4d", "0x535", "0x0", "0x7fff7fff", diff --git a/stwo_cairo_verifier/crates/cairo_air/src/lib.cairo b/stwo_cairo_verifier/crates/cairo_air/src/lib.cairo index 638062f91..92fa737e3 100644 --- a/stwo_cairo_verifier/crates/cairo_air/src/lib.cairo +++ b/stwo_cairo_verifier/crates/cairo_air/src/lib.cairo @@ -1,3 +1,4 @@ +use cairo_air::CairoClaim; use components::memory_address_to_id::{ InteractionClaimImpl as MemoryAddressToIdInteractionClaimImpl, LOG_MEMORY_ADDRESS_TO_ID_SPLIT, }; @@ -127,7 +128,7 @@ type RelationUse = (felt252, u32); #[derive(Drop, Serde)] pub struct CairoProof { - pub claim: CairoClaim, + pub serialized_claim: Span, pub interaction_pow: u64, pub interaction_claim: CairoInteractionClaim, pub stark_proof: StarkProof, @@ -151,15 +152,15 @@ pub struct VerificationOutput { /// Given a proof, returns the output of the verifier. #[cfg(not(or(feature: "blake_outputs_packing", feature: "poseidon_outputs_packing")))] -pub fn get_verification_output(proof: @CairoProof) -> VerificationOutput { +pub fn get_verification_output(claim: @CairoClaim) -> VerificationOutput { // Note: the blake hash yields a 256-bit integer, the given program hash is taken modulo the // f252 prime to yield a felt. let program_hash = construct_f252( - encode_and_hash_program_memory_section(*proof.claim.public_data.public_memory.program), + encode_and_hash_program_memory_section(*claim.public_data.public_memory.program), ); let mut output = array![]; - for entry in proof.claim.public_data.public_memory.output { + for entry in claim.public_data.public_memory.output { let (_, val) = entry; output.append(construct_f252(BoxTrait::new(*val))); } @@ -182,8 +183,11 @@ pub fn get_verification_output(proof: @CairoProof) -> VerificationOutput { VerificationOutput { program_hash, output_hash } } -pub fn verify_cairo(proof: CairoProof) { - let CairoProof { claim, interaction_pow, interaction_claim, stark_proof, channel_salt } = proof; +pub fn verify_cairo(proof: CairoProof) -> VerificationOutput { + let CairoProof { mut serialized_claim, interaction_pow, interaction_claim, stark_proof, channel_salt } = proof; + + let claim: CairoClaim = Serde::deserialize(ref serialized_claim).unwrap(); + assert!(serialized_claim.is_empty()); // Verify. let pcs_config = stark_proof.commitment_scheme_proof.config; @@ -246,6 +250,8 @@ pub fn verify_cairo(proof: CairoProof) { // The maximal constraint degree is 2, so the degree bound for the cairo air is the degree bound // of the trace plus 1. let cairo_air_log_degree_bound = trace_log_size - pcs_config.fri_config.log_blowup_factor + 1; + + let cairo_air = CairoAirNewImpl::new( @claim, @interaction_elements, @interaction_claim, cairo_air_log_degree_bound, ); @@ -257,6 +263,8 @@ pub fn verify_cairo(proof: CairoProof) { SECURITY_BITS, composition_commitment, ); + + get_verification_output(@claim) } diff --git a/stwo_cairo_verifier/crates/cairo_verifier/src/lib.cairo b/stwo_cairo_verifier/crates/cairo_verifier/src/lib.cairo index 06bfbf0a4..197bc27ea 100644 --- a/stwo_cairo_verifier/crates/cairo_verifier/src/lib.cairo +++ b/stwo_cairo_verifier/crates/cairo_verifier/src/lib.cairo @@ -1,10 +1,9 @@ -use stwo_cairo_air::{CairoProof, VerificationOutput, get_verification_output, verify_cairo}; +use stwo_cairo_air::{CairoProof, VerificationOutput, verify_cairo}; #[executable] fn main(proof: CairoProof) -> VerificationOutput { - let verification_output = get_verification_output(proof: @proof); + let verification_output = verify_cairo(:proof); - verify_cairo(:proof); verification_output } diff --git a/stwo_cairo_verifier/crates/cairo_verifier_mock/src/lib.cairo b/stwo_cairo_verifier/crates/cairo_verifier_mock/src/lib.cairo index 7f2d3b297..448e9dc58 100644 --- a/stwo_cairo_verifier/crates/cairo_verifier_mock/src/lib.cairo +++ b/stwo_cairo_verifier/crates/cairo_verifier_mock/src/lib.cairo @@ -17,9 +17,9 @@ use stwo_cairo_air::{CairoProof, VerificationOutput, get_verification_output}; /// /// Note: the input JSON file should contain data that is deserialized to `CairoProof`. The data /// should be given as an array of hex numbers (felt252s) as strings. For example: ["0x7", "0x80"]. -#[executable] -fn main(proof: CairoProof) -> VerificationOutput { - // In the real verifier, here is the actual verification. Here we skip it. +// #[executable] +// fn main(proof: CairoProof) -> VerificationOutput { +// // In the real verifier, here is the actual verification. Here we skip it. - get_verification_output(proof: @proof) -} +// // get_verification_output(proof: @proof) +// }