From 4889989de20de59d3c4b4de1c6761ee50e06ed9d Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 13 Jun 2018 17:22:20 +0200 Subject: [PATCH] invert lhs and rhs in r1cs import to please the R1CS exporter. Replace fold with reduce for more concise output --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/standard.rs | 27 ++++++++++++++++++++------- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f83c505..56e82d6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -341,6 +341,11 @@ dependencies = [ "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "reduce" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "regex" version = "0.2.11" @@ -571,6 +576,7 @@ dependencies = [ "lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "reduce 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -623,6 +629,7 @@ dependencies = [ "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" +"checksum reduce 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f77b717415291f4d7929a111402316b272c566ae9d4b75a61507dba88ecbd89" "checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" "checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" diff --git a/Cargo.toml b/Cargo.toml index ba7fbbe5..14397f52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ nolibsnark = [] libc = "0.2.0" num = "0.1.36" lazy_static = "0.1.*" +reduce = "0.1.1" # cli clap = "2.26.2" # serialization and deserialization diff --git a/src/standard.rs b/src/standard.rs index a827bf2c..64a8b2cc 100644 --- a/src/standard.rs +++ b/src/standard.rs @@ -4,6 +4,7 @@ use flat_absy::{FlatStatement, FlatExpression, FlatFunction, FlatExpressionList} use field::Field; use executable::Sha256Libsnark; use parameter::Parameter; +use reduce::Reduce; // for r1cs import, can be moved. // r1cs data strucutre reflecting JSON standard format: @@ -32,19 +33,31 @@ pub struct Constraint { impl Into> for Constraint { fn into(self: Constraint) -> FlatStatement { - let lhs_a = self.a.iter() + let rhs_a = match self.a.iter() .map(|(key, val)| FlatExpression::Mult(box FlatExpression::Number(T::from_dec_string(val.to_string())), box FlatExpression::Identifier(format!("inter{}",key.clone())))) - .fold(FlatExpression::Number(T::zero()), |acc, e| FlatExpression::Add(box acc, box e)); + .reduce(|acc, e| FlatExpression::Add(box acc, box e)) { + Some(e @ FlatExpression::Mult(..)) => FlatExpression::Add(box FlatExpression::Number(T::zero()), box e), // the R1CS serializer only recognizes Add + Some(e) => e, + None => FlatExpression::Number(T::zero()) + }; - let lhs_b = self.b.iter() + let rhs_b = match self.b.iter() .map(|(key, val)| FlatExpression::Mult(box FlatExpression::Number(T::from_dec_string(val.to_string())), box FlatExpression::Identifier(format!("inter{}",key.clone())))) - .fold(FlatExpression::Number(T::zero()), |acc, e| FlatExpression::Add(box acc, box e)); + .reduce(|acc, e| FlatExpression::Add(box acc, box e)) { + Some(e @ FlatExpression::Mult(..)) => FlatExpression::Add(box FlatExpression::Number(T::zero()), box e), // the R1CS serializer only recognizes Add + Some(e) => e, + None => FlatExpression::Number(T::zero()) + }; - let rhs = self.c.iter() + let lhs = match self.c.iter() .map(|(key, val)| FlatExpression::Mult(box FlatExpression::Number(T::from_dec_string(val.to_string())), box FlatExpression::Identifier(format!("inter{}",key.clone())))) - .fold(FlatExpression::Number(T::zero()), |acc, e| FlatExpression::Add(box acc, box e)); + .reduce(|acc, e| FlatExpression::Add(box acc, box e)) { + Some(e @ FlatExpression::Mult(..)) => FlatExpression::Add(box FlatExpression::Number(T::zero()), box e), // the R1CS serializer only recognizes Add + Some(e) => e, + None => FlatExpression::Number(T::zero()) + }; - FlatStatement::Condition(FlatExpression::Mult(box lhs_a, box lhs_b), rhs) + FlatStatement::Condition(lhs, FlatExpression::Mult(box rhs_a, box rhs_b)) } }