1
0
Fork 0
mirror of synced 2025-09-24 04:40:05 +00:00
ZoKrates/lib/wraplibsnark.cpp
2017-02-07 11:53:42 +01:00

67 lines
2.9 KiB
C++

/**
* @file wraplibsnark.cpp
* @author Dennis Kuhnert <dennis.kuhnert@campus.tu-berlin.de>
* @date 2017
*/
#include "wraplibsnark.hpp"
#include <iostream>
#include <cassert>
#include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp"
#include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/examples/run_r1cs_ppzksnark.hpp"
using namespace std;
using namespace libsnark;
bool _run_libsnark(const int* A, const int* B, const int* C, const int* witness, int constraints, int variables){
r1cs_constraint_system<Fr<default_r1cs_ppzksnark_pp> > cs;
cs.primary_input_size = variables - 1;
cs.auxiliary_input_size = 0;
cout << endl << "run_libsnark" << endl;
for (int row = 0; row < constraints; row++) {
// cout << "row " << row << endl;
linear_combination<Fr<default_r1cs_ppzksnark_pp> > lin_comb_A, lin_comb_B, lin_comb_C;
for (int idx = 0; idx < variables; idx++) {
// using (constraints + 2) because of the representation of Rust's Vec<_>
if (A[row * (constraints + 2) + idx] != 0) {
// cout << "A(" << idx << ", " << A[row * (constraints + 2) + idx] << ")" << endl;
lin_comb_A.add_term(idx, A[row * (constraints + 2) + idx]);
}
if (B[row * (constraints + 2) + idx] != 0) {
// cout << "B(" << idx << ", " << B[row * (constraints + 2) + idx] << ")" << endl;
lin_comb_B.add_term(idx, B[row * (constraints + 2) + idx]);
}
if (C[row * (constraints + 2) + idx] != 0) {
// cout << "C(" << idx << ", " << C[row * (constraints + 2) + idx] << ")" << endl;
lin_comb_C.add_term(idx, C[row * (constraints + 2) + idx]);
}
}
cs.add_constraint(r1cs_constraint<Fr<default_r1cs_ppzksnark_pp> >(lin_comb_A, lin_comb_B, lin_comb_C));
}
r1cs_variable_assignment<Fr<default_r1cs_ppzksnark_pp> > full_variable_assignment;
for (int i = 1; i < variables; i++) {
full_variable_assignment.push_back(witness[i]);
}
r1cs_primary_input<Fr<default_r1cs_ppzksnark_pp> > primary_input(full_variable_assignment.begin(), full_variable_assignment.begin() + variables - 1);
r1cs_primary_input<Fr<default_r1cs_ppzksnark_pp> > auxiliary_input(full_variable_assignment.begin() + variables - 1, full_variable_assignment.end());
/* sanity checks */
assert(cs.num_variables() == full_variable_assignment.size());
assert(cs.num_variables() >= variables - 1);
assert(cs.num_inputs() == variables - 1);
assert(cs.num_constraints() == constraints);
assert(cs.is_satisfied(primary_input, auxiliary_input));
r1cs_example<Fr<default_r1cs_ppzksnark_pp> > example = r1cs_example<Fr<default_r1cs_ppzksnark_pp> >(std::move(cs), std::move(primary_input), std::move(auxiliary_input));
print_header("(enter) Profile R1CS ppzkSNARK");
default_r1cs_ppzksnark_pp::init_public_params();
const bool test_serialization = true;
bool result = run_r1cs_ppzksnark<default_r1cs_ppzksnark_pp>(example, test_serialization);
print_header("(leave) Profile R1CS ppzkSNARK");
return result;
}