Skip to content

Commit f9ef593

Browse files
committed
Fix soundness in Lookups
1 parent 2488cda commit f9ef593

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

Diff for: plonky2/src/gates/lookup.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,10 @@ impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for Loo
197197
let get_wire = |wire: usize| -> F { witness.get_target(Target::wire(self.row, wire)) };
198198

199199
let input_val = get_wire(LookupGate::wire_ith_looking_inp(self.slot_nb));
200-
let (input, output) = self.lut[input_val.to_canonical_u64() as usize];
201-
if input_val == F::from_canonical_u16(input) {
200+
if (input_val.to_canonical_u64() as usize) < self.lut.len()
201+
&& input_val == F::from_canonical_u16(self.lut[input_val.to_canonical_u64() as usize].0)
202+
{
203+
let (_, output) = self.lut[input_val.to_canonical_u64() as usize];
202204
let output_val = F::from_canonical_u16(output);
203205

204206
let out_wire = Target::wire(self.row, LookupGate::wire_ith_looking_out(self.slot_nb));

Diff for: plonky2/src/gates/lookup_table.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,11 @@ impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for Loo
224224
out_buffer.set_target(slot_input_target, F::from_canonical_usize(input as usize))?;
225225
out_buffer.set_target(slot_output_target, F::from_canonical_usize(output as usize))
226226
} else {
227-
// Pad with zeros.
228-
out_buffer.set_target(slot_input_target, F::ZERO)?;
229-
out_buffer.set_target(slot_output_target, F::ZERO)
227+
// Pad with first element in the LUT.
228+
assert!(!self.lut.is_empty(), "Empty LUTs are not supported.");
229+
let (input, output) = self.lut[0];
230+
out_buffer.set_target(slot_input_target, F::from_canonical_usize(input as usize))?;
231+
out_buffer.set_target(slot_output_target, F::from_canonical_usize(output as usize))
230232
}
231233
}
232234

Diff for: plonky2/src/plonk/vanishing_poly.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,17 @@ pub(crate) fn get_lut_poly<F: RichField + Extendable<D>, const D: usize>(
3636
let b = deltas[LookupChallenges::ChallengeB as usize];
3737
let mut coeffs = Vec::with_capacity(common_data.luts[lut_index].len());
3838
let n = common_data.luts[lut_index].len();
39+
let nb_padded_elts = LookupTableGate::num_slots(&common_data.config)
40+
- n % LookupTableGate::num_slots(&common_data.config);
41+
let (padding_inp, padding_out) = common_data.luts[lut_index][0];
3942
for (input, output) in common_data.luts[lut_index].iter() {
4043
coeffs.push(F::from_canonical_u16(*input) + b * F::from_canonical_u16(*output));
4144
}
42-
coeffs.append(&mut vec![F::ZERO; degree - n]);
45+
// Padding with the first element of the LUT.
46+
for _ in 0..nb_padded_elts {
47+
coeffs.push(F::from_canonical_u16(padding_inp) + b * F::from_canonical_u16(padding_out));
48+
}
49+
coeffs.append(&mut vec![F::ZERO; degree - (n + nb_padded_elts)]);
4350
coeffs.reverse();
4451
PolynomialCoeffs::new(coeffs)
4552
}

0 commit comments

Comments
 (0)