r1cs_sp_ppzkpcd.hpp
Go to the documentation of this file.
1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2018-2021 Mikhail Komarov <nemo@nil.foundation>
3 // Copyright (c) 2020-2021 Nikita Kaskov <nbering@nil.foundation>
4 //
5 // MIT License
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
8 // of this software and associated documentation files (the "Software"), to deal
9 // in the Software without restriction, including without limitation the rights
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 // copies of the Software, and to permit persons to whom the Software is
12 // furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in all
15 // copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 // SOFTWARE.
24 //---------------------------------------------------------------------------//
25 // Single-Predicate ppzkPCD for R1CS.
26 //
27 // This includes:
28 // - class for proving key
29 // - class for verification key
30 // - class for processed verification key
31 // - class for key pair (proving key & verification key)
32 // - class for proof
33 // - generator algorithm
34 // - prover algorithm
35 // - verifier algorithm
36 // - online verifier algorithm
37 //
38 // The implementation follows, extends, and optimizes the approach described
39 // in \[BCTV14]. Thus, PCD is constructed from two "matched" ppzkSNARKs for R1CS.
40 //
41 // Acronyms:
42 //
43 // "R1CS" = "Rank-1 Constraint Systems"
44 // "ppzkSNARK" = "PreProcessing Zero-Knowledge Succinct Non-interactive ARgument of Knowledge"
45 // "ppzkPCD" = "Pre-Processing Zero-Knowledge Proof-Carrying Data"
46 //
47 // References:
48 //
49 // \[BCTV14]:
50 // "Scalable Zero Knowledge via Cycles of Elliptic Curves",
51 // Eli Ben-Sasson, Alessandro Chiesa, Eran Tromer, Madars Virza,
52 // CRYPTO 2014,
53 // <http://eprint.iacr.org/2014/595>
54 //---------------------------------------------------------------------------//
55 
56 #ifndef CRYPTO3_ZK_R1CS_SP_PPZKPCD_HPP
57 #define CRYPTO3_ZK_R1CS_SP_PPZKPCD_HPP
58 
59 #include <memory>
60 
61 #include <nil/crypto3/zk/snark/schemes/pcd/r1cs_pcd/r1cs_sp_ppzkpcd/r1cs_sp_ppzkpcd_params.hpp>
62 #include <nil/crypto3/zk/snark/schemes/ppzksnark/r1cs_ppzksnark.hpp>
63 
64 namespace nil {
65  namespace crypto3 {
66  namespace zk {
67  namespace snark {
68 
69  /******************************** Proving key ********************************/
70 
74  template<typename PCD_ppT>
76  public:
77  typedef typename PCD_ppT::curve_A_pp A_pp;
78  typedef typename PCD_ppT::curve_B_pp B_pp;
79 
81 
84 
87 
102 
105 
106  std::size_t size_in_bits() const {
107  return (compliance_step_r1cs_pk.size_in_bits() + translation_step_r1cs_pk.size_in_bits() +
108  compliance_step_r1cs_vk.size_in_bits() + translation_step_r1cs_vk.size_in_bits());
109  }
110 
111  bool operator==(const r1cs_sp_ppzkpcd_proving_key<PCD_ppT> &other) const;
112  };
113 
114  /******************************* Verification key ****************************/
115 
119  template<typename PCD_ppT>
121  public:
122  typedef typename PCD_ppT::curve_A_pp A_pp;
123  typedef typename PCD_ppT::curve_B_pp B_pp;
124 
127 
136 
139 
140  std::size_t size_in_bits() const {
141  return (compliance_step_r1cs_vk.size_in_bits() + translation_step_r1cs_vk.size_in_bits());
142  }
143 
144  bool operator==(const r1cs_sp_ppzkpcd_verification_key<PCD_ppT> &other) const;
145 
147  };
148 
149  /************************ Processed verification key *************************/
150 
158  template<typename PCD_ppT>
160  public:
161  typedef typename PCD_ppT::curve_A_pp A_pp;
162  typedef typename PCD_ppT::curve_B_pp B_pp;
163 
166  std::vector<bool> translation_step_r1cs_vk_bits;
167 
176  const std::vector<bool> &translation_step_r1cs_vk_bits) :
180 
183 
184  std::size_t size_in_bits() const {
185  return (compliance_step_r1cs_pvk.size_in_bits() + translation_step_r1cs_pvk.size_in_bits() +
187  }
188 
190  };
191 
192  /********************************* Key pair **********************************/
193 
198  template<typename PCD_ppT>
200  public:
201  typedef typename PCD_ppT::curve_A_pp A_pp;
202  typedef typename PCD_ppT::curve_B_pp B_pp;
203 
206 
211  pk(std::move(pk)),
212  vk(std::move(vk)) {};
214  typename r1cs_ppzksnark<B_pp>::keypair_type &&kp_B) :
215  pk(std::move(kp_A.pk), std::move(kp_B.pk)),
216  vk(std::move(kp_A.vk), std::move(kp_B.vk)) {};
217  };
218 
219  /*********************************** Proof ***********************************/
220 
224  template<typename PCD_ppT>
226 
227  /***************************** Main algorithms *******************************/
228 
235  template<typename PCD_ppT>
237  const r1cs_sp_ppzkpcd_compliance_predicate<PCD_ppT> &compliance_predicate);
238 
246  template<typename PCD_ppT>
249  const r1cs_sp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
250  const r1cs_sp_ppzkpcd_auxiliary_input<PCD_ppT> &auxiliary_input,
251  const std::vector<r1cs_sp_ppzkpcd_proof<PCD_ppT>> &incoming_proofs);
252 
253  /*
254  Below are two variants of verifier algorithm for the R1CS (single-predicate) ppzkPCD.
255 
256  These are the two cases that arise from whether the verifier accepts a
257  (non-processed) verification key or, instead, a processed verification key.
258  In the latter case, we call the algorithm an "online verifier".
259  */
260 
265  template<typename PCD_ppT>
267  const r1cs_sp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
269 
273  template<typename PCD_ppT>
276 
281  template<typename PCD_ppT>
283  const r1cs_sp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
285 
286  template<typename PCD_ppT>
288  const r1cs_sp_ppzkpcd_proving_key<PCD_ppT> &other) const {
289  return (this->compliance_predicate == other.compliance_predicate &&
290  this->compliance_step_r1cs_pk == other.compliance_step_r1cs_pk &&
291  this->translation_step_r1cs_pk == other.translation_step_r1cs_pk &&
292  this->compliance_step_r1cs_vk == other.compliance_step_r1cs_vk &&
293  this->translation_step_r1cs_vk == other.translation_step_r1cs_vk);
294  }
295 
296  template<typename PCD_ppT>
298  const r1cs_sp_ppzkpcd_verification_key<PCD_ppT> &other) const {
299  return (this->compliance_step_r1cs_vk == other.compliance_step_r1cs_vk &&
300  this->translation_step_r1cs_vk == other.translation_step_r1cs_vk);
301  }
302 
303  /*template<typename PCD_ppT>
304  r1cs_sp_ppzkpcd_verification_key<PCD_ppT>
305  r1cs_sp_ppzkpcd_verification_key<PCD_ppT>::dummy_verification_key() {
306  typedef typename PCD_ppT::curve_A_pp curve_A_pp;
307  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
308 
309  r1cs_sp_ppzkpcd_verification_key<PCD_ppT> result;
310  result.compliance_step_r1cs_vk =
311  typename r1cs_ppzksnark<typename
312  PCD_ppT::curve_A_pp>::verification_key_type::dummy_verification_key(
313  sp_compliance_step_pcd_circuit_maker<curve_A_pp>::input_size_in_elts());
314  result.translation_step_r1cs_vk =
315  typename r1cs_ppzksnark<typename PCD_ppT::curve_B_pp>::verification_key::dummy_verification_key(
316  sp_translation_step_pcd_circuit_maker<curve_B_pp>::input_size_in_elts());
317 
318  return result;
319  }*/
320 
321  template<typename PCD_ppT>
324  return (this->compliance_step_r1cs_pvk == other.compliance_step_r1cs_pvk &&
325  this->translation_step_r1cs_pvk == other.translation_step_r1cs_pvk &&
326  this->translation_step_r1cs_vk_bits == other.translation_step_r1cs_vk_bits);
327  }
328 
329  template<typename PCD_ppT>
331  const r1cs_sp_ppzkpcd_compliance_predicate<PCD_ppT> &compliance_predicate) {
332  assert(algebra::Fr<typename PCD_ppT::curve_A_pp>::mod ==
333  algebra::Fq<typename PCD_ppT::curve_B_pp>::mod);
334  assert(algebra::Fq<typename PCD_ppT::curve_A_pp>::mod ==
335  algebra::Fr<typename PCD_ppT::curve_B_pp>::mod);
336 
337  typedef algebra::Fr<typename PCD_ppT::curve_A_pp> FieldT_A;
338  typedef algebra::Fr<typename PCD_ppT::curve_B_pp> FieldT_B;
339 
340  typedef typename PCD_ppT::curve_A_pp curve_A_pp;
341  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
342 
343  assert(compliance_predicate.is_well_formed());
344 
345  sp_compliance_step_pcd_circuit_maker<curve_A_pp> compliance_step_pcd_circuit(compliance_predicate);
346  compliance_step_pcd_circuit.generate_r1cs_constraints();
347  const r1cs_constraint_system<FieldT_A> compliance_step_pcd_circuit_cs =
348  compliance_step_pcd_circuit.get_circuit();
349 
350  typename r1cs_ppzksnark<curve_A_pp>::keypair_type compliance_step_keypair =
351  typename r1cs_ppzksnark<curve_A_pp>::generator(compliance_step_pcd_circuit_cs);
352 
353  sp_translation_step_pcd_circuit_maker<curve_B_pp> translation_step_pcd_circuit(
354  compliance_step_keypair.vk);
355  translation_step_pcd_circuit.generate_r1cs_constraints();
356  const r1cs_constraint_system<FieldT_B> translation_step_pcd_circuit_cs =
357  translation_step_pcd_circuit.get_circuit();
358 
359  typename r1cs_ppzksnark<curve_B_pp>::keypair_type translation_step_keypair =
360  typename r1cs_ppzksnark<curve_B_pp>::generator(translation_step_pcd_circuit_cs);
361 
363  r1cs_sp_ppzkpcd_proving_key<PCD_ppT>(compliance_predicate,
364  std::move(compliance_step_keypair.pk),
365  std::move(translation_step_keypair.pk),
366  compliance_step_keypair.vk,
367  translation_step_keypair.vk),
368  r1cs_sp_ppzkpcd_verification_key<PCD_ppT>(compliance_step_keypair.vk,
369  translation_step_keypair.vk));
370  }
371 
372  template<typename PCD_ppT>
373  r1cs_sp_ppzkpcd_proof<PCD_ppT>
375  const r1cs_sp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
376  const r1cs_sp_ppzkpcd_auxiliary_input<PCD_ppT> &auxiliary_input,
377  const std::vector<r1cs_sp_ppzkpcd_proof<PCD_ppT>> &incoming_proofs) {
378  typedef algebra::Fr<typename PCD_ppT::curve_A_pp> FieldT_A;
379  typedef algebra::Fr<typename PCD_ppT::curve_B_pp> FieldT_B;
380 
381  typedef typename PCD_ppT::curve_A_pp curve_A_pp;
382  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
383 
384  const std::vector<bool> translation_step_r1cs_vk_bits =
385  r1cs_ppzksnark_verification_key_variable<curve_A_pp>::get_verification_key_bits(
387 
388  sp_compliance_step_pcd_circuit_maker<curve_A_pp> compliance_step_pcd_circuit(
390  compliance_step_pcd_circuit.generate_r1cs_witness(
391  pk.translation_step_r1cs_vk, primary_input, auxiliary_input, incoming_proofs);
392 
393  const r1cs_primary_input<FieldT_A> compliance_step_primary_input =
394  compliance_step_pcd_circuit.get_primary_input();
395  const r1cs_auxiliary_input<FieldT_A> compliance_step_auxiliary_input =
396  compliance_step_pcd_circuit.get_auxiliary_input();
397 
398  const typename r1cs_ppzksnark<curve_A_pp>::proof_type compliance_step_proof =
400  pk.compliance_step_r1cs_pk, compliance_step_primary_input, compliance_step_auxiliary_input);
401 
402  sp_translation_step_pcd_circuit_maker<curve_B_pp> translation_step_pcd_circuit(
404 
405  const r1cs_primary_input<FieldT_B> translation_step_primary_input =
406  get_sp_translation_step_pcd_circuit_input<curve_B_pp>(translation_step_r1cs_vk_bits,
407  primary_input);
408  translation_step_pcd_circuit.generate_r1cs_witness(
409  translation_step_primary_input, compliance_step_proof); // TODO: potential for better naming
410 
411  const r1cs_auxiliary_input<FieldT_B> translation_step_auxiliary_input =
412  translation_step_pcd_circuit.get_auxiliary_input();
413  const typename r1cs_ppzksnark<curve_B_pp>::proof_type translation_step_proof =
415  translation_step_primary_input,
416  translation_step_auxiliary_input);
417 
418  return translation_step_proof;
419  }
420 
421  template<typename PCD_ppT>
423  const r1cs_sp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
425 
426  {
427  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
428 
430  get_sp_translation_step_pcd_circuit_input<curve_B_pp>(pvk.translation_step_r1cs_vk_bits,
431  primary_input);
432  const bool result = r1cs_ppzksnark::online_verifier_strong_input_consistency(
433  pvk.translation_step_r1cs_pvk, r1cs_input, proof);
434 
435  return result;
436  }
437 
438  template<typename PCD_ppT>
439  r1cs_sp_ppzkpcd_processed_verification_key<PCD_ppT>
441  typedef typename PCD_ppT::curve_A_pp curve_A_pp;
442  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
443 
444  typename r1cs_ppzksnark<curve_A_pp>::processed_verification_key compliance_step_r1cs_pvk =
446  typename r1cs_ppzksnark<curve_B_pp>::processed_verification_key translation_step_r1cs_pvk =
448  const std::vector<bool> translation_step_r1cs_vk_bits =
449  r1cs_ppzksnark_verification_key_variable<curve_A_pp>::get_verification_key_bits(
451 
452  return r1cs_sp_ppzkpcd_processed_verification_key<PCD_ppT>(std::move(compliance_step_r1cs_pvk),
453  std::move(translation_step_r1cs_pvk),
454  translation_step_r1cs_vk_bits);
455  }
456 
457  template<typename PCD_ppT>
459  const r1cs_sp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
462  const bool result = r1cs_sp_ppzkpcd_online_verifier(pvk, primary_input, proof);
463 
464  return result;
465  }
466  } // namespace snark
467  } // namespace zk
468  } // namespace crypto3
469 } // namespace nil
470 
471 #endif // CRYPTO3_ZK_R1CS_SP_PPZKPCD_HPP
Definition: snark/proof.hpp:37
Definition: compliance_predicate.hpp:123
bool is_well_formed() const
Definition: compliance_predicate.hpp:198
Definition: snark/systems/ppzksnark/r1cs_ppzksnark/proof.hpp:43
ppzkSNARK for R1CS
Definition: r1cs_ppzksnark.hpp:70
policy_type::keypair_type keypair_type
Definition: r1cs_ppzksnark.hpp:86
Definition: r1cs_sp_ppzkpcd.hpp:199
r1cs_sp_ppzkpcd_verification_key< PCD_ppT > vk
Definition: r1cs_sp_ppzkpcd.hpp:205
r1cs_sp_ppzkpcd_keypair()
Definition: r1cs_sp_ppzkpcd.hpp:207
r1cs_sp_ppzkpcd_keypair(typename r1cs_ppzksnark< A_pp >::keypair_type &&kp_A, typename r1cs_ppzksnark< B_pp >::keypair_type &&kp_B)
Definition: r1cs_sp_ppzkpcd.hpp:213
r1cs_sp_ppzkpcd_keypair(r1cs_sp_ppzkpcd_proving_key< PCD_ppT > &&pk, r1cs_sp_ppzkpcd_verification_key< PCD_ppT > &&vk)
Definition: r1cs_sp_ppzkpcd.hpp:209
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_sp_ppzkpcd.hpp:202
r1cs_sp_ppzkpcd_keypair(r1cs_sp_ppzkpcd_keypair< PCD_ppT > &&other)=default
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_sp_ppzkpcd.hpp:201
r1cs_sp_ppzkpcd_proving_key< PCD_ppT > pk
Definition: r1cs_sp_ppzkpcd.hpp:204
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_sp_ppzkpcd.hpp:162
r1cs_ppzksnark< B_pp >::processed_verification_key_type translation_step_r1cs_pvk
Definition: r1cs_sp_ppzkpcd.hpp:165
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_sp_ppzkpcd.hpp:161
bool operator==(const r1cs_sp_ppzkpcd_processed_verification_key< PCD_ppT > &other) const
Definition: r1cs_sp_ppzkpcd.hpp:322
r1cs_sp_ppzkpcd_processed_verification_key(typename r1cs_ppzksnark< A_pp >::processed_verification_key_type &&compliance_step_r1cs_pvk, typename r1cs_ppzksnark< B_pp >::processed_verification_key_type &&translation_step_r1cs_pvk, const std::vector< bool > &translation_step_r1cs_vk_bits)
Definition: r1cs_sp_ppzkpcd.hpp:173
std::vector< bool > translation_step_r1cs_vk_bits
Definition: r1cs_sp_ppzkpcd.hpp:166
r1cs_sp_ppzkpcd_processed_verification_key(r1cs_sp_ppzkpcd_processed_verification_key< PCD_ppT > &&other)=default
std::size_t size_in_bits() const
Definition: r1cs_sp_ppzkpcd.hpp:184
r1cs_ppzksnark< A_pp >::processed_verification_key_type compliance_step_r1cs_pvk
Definition: r1cs_sp_ppzkpcd.hpp:164
r1cs_sp_ppzkpcd_processed_verification_key()
Definition: r1cs_sp_ppzkpcd.hpp:168
r1cs_sp_ppzkpcd_processed_verification_key(const r1cs_sp_ppzkpcd_processed_verification_key< PCD_ppT > &other)=default
r1cs_sp_ppzkpcd_processed_verification_key< PCD_ppT > & operator=(const r1cs_sp_ppzkpcd_processed_verification_key< PCD_ppT > &other)=default
r1cs_sp_ppzkpcd_proving_key(const r1cs_sp_ppzkpcd_proving_key< PCD_ppT > &other)=default
r1cs_ppzksnark< A_pp >::proving_key_type compliance_step_r1cs_pk
Definition: r1cs_sp_ppzkpcd.hpp:82
bool operator==(const r1cs_sp_ppzkpcd_proving_key< PCD_ppT > &other) const
Definition: r1cs_sp_ppzkpcd.hpp:287
r1cs_sp_ppzkpcd_proving_key(r1cs_sp_ppzkpcd_proving_key< PCD_ppT > &&other)=default
r1cs_sp_ppzkpcd_proving_key< PCD_ppT > & operator=(const r1cs_sp_ppzkpcd_proving_key< PCD_ppT > &other)=default
std::size_t size_in_bits() const
Definition: r1cs_sp_ppzkpcd.hpp:106
r1cs_ppzksnark< B_pp >::verification_key_type translation_step_r1cs_vk
Definition: r1cs_sp_ppzkpcd.hpp:86
r1cs_ppzksnark< B_pp >::proving_key_type translation_step_r1cs_pk
Definition: r1cs_sp_ppzkpcd.hpp:83
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_sp_ppzkpcd.hpp:78
r1cs_sp_ppzkpcd_compliance_predicate< PCD_ppT > compliance_predicate
Definition: r1cs_sp_ppzkpcd.hpp:80
r1cs_sp_ppzkpcd_proving_key(const r1cs_sp_ppzkpcd_compliance_predicate< PCD_ppT > &compliance_predicate, typename r1cs_ppzksnark< A_pp >::proving_key_type &&compliance_step_r1cs_pk, typename r1cs_ppzksnark< B_pp >::proving_key &_type &translation_step_r1cs_pk, const typename r1cs_ppzksnark< A_pp >::verification_key_type &compliance_step_r1cs_vk, const typename r1cs_ppzksnark< B_pp >::verification_key_type &translation_step_r1cs_vk)
Definition: r1cs_sp_ppzkpcd.hpp:91
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_sp_ppzkpcd.hpp:77
r1cs_sp_ppzkpcd_proving_key()
Definition: r1cs_sp_ppzkpcd.hpp:88
r1cs_ppzksnark< A_pp >::verification_key_type compliance_step_r1cs_vk
Definition: r1cs_sp_ppzkpcd.hpp:85
r1cs_sp_ppzkpcd_verification_key(const typename r1cs_ppzksnark< A_pp >::verification_key_type &compliance_step_r1cs_vk, const typename r1cs_ppzksnark< B_pp >::verification_key_type &translation_step_r1cs_vk)
Definition: r1cs_sp_ppzkpcd.hpp:131
r1cs_ppzksnark< A_pp >::verification_key_type compliance_step_r1cs_vk
Definition: r1cs_sp_ppzkpcd.hpp:125
r1cs_ppzksnark< B_pp >::verification_key_type translation_step_r1cs_vk
Definition: r1cs_sp_ppzkpcd.hpp:126
r1cs_sp_ppzkpcd_verification_key(r1cs_sp_ppzkpcd_verification_key< PCD_ppT > &&other)=default
bool operator==(const r1cs_sp_ppzkpcd_verification_key< PCD_ppT > &other) const
Definition: r1cs_sp_ppzkpcd.hpp:297
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_sp_ppzkpcd.hpp:123
r1cs_sp_ppzkpcd_verification_key< PCD_ppT > & operator=(const r1cs_sp_ppzkpcd_verification_key< PCD_ppT > &other)=default
static r1cs_sp_ppzkpcd_verification_key< PCD_ppT > dummy_verification_key()
r1cs_sp_ppzkpcd_verification_key(const r1cs_sp_ppzkpcd_verification_key< PCD_ppT > &other)=default
std::size_t size_in_bits() const
Definition: r1cs_sp_ppzkpcd.hpp:140
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_sp_ppzkpcd.hpp:122
r1cs_auxiliary_input< FieldType > get_auxiliary_input() const
Definition: sp_pcd_circuits.hpp:414
void generate_r1cs_witness(const r1cs_ppzksnark_verification_key< other_curve< CurveType >> &translation_step_pcd_circuit_vk, const r1cs_pcd_compliance_predicate_primary_input< FieldType > &compliance_predicate_primary_input, const r1cs_pcd_compliance_predicate_auxiliary_input< FieldType > &compliance_predicate_auxiliary_input, const std::vector< r1cs_ppzksnark_proof< other_curve< CurveType >>> &incoming_proofs)
Definition: sp_pcd_circuits.hpp:419
void generate_r1cs_constraints()
Definition: sp_pcd_circuits.hpp:349
r1cs_constraint_system< FieldType > get_circuit() const
Definition: sp_pcd_circuits.hpp:402
r1cs_primary_input< FieldType > get_primary_input() const
Definition: sp_pcd_circuits.hpp:408
void generate_r1cs_witness(const r1cs_primary_input< typename CurveType::scalar_field_type > translation_step_input, const r1cs_ppzksnark_proof< other_curve< CurveType >> &compliance_step_proof)
Definition: sp_pcd_circuits.hpp:529
void generate_r1cs_constraints()
Definition: sp_pcd_circuits.hpp:514
r1cs_constraint_system< FieldType > get_circuit() const
Definition: sp_pcd_circuits.hpp:524
r1cs_auxiliary_input< FieldType > get_auxiliary_input() const
Definition: sp_pcd_circuits.hpp:549
vector(T, U...) -> vector< std::enable_if_t<(std::is_same_v< T, U > &&...), T >, 1+sizeof...(U)>
deduction guide for uniform initialization
OutputIterator move(const SinglePassRange &rng, OutputIterator result)
Definition: move.hpp:45
r1cs_sp_ppzkpcd_keypair< PCD_ppT > r1cs_sp_ppzkpcd_generator(const r1cs_sp_ppzkpcd_compliance_predicate< PCD_ppT > &compliance_predicate)
Definition: r1cs_sp_ppzkpcd.hpp:330
std::vector< typename FieldType::value_type > r1cs_auxiliary_input
Definition: r1cs.hpp:104
r1cs_sp_ppzkpcd_proof< PCD_ppT > r1cs_sp_ppzkpcd_prover(const r1cs_sp_ppzkpcd_proving_key< PCD_ppT > &pk, const r1cs_sp_ppzkpcd_primary_input< PCD_ppT > &primary_input, const r1cs_sp_ppzkpcd_auxiliary_input< PCD_ppT > &auxiliary_input, const std::vector< r1cs_sp_ppzkpcd_proof< PCD_ppT >> &incoming_proofs)
Definition: r1cs_sp_ppzkpcd.hpp:374
bool r1cs_sp_ppzkpcd_online_verifier(const r1cs_sp_ppzkpcd_processed_verification_key< PCD_ppT > &pvk, const r1cs_sp_ppzkpcd_primary_input< PCD_ppT > &primary_input, const r1cs_sp_ppzkpcd_proof< PCD_ppT > &proof)
Definition: r1cs_sp_ppzkpcd.hpp:422
bool r1cs_sp_ppzkpcd_verifier(const r1cs_sp_ppzkpcd_verification_key< PCD_ppT > &vk, const r1cs_sp_ppzkpcd_primary_input< PCD_ppT > &primary_input, const r1cs_sp_ppzkpcd_proof< PCD_ppT > &proof)
Definition: r1cs_sp_ppzkpcd.hpp:458
std::vector< typename FieldType::value_type > r1cs_primary_input
Definition: r1cs.hpp:101
typename r1cs_ppzksnark< typename PCD_ppT::curve_B_pp >::proof_type r1cs_sp_ppzkpcd_proof
Definition: r1cs_sp_ppzkpcd.hpp:225
r1cs_sp_ppzkpcd_processed_verification_key< PCD_ppT > r1cs_sp_ppzkpcd_process_vk(const r1cs_sp_ppzkpcd_verification_key< PCD_ppT > &vk)
Definition: r1cs_sp_ppzkpcd.hpp:440
Definition: pair.hpp:31