From 6d601c6113911ba32708cc38b26e251605253d1f Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Tue, 5 Oct 2021 14:27:30 +0200 Subject: [PATCH 1/2] Overflow fixes --- src/gadgets/split_join.rs | 2 +- src/gates/comparison.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gadgets/split_join.rs b/src/gadgets/split_join.rs index dddae0be..a672b61a 100644 --- a/src/gadgets/split_join.rs +++ b/src/gadgets/split_join.rs @@ -16,7 +16,7 @@ impl, const D: usize> CircuitBuilder { if num_bits == 0 { return Vec::new(); } - let bits_per_gate = self.config.num_routed_wires - BaseSumGate::<2>::START_LIMBS; + let bits_per_gate = 63.min(self.config.num_routed_wires - BaseSumGate::<2>::START_LIMBS); let k = ceil_div_usize(num_bits, bits_per_gate); let gates = (0..k) .map(|_| self.add_gate(BaseSumGate::<2>::new(bits_per_gate), vec![])) diff --git a/src/gates/comparison.rs b/src/gates/comparison.rs index 1a472550..364a1611 100644 --- a/src/gates/comparison.rs +++ b/src/gates/comparison.rs @@ -23,6 +23,7 @@ pub struct ComparisonGate, const D: usize> { impl, const D: usize> ComparisonGate { pub fn new(num_bits: usize, num_chunks: usize) -> Self { + debug_assert!(num_bits < 64); Self { num_bits, num_chunks, From 242ee26b6ffa91a40463d05ce68bf1adb61c82e6 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Tue, 5 Oct 2021 17:50:38 +0200 Subject: [PATCH 2/2] Generalize to fields with less than 64 bits --- src/gadgets/split_join.rs | 5 +++-- src/gates/comparison.rs | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/gadgets/split_join.rs b/src/gadgets/split_join.rs index a672b61a..9b84ed76 100644 --- a/src/gadgets/split_join.rs +++ b/src/gadgets/split_join.rs @@ -5,7 +5,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::{BoolTarget, Target}; use crate::iop::witness::{PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::util::ceil_div_usize; +use crate::util::{bits_u64, ceil_div_usize}; impl, const D: usize> CircuitBuilder { /// Split the given integer into a list of wires, where each one represents a @@ -16,7 +16,8 @@ impl, const D: usize> CircuitBuilder { if num_bits == 0 { return Vec::new(); } - let bits_per_gate = 63.min(self.config.num_routed_wires - BaseSumGate::<2>::START_LIMBS); + let bits_per_gate = (bits_u64(F::ORDER) - 1) + .min(self.config.num_routed_wires - BaseSumGate::<2>::START_LIMBS); let k = ceil_div_usize(num_bits, bits_per_gate); let gates = (0..k) .map(|_| self.add_gate(BaseSumGate::<2>::new(bits_per_gate), vec![])) diff --git a/src/gates/comparison.rs b/src/gates/comparison.rs index 364a1611..0715b066 100644 --- a/src/gates/comparison.rs +++ b/src/gates/comparison.rs @@ -11,7 +11,7 @@ use crate::iop::witness::{PartitionWitness, Witness}; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::plonk_common::{reduce_with_powers, reduce_with_powers_ext_recursive}; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; -use crate::util::ceil_div_usize; +use crate::util::{bits_u64, ceil_div_usize}; /// A gate for checking that one value is less than or equal to another. #[derive(Clone, Debug)] @@ -23,7 +23,7 @@ pub struct ComparisonGate, const D: usize> { impl, const D: usize> ComparisonGate { pub fn new(num_bits: usize, num_chunks: usize) -> Self { - debug_assert!(num_bits < 64); + debug_assert!(num_bits < bits_u64(F::ORDER)); Self { num_bits, num_chunks,