Allow us to easily switch to ate-pairing later.

This commit is contained in:
Sean Bowe 2016-08-02 22:50:39 -06:00
parent 3d8a255235
commit dcb0d44b00
No known key found for this signature in database
GPG Key ID: 95684257D8F8B031
7 changed files with 105 additions and 66 deletions

6
.gitmodules vendored
View File

@ -1,3 +1,9 @@
[submodule "snark/libsnark"]
path = snark/libsnark
url = https://github.com/zcash/libsnark.git
[submodule "snark/ate-pairing"]
path = snark/ate-pairing
url = https://github.com/herumi/ate-pairing.git
[submodule "snark/xbyak"]
path = snark/xbyak
url = https://github.com/herumi/xbyak.git

1
snark/ate-pairing Submodule

@ -0,0 +1 @@
Subproject commit dcb9da999b1113f90b115bccb6f4b57ddf3a8452

@ -1 +1 @@
Subproject commit a7031481fd8d2360337321401fe8e24f0359317a
Subproject commit fa107871c84297dbf2f6ce8f1ddb9b682587d01c

View File

@ -1,32 +1,61 @@
extern crate gcc;
const USE_ATE_PAIRING: bool = false;
fn main() {
println!("cargo:rustc-link-lib=gmp");
println!("cargo:rustc-link-lib=gmpxx");
println!("cargo:rustc-link-lib=sodium");
if USE_ATE_PAIRING {
let mut cfg = gcc::Config::new();
cfg.cpp(true)
.opt_level(2)
.define("BN_SUPPORT_SNARK", None)
.include("ate-pairing/include")
.include("xbyak")
.file("ate-pairing/src/zm.cpp")
.file("ate-pairing/src/zm2.cpp")
.compile("libzm.a");
}
let mut cfg = gcc::Config::new();
cfg.cpp(true)
.opt_level(2)
.define("NO_PROCPS", None)
.define("STATIC", None)
.define("CURVE_ALT_BN128", None)
.define("MONTGOMERY_OUTPUT", None)
.define("USE_ASM", None)
.define("NO_PT_COMPRESSION", None)
.define("BINARY_OUTPUT", None)
.flag("-std=c++11")
.include("libsnark/src")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_g1.cpp")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_g2.cpp")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_init.cpp")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_pp.cpp")
.file("libsnark/src/common/utils.cpp")
.file("libsnark/src/common/profiling.cpp")
.file("src/libsnarkwrap.cpp")
;
cfg.compile("libsnarkwrap.a");
let cfg = cfg.cpp(true)
.opt_level(2)
.define("NO_PROCPS", None)
.define("STATIC", None)
.define("MONTGOMERY_OUTPUT", None)
.define("USE_ASM", None)
.define("NO_PT_COMPRESSION", None)
.define("BINARY_OUTPUT", None)
.flag("-std=c++11")
.include("libsnark/src")
.file("libsnark/src/common/utils.cpp")
.file("libsnark/src/common/profiling.cpp")
.file("src/libsnarkwrap.cpp");
if USE_ATE_PAIRING {
let cfg = cfg.define("CURVE_BN128", None)
.define("BN_SUPPORT_SNARK", None)
.include("ate-pairing/include")
.file("libsnark/src/algebra/curves/bn128/bn128_g1.cpp")
.file("libsnark/src/algebra/curves/bn128/bn128_g2.cpp")
.file("libsnark/src/algebra/curves/bn128/bn128_gt.cpp")
.file("libsnark/src/algebra/curves/bn128/bn128_init.cpp")
.file("libsnark/src/algebra/curves/bn128/bn128_pairing.cpp")
.file("libsnark/src/algebra/curves/bn128/bn128_pp.cpp");
cfg.compile("libsnarkwrap.a");
} else {
let cfg = cfg.define("CURVE_ALT_BN128", None)
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_g1.cpp")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_g2.cpp")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_init.cpp")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_pairing.cpp")
.file("libsnark/src/algebra/curves/alt_bn128/alt_bn128_pp.cpp");
cfg.compile("libsnarkwrap.a");
}
}

View File

