varscalarmul.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <stdlib.h>
  2. #include <iostream>
  3. #include <fstream>
  4. #include "ecgadget.hpp"
  5. #include "scalarmul.hpp"
  6. using namespace libsnark;
  7. using namespace std;
  8. int main()
  9. {
  10. // Initialize the curve parameters
  11. default_r1cs_gg_ppzksnark_pp::init_public_params();
  12. typedef libff::Fr<default_r1cs_gg_ppzksnark_pp> FieldT;
  13. // Create protoboard
  14. libff::start_profiling();
  15. cout << "Keypair" << endl;
  16. protoboard<FieldT> pb;
  17. pb_variable<FieldT> outx, outy;
  18. pb_variable<FieldT> s;
  19. pb_variable_array<FieldT> Ptable;
  20. // A variable base point P
  21. const FieldT Px = FieldT("1095194319010475832867263440470707690447963461907735667341232728633587089702");
  22. const FieldT Py = FieldT("9185463202887631101218413269806857706246311016297504828581985913021301344974");
  23. // Allocate variables
  24. size_t numbits = FieldT::num_bits;
  25. outx.allocate(pb, "outx");
  26. outy.allocate(pb, "outy");
  27. Ptable.allocate(pb, 2*numbits, "Ptable");
  28. s.allocate(pb, "s");
  29. // This sets up the protoboard variables so that the first n of them
  30. // represent the public input and the rest is private input
  31. pb.set_input_sizes(2+2*numbits);
  32. // Initialize the gadget
  33. ec_scalarmul_gadget<FieldT> sm(pb, outx, outy, s, Ptable);
  34. sm.generate_r1cs_constraints();
  35. const r1cs_constraint_system<FieldT> constraint_system = pb.get_constraint_system();
  36. const r1cs_gg_ppzksnark_keypair<default_r1cs_gg_ppzksnark_pp> keypair = r1cs_gg_ppzksnark_generator<default_r1cs_gg_ppzksnark_pp>(constraint_system);
  37. // Add witness values
  38. cout << "Prover" << endl;
  39. pb.val(s) = FieldT::random_element();
  40. cout << "Computing " << pb.val(s) << "*G" << endl;
  41. ec_scalarmul_gadget<FieldT>::compute_Ptable(pb, Ptable, Px, Py);
  42. sm.generate_r1cs_witness();
  43. const r1cs_gg_ppzksnark_proof<default_r1cs_gg_ppzksnark_pp> proof = r1cs_gg_ppzksnark_prover<default_r1cs_gg_ppzksnark_pp>(keypair.pk, pb.primary_input(), pb.auxiliary_input());
  44. cout << "Verifier" << endl;
  45. bool verified = r1cs_gg_ppzksnark_verifier_strong_IC<default_r1cs_gg_ppzksnark_pp>(keypair.vk, pb.primary_input(), proof);
  46. cout << "Number of R1CS constraints: " << constraint_system.num_constraints() << endl;
  47. cout << "Primary (public) input length: " << pb.primary_input().size() << endl;
  48. // cout << "Primary (public) input: " << pb.primary_input() << endl;
  49. cout << "Auxiliary (private) input length: " << pb.auxiliary_input().size() << endl;
  50. // cout << "Auxiliary (private) input: " << pb.auxiliary_input() << endl;
  51. cout << "Verification status: " << verified << endl;
  52. ofstream pkfile("pk_varscalarmul");
  53. pkfile << keypair.pk;
  54. pkfile.close();
  55. ofstream vkfile("vk_varscalarmul");
  56. vkfile << keypair.vk;
  57. vkfile.close();
  58. ofstream pffile("proof_varscalarmul");
  59. pffile << proof;
  60. pffile.close();
  61. cout << pb.val(s) << "*P" << " = (" << pb.val(outx) << ", " << pb.val(outy) << ")" << endl;
  62. return 0;
  63. }