Auto merge of #1104 - ebfull:libsnark-updates, r=ebfull
Update libsnark We have now forked libsnark's current master and applied the following patches: * [`9216072`: Remove code that we don't use.](9216072c3b
) (unblocks #69) * [`dcb78b2`: Modify makefile to stop compiling things we removed.](dcb78b24d9
) * [`a6b0ad0`: Use libsodium's PRNG](a6b0ad0c80
) (closes #780) * [`4036716`: Don't (de)serialize the constraint system in the proving key.](403671675a
) (closes #491) * [`a703148`: Taylor's compilation patch](a7031481fd
) (@defuse can you submit this to upstream?) This PR adopts those changes, and makes the requisite changes to Zcash to support them. I have decided to not bring libsnark in tree for the time being, though it should be incredibly easy to do later if we're *absolutely* sure we should.
This commit is contained in:
commit
e613014526
|
@ -1,18 +1,12 @@
|
||||||
package=libsnark
|
package=libsnark
|
||||||
$(package)_version=0.1
|
$(package)_version=0.1
|
||||||
$(package)_download_path=https://github.com/scipr-lab/$(package)/archive/
|
$(package)_download_path=https://github.com/zcash/$(package)/archive/
|
||||||
$(package)_file_name=$(package)-$($(package)_git_commit).tar.gz
|
$(package)_file_name=$(package)-$($(package)_git_commit).tar.gz
|
||||||
$(package)_download_file=$($(package)_git_commit).tar.gz
|
$(package)_download_file=$($(package)_git_commit).tar.gz
|
||||||
$(package)_sha256_hash=b5ec84a836d0d305407d5f39c8176bae2bb448abe802a8d11ba0f88f17e6d358
|
$(package)_sha256_hash=43b0c921e8a1d556e70cf5c63c921db54f151842eb3cada029e3b92095e7b6f9
|
||||||
$(package)_git_commit=69f312f149cc4bd8def8e2fed26a7941ff41251d
|
$(package)_git_commit=a7031481fd8d2360337321401fe8e24f0359317a
|
||||||
|
|
||||||
$(package)_dependencies=libgmp
|
$(package)_dependencies=libgmp libsodium
|
||||||
$(package)_patches=1_fix_Wl_flag.patch 2_include_iota_header.patch
|
|
||||||
|
|
||||||
define $(package)_preprocess_cmds
|
|
||||||
patch -p1 < $($(package)_patch_dir)/1_fix_Wl_flag.patch && \
|
|
||||||
patch -p1 < $($(package)_patch_dir)/2_include_iota_header.patch
|
|
||||||
endef
|
|
||||||
|
|
||||||
define $(package)_build_cmds
|
define $(package)_build_cmds
|
||||||
CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT
|
CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
commit 728c1ace30f2338b86331f0b83559409198e1f74
|
|
||||||
Author: Taylor Hornby <havoc@defuse.ca>
|
|
||||||
Date: Wed Sep 9 16:46:48 2015 -0600
|
|
||||||
|
|
||||||
g++-4.9 requires commas to include the argument to ``rpath`` as a linker flag.
|
|
||||||
|
|
||||||
diff --git a/Makefile b/Makefile
|
|
||||||
index 5f59388..68e91bb 100644
|
|
||||||
--- a/Makefile
|
|
||||||
+++ b/Makefile
|
|
||||||
@@ -18,7 +18,7 @@ DEPSRC = depsrc
|
|
||||||
DEPINST = depinst
|
|
||||||
|
|
||||||
CXXFLAGS += -I$(DEPINST)/include -Isrc
|
|
||||||
-LDFLAGS += -L$(DEPINST)/lib -Wl,-rpath $(DEPINST)/lib
|
|
||||||
+LDFLAGS += -L$(DEPINST)/lib -Wl,-rpath,$(DEPINST)/lib
|
|
||||||
LDLIBS += -lgmpxx -lgmp -lboost_program_options
|
|
||||||
# OpenSSL and its dependencies (needed explicitly for static builds):
|
|
||||||
LDLIBS += -lcrypto -ldl -lz
|
|
|
@ -1,31 +0,0 @@
|
||||||
commit c437365ec98ec77754287594d2d3748901d0d176
|
|
||||||
Author: Taylor Hornby <taylor@defuse.ca>
|
|
||||||
Date: Wed May 18 10:49:58 2016 -0600
|
|
||||||
|
|
||||||
Include header required for std::iota.
|
|
||||||
|
|
||||||
diff --git a/src/common/data_structures/integer_permutation.cpp b/src/common/data_structures/integer_permutation.cpp
|
|
||||||
index f9f9327..378ea7e 100644
|
|
||||||
--- a/src/common/data_structures/integer_permutation.cpp
|
|
||||||
+++ b/src/common/data_structures/integer_permutation.cpp
|
|
||||||
@@ -15,6 +15,7 @@
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cassert>
|
|
||||||
+#include <numeric>
|
|
||||||
#include <unordered_set>
|
|
||||||
|
|
||||||
namespace libsnark {
|
|
||||||
diff --git a/src/common/data_structures/sparse_vector.tcc b/src/common/data_structures/sparse_vector.tcc
|
|
||||||
index 26429a5..cfc5d75 100644
|
|
||||||
--- a/src/common/data_structures/sparse_vector.tcc
|
|
||||||
+++ b/src/common/data_structures/sparse_vector.tcc
|
|
||||||
@@ -16,6 +16,8 @@
|
|
||||||
|
|
||||||
#include "algebra/scalar_multiplication/multiexp.hpp"
|
|
||||||
|
|
||||||
+#include <numeric>
|
|
||||||
+
|
|
||||||
namespace libsnark {
|
|
||||||
|
|
||||||
template<typename T>
|
|
|
@ -1,9 +1,14 @@
|
||||||
#include "zcash/JoinSplit.hpp"
|
#include "zcash/JoinSplit.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include "sodium.h"
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
if (sodium_init() == -1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if(argc != 3) {
|
if(argc != 3) {
|
||||||
std::cerr << "Usage: " << argv[0] << " provingKeyFileName verificationKeyFileName" << std::endl;
|
std::cerr << "Usage: " << argv[0] << " provingKeyFileName verificationKeyFileName" << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -231,37 +231,40 @@ public:
|
||||||
out_macs[i] = PRF_pk(inputs[i].key, i, h_sig);
|
out_macs[i] = PRF_pk(inputs[i].key, i, h_sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<FieldT> primary_input;
|
protoboard<FieldT> pb;
|
||||||
std::vector<FieldT> aux_input;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
protoboard<FieldT> pb;
|
joinsplit_gadget<FieldT, NumInputs, NumOutputs> g(pb);
|
||||||
{
|
g.generate_r1cs_constraints();
|
||||||
joinsplit_gadget<FieldT, NumInputs, NumOutputs> g(pb);
|
g.generate_r1cs_witness(
|
||||||
g.generate_r1cs_constraints();
|
phi,
|
||||||
g.generate_r1cs_witness(
|
rt,
|
||||||
phi,
|
h_sig,
|
||||||
rt,
|
inputs,
|
||||||
h_sig,
|
out_notes,
|
||||||
inputs,
|
vpub_old,
|
||||||
out_notes,
|
vpub_new
|
||||||
vpub_old,
|
);
|
||||||
vpub_new
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pb.is_satisfied()) {
|
|
||||||
throw std::invalid_argument("Constraint system not satisfied by inputs");
|
|
||||||
}
|
|
||||||
|
|
||||||
primary_input = pb.primary_input();
|
|
||||||
aux_input = pb.auxiliary_input();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!pb.is_satisfied()) {
|
||||||
|
throw std::invalid_argument("Constraint system not satisfied by inputs");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: These are copies, which is not strictly necessary.
|
||||||
|
std::vector<FieldT> primary_input = pb.primary_input();
|
||||||
|
std::vector<FieldT> aux_input = pb.auxiliary_input();
|
||||||
|
|
||||||
|
// Swap A and B if it's beneficial (less arithmetic in G2)
|
||||||
|
// In our circuit, we already know that it's beneficial
|
||||||
|
// to swap, but it takes so little time to perform this
|
||||||
|
// estimate that it doesn't matter if we check every time.
|
||||||
|
pb.constraint_system.swap_AB_if_beneficial();
|
||||||
|
|
||||||
auto proof = r1cs_ppzksnark_prover<ppzksnark_ppT>(
|
auto proof = r1cs_ppzksnark_prover<ppzksnark_ppT>(
|
||||||
*pk,
|
*pk,
|
||||||
primary_input,
|
primary_input,
|
||||||
aux_input
|
aux_input,
|
||||||
|
pb.constraint_system
|
||||||
);
|
);
|
||||||
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
|
|
Loading…
Reference in New Issue