From 227eca8dc65129df724b1e97eb70bd60c2ffa762 Mon Sep 17 00:00:00 2001 From: Gali Michlevich Date: Tue, 28 Jan 2025 17:47:13 +0200 Subject: [PATCH] Integrate Verify Bitwise Xor 9 --- .../crates/prover/src/cairo_air/air.rs | 41 ++++++++++++++++++- .../prover/src/cairo_air/debug_tools.rs | 13 +++++- .../prover/src/cairo_air/preprocessed.rs | 10 ++++- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/stwo_cairo_prover/crates/prover/src/cairo_air/air.rs b/stwo_cairo_prover/crates/prover/src/cairo_air/air.rs index e3c6cf57a..99f987933 100644 --- a/stwo_cairo_prover/crates/prover/src/cairo_air/air.rs +++ b/stwo_cairo_prover/crates/prover/src/cairo_air/air.rs @@ -30,7 +30,7 @@ use crate::components::memory::{memory_address_to_id, memory_id_to_big}; use crate::components::range_check_vector::{ range_check_19, range_check_4_3, range_check_7_2_5, range_check_9_9, }; -use crate::components::{range_check_11, verify_instruction}; +use crate::components::{range_check_11, verify_bitwise_xor_9, verify_instruction}; use crate::felt::split_f252; use crate::input::ProverInput; use crate::relations; @@ -67,6 +67,7 @@ pub struct CairoClaim { pub opcodes: OpcodeClaim, pub verify_instruction: verify_instruction::Claim, pub builtins: BuiltinsClaim, + pub verify_bitwise_xor_9: verify_bitwise_xor_9::Claim, pub memory_address_to_id: memory_address_to_id::Claim, pub memory_id_to_value: memory_id_to_big::Claim, pub range_check_11: range_check_11::Claim, @@ -83,6 +84,7 @@ impl CairoClaim { self.opcodes.mix_into(channel); self.verify_instruction.mix_into(channel); self.builtins.mix_into(channel); + self.verify_bitwise_xor_9.mix_into(channel); self.memory_address_to_id.mix_into(channel); self.memory_id_to_value.mix_into(channel); self.range_check_11.mix_into(channel); @@ -97,6 +99,7 @@ impl CairoClaim { self.opcodes.log_sizes(), self.verify_instruction.log_sizes(), self.builtins.log_sizes(), + self.verify_bitwise_xor_9.log_sizes(), self.memory_address_to_id.log_sizes(), self.memory_id_to_value.log_sizes(), self.range_check_11.log_sizes(), @@ -171,6 +174,7 @@ pub struct CairoClaimGenerator { // Internal components. verify_instruction_trace_generator: verify_instruction::ClaimGenerator, builtins: BuiltinsClaimGenerator, + verify_bitwise_xor_9_trace_generator: verify_bitwise_xor_9::ClaimGenerator, memory_address_to_id_trace_generator: memory_address_to_id::ClaimGenerator, memory_id_to_value_trace_generator: memory_id_to_big::ClaimGenerator, range_check_11_trace_generator: range_check_11::ClaimGenerator, @@ -188,6 +192,7 @@ impl CairoClaimGenerator { let verify_instruction_trace_generator = verify_instruction::ClaimGenerator::new(input.instruction_by_pc); let builtins = BuiltinsClaimGenerator::new(input.builtins_segments); + let verify_bitwise_xor_9_trace_generator = verify_bitwise_xor_9::ClaimGenerator::new(); let memory_address_to_id_trace_generator = memory_address_to_id::ClaimGenerator::new(&input.memory); let memory_id_to_value_trace_generator = @@ -231,6 +236,7 @@ impl CairoClaimGenerator { opcodes, verify_instruction_trace_generator, builtins, + verify_bitwise_xor_9_trace_generator, memory_address_to_id_trace_generator, memory_id_to_value_trace_generator, range_check_11_trace_generator, @@ -273,6 +279,9 @@ impl CairoClaimGenerator { &self.memory_address_to_id_trace_generator, &self.memory_id_to_value_trace_generator, ); + let (verify_bitwise_xor_9_claim, verify_bitwise_xor_9_interaction_gen) = self + .verify_bitwise_xor_9_trace_generator + .write_trace(tree_builder); let (memory_address_to_id_claim, memory_address_to_id_interaction_gen) = self .memory_address_to_id_trace_generator .write_trace(tree_builder); @@ -301,6 +310,7 @@ impl CairoClaimGenerator { opcodes: opcodes_claim, verify_instruction: verify_instruction_claim, builtins: builtins_claim, + verify_bitwise_xor_9: verify_bitwise_xor_9_claim, memory_address_to_id: memory_address_to_id_claim, memory_id_to_value: memory_id_to_value_claim, range_check_11: range_check_11_claim, @@ -313,6 +323,7 @@ impl CairoClaimGenerator { opcodes_interaction_gen, verify_instruction_interaction_gen, builtins_interaction_gen, + verify_bitwise_xor_9_interaction_gen, memory_address_to_id_interaction_gen, memory_id_to_value_interaction_gen, range_check_11_interaction_gen, @@ -329,6 +340,7 @@ pub struct CairoInteractionClaimGenerator { opcodes_interaction_gen: OpcodesInteractionClaimGenerator, verify_instruction_interaction_gen: verify_instruction::InteractionClaimGenerator, builtins_interaction_gen: BuiltinsInteractionClaimGenerator, + verify_bitwise_xor_9_interaction_gen: verify_bitwise_xor_9::InteractionClaimGenerator, memory_address_to_id_interaction_gen: memory_address_to_id::InteractionClaimGenerator, memory_id_to_value_interaction_gen: memory_id_to_big::InteractionClaimGenerator, range_check_11_interaction_gen: range_check_11::InteractionClaimGenerator, @@ -363,6 +375,9 @@ impl CairoInteractionClaimGenerator { let builtins_interaction_claims = self .builtins_interaction_gen .write_interaction_trace(tree_builder, interaction_elements); + let verify_bitwise_xor_9_interaction_claim = self + .verify_bitwise_xor_9_interaction_gen + .write_interaction_trace(tree_builder, &interaction_elements.verify_bitwise_xor_9); let memory_address_to_id_interaction_claim = self .memory_address_to_id_interaction_gen .write_interaction_trace(tree_builder, &interaction_elements.memory_address_to_id); @@ -394,6 +409,7 @@ impl CairoInteractionClaimGenerator { opcodes: opcodes_interaction_claims, verify_instruction: verify_instruction_interaction_claim, builtins: builtins_interaction_claims, + verify_bitwise_xor_9: verify_bitwise_xor_9_interaction_claim, memory_address_to_id: memory_address_to_id_interaction_claim, memory_id_to_value: memory_id_to_value_interaction_claim, range_check_11: range_check_11_interaction_claim, @@ -408,6 +424,7 @@ impl CairoInteractionClaimGenerator { pub struct CairoInteractionElements { pub opcodes: relations::Opcodes, pub verify_instruction: relations::VerifyInstruction, + pub verify_bitwise_xor_9: relations::VerifyBitwiseXor_9, pub memory_address_to_id: relations::MemoryAddressToId, pub memory_id_to_value: relations::MemoryIdToBig, pub range_check_11: relations::RangeCheck_11, @@ -422,6 +439,7 @@ impl CairoInteractionElements { CairoInteractionElements { opcodes: relations::Opcodes::draw(channel), verify_instruction: relations::VerifyInstruction::draw(channel), + verify_bitwise_xor_9: relations::VerifyBitwiseXor_9::draw(channel), memory_address_to_id: relations::MemoryAddressToId::draw(channel), memory_id_to_value: relations::MemoryIdToBig::draw(channel), range_check_11: relations::RangeCheck_11::draw(channel), @@ -438,6 +456,7 @@ pub struct CairoInteractionClaim { pub opcodes: OpcodeInteractionClaim, pub verify_instruction: verify_instruction::InteractionClaim, pub builtins: BuiltinsInteractionClaim, + pub verify_bitwise_xor_9: verify_bitwise_xor_9::InteractionClaim, pub memory_address_to_id: memory_address_to_id::InteractionClaim, pub memory_id_to_value: memory_id_to_big::InteractionClaim, pub range_check_11: range_check_11::InteractionClaim, @@ -451,6 +470,7 @@ impl CairoInteractionClaim { self.opcodes.mix_into(channel); self.verify_instruction.mix_into(channel); self.builtins.mix_into(channel); + self.verify_bitwise_xor_9.mix_into(channel); self.memory_address_to_id.mix_into(channel); self.memory_id_to_value.mix_into(channel); self.range_check_11.mix_into(channel); @@ -474,6 +494,7 @@ pub fn lookup_sum( sum += interaction_claim.opcodes.sum(); sum += interaction_claim.verify_instruction.claimed_sum; sum += interaction_claim.builtins.sum(); + sum += interaction_claim.verify_bitwise_xor_9.logup_sums.0; sum += interaction_claim.memory_address_to_id.claimed_sum; sum += interaction_claim.memory_id_to_value.big_claimed_sum; sum += interaction_claim.memory_id_to_value.small_claimed_sum; @@ -489,6 +510,7 @@ pub struct CairoComponents { opcodes: OpcodeComponents, verify_instruction: verify_instruction::Component, builtins: BuiltinComponents, + verify_bitwise_xor_9: verify_bitwise_xor_9::Component, memory_address_to_id: memory_address_to_id::Component, memory_id_to_value: ( memory_id_to_big::BigComponent, @@ -540,6 +562,16 @@ impl CairoComponents { interaction_elements, &interaction_claim.builtins, ); + let verify_bitwise_xor_9_component = verify_bitwise_xor_9::Component::new( + tree_span_provider, + verify_bitwise_xor_9::Eval { + claim: cairo_claim.verify_bitwise_xor_9, + verify_bitwise_xor_9_lookup_elements: interaction_elements + .verify_bitwise_xor_9 + .clone(), + }, + interaction_claim.verify_bitwise_xor_9.logup_sums, + ); let memory_address_to_id_component = memory_address_to_id::Component::new( tree_span_provider, memory_address_to_id::Eval::new( @@ -607,6 +639,7 @@ impl CairoComponents { opcodes: opcode_components, verify_instruction: verify_instruction_component, builtins: builtin_components, + verify_bitwise_xor_9: verify_bitwise_xor_9_component, memory_address_to_id: memory_address_to_id_component, memory_id_to_value: ( memory_id_to_value_component, @@ -626,6 +659,7 @@ impl CairoComponents { [&self.verify_instruction as &dyn ComponentProver,], self.builtins.provers(), [ + &self.verify_bitwise_xor_9 as &dyn ComponentProver, &self.memory_address_to_id as &dyn ComponentProver, &self.memory_id_to_value.0 as &dyn ComponentProver, &self.memory_id_to_value.1 as &dyn ComponentProver, @@ -657,6 +691,11 @@ impl std::fmt::Display for CairoComponents { indented_component_display(&self.verify_instruction) )?; writeln!(f, "Builtins: {}", self.builtins)?; + writeln!( + f, + "VerifyBitwiseXor9: {}", + indented_component_display(&self.verify_bitwise_xor_9) + )?; writeln!( f, "MemoryAddressToId: {}", diff --git a/stwo_cairo_prover/crates/prover/src/cairo_air/debug_tools.rs b/stwo_cairo_prover/crates/prover/src/cairo_air/debug_tools.rs index 730128356..4dcf907c9 100644 --- a/stwo_cairo_prover/crates/prover/src/cairo_air/debug_tools.rs +++ b/stwo_cairo_prover/crates/prover/src/cairo_air/debug_tools.rs @@ -22,7 +22,7 @@ use crate::components::{ jump_opcode, jump_opcode_double_deref, jump_opcode_rel, jump_opcode_rel_imm, memory_address_to_id, memory_id_to_big, mul_opcode, mul_opcode_imm, range_check_11, range_check_19, range_check_4_3, range_check_7_2_5, range_check_9_9, - range_check_builtin_bits_128, ret_opcode, verify_instruction, + range_check_builtin_bits_128, ret_opcode, verify_bitwise_xor_9, verify_instruction, }; use crate::felt::split_f252; use crate::relations; @@ -485,6 +485,17 @@ where ); } + entries.extend( + RelationTrackerComponent::new( + tree_span_provider, + verify_bitwise_xor_9::Eval { + claim: claim.verify_bitwise_xor_9, + verify_bitwise_xor_9_lookup_elements: relations::VerifyBitwiseXor_9::dummy(), + }, + 1 << claim.verify_bitwise_xor_9.log_size, + ) + .entries(trace), + ); // Memory. entries.extend( RelationTrackerComponent::new( diff --git a/stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs b/stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs index 8b16dcb1b..98dda6194 100644 --- a/stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs +++ b/stwo_cairo_prover/crates/prover/src/cairo_air/preprocessed.rs @@ -19,6 +19,9 @@ const IS_FIRST_LOG_SIZES: [u32; N_PREPROCESSED_COLUMN_SIZES] = preprocessed_log_ // List of sizes to initialize the preprocessed trace with for `PreprocessedColumn::Seq`. const SEQ_LOG_SIZES: [u32; N_PREPROCESSED_COLUMN_SIZES] = preprocessed_log_sizes(); +// List of sizes to initialize the preprocessed trace with for `PreprocessedColumn::BitwiseXor`. +const BITWISE_XOR_LOG_SIZES: [u32; 1] = [9]; + /// [LOG_MAX_ROWS, LOG_MAX_ROWS - 1, ..., LOG_N_LANES] const fn preprocessed_log_sizes() -> [u32; N_PREPROCESSED_COLUMN_SIZES] { let mut arr = [0; N_PREPROCESSED_COLUMN_SIZES]; @@ -83,7 +86,12 @@ pub fn preprocessed_trace_columns() -> Vec { let is_first_columns = IS_FIRST_LOG_SIZES.map(|log_size| PreProcessedColumn::IsFirst(IsFirst::new(log_size))); let seq_columns = SEQ_LOG_SIZES.map(|log_size| PreProcessedColumn::Seq(Seq::new(log_size))); - chain![is_first_columns, seq_columns] + let bitwise_xor_columns = BITWISE_XOR_LOG_SIZES.into_iter().flat_map(|log_size| { + (0..3).map(move |col_index| { + PreProcessedColumn::BitwiseXor(BitwiseXor::new(log_size, col_index)) + }) + }); + chain![is_first_columns, seq_columns, bitwise_xor_columns] .sorted_by_key(|column| std::cmp::Reverse(column.log_size())) .collect_vec() }