Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
r1cs_mp_ppzkpcd.hpp
Go to the documentation of this file.
1 
38 #ifndef R1CS_MP_PPZKPCD_HPP_
39 #define R1CS_MP_PPZKPCD_HPP_
40 
45 #include <memory>
46 #include <vector>
47 
48 namespace libsnark
49 {
50 
51 /******************************** Proving key ********************************/
52 
53 template<typename PCD_ppT> class r1cs_mp_ppzkpcd_proving_key;
54 
55 template<typename PCD_ppT>
56 std::ostream &operator<<(
57  std::ostream &out, const r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &pk);
58 
59 template<typename PCD_ppT>
60 std::istream &operator>>(
61  std::istream &in, r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &pk);
62 
66 template<typename PCD_ppT> class r1cs_mp_ppzkpcd_proving_key
67 {
68 public:
69  typedef typename PCD_ppT::curve_A_pp A_pp;
70  typedef typename PCD_ppT::curve_B_pp B_pp;
71 
72  std::vector<r1cs_mp_ppzkpcd_compliance_predicate<PCD_ppT>>
74 
75  std::vector<r1cs_ppzksnark_proving_key<A_pp>> compliance_step_r1cs_pks;
76  std::vector<r1cs_ppzksnark_proving_key<B_pp>> translation_step_r1cs_pks;
77 
78  std::vector<r1cs_ppzksnark_verification_key<A_pp>> compliance_step_r1cs_vks;
79  std::vector<r1cs_ppzksnark_verification_key<B_pp>>
81 
83  std::vector<set_membership_proof> compliance_step_r1cs_vk_membership_proofs;
84 
85  std::map<size_t, size_t> compliance_predicate_name_to_idx;
86 
89  const r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &other) = default;
91  default;
95  const std::vector<r1cs_ppzksnark_proving_key<A_pp>>
96  &compliance_step_r1cs_pk,
97  const std::vector<r1cs_ppzksnark_proving_key<B_pp>>
98  &translation_step_r1cs_pk,
99  const std::vector<r1cs_ppzksnark_verification_key<A_pp>>
100  &compliance_step_r1cs_vk,
101  const std::vector<r1cs_ppzksnark_verification_key<B_pp>>
102  &translation_step_r1cs_vk,
104  const std::vector<set_membership_proof>
106  const std::map<size_t, size_t> &compliance_predicate_name_to_idx)
117  {
118  }
119 
121  const r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &other) = default;
122 
123  size_t size_in_bits() const;
124 
125  bool is_well_formed() const;
126 
127  bool operator==(const r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &other) const;
128  friend std::ostream &operator<<<PCD_ppT>(
129  std::ostream &out, const r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &pk);
130  friend std::istream &operator>>
131  <PCD_ppT>(std::istream &in, r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &pk);
132 };
133 
134 /******************************* Verification key ****************************/
135 
136 template<typename PCD_ppT> class r1cs_mp_ppzkpcd_verification_key;
137 
138 template<typename PCD_ppT>
139 std::ostream &operator<<(
140  std::ostream &out, const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &vk);
141 
142 template<typename PCD_ppT>
143 std::istream &operator>>(
144  std::istream &in, r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &vk);
145 
149 template<typename PCD_ppT> class r1cs_mp_ppzkpcd_verification_key
150 {
151 public:
152  typedef typename PCD_ppT::curve_A_pp A_pp;
153  typedef typename PCD_ppT::curve_B_pp B_pp;
154 
155  std::vector<r1cs_ppzksnark_verification_key<A_pp>> compliance_step_r1cs_vks;
156  std::vector<r1cs_ppzksnark_verification_key<B_pp>>
159 
162  const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &other) = default;
166  const std::vector<r1cs_ppzksnark_verification_key<A_pp>>
168  const std::vector<r1cs_ppzksnark_verification_key<B_pp>>
175  {
176  }
177 
179  const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &other) = default;
180 
181  size_t size_in_bits() const;
182 
183  bool operator==(
184  const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &other) const;
185  friend std::ostream &operator<<<PCD_ppT>(
186  std::ostream &out, const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &vk);
187  friend std::istream &operator>><PCD_ppT>(
188  std::istream &in, r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &vk);
189 };
190 
191 /************************* Processed verification key
192  * **************************/
193 
194 template<typename PCD_ppT> class r1cs_mp_ppzkpcd_processed_verification_key;
195 
196 template<typename PCD_ppT>
197 std::ostream &operator<<(
198  std::ostream &out,
200 
201 template<typename PCD_ppT>
202 std::istream &operator>>(
204 
212 template<typename PCD_ppT> class r1cs_mp_ppzkpcd_processed_verification_key
213 {
214 public:
215  typedef typename PCD_ppT::curve_A_pp A_pp;
216  typedef typename PCD_ppT::curve_B_pp B_pp;
217 
218  std::vector<r1cs_ppzksnark_processed_verification_key<A_pp>>
220  std::vector<r1cs_ppzksnark_processed_verification_key<B_pp>>
223 
227  default;
240 
243  default;
244 
245  size_t size_in_bits() const;
246 
247  bool operator==(
249  friend std::ostream &operator<<<PCD_ppT>(
250  std::ostream &out,
252  friend std::istream &operator>><PCD_ppT>(
253  std::istream &in,
255 };
256 
257 /********************************** Key pair *********************************/
258 
263 template<typename PCD_ppT> class r1cs_mp_ppzkpcd_keypair
264 {
265 public:
268 
269  r1cs_mp_ppzkpcd_keypair() = default;
274  : pk(std::move(pk)), vk(std::move(vk)){};
275 };
276 
277 /*********************************** Proof ***********************************/
278 
279 template<typename ppT> class r1cs_mp_ppzkpcd_proof;
280 
281 template<typename ppT>
282 std::ostream &operator<<(
283  std::ostream &out, const r1cs_mp_ppzkpcd_proof<ppT> &proof);
284 
285 template<typename ppT>
286 std::istream &operator>>(std::istream &in, r1cs_mp_ppzkpcd_proof<ppT> &proof);
287 
291 template<typename PCD_ppT> class r1cs_mp_ppzkpcd_proof
292 {
293 public:
296 
297  r1cs_mp_ppzkpcd_proof() = default;
299  const size_t compliance_predicate_idx,
303  {
304  }
305 
306  size_t size_in_bits() const;
307 
308  bool operator==(const r1cs_mp_ppzkpcd_proof<PCD_ppT> &other) const;
309  friend std::ostream &operator<<<PCD_ppT>(
310  std::ostream &out, const r1cs_mp_ppzkpcd_proof<PCD_ppT> &proof);
311  friend std::istream &operator>>
312  <PCD_ppT>(std::istream &in, r1cs_mp_ppzkpcd_proof<PCD_ppT> &proof);
313 };
314 
315 /***************************** Main algorithms *******************************/
316 
323 template<typename PCD_ppT>
324 r1cs_mp_ppzkpcd_keypair<PCD_ppT> r1cs_mp_ppzkpcd_generator(
325  const std::vector<r1cs_mp_ppzkpcd_compliance_predicate<PCD_ppT>>
326  &compliance_predicates);
327 
336 template<typename PCD_ppT>
337 r1cs_mp_ppzkpcd_proof<PCD_ppT> r1cs_mp_ppzkpcd_prover(
338  const r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &pk,
339  const size_t compliance_predicate_name,
340  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
341  const r1cs_mp_ppzkpcd_auxiliary_input<PCD_ppT> &auxiliary_input,
342  const std::vector<r1cs_mp_ppzkpcd_proof<PCD_ppT>> &incoming_proofs);
343 
344 /*
345  Below are two variants of verifier algorithm for the R1CS (multi-predicate)
346  ppzkPCD.
347 
348  These are the two cases that arise from whether the verifier accepts a
349  (non-processed) verification key or, instead, a processed verification key.
350  In the latter case, we call the algorithm an "online verifier".
351 */
352 
357 template<typename PCD_ppT>
359  const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &vk,
360  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
361  const r1cs_mp_ppzkpcd_proof<PCD_ppT> &proof);
362 
366 template<typename PCD_ppT>
367 r1cs_mp_ppzkpcd_processed_verification_key<PCD_ppT> r1cs_mp_ppzkpcd_process_vk(
368  const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &vk);
369 
374 template<typename PCD_ppT>
376  const r1cs_mp_ppzkpcd_processed_verification_key<PCD_ppT> &pvk,
377  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
378  const r1cs_mp_ppzkpcd_proof<PCD_ppT> &proof);
379 
380 } // namespace libsnark
381 
383 
384 #endif // R1CS_MP_PPZKPCD_HPP_
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::size_in_bits
size_t size_in_bits() const
libsnark::r1cs_mp_ppzkpcd_proving_key::translation_step_r1cs_pks
std::vector< r1cs_ppzksnark_proving_key< B_pp > > translation_step_r1cs_pks
Definition: r1cs_mp_ppzkpcd.hpp:76
libsnark::r1cs_mp_ppzkpcd_proving_key::compliance_step_r1cs_vk_membership_proofs
std::vector< set_membership_proof > compliance_step_r1cs_vk_membership_proofs
Definition: r1cs_mp_ppzkpcd.hpp:83
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::B_pp
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_mp_ppzkpcd.hpp:216
libsnark::r1cs_mp_ppzkpcd_verification_key::translation_step_r1cs_vks
std::vector< r1cs_ppzksnark_verification_key< B_pp > > translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:157
libsnark::r1cs_mp_ppzkpcd_keypair::r1cs_mp_ppzkpcd_keypair
r1cs_mp_ppzkpcd_keypair(r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &&pk, r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &&vk)
Definition: r1cs_mp_ppzkpcd.hpp:271
libsnark::r1cs_mp_ppzkpcd_proving_key::compliance_predicate_name_to_idx
std::map< size_t, size_t > compliance_predicate_name_to_idx
Definition: r1cs_mp_ppzkpcd.hpp:85
libsnark::r1cs_mp_ppzkpcd_process_vk
r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > r1cs_mp_ppzkpcd_process_vk(const r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &vk)
libsnark
Definition: accumulation_vector.hpp:18
libsnark::r1cs_mp_ppzkpcd_proving_key::operator==
bool operator==(const r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &other) const
libsnark::operator<<
std::ostream & operator<<(std::ostream &out, const accumulation_vector< T > &v)
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::compliance_step_r1cs_pvks
std::vector< r1cs_ppzksnark_processed_verification_key< A_pp > > compliance_step_r1cs_pvks
Definition: r1cs_mp_ppzkpcd.hpp:219
libsnark::r1cs_mp_ppzkpcd_prover
r1cs_mp_ppzkpcd_proof< PCD_ppT > r1cs_mp_ppzkpcd_prover(const r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &pk, const size_t compliance_predicate_name, const r1cs_mp_ppzkpcd_primary_input< PCD_ppT > &primary_input, const r1cs_mp_ppzkpcd_auxiliary_input< PCD_ppT > &auxiliary_input, const std::vector< r1cs_mp_ppzkpcd_proof< PCD_ppT >> &incoming_proofs)
libsnark::set_commitment
libff::bit_vector set_commitment
Definition: set_commitment.hpp:22
libsnark::r1cs_mp_ppzkpcd_processed_verification_key
Definition: r1cs_mp_ppzkpcd.hpp:194
libsnark::r1cs_ppzksnark_processed_verification_key< A_pp >
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::r1cs_mp_ppzkpcd_processed_verification_key
r1cs_mp_ppzkpcd_processed_verification_key()=default
libsnark::r1cs_mp_ppzkpcd_keypair
Definition: r1cs_mp_ppzkpcd.hpp:263
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::translation_step_r1cs_pvks
std::vector< r1cs_ppzksnark_processed_verification_key< B_pp > > translation_step_r1cs_pvks
Definition: r1cs_mp_ppzkpcd.hpp:221
libsnark::r1cs_mp_ppzkpcd_verification_key::compliance_step_r1cs_vks
std::vector< r1cs_ppzksnark_verification_key< A_pp > > compliance_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:155
libsnark::r1cs_mp_ppzkpcd_proof
Definition: r1cs_mp_ppzkpcd.hpp:279
libsnark::r1cs_mp_ppzkpcd_proof::r1cs_mp_ppzkpcd_proof
r1cs_mp_ppzkpcd_proof()=default
libsnark::r1cs_mp_ppzkpcd_proving_key::operator=
r1cs_mp_ppzkpcd_proving_key< PCD_ppT > & operator=(const r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &other)=default
libsnark::r1cs_mp_ppzkpcd_verification_key::r1cs_mp_ppzkpcd_verification_key
r1cs_mp_ppzkpcd_verification_key()=default
libsnark::r1cs_ppzksnark_proving_key< A_pp >
libsnark::r1cs_mp_ppzkpcd_online_verifier
bool r1cs_mp_ppzkpcd_online_verifier(const r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > &pvk, const r1cs_mp_ppzkpcd_primary_input< PCD_ppT > &primary_input, const r1cs_mp_ppzkpcd_proof< PCD_ppT > &proof)
libsnark::r1cs_mp_ppzkpcd_proof::r1cs_mp_ppzkpcd_proof
r1cs_mp_ppzkpcd_proof(const size_t compliance_predicate_idx, const r1cs_ppzksnark_proof< typename PCD_ppT::curve_B_pp > &r1cs_proof)
Definition: r1cs_mp_ppzkpcd.hpp:298
libsnark::r1cs_mp_ppzkpcd_keypair::vk
r1cs_mp_ppzkpcd_verification_key< PCD_ppT > vk
Definition: r1cs_mp_ppzkpcd.hpp:267
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::A_pp
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_mp_ppzkpcd.hpp:215
libsnark::r1cs_pcd_compliance_predicate
Definition: compliance_predicate.hpp:69
libsnark::r1cs_ppzksnark_proof< typename PCD_ppT::curve_B_pp >
libsnark::r1cs_ppzksnark_verification_key< A_pp >
libsnark::r1cs_mp_ppzkpcd_proving_key::r1cs_mp_ppzkpcd_proving_key
r1cs_mp_ppzkpcd_proving_key()
Definition: r1cs_mp_ppzkpcd.hpp:87
libsnark::r1cs_mp_ppzkpcd_proving_key::commitment_to_translation_step_r1cs_vks
set_commitment commitment_to_translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:82
libsnark::r1cs_mp_ppzkpcd_verification_key::r1cs_mp_ppzkpcd_verification_key
r1cs_mp_ppzkpcd_verification_key(const std::vector< r1cs_ppzksnark_verification_key< A_pp >> &compliance_step_r1cs_vks, const std::vector< r1cs_ppzksnark_verification_key< B_pp >> &translation_step_r1cs_vks, const set_commitment &commitment_to_translation_step_r1cs_vks)
Definition: r1cs_mp_ppzkpcd.hpp:165
r1cs_ppzksnark.hpp
libsnark::r1cs_mp_ppzkpcd_proof::size_in_bits
size_t size_in_bits() const
libsnark::r1cs_mp_ppzkpcd_verification_key
Definition: r1cs_mp_ppzkpcd.hpp:136
libsnark::r1cs_mp_ppzkpcd_proof::operator==
bool operator==(const r1cs_mp_ppzkpcd_proof< PCD_ppT > &other) const
libsnark::r1cs_mp_ppzkpcd_keypair::r1cs_mp_ppzkpcd_keypair
r1cs_mp_ppzkpcd_keypair()=default
libsnark::r1cs_mp_ppzkpcd_proving_key::compliance_step_r1cs_pks
std::vector< r1cs_ppzksnark_proving_key< A_pp > > compliance_step_r1cs_pks
Definition: r1cs_mp_ppzkpcd.hpp:75
r1cs_mp_ppzkpcd_params.hpp
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::r1cs_mp_ppzkpcd_processed_verification_key
r1cs_mp_ppzkpcd_processed_verification_key(std::vector< r1cs_ppzksnark_processed_verification_key< A_pp >> &&compliance_step_r1cs_pvks, std::vector< r1cs_ppzksnark_processed_verification_key< B_pp >> &&translation_step_r1cs_pvks, const set_commitment &commitment_to_translation_step_r1cs_vks)
Definition: r1cs_mp_ppzkpcd.hpp:230
libsnark::r1cs_mp_ppzkpcd_verifier
bool r1cs_mp_ppzkpcd_verifier(const r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &vk, const r1cs_mp_ppzkpcd_primary_input< PCD_ppT > &primary_input, const r1cs_mp_ppzkpcd_proof< PCD_ppT > &proof)
libsnark::r1cs_mp_ppzkpcd_proving_key
Definition: r1cs_mp_ppzkpcd.hpp:53
libsnark::r1cs_mp_ppzkpcd_generator
r1cs_mp_ppzkpcd_keypair< PCD_ppT > r1cs_mp_ppzkpcd_generator(const std::vector< r1cs_mp_ppzkpcd_compliance_predicate< PCD_ppT >> &compliance_predicates)
set_commitment.hpp
libsnark::r1cs_mp_ppzkpcd_proving_key::A_pp
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_mp_ppzkpcd.hpp:69
libsnark::r1cs_mp_ppzkpcd_proving_key::compliance_predicates
std::vector< r1cs_mp_ppzkpcd_compliance_predicate< PCD_ppT > > compliance_predicates
Definition: r1cs_mp_ppzkpcd.hpp:73
ppzkpcd_compliance_predicate.hpp
libsnark::r1cs_mp_ppzkpcd_proving_key::size_in_bits
size_t size_in_bits() const
libsnark::operator>>
std::istream & operator>>(std::istream &in, accumulation_vector< T > &v)
libsnark::r1cs_mp_ppzkpcd_verification_key::size_in_bits
size_t size_in_bits() const
libsnark::r1cs_mp_ppzkpcd_proving_key::r1cs_mp_ppzkpcd_proving_key
r1cs_mp_ppzkpcd_proving_key(const std::vector< r1cs_mp_ppzkpcd_compliance_predicate< PCD_ppT >> &compliance_predicates, const std::vector< r1cs_ppzksnark_proving_key< A_pp >> &compliance_step_r1cs_pk, const std::vector< r1cs_ppzksnark_proving_key< B_pp >> &translation_step_r1cs_pk, const std::vector< r1cs_ppzksnark_verification_key< A_pp >> &compliance_step_r1cs_vk, const std::vector< r1cs_ppzksnark_verification_key< B_pp >> &translation_step_r1cs_vk, const set_commitment &commitment_to_translation_step_r1cs_vks, const std::vector< set_membership_proof > &compliance_step_r1cs_vk_membership_proofs, const std::map< size_t, size_t > &compliance_predicate_name_to_idx)
Definition: r1cs_mp_ppzkpcd.hpp:92
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::operator=
r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > & operator=(const r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > &other)=default
libsnark::r1cs_mp_ppzkpcd_proving_key::compliance_step_r1cs_vks
std::vector< r1cs_ppzksnark_verification_key< A_pp > > compliance_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:78
libsnark::r1cs_mp_ppzkpcd_verification_key::A_pp
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_mp_ppzkpcd.hpp:152
libsnark::r1cs_mp_ppzkpcd_proving_key::B_pp
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_mp_ppzkpcd.hpp:70
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::commitment_to_translation_step_r1cs_vks
set_commitment commitment_to_translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:222
libsnark::r1cs_mp_ppzkpcd_proving_key::translation_step_r1cs_vks
std::vector< r1cs_ppzksnark_verification_key< B_pp > > translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:80
libsnark::r1cs_mp_ppzkpcd_proof::r1cs_proof
r1cs_ppzksnark_proof< typename PCD_ppT::curve_B_pp > r1cs_proof
Definition: r1cs_mp_ppzkpcd.hpp:295
libsnark::r1cs_mp_ppzkpcd_verification_key::B_pp
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_mp_ppzkpcd.hpp:153
libsnark::r1cs_mp_ppzkpcd_verification_key::operator==
bool operator==(const r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &other) const
libsnark::r1cs_mp_ppzkpcd_proof::compliance_predicate_idx
size_t compliance_predicate_idx
Definition: r1cs_mp_ppzkpcd.hpp:294
r1cs_mp_ppzkpcd.tcc
libsnark::r1cs_mp_ppzkpcd_proving_key::is_well_formed
bool is_well_formed() const
libsnark::r1cs_mp_ppzkpcd_processed_verification_key::operator==
bool operator==(const r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > &other) const
libsnark::r1cs_mp_ppzkpcd_verification_key::commitment_to_translation_step_r1cs_vks
set_commitment commitment_to_translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:158
libsnark::r1cs_mp_ppzkpcd_keypair::pk
r1cs_mp_ppzkpcd_proving_key< PCD_ppT > pk
Definition: r1cs_mp_ppzkpcd.hpp:266
libsnark::r1cs_mp_ppzkpcd_verification_key::operator=
r1cs_mp_ppzkpcd_verification_key< PCD_ppT > & operator=(const r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &other)=default