Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
uscs_ppzksnark.hpp
Go to the documentation of this file.
1 
47 #ifndef USCS_PPZKSNARK_HPP_
48 #define USCS_PPZKSNARK_HPP_
49 
50 #include <libff/algebra/curves/public_params.hpp>
55 #include <memory>
56 
57 namespace libsnark
58 {
59 
60 /******************************** Proving key ********************************/
61 
62 template<typename ppT> class uscs_ppzksnark_proving_key;
63 
64 template<typename ppT>
65 std::ostream &operator<<(
66  std::ostream &out, const uscs_ppzksnark_proving_key<ppT> &pk);
67 
68 template<typename ppT>
69 std::istream &operator>>(std::istream &in, uscs_ppzksnark_proving_key<ppT> &pk);
70 
74 template<typename ppT> class uscs_ppzksnark_proving_key
75 {
76 public:
77  libff::G1_vector<ppT> V_g1_query;
78  libff::G1_vector<ppT> alpha_V_g1_query;
79  libff::G1_vector<ppT> H_g1_query;
80  libff::G2_vector<ppT> V_g2_query;
81 
83 
86  const uscs_ppzksnark_proving_key<ppT> &other) = default;
88  default;
90  default;
92  libff::G1_vector<ppT> &&V_g1_query,
93  libff::G1_vector<ppT> &&alpha_V_g1_query,
94  libff::G1_vector<ppT> &&H_g1_query,
95  libff::G2_vector<ppT> &&V_g2_query,
97  : V_g1_query(std::move(V_g1_query))
99  , H_g1_query(std::move(H_g1_query))
100  , V_g2_query(std::move(V_g2_query))
101  , constraint_system(std::move(constraint_system)){};
102 
103  size_t G1_size() const
104  {
105  return V_g1_query.size() + alpha_V_g1_query.size() + H_g1_query.size();
106  }
107 
108  size_t G2_size() const { return V_g2_query.size(); }
109 
110  size_t G1_sparse_size() const { return G1_size(); }
111 
112  size_t G2_sparse_size() const { return G2_size(); }
113 
114  size_t size_in_bits() const
115  {
116  return libff::G1<ppT>::size_in_bits() * G1_size() +
117  libff::G2<ppT>::size_in_bits() * G2_size();
118  }
119 
120  void print_size() const
121  {
122  libff::print_indent();
123  printf("* G1 elements in PK: %zu\n", this->G1_size());
124  libff::print_indent();
125  printf("* Non-zero G1 elements in PK: %zu\n", this->G1_sparse_size());
126  libff::print_indent();
127  printf("* G2 elements in PK: %zu\n", this->G2_size());
128  libff::print_indent();
129  printf("* Non-zero G2 elements in PK: %zu\n", this->G2_sparse_size());
130  libff::print_indent();
131  printf("* PK size in bits: %zu\n", this->size_in_bits());
132  }
133 
134  bool operator==(const uscs_ppzksnark_proving_key<ppT> &other) const;
135  friend std::ostream &operator<<<ppT>(
136  std::ostream &out, const uscs_ppzksnark_proving_key<ppT> &pk);
137  friend std::istream &operator>>
138  <ppT>(std::istream &in, uscs_ppzksnark_proving_key<ppT> &pk);
139 };
140 
141 /******************************* Verification key ****************************/
142 
143 template<typename ppT> class uscs_ppzksnark_verification_key;
144 
145 template<typename ppT>
146 std::ostream &operator<<(
147  std::ostream &out, const uscs_ppzksnark_verification_key<ppT> &vk);
148 
149 template<typename ppT>
150 std::istream &operator>>(
151  std::istream &in, uscs_ppzksnark_verification_key<ppT> &vk);
152 
156 template<typename ppT> class uscs_ppzksnark_verification_key
157 {
158 public:
159  libff::G2<ppT> tilde_g2;
160  libff::G2<ppT> alpha_tilde_g2;
161  libff::G2<ppT> Z_g2;
162 
164 
167  const libff::G2<ppT> &tilde_g2,
168  const libff::G2<ppT> &alpha_tilde_g2,
169  const libff::G2<ppT> &Z_g2,
170  const accumulation_vector<libff::G1<ppT>> &eIC)
171  : tilde_g2(tilde_g2)
173  , Z_g2(Z_g2)
174  , encoded_IC_query(eIC){};
175 
176  size_t G1_size() const { return encoded_IC_query.size(); }
177 
178  size_t G2_size() const { return 3; }
179 
180  size_t size_in_bits() const
181  {
182  return encoded_IC_query.size_in_bits() +
183  3 * libff::G2<ppT>::size_in_bits();
184  }
185 
186  void print_size() const
187  {
188  libff::print_indent();
189  printf("* G1 elements in VK: %zu\n", this->G1_size());
190  libff::print_indent();
191  printf("* G2 elements in VK: %zu\n", this->G2_size());
192  libff::print_indent();
193  printf("* VK size in bits: %zu\n", this->size_in_bits());
194  }
195 
196  bool operator==(const uscs_ppzksnark_verification_key<ppT> &other) const;
197  friend std::ostream &operator<<<ppT>(
198  std::ostream &out, const uscs_ppzksnark_verification_key<ppT> &vk);
199  friend std::istream &operator>>
200  <ppT>(std::istream &in, uscs_ppzksnark_verification_key<ppT> &vk);
201 
203  const size_t input_size);
204 };
205 
206 /************************ Processed verification key *************************/
207 
208 template<typename ppT> class uscs_ppzksnark_processed_verification_key;
209 
210 template<typename ppT>
211 std::ostream &operator<<(
212  std::ostream &out,
214 
215 template<typename ppT>
216 std::istream &operator>>(
217  std::istream &in, uscs_ppzksnark_processed_verification_key<ppT> &pvk);
218 
226 template<typename ppT> class uscs_ppzksnark_processed_verification_key
227 {
228 public:
229  libff::G1_precomp<ppT> pp_G1_one_precomp;
230  libff::G2_precomp<ppT> pp_G2_one_precomp;
231  libff::G2_precomp<ppT> vk_tilde_g2_precomp;
232  libff::G2_precomp<ppT> vk_alpha_tilde_g2_precomp;
233  libff::G2_precomp<ppT> vk_Z_g2_precomp;
234  libff::GT<ppT> pairing_of_g1_and_g2;
235 
237 
238  bool operator==(
239  const uscs_ppzksnark_processed_verification_key &other) const;
240  friend std::ostream &operator<<<ppT>(
241  std::ostream &out,
243  friend std::istream &operator>><ppT>(
244  std::istream &in, uscs_ppzksnark_processed_verification_key<ppT> &pvk);
245 };
246 
247 /********************************** Key pair *********************************/
248 
253 template<typename ppT> class uscs_ppzksnark_keypair
254 {
255 public:
258 
263  : pk(std::move(pk)), vk(std::move(vk))
264  {
265  }
266 
268 };
269 
270 /*********************************** Proof ***********************************/
271 
272 template<typename ppT> class uscs_ppzksnark_proof;
273 
274 template<typename ppT>
275 std::ostream &operator<<(
276  std::ostream &out, const uscs_ppzksnark_proof<ppT> &proof);
277 
278 template<typename ppT>
279 std::istream &operator>>(std::istream &in, uscs_ppzksnark_proof<ppT> &proof);
280 
288 template<typename ppT> class uscs_ppzksnark_proof
289 {
290 public:
291  libff::G1<ppT> V_g1;
292  libff::G1<ppT> alpha_V_g1;
293  libff::G1<ppT> H_g1;
294  libff::G2<ppT> V_g2;
295 
297  {
298  // invalid proof with valid curve points
299  this->V_g1 = libff::G1<ppT>::one();
300  this->alpha_V_g1 = libff::G1<ppT>::one();
301  this->H_g1 = libff::G1<ppT>::one();
302  this->V_g2 = libff::G2<ppT>::one();
303  }
305  libff::G1<ppT> &&V_g1,
306  libff::G1<ppT> &&alpha_V_g1,
307  libff::G1<ppT> &&H_g1,
308  libff::G2<ppT> &&V_g2)
309  : V_g1(std::move(V_g1))
310  , alpha_V_g1(std::move(alpha_V_g1))
311  , H_g1(std::move(H_g1))
312  , V_g2(std::move(V_g2)){};
313 
314  size_t G1_size() const { return 3; }
315 
316  size_t G2_size() const { return 1; }
317 
318  size_t size_in_bits() const
319  {
320  return G1_size() * libff::G1<ppT>::size_in_bits() +
321  G2_size() * libff::G2<ppT>::size_in_bits();
322  }
323 
324  void print_size() const
325  {
326  libff::print_indent();
327  printf("* G1 elements in proof: %zu\n", this->G1_size());
328  libff::print_indent();
329  printf("* G2 elements in proof: %zu\n", this->G2_size());
330  libff::print_indent();
331  printf("* Proof size in bits: %zu\n", this->size_in_bits());
332  }
333 
334  bool is_well_formed() const
335  {
336  return (
337  V_g1.is_well_formed() && alpha_V_g1.is_well_formed() &&
338  H_g1.is_well_formed() && V_g2.is_well_formed());
339  }
340 
341  bool operator==(const uscs_ppzksnark_proof<ppT> &other) const;
342  friend std::ostream &operator<<<ppT>(
343  std::ostream &out, const uscs_ppzksnark_proof<ppT> &proof);
344  friend std::istream &operator>>
345  <ppT>(std::istream &in, uscs_ppzksnark_proof<ppT> &proof);
346 };
347 
348 /***************************** Main algorithms *******************************/
349 
356 template<
357  typename ppT,
358  libff::multi_exp_base_form BaseForm = libff::multi_exp_base_form_normal>
359 uscs_ppzksnark_keypair<ppT> uscs_ppzksnark_generator(
360  const uscs_ppzksnark_constraint_system<ppT> &cs);
361 
371 template<
372  typename ppT,
373  libff::multi_exp_method Method = libff::multi_exp_method_BDLO12,
374  libff::multi_exp_base_form BaseForm = libff::multi_exp_base_form_normal>
375 uscs_ppzksnark_proof<ppT> uscs_ppzksnark_prover(
376  const uscs_ppzksnark_proving_key<ppT> &pk,
377  const uscs_ppzksnark_primary_input<ppT> &primary_input,
378  const uscs_ppzksnark_auxiliary_input<ppT> &auxiliary_input);
379 
380 /*
381  Below are four variants of verifier algorithm for the USCS ppzkSNARK.
382 
383  These are the four cases that arise from the following two choices:
384 
385  (1) The verifier accepts a (non-processed) verification key or, instead, a
386  processed verification key. In the latter case, we call the algorithm an
387  "online verifier".
388 
389  (2) The verifier checks for "weak" input consistency or, instead, "strong"
390  input consistency. Strong input consistency requires that |primary_input| =
391  CS.num_inputs, whereas weak input consistency requires that |primary_input| <=
392  CS.num_inputs (and the primary input is implicitly padded with zeros up to
393  length CS.num_inputs).
394  */
395 
401 template<typename ppT>
403  const uscs_ppzksnark_verification_key<ppT> &vk,
404  const uscs_ppzksnark_primary_input<ppT> &primary_input,
405  const uscs_ppzksnark_proof<ppT> &proof);
406 
412 template<typename ppT>
414  const uscs_ppzksnark_verification_key<ppT> &vk,
415  const uscs_ppzksnark_primary_input<ppT> &primary_input,
416  const uscs_ppzksnark_proof<ppT> &proof);
417 
421 template<typename ppT>
422 uscs_ppzksnark_processed_verification_key<ppT> uscs_ppzksnark_verifier_process_vk(
423  const uscs_ppzksnark_verification_key<ppT> &vk);
424 
430 template<typename ppT>
432  const uscs_ppzksnark_processed_verification_key<ppT> &pvk,
433  const uscs_ppzksnark_primary_input<ppT> &primary_input,
434  const uscs_ppzksnark_proof<ppT> &proof);
435 
441 template<typename ppT>
443  const uscs_ppzksnark_processed_verification_key<ppT> &pvk,
444  const uscs_ppzksnark_primary_input<ppT> &primary_input,
445  const uscs_ppzksnark_proof<ppT> &proof);
446 
447 } // namespace libsnark
448 
450 
451 #endif // USCS_PPZKSNARK_HPP_
libsnark::uscs_ppzksnark_verifier_strong_IC
bool uscs_ppzksnark_verifier_strong_IC(const uscs_ppzksnark_verification_key< ppT > &vk, const uscs_ppzksnark_primary_input< ppT > &primary_input, const uscs_ppzksnark_proof< ppT > &proof)
libsnark::uscs_ppzksnark_proving_key::H_g1_query
libff::G1_vector< ppT > H_g1_query
Definition: uscs_ppzksnark.hpp:79
libsnark::uscs_ppzksnark_verification_key::dummy_verification_key
static uscs_ppzksnark_verification_key< ppT > dummy_verification_key(const size_t input_size)
uscs_ppzksnark.tcc
accumulation_vector.hpp
libsnark::uscs_ppzksnark_proving_key::G1_sparse_size
size_t G1_sparse_size() const
Definition: uscs_ppzksnark.hpp:110
libsnark::uscs_ppzksnark_verifier_weak_IC
bool uscs_ppzksnark_verifier_weak_IC(const uscs_ppzksnark_verification_key< ppT > &vk, const uscs_ppzksnark_primary_input< ppT > &primary_input, const uscs_ppzksnark_proof< ppT > &proof)
libsnark::uscs_ppzksnark_verification_key::encoded_IC_query
accumulation_vector< libff::G1< ppT > > encoded_IC_query
Definition: uscs_ppzksnark.hpp:163
libsnark::uscs_ppzksnark_verification_key::Z_g2
libff::G2< ppT > Z_g2
Definition: uscs_ppzksnark.hpp:161
libsnark::uscs_ppzksnark_verification_key::operator==
bool operator==(const uscs_ppzksnark_verification_key< ppT > &other) const
libsnark::uscs_ppzksnark_keypair::pk
uscs_ppzksnark_proving_key< ppT > pk
Definition: uscs_ppzksnark.hpp:256
libsnark::uscs_ppzksnark_proving_key::constraint_system
uscs_ppzksnark_constraint_system< ppT > constraint_system
Definition: uscs_ppzksnark.hpp:82
libsnark
Definition: accumulation_vector.hpp:18
libsnark::operator<<
std::ostream & operator<<(std::ostream &out, const accumulation_vector< T > &v)
libsnark::uscs_ppzksnark_verification_key::alpha_tilde_g2
libff::G2< ppT > alpha_tilde_g2
Definition: uscs_ppzksnark.hpp:160
libsnark::accumulation_vector
Definition: accumulation_vector.hpp:21
libsnark::uscs_ppzksnark_processed_verification_key::operator==
bool operator==(const uscs_ppzksnark_processed_verification_key &other) const
libsnark::uscs_ppzksnark_online_verifier_weak_IC
bool uscs_ppzksnark_online_verifier_weak_IC(const uscs_ppzksnark_processed_verification_key< ppT > &pvk, const uscs_ppzksnark_primary_input< ppT > &primary_input, const uscs_ppzksnark_proof< ppT > &proof)
libsnark::uscs_ppzksnark_verification_key
Definition: uscs_ppzksnark.hpp:143
libsnark::uscs_ppzksnark_proof::alpha_V_g1
libff::G1< ppT > alpha_V_g1
Definition: uscs_ppzksnark.hpp:292
libsnark::uscs_ppzksnark_verification_key::G2_size
size_t G2_size() const
Definition: uscs_ppzksnark.hpp:178
libsnark::uscs_ppzksnark_proof::H_g1
libff::G1< ppT > H_g1
Definition: uscs_ppzksnark.hpp:293
libsnark::uscs_ppzksnark_proof::V_g2
libff::G2< ppT > V_g2
Definition: uscs_ppzksnark.hpp:294
libsnark::uscs_ppzksnark_verification_key::uscs_ppzksnark_verification_key
uscs_ppzksnark_verification_key(const libff::G2< ppT > &tilde_g2, const libff::G2< ppT > &alpha_tilde_g2, const libff::G2< ppT > &Z_g2, const accumulation_vector< libff::G1< ppT >> &eIC)
Definition: uscs_ppzksnark.hpp:166
libsnark::uscs_ppzksnark_proving_key::V_g2_query
libff::G2_vector< ppT > V_g2_query
Definition: uscs_ppzksnark.hpp:80
libsnark::uscs_ppzksnark_verification_key::print_size
void print_size() const
Definition: uscs_ppzksnark.hpp:186
libsnark::uscs_ppzksnark_proving_key::print_size
void print_size() const
Definition: uscs_ppzksnark.hpp:120
libsnark::uscs_ppzksnark_proving_key::alpha_V_g1_query
libff::G1_vector< ppT > alpha_V_g1_query
Definition: uscs_ppzksnark.hpp:78
libsnark::uscs_ppzksnark_verification_key::uscs_ppzksnark_verification_key
uscs_ppzksnark_verification_key()=default
libsnark::uscs_ppzksnark_keypair::uscs_ppzksnark_keypair
uscs_ppzksnark_keypair()
Definition: uscs_ppzksnark.hpp:259
libsnark::uscs_ppzksnark_verification_key::size_in_bits
size_t size_in_bits() const
Definition: uscs_ppzksnark.hpp:180
libsnark::uscs_ppzksnark_proving_key::G2_sparse_size
size_t G2_sparse_size() const
Definition: uscs_ppzksnark.hpp:112
libsnark::uscs_ppzksnark_processed_verification_key::vk_alpha_tilde_g2_precomp
libff::G2_precomp< ppT > vk_alpha_tilde_g2_precomp
Definition: uscs_ppzksnark.hpp:232
libsnark::uscs_ppzksnark_proving_key::operator=
uscs_ppzksnark_proving_key< ppT > & operator=(const uscs_ppzksnark_proving_key< ppT > &other)=default
libsnark::accumulation_vector::size_in_bits
size_t size_in_bits() const
libsnark::uscs_ppzksnark_processed_verification_key::vk_tilde_g2_precomp
libff::G2_precomp< ppT > vk_tilde_g2_precomp
Definition: uscs_ppzksnark.hpp:231
libsnark::uscs_ppzksnark_proving_key::V_g1_query
libff::G1_vector< ppT > V_g1_query
Definition: uscs_ppzksnark.hpp:77
libsnark::uscs_ppzksnark_keypair
Definition: uscs_ppzksnark.hpp:253
libsnark::uscs_ppzksnark_proof::uscs_ppzksnark_proof
uscs_ppzksnark_proof()
Definition: uscs_ppzksnark.hpp:296
libsnark::uscs_ppzksnark_proof::uscs_ppzksnark_proof
uscs_ppzksnark_proof(libff::G1< ppT > &&V_g1, libff::G1< ppT > &&alpha_V_g1, libff::G1< ppT > &&H_g1, libff::G2< ppT > &&V_g2)
Definition: uscs_ppzksnark.hpp:304
libsnark::uscs_ppzksnark_proving_key
Definition: uscs_ppzksnark.hpp:62
libsnark::uscs_ppzksnark_verification_key::G1_size
size_t G1_size() const
Definition: uscs_ppzksnark.hpp:176
libsnark::uscs_ppzksnark_proof::operator==
bool operator==(const uscs_ppzksnark_proof< ppT > &other) const
libsnark::uscs_ppzksnark_proving_key::uscs_ppzksnark_proving_key
uscs_ppzksnark_proving_key(libff::G1_vector< ppT > &&V_g1_query, libff::G1_vector< ppT > &&alpha_V_g1_query, libff::G1_vector< ppT > &&H_g1_query, libff::G2_vector< ppT > &&V_g2_query, uscs_ppzksnark_constraint_system< ppT > &&constraint_system)
Definition: uscs_ppzksnark.hpp:91
libsnark::uscs_ppzksnark_proof::size_in_bits
size_t size_in_bits() const
Definition: uscs_ppzksnark.hpp:318
libsnark::uscs_ppzksnark_keypair::uscs_ppzksnark_keypair
uscs_ppzksnark_keypair(uscs_ppzksnark_proving_key< ppT > &&pk, uscs_ppzksnark_verification_key< ppT > &&vk)
Definition: uscs_ppzksnark.hpp:260
libsnark::uscs_ppzksnark_verification_key::tilde_g2
libff::G2< ppT > tilde_g2
Definition: uscs_ppzksnark.hpp:159
libsnark::uscs_ppzksnark_online_verifier_strong_IC
bool uscs_ppzksnark_online_verifier_strong_IC(const uscs_ppzksnark_processed_verification_key< ppT > &pvk, const uscs_ppzksnark_primary_input< ppT > &primary_input, const uscs_ppzksnark_proof< ppT > &proof)
knowledge_commitment.hpp
libsnark::uscs_ppzksnark_verifier_process_vk
uscs_ppzksnark_processed_verification_key< ppT > uscs_ppzksnark_verifier_process_vk(const uscs_ppzksnark_verification_key< ppT > &vk)
libsnark::uscs_ppzksnark_proving_key::G2_size
size_t G2_size() const
Definition: uscs_ppzksnark.hpp:108
libsnark::uscs_constraint_system
Definition: uscs.hpp:57
libsnark::uscs_ppzksnark_processed_verification_key::pp_G2_one_precomp
libff::G2_precomp< ppT > pp_G2_one_precomp
Definition: uscs_ppzksnark.hpp:230
libsnark::accumulation_vector::size
size_t size() const
libsnark::uscs_ppzksnark_proving_key::G1_size
size_t G1_size() const
Definition: uscs_ppzksnark.hpp:103
uscs_ppzksnark_params.hpp
libsnark::operator>>
std::istream & operator>>(std::istream &in, accumulation_vector< T > &v)
libsnark::uscs_ppzksnark_proof
Definition: uscs_ppzksnark.hpp:272
uscs.hpp
libsnark::uscs_ppzksnark_proof::G1_size
size_t G1_size() const
Definition: uscs_ppzksnark.hpp:314
libsnark::uscs_ppzksnark_prover
uscs_ppzksnark_proof< ppT > uscs_ppzksnark_prover(const uscs_ppzksnark_proving_key< ppT > &pk, const uscs_ppzksnark_primary_input< ppT > &primary_input, const uscs_ppzksnark_auxiliary_input< ppT > &auxiliary_input)
libsnark::uscs_ppzksnark_processed_verification_key::pp_G1_one_precomp
libff::G1_precomp< ppT > pp_G1_one_precomp
Definition: uscs_ppzksnark.hpp:229
libsnark::uscs_ppzksnark_proving_key::size_in_bits
size_t size_in_bits() const
Definition: uscs_ppzksnark.hpp:114
libsnark::uscs_ppzksnark_processed_verification_key::encoded_IC_query
accumulation_vector< libff::G1< ppT > > encoded_IC_query
Definition: uscs_ppzksnark.hpp:236
libsnark::uscs_ppzksnark_keypair::vk
uscs_ppzksnark_verification_key< ppT > vk
Definition: uscs_ppzksnark.hpp:257
libsnark::uscs_ppzksnark_processed_verification_key
Definition: uscs_ppzksnark.hpp:208
libsnark::uscs_ppzksnark_proof::print_size
void print_size() const
Definition: uscs_ppzksnark.hpp:324
libsnark::uscs_ppzksnark_proving_key::uscs_ppzksnark_proving_key
uscs_ppzksnark_proving_key()
Definition: uscs_ppzksnark.hpp:84
libsnark::uscs_ppzksnark_processed_verification_key::vk_Z_g2_precomp
libff::G2_precomp< ppT > vk_Z_g2_precomp
Definition: uscs_ppzksnark.hpp:233
libsnark::uscs_ppzksnark_proof::G2_size
size_t G2_size() const
Definition: uscs_ppzksnark.hpp:316
libsnark::uscs_ppzksnark_proof::is_well_formed
bool is_well_formed() const
Definition: uscs_ppzksnark.hpp:334
libsnark::uscs_ppzksnark_proof::V_g1
libff::G1< ppT > V_g1
Definition: uscs_ppzksnark.hpp:291
libsnark::uscs_ppzksnark_processed_verification_key::pairing_of_g1_and_g2
libff::GT< ppT > pairing_of_g1_and_g2
Definition: uscs_ppzksnark.hpp:234
libsnark::uscs_ppzksnark_generator
uscs_ppzksnark_keypair< ppT > uscs_ppzksnark_generator(const uscs_ppzksnark_constraint_system< ppT > &cs)
libsnark::uscs_ppzksnark_proving_key::operator==
bool operator==(const uscs_ppzksnark_proving_key< ppT > &other) const