From c9bbc833e7deb58b918340b5c9edff406832d589 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 14 Aug 2025 19:27:15 -0400 Subject: [PATCH 1/3] Fix multi_observe constraints --- extensions/native/circuit/src/poseidon2/air.rs | 15 +++++++++++++-- .../native/circuit/src/poseidon2/columns.rs | 1 + extensions/native/circuit/src/poseidon2/trace.rs | 9 +++++++++ extensions/native/recursion/tests/recursion.rs | 12 +++++++++--- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/extensions/native/circuit/src/poseidon2/air.rs b/extensions/native/circuit/src/poseidon2/air.rs index e1fca5c827..3a93e21400 100644 --- a/extensions/native/circuit/src/poseidon2/air.rs +++ b/extensions/native/circuit/src/poseidon2/air.rs @@ -98,6 +98,7 @@ impl Air builder.assert_bool(simple); builder.assert_bool(multi_observe_row); let enabled = incorporate_row + incorporate_sibling + inside_row + simple + multi_observe_row; + builder.assert_bool(enabled.clone()); builder.assert_bool(end_inside_row); builder.when(end_inside_row).assert_one(inside_row); @@ -679,6 +680,7 @@ impl Air ) .eval(builder, simple * is_permute); + //// multi_observe contraints let multi_observe_specific: &MultiObserveCols = specific[..MultiObserveCols::::width()].borrow(); @@ -698,6 +700,7 @@ impl Air end_idx, aux_after_start, aux_before_end, + aux_read_enabled, read_data, write_data, data, @@ -783,7 +786,7 @@ impl Air start_timestamp + i_var * AB::F::TWO - start_idx * AB::F::TWO, &read_data[i] ) - .eval(builder, aux_after_start[i] * aux_before_end[i]); + .eval(builder, multi_observe_row * aux_read_enabled[i]); self.memory_bridge .write( @@ -795,21 +798,29 @@ impl Air start_timestamp + i_var * AB::F::TWO - start_idx * AB::F::TWO + AB::F::ONE, &write_data[i], ) - .eval(builder, aux_after_start[i] * aux_before_end[i]); + .eval(builder, multi_observe_row * aux_read_enabled[i]); } for i in 0..(CHUNK - 1) { builder + .when(multi_observe_row) .when(aux_after_start[i]) .assert_one(aux_after_start[i + 1]); } for i in 1..CHUNK { builder + .when(multi_observe_row) .when(aux_before_end[i]) .assert_one(aux_before_end[i - 1]); } + for i in 0..CHUNK { + builder + .when(multi_observe_row) + .assert_eq(aux_after_start[i] * aux_before_end[i], aux_read_enabled[i]); + } + builder .when(multi_observe_row) .when(not(is_first)) diff --git a/extensions/native/circuit/src/poseidon2/columns.rs b/extensions/native/circuit/src/poseidon2/columns.rs index fe0fce881a..723a30c24d 100644 --- a/extensions/native/circuit/src/poseidon2/columns.rs +++ b/extensions/native/circuit/src/poseidon2/columns.rs @@ -224,6 +224,7 @@ pub struct MultiObserveCols { pub end_idx: T, pub aux_after_start: [T; CHUNK], pub aux_before_end: [T; CHUNK], + pub aux_read_enabled: [T; CHUNK], // Transcript observation pub read_data: [MemoryReadAuxCols; CHUNK], diff --git a/extensions/native/circuit/src/poseidon2/trace.rs b/extensions/native/circuit/src/poseidon2/trace.rs index 9a2c2b4cb1..655a0d2edd 100644 --- a/extensions/native/circuit/src/poseidon2/trace.rs +++ b/extensions/native/circuit/src/poseidon2/trace.rs @@ -473,6 +473,11 @@ impl NativePoseidon2Chip= F::TWO { + specific.aux_read_enabled[i] = F::ONE; + } + } for i in record.start_idx..record.end_idx { let read_data_record = memory.record_by_id(record.read_input_data[i]); let write_data_record = memory.record_by_id(record.write_input_data[i]); @@ -512,6 +517,10 @@ impl NativePoseidon2Chip self.record_set: {:?}", self.record_set); + for record in self.record_set.verify_batch_records.iter() { used_cells += self.verify_batch_record_to_rows( record, diff --git a/extensions/native/recursion/tests/recursion.rs b/extensions/native/recursion/tests/recursion.rs index 2147a18203..66f59796c8 100644 --- a/extensions/native/recursion/tests/recursion.rs +++ b/extensions/native/recursion/tests/recursion.rs @@ -5,7 +5,7 @@ use openvm_native_compiler::{ asm::{AsmBuilder, AsmCompiler}, ir::Felt, conversion::{convert_program, CompilerOptions}, }; -use openvm_native_recursion::{testing_utils::inner::run_recursive_test, challenger::duplex::DuplexChallengerVariable}; +use openvm_native_recursion::{testing_utils::inner::run_recursive_test, challenger::{duplex::DuplexChallengerVariable, CanObserveVariable}}; use openvm_stark_backend::{ config::{Domain, StarkGenericConfig}, p3_commit::PolynomialSpace, @@ -146,9 +146,15 @@ fn build_test_program( builder: &mut Builder, ) { let sample_lens: Vec = vec![10, 2, 0, 3, 20]; - let mut rng = create_seeded_rng(); - let challenger = DuplexChallengerVariable::new(builder); + let mut challenger = DuplexChallengerVariable::new(builder); + + // Observe a setup label + let label_f: Vec = vec![128, 3098, 192, 394, 1662, 928, 374, 281, 598, 182, 475, 729]; + for n in label_f { + let f: Felt = builder.constant(C::F::from_canonical_u64(n)); + challenger.observe(builder, f); + } for l in sample_lens { let sample_input: Array> = builder.dyn_array(l); From 79f1a3973c041c3e64283731538d6f1d4419b82e Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 14 Aug 2025 19:31:28 -0400 Subject: [PATCH 2/3] Remove debug flags --- extensions/native/circuit/src/poseidon2/air.rs | 2 -- extensions/native/circuit/src/poseidon2/trace.rs | 4 ---- extensions/native/recursion/tests/recursion.rs | 1 + 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/extensions/native/circuit/src/poseidon2/air.rs b/extensions/native/circuit/src/poseidon2/air.rs index 3a93e21400..95753fb940 100644 --- a/extensions/native/circuit/src/poseidon2/air.rs +++ b/extensions/native/circuit/src/poseidon2/air.rs @@ -98,7 +98,6 @@ impl Air builder.assert_bool(simple); builder.assert_bool(multi_observe_row); let enabled = incorporate_row + incorporate_sibling + inside_row + simple + multi_observe_row; - builder.assert_bool(enabled.clone()); builder.assert_bool(end_inside_row); builder.when(end_inside_row).assert_one(inside_row); @@ -680,7 +679,6 @@ impl Air ) .eval(builder, simple * is_permute); - //// multi_observe contraints let multi_observe_specific: &MultiObserveCols = specific[..MultiObserveCols::::width()].borrow(); diff --git a/extensions/native/circuit/src/poseidon2/trace.rs b/extensions/native/circuit/src/poseidon2/trace.rs index 655a0d2edd..27ffe858a9 100644 --- a/extensions/native/circuit/src/poseidon2/trace.rs +++ b/extensions/native/circuit/src/poseidon2/trace.rs @@ -517,10 +517,6 @@ impl NativePoseidon2Chip self.record_set: {:?}", self.record_set); - for record in self.record_set.verify_batch_records.iter() { used_cells += self.verify_batch_record_to_rows( record, diff --git a/extensions/native/recursion/tests/recursion.rs b/extensions/native/recursion/tests/recursion.rs index 66f59796c8..34dc1c7ee7 100644 --- a/extensions/native/recursion/tests/recursion.rs +++ b/extensions/native/recursion/tests/recursion.rs @@ -146,6 +146,7 @@ fn build_test_program( builder: &mut Builder, ) { let sample_lens: Vec = vec![10, 2, 0, 3, 20]; + let mut rng = create_seeded_rng(); let mut challenger = DuplexChallengerVariable::new(builder); From ad05d58d8b79a9cba79504e4ba4ac527ffaea62f Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 14 Aug 2025 19:33:16 -0400 Subject: [PATCH 3/3] fmt --- extensions/native/recursion/tests/recursion.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/native/recursion/tests/recursion.rs b/extensions/native/recursion/tests/recursion.rs index 34dc1c7ee7..6ed8a3cefa 100644 --- a/extensions/native/recursion/tests/recursion.rs +++ b/extensions/native/recursion/tests/recursion.rs @@ -146,7 +146,7 @@ fn build_test_program( builder: &mut Builder, ) { let sample_lens: Vec = vec![10, 2, 0, 3, 20]; - + let mut rng = create_seeded_rng(); let mut challenger = DuplexChallengerVariable::new(builder);