diff --git a/.gitmodules b/.gitmodules index adf23b9..afc046d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 diff --git a/snark/ate-pairing b/snark/ate-pairing new file mode 160000 index 0000000..dcb9da9 --- /dev/null +++ b/snark/ate-pairing @@ -0,0 +1 @@ +Subproject commit dcb9da999b1113f90b115bccb6f4b57ddf3a8452 diff --git a/snark/libsnark b/snark/libsnark index a703148..fa10787 160000 --- a/snark/libsnark +++ b/snark/libsnark @@ -1 +1 @@ -Subproject commit a7031481fd8d2360337321401fe8e24f0359317a +Subproject commit fa107871c84297dbf2f6ce8f1ddb9b682587d01c diff --git a/snark/src/build.rs b/snark/src/build.rs index 4834c02..aef54fd 100644 --- a/snark/src/build.rs +++ b/snark/src/build.rs @@ -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"); + } } diff --git a/snark/src/fr.rs b/snark/src/fr.rs index 2a71374..b6e5801 100644 --- a/snark/src/fr.rs +++ b/snark/src/fr.rs @@ -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"); diff --git a/snark/src/libsnarkwrap.cpp b/snark/src/libsnarkwrap.cpp index 406330c..6488ef0 100644 --- a/snark/src/libsnarkwrap.cpp +++ b/snark/src/libsnarkwrap.cpp @@ -1,12 +1,8 @@ #include #include #include -#include "algebra/curves/alt_bn128/alt_bn128_g1.hpp" #include -#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 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); } diff --git a/snark/xbyak b/snark/xbyak new file mode 160000 index 0000000..316e68b --- /dev/null +++ b/snark/xbyak @@ -0,0 +1 @@ +Subproject commit 316e68b8c85f7a064a56465e253c022203eef4bd