#include #include #include #include "libff/algebra/fields/field_utils.hpp" #include "libsnark/zk_proof_systems/ppzksnark/r1cs_ppzksnark/r1cs_ppzksnark.hpp" #include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp" #include "libsnark/gadgetlib1/pb_variable.hpp" #include "ecgadget.hpp" using namespace libsnark; using namespace std; int main() { // Initialize the curve parameters default_r1cs_ppzksnark_pp::init_public_params(); typedef libff::Fr FieldT; // Create protoboard libff::start_profiling(); cout << "Keypair" << endl; protoboard pb; pb_variable outx, outy; pb_variable a, b; // Allocate variables outx.allocate(pb, "outx"); outy.allocate(pb, "outy"); a.allocate(pb, "a"); b.allocate(pb, "b"); // This sets up the protoboard variables so that the first n of them // represent the public input and the rest is private input pb.set_input_sizes(2); // Initialize gadget ec_pedersen_gadget ped(pb, outx, outy, a, b); ped.generate_r1cs_constraints(); const r1cs_constraint_system constraint_system = pb.get_constraint_system(); const r1cs_ppzksnark_keypair keypair = r1cs_ppzksnark_generator(constraint_system); // Add witness values cout << "Prover" << endl; pb.val(a) = FieldT::random_element(); pb.val(b) = FieldT::random_element(); cout << "Computing " << pb.val(a) << "*G + " << pb.val(b) << "*H" << endl; ped.generate_r1cs_witness(); const r1cs_ppzksnark_proof proof = r1cs_ppzksnark_prover(keypair.pk, pb.primary_input(), pb.auxiliary_input()); cout << "Verifier" << endl; bool verified = r1cs_ppzksnark_verifier_strong_IC(keypair.vk, pb.primary_input(), proof); cout << "Number of R1CS constraints: " << constraint_system.num_constraints() << endl; cout << "Primary (public) input: " << pb.primary_input() << endl; cout << "Auxiliary (private) input: " << pb.auxiliary_input() << endl; cout << "Verification status: " << verified << endl; ofstream pkfile("pk_pedersen"); pkfile << keypair.pk; pkfile.close(); ofstream vkfile("vk_pedersen"); vkfile << keypair.vk; vkfile.close(); ofstream pffile("proof_pedersen"); pffile << proof; pffile.close(); return 0; }