@ -109,6 +109,8 @@ fn test_basic_arith() {
#[test]
fn test_primitives() {
super::initialize();
let a = Fr::from_str("0");
assert!(a.is_zero());
let a = Fr::from_str("1");

View File

@ -1,12 +1,8 @@
#include <sodium.h>
#include <iostream>
#include <stdexcept>
#include "algebra/curves/alt_bn128/alt_bn128_g1.hpp"
#include <assert.h>
#include "algebra/curves/alt_bn128/alt_bn128_g2.hpp"
#include "algebra/curves/alt_bn128/alt_bn128_init.hpp"
#include "algebra/curves/alt_bn128/alt_bn128_pairing.hpp"
#include "algebra/curves/alt_bn128/alt_bn128_pp.hpp"
#include "common/default_types/r1cs_ppzksnark_pp.hpp"
#include "algebra/curves/public_params.hpp"
#include "relations/arithmetic_programs/qap/qap.hpp"
#include "reductions/r1cs_to_qap/r1cs_to_qap.hpp"
@ -14,127 +10,131 @@
using namespace std;
using namespace libsnark;
typedef Fr<alt_bn128_pp> FieldT;
typedef default_r1cs_ppzksnark_pp curve_pp;
typedef default_r1cs_ppzksnark_pp::G1_type curve_G1;
typedef default_r1cs_ppzksnark_pp::G2_type curve_G2;
typedef default_r1cs_ppzksnark_pp::GT_type curve_GT;
typedef default_r1cs_ppzksnark_pp::Fp_type curve_Fr;
extern "C" void libsnarkwrap_init() {
libsnark::inhibit_profiling_info = true;
libsnark::inhibit_profiling_counters = true;
assert(sodium_init() != -1);
init_alt_bn128_params();
curve_pp::init_public_params();
}
// Fr
extern "C" FieldT libsnarkwrap_Fr_random() {
return FieldT::random_element();
extern "C" curve_Fr libsnarkwrap_Fr_random() {
return curve_Fr::random_element();
}
extern "C" FieldT libsnarkwrap_Fr_from(const char *a) {
return FieldT(a);
extern "C" curve_Fr libsnarkwrap_Fr_from(const char *a) {
return curve_Fr(a);
}
extern "C" FieldT libsnarkwrap_Fr_add(FieldT *a, FieldT *b) {
extern "C" curve_Fr libsnarkwrap_Fr_add(curve_Fr *a, curve_Fr *b) {
return *a + *b;
}
extern "C" FieldT libsnarkwrap_Fr_sub(FieldT *a, FieldT *b) {
extern "C" curve_Fr libsnarkwrap_Fr_sub(curve_Fr *a, curve_Fr *b) {
return *a - *b;
}
extern "C" FieldT libsnarkwrap_Fr_mul(FieldT *a, FieldT *b) {
extern "C" curve_Fr libsnarkwrap_Fr_mul(curve_Fr *a, curve_Fr *b) {
return *a * *b;
}
extern "C" FieldT libsnarkwrap_Fr_neg(FieldT *a) {
extern "C" curve_Fr libsnarkwrap_Fr_neg(curve_Fr *a) {
return -(*a);
}
extern "C" bool libsnarkwrap_Fr_is_zero(FieldT *a) {
extern "C" bool libsnarkwrap_Fr_is_zero(curve_Fr *a) {
return a->is_zero();
}
// G1
extern "C" alt_bn128_G1 libsnarkwrap_G1_zero() {
return alt_bn128_G1::zero();
extern "C" curve_G1 libsnarkwrap_G1_zero() {
return curve_G1::zero();
}
extern "C" alt_bn128_G1 libsnarkwrap_G1_one() {
return alt_bn128_G1::one();
extern "C" curve_G1 libsnarkwrap_G1_one() {
return curve_G1::one();
}
extern "C" alt_bn128_G1 libsnarkwrap_G1_random() {
return alt_bn128_G1::random_element();
extern "C" curve_G1 libsnarkwrap_G1_random() {
return curve_G1::random_element();
}
extern "C" bool libsnarkwrap_G1_is_zero(alt_bn128_G1 *p) {
extern "C" bool libsnarkwrap_G1_is_zero(curve_G1 *p) {
return p->is_zero();
}
extern "C" bool libsnarkwrap_G1_is_equal(alt_bn128_G1 *p, alt_bn128_G1 *q) {
extern "C" bool libsnarkwrap_G1_is_equal(curve_G1 *p, curve_G1 *q) {
return *p == *q;
}
extern "C" alt_bn128_G1 libsnarkwrap_G1_add(alt_bn128_G1 *p, alt_bn128_G1 *q) {
extern "C" curve_G1 libsnarkwrap_G1_add(curve_G1 *p, curve_G1 *q) {
return *p + *q;
}
extern "C" alt_bn128_G1 libsnarkwrap_G1_sub(alt_bn128_G1 *p, alt_bn128_G1 *q) {
extern "C" curve_G1 libsnarkwrap_G1_sub(curve_G1 *p, curve_G1 *q) {
return *p - *q;
}
extern "C" alt_bn128_G1 libsnarkwrap_G1_neg(alt_bn128_G1 *p) {
extern "C" curve_G1 libsnarkwrap_G1_neg(curve_G1 *p) {
return -(*p);
}
extern "C" alt_bn128_G1 libsnarkwrap_G1_scalarmul(alt_bn128_G1 *p, FieldT *q) {
extern "C" curve_G1 libsnarkwrap_G1_scalarmul(curve_G1 *p, curve_Fr *q) {
return (*q) * (*p);
}
// G2
extern "C" alt_bn128_G2 libsnarkwrap_G2_zero() {
return alt_bn128_G2::zero();
extern "C" curve_G2 libsnarkwrap_G2_zero() {
return curve_G2::zero();
}
extern "C" alt_bn128_G2 libsnarkwrap_G2_one() {
return alt_bn128_G2::one();
extern "C" curve_G2 libsnarkwrap_G2_one() {
return curve_G2::one();
}
extern "C" alt_bn128_G2 libsnarkwrap_G2_random() {
return alt_bn128_G2::random_element();
extern "C" curve_G2 libsnarkwrap_G2_random() {
return curve_G2::random_element();
}
extern "C" bool libsnarkwrap_G2_is_zero(alt_bn128_G2 *p) {
extern "C" bool libsnarkwrap_G2_is_zero(curve_G2 *p) {
return p->is_zero();
}
extern "C" bool libsnarkwrap_G2_is_equal(alt_bn128_G2 *p, alt_bn128_G2 *q) {
extern "C" bool libsnarkwrap_G2_is_equal(curve_G2 *p, curve_G2 *q) {
return *p == *q;
}
extern "C" alt_bn128_G2 libsnarkwrap_G2_add(alt_bn128_G2 *p, alt_bn128_G2 *q) {
extern "C" curve_G2 libsnarkwrap_G2_add(curve_G2 *p, curve_G2 *q) {
return *p + *q;
}
extern "C" alt_bn128_G2 libsnarkwrap_G2_sub(alt_bn128_G2 *p, alt_bn128_G2 *q) {
extern "C" curve_G2 libsnarkwrap_G2_sub(curve_G2 *p, curve_G2 *q) {
return *p - *q;
}
extern "C" alt_bn128_G2 libsnarkwrap_G2_neg(alt_bn128_G2 *p) {
extern "C" curve_G2 libsnarkwrap_G2_neg(curve_G2 *p) {
return -(*p);
}
extern "C" alt_bn128_G2 libsnarkwrap_G2_scalarmul(alt_bn128_G2 *p, FieldT *q) {
extern "C" curve_G2 libsnarkwrap_G2_scalarmul(curve_G2 *p, curve_Fr *q) {
return (*q) * (*p);
}
// Pairing
extern "C" alt_bn128_GT libsnarkwrap_gt_exp(alt_bn128_GT *p, FieldT *s) {
extern "C" curve_GT libsnarkwrap_gt_exp(curve_GT *p, curve_Fr *s) {
return (*p) ^ (*s);
}
extern "C" alt_bn128_GT libsnarkwrap_pairing(alt_bn128_G1 *p, alt_bn128_G2 *q) {
return alt_bn128_reduced_pairing(*p, *q);
extern "C" curve_GT libsnarkwrap_pairing(curve_G1 *p, curve_G2 *q) {
return curve_pp::reduced_pairing(*p, *q);
}

1
snark/xbyak Submodule

@ -0,0 +1 @@
Subproject commit 316e68b8c85f7a064a56465e253c022203eef4bd