Browse Source

Fix padding logic (#151)

* fix padding

* update version
main
Srinath Setty 1 year ago
committed by GitHub
parent
commit
eb97499907
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 17 deletions
  1. +1
    -1
      Cargo.toml
  2. +10
    -16
      src/r1cs.rs

+ 1
- 1
Cargo.toml

@ -1,6 +1,6 @@
[package] [package]
name = "nova-snark" name = "nova-snark"
version = "0.18.1"
version = "0.18.2"
authors = ["Srinath Setty <srinath@microsoft.com>"] authors = ["Srinath Setty <srinath@microsoft.com>"]
edition = "2021" edition = "2021"
description = "Recursive zkSNARKs without trusted setup" description = "Recursive zkSNARKs without trusted setup"

+ 10
- 16
src/r1cs.rs

@ -364,28 +364,22 @@ impl R1CSShape {
/// Pads the R1CSShape so that the number of variables is a power of two /// Pads the R1CSShape so that the number of variables is a power of two
/// Renumbers variables to accomodate padded variables /// Renumbers variables to accomodate padded variables
pub fn pad(&self) -> Self { pub fn pad(&self) -> Self {
// equalize the number of variables and constraints
let m = max(self.num_vars, self.num_cons).next_power_of_two();
// check if the provided R1CSShape is already as required // check if the provided R1CSShape is already as required
if self.num_vars.next_power_of_two() == self.num_vars
&& self.num_cons.next_power_of_two() == self.num_cons
{
if self.num_vars == m && self.num_cons == m {
return self.clone(); return self.clone();
} }
// check if the number of variables are as expected, then // check if the number of variables are as expected, then
// we simply set the number of constraints to the next power of two // we simply set the number of constraints to the next power of two
if self.num_vars.next_power_of_two() == self.num_vars {
let digest = Self::compute_digest(
self.num_cons.next_power_of_two(),
self.num_vars,
self.num_io,
&self.A,
&self.B,
&self.C,
);
if self.num_vars == m {
let digest = Self::compute_digest(m, self.num_vars, self.num_io, &self.A, &self.B, &self.C);
return R1CSShape { return R1CSShape {
num_cons: self.num_cons.next_power_of_two(),
num_vars: self.num_vars,
num_cons: m,
num_vars: m,
num_io: self.num_io, num_io: self.num_io,
A: self.A.clone(), A: self.A.clone(),
B: self.B.clone(), B: self.B.clone(),
@ -395,8 +389,8 @@ impl R1CSShape {
} }
// otherwise, we need to pad the number of variables and renumber variable accesses // otherwise, we need to pad the number of variables and renumber variable accesses
let num_vars_padded = self.num_vars.next_power_of_two();
let num_cons_padded = self.num_cons.next_power_of_two();
let num_vars_padded = m;
let num_cons_padded = m;
let apply_pad = |M: &[(usize, usize, G::Scalar)]| -> Vec<(usize, usize, G::Scalar)> { let apply_pad = |M: &[(usize, usize, G::Scalar)]| -> Vec<(usize, usize, G::Scalar)> {
M.par_iter() M.par_iter()
.map(|(r, c, v)| { .map(|(r, c, v)| {

Loading…
Cancel
Save