r1cs_mp_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 // @file Declaration of interfaces for a *multi-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 \[CTV15]. 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 // \[CTV15]:
50 // "Cluster Computing in Zero Knowledge",
51 // Alessandro Chiesa, Eran Tromer, Madars Virza,
52 //---------------------------------------------------------------------------//
53 
54 #ifndef CRYPTO3_R1CS_MP_PPZKPCD_HPP
55 #define CRYPTO3_R1CS_MP_PPZKPCD_HPP
56 
57 #include <memory>
58 #include <vector>
59 
61 
62 #include <nil/crypto3/zk/snark/schemes/pcd/r1cs_pcd/ppzkpcd_compliance_predicate.hpp>
63 #include <nil/crypto3/zk/snark/schemes/pcd/r1cs_pcd/r1cs_mp_ppzkpcd/r1cs_mp_ppzkpcd_params.hpp>
64 
65 #include <nil/crypto3/zk/snark/schemes/ppzksnark/r1cs_ppzksnark.hpp>
66 
67 namespace nil {
68  namespace crypto3 {
69  namespace zk {
70  namespace snark {
71 
72  /******************************** Proving key ********************************/
73 
77  template<typename PCD_ppT>
79  public:
80  typedef typename PCD_ppT::curve_A_pp A_pp;
81  typedef typename PCD_ppT::curve_B_pp B_pp;
82 
83  std::vector<r1cs_mp_ppzkpcd_compliance_predicate<PCD_ppT>> compliance_predicates;
84 
85  std::vector<typename r1cs_ppzksnark<A_pp>::proving_key_type> compliance_step_r1cs_pks;
86  std::vector<typename r1cs_ppzksnark<B_pp>::proving_key_type> translation_step_r1cs_pks;
87 
88  std::vector<typename r1cs_ppzksnark<A_pp>::verification_key_type> compliance_step_r1cs_vks;
89  std::vector<typename r1cs_ppzksnark<B_pp>::verification_key_type> translation_step_r1cs_vks;
90 
92  std::vector<set_membership_proof> compliance_step_r1cs_vk_membership_proofs;
93 
94  std::map<std::size_t, std::size_t> compliance_predicate_name_to_idx;
95 
101  const std::vector<typename r1cs_ppzksnark<A_pp>::proving_key_type> &compliance_step_r1cs_pk,
102  const std::vector<typename r1cs_ppzksnark<B_pp>::proving_key_type> &translation_step_r1cs_pk,
104  &compliance_step_r1cs_vk,
106  &translation_step_r1cs_vk,
108  const std::vector<set_membership_proof> &compliance_step_r1cs_vk_membership_proofs,
109  const std::map<std::size_t, std::size_t> &compliance_predicate_name_to_idx) :
118  }
119 
122 
123  std::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  };
129 
130  /******************************* Verification key ****************************/
131 
135  template<typename PCD_ppT>
137  public:
138  typedef typename PCD_ppT::curve_A_pp A_pp;
139  typedef typename PCD_ppT::curve_B_pp B_pp;
140 
141  std::vector<typename r1cs_ppzksnark<A_pp>::verification_key_type> compliance_step_r1cs_vks;
142  std::vector<typename r1cs_ppzksnark<B_pp>::verification_key_type> translation_step_r1cs_vks;
144 
157  }
158 
161 
162  std::size_t size_in_bits() const;
163 
164  bool operator==(const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &other) const;
165  };
166 
167  /************************* Processed verification key **************************/
168 
176  template<typename PCD_ppT>
178  public:
179  typedef typename PCD_ppT::curve_A_pp A_pp;
180  typedef typename PCD_ppT::curve_B_pp B_pp;
181 
182  std::vector<typename r1cs_ppzksnark<A_pp>::processed_verification_key_type>
184  std::vector<typename r1cs_ppzksnark<B_pp>::processed_verification_key_type>
187 
202 
205 
206  std::size_t size_in_bits() const;
207 
209  };
210 
211  /********************************** Key pair *********************************/
212 
217  template<typename PCD_ppT>
219  public:
222 
227  pk(std::move(pk)),
228  vk(std::move(vk)) {};
229  };
230 
231  /*********************************** Proof ***********************************/
232 
236  template<typename PCD_ppT>
238  public:
241 
244  const std::size_t compliance_predicate_idx,
248  }
249 
250  std::size_t size_in_bits() const;
251 
252  bool operator==(const r1cs_mp_ppzkpcd_proof<PCD_ppT> &other) const;
253  };
254 
255  /***************************** Main algorithms *******************************/
256 
263  template<typename PCD_ppT>
265  const std::vector<r1cs_mp_ppzkpcd_compliance_predicate<PCD_ppT>> &compliance_predicates);
266 
275  template<typename PCD_ppT>
278  const std::size_t compliance_predicate_name,
279  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
280  const r1cs_mp_ppzkpcd_auxiliary_input<PCD_ppT> &auxiliary_input,
281  const std::vector<r1cs_mp_ppzkpcd_proof<PCD_ppT>> &incoming_proofs);
282 
283  /*
284  Below are two variants of verifier algorithm for the R1CS (multi-predicate) ppzkPCD.
285 
286  These are the two cases that arise from whether the verifier accepts a
287  (non-processed) verification key or, instead, a processed verification key.
288  In the latter case, we call the algorithm an "online verifier".
289  */
290 
295  template<typename PCD_ppT>
297  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
299 
303  template<typename PCD_ppT>
306 
311  template<typename PCD_ppT>
313  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
315 
316  template<typename PCD_ppT>
318  const std::size_t num_predicates = compliance_predicates.size();
319 
320  std::size_t result = 0;
321  for (std::size_t i = 0; i < num_predicates; ++i) {
322  result +=
323  (compliance_predicates[i].size_in_bits() + compliance_step_r1cs_pks[i].size_in_bits() +
324  translation_step_r1cs_pks[i].size_in_bits() + compliance_step_r1cs_vks[i].size_in_bits() +
325  translation_step_r1cs_vks[i].size_in_bits() +
326  compliance_step_r1cs_vk_membership_proofs[i].size_in_bits());
327  }
328  result += commitment_to_translation_step_r1cs_vks.size();
329 
330  return result;
331  }
332 
333  template<typename PCD_ppT>
335  const std::size_t num_predicates = compliance_predicates.size();
336 
337  bool result;
338  result = result && (compliance_step_r1cs_pks.size() == num_predicates);
339  result = result && (translation_step_r1cs_pks.size() == num_predicates);
340  result = result && (compliance_step_r1cs_vks.size() == num_predicates);
341  result = result && (translation_step_r1cs_vks.size() == num_predicates);
342  result = result && (compliance_step_r1cs_vk_membership_proofs.size() == num_predicates);
343 
344  return result;
345  }
346 
347  template<typename PCD_ppT>
349  const r1cs_mp_ppzkpcd_proving_key<PCD_ppT> &other) const {
350  return (this->compliance_predicates == other.compliance_predicates &&
351  this->compliance_step_r1cs_pks == other.compliance_step_r1cs_pks &&
352  this->translation_step_r1cs_pks == other.translation_step_r1cs_pks &&
353  this->compliance_step_r1cs_vks == other.compliance_step_r1cs_vks &&
354  this->translation_step_r1cs_vks == other.translation_step_r1cs_vks &&
355  this->commitment_to_translation_step_r1cs_vks ==
357  this->compliance_step_r1cs_vk_membership_proofs ==
359  this->compliance_predicate_name_to_idx == other.compliance_predicate_name_to_idx);
360  }
361 
362  template<typename PCD_ppT>
364  const std::size_t num_predicates = compliance_step_r1cs_vks.size();
365 
366  std::size_t result = 0;
367  for (std::size_t i = 0; i < num_predicates; ++i) {
368  result +=
369  (compliance_step_r1cs_vks[i].size_in_bits() + translation_step_r1cs_vks[i].size_in_bits());
370  }
371 
372  result += commitment_to_translation_step_r1cs_vks.size();
373 
374  return result;
375  }
376 
377  template<typename PCD_ppT>
379  const r1cs_mp_ppzkpcd_verification_key<PCD_ppT> &other) const {
380  return (this->compliance_step_r1cs_vks == other.compliance_step_r1cs_vks &&
381  this->translation_step_r1cs_vks == other.translation_step_r1cs_vks &&
382  this->commitment_to_translation_step_r1cs_vks ==
384  }
385 
386  template<typename PCD_ppT>
388  const std::size_t num_predicates = compliance_step_r1cs_pvks.size();
389 
390  std::size_t result = 0;
391  for (std::size_t i = 0; i < num_predicates; ++i) {
392  result += (compliance_step_r1cs_pvks[i].size_in_bits() +
393  translation_step_r1cs_pvks[i].size_in_bits());
394  }
395 
396  result += commitment_to_translation_step_r1cs_vks.size();
397 
398  return result;
399  }
400 
401  template<typename PCD_ppT>
404  return (this->compliance_step_r1cs_pvks == other.compliance_step_r1cs_pvks &&
405  this->translation_step_r1cs_pvks == other.translation_step_r1cs_pvks &&
406  this->commitment_to_translation_step_r1cs_vks ==
408  }
409 
410  template<typename PCD_ppT>
412  return (this->compliance_predicate_idx == other.compliance_predicate_idx &&
413  this->r1cs_proof == other.r1cs_proof);
414  }
415 
416  template<typename PCD_ppT>
418  const std::vector<r1cs_mp_ppzkpcd_compliance_predicate<PCD_ppT>> &compliance_predicates) {
419  assert(algebra::Fr<typename PCD_ppT::curve_A_pp>::mod ==
420  algebra::Fq<typename PCD_ppT::curve_B_pp>::mod);
421  assert(algebra::Fq<typename PCD_ppT::curve_A_pp>::mod ==
422  algebra::Fr<typename PCD_ppT::curve_B_pp>::mod);
423 
424  typedef typename PCD_ppT::curve_A_pp curve_A_pp;
425  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
426 
427  typedef typename curve_A_pp::scalar_field_type FieldT_A;
428  typedef typename curve_B_pp::scalar_field_type FieldT_B;
429 
430  std::cout << "Call to r1cs_mp_ppzkpcd_generator" << std::endl;
431 
433  const std::size_t translation_input_size =
435  const std::size_t vk_size_in_bits =
436  r1cs_ppzksnark_verification_key_variable<curve_A_pp>::size_in_bits(translation_input_size);
437  printf("%zu %zu\n", translation_input_size, vk_size_in_bits);
438 
440  compliance_predicates.size(), vk_size_in_bits);
441 
442  std::cout << "Perform type checks" << std::endl;
443  std::map<std::size_t, std::size_t> type_counts;
444 
445  for (auto &cp : compliance_predicates) {
446  type_counts[cp.type] += 1;
447  }
448 
449  for (auto &cp : compliance_predicates) {
450  if (cp.relies_on_same_type_inputs) {
451  for (std::size_t type : cp.accepted_input_types) {
452  assert(type_counts[type] == 1); /* each of accepted_input_types must be unique */
453  }
454  } else {
455  assert(cp.accepted_input_types.empty());
456  }
457  }
458 
459  for (std::size_t i = 0; i < compliance_predicates.size(); ++i) {
460  std::cout << FMT("",
461  "Process predicate %zu (with name %zu and type %zu)",
462  i,
463  compliance_predicates[i].name,
464  compliance_predicates[i].type)
465  << std::endl;
466  assert(compliance_predicates[i].is_well_formed());
467 
468  std::cout << "Construct compliance step PCD circuit" << std::endl;
469  mp_compliance_step_pcd_circuit_maker<curve_A_pp> mp_compliance_step_pcd_circuit(
470  compliance_predicates[i], compliance_predicates.size());
471  mp_compliance_step_pcd_circuit.generate_r1cs_constraints();
472  r1cs_constraint_system<FieldT_A> mp_compliance_step_pcd_circuit_cs =
473  mp_compliance_step_pcd_circuit.get_circuit();
474 
475  std::cout << "Generate key pair for compliance step PCD circuit" << std::endl;
476  typename r1cs_ppzksnark<curve_A_pp>::keypair_type mp_compliance_step_keypair =
477  r1cs_ppzksnark<curve_A_pp>::generator(mp_compliance_step_pcd_circuit_cs);
478 
479  std::cout << "Construct translation step PCD circuit" << std::endl;
480  mp_translation_step_pcd_circuit_maker<curve_B_pp> mp_translation_step_pcd_circuit(
481  mp_compliance_step_keypair.vk);
482  mp_translation_step_pcd_circuit.generate_r1cs_constraints();
483  r1cs_constraint_system<FieldT_B> mp_translation_step_pcd_circuit_cs =
484  mp_translation_step_pcd_circuit.get_circuit();
485 
486  std::cout << "Generate key pair for translation step PCD circuit" << std::endl;
487  typename r1cs_ppzksnark<curve_B_pp>::keypair_type mp_translation_step_keypair =
488  r1cs_ppzksnark<curve_B_pp>::generator(mp_translation_step_pcd_circuit_cs);
489 
490  std::cout << "Augment set of translation step verification keys" << std::endl;
491  const std::vector<bool> vk_bits =
492  r1cs_ppzksnark_verification_key_variable<curve_A_pp>::get_verification_key_bits(
493  mp_translation_step_keypair.vk);
494  all_translation_vks.add(vk_bits);
495 
496  std::cout << "Update r1cs_mp_ppzkpcd keypair" << std::endl;
497  keypair.pk.compliance_predicates.emplace_back(compliance_predicates[i]);
498  keypair.pk.compliance_step_r1cs_pks.emplace_back(mp_compliance_step_keypair.pk);
499  keypair.pk.translation_step_r1cs_pks.emplace_back(mp_translation_step_keypair.pk);
500  keypair.pk.compliance_step_r1cs_vks.emplace_back(mp_compliance_step_keypair.vk);
501  keypair.pk.translation_step_r1cs_vks.emplace_back(mp_translation_step_keypair.vk);
502  const std::size_t cp_name = compliance_predicates[i].name;
503  assert(keypair.pk.compliance_predicate_name_to_idx.find(cp_name) ==
504  keypair.pk.compliance_predicate_name_to_idx.end()); // all names must be distinct
505  keypair.pk.compliance_predicate_name_to_idx[cp_name] = i;
506 
507  keypair.vk.compliance_step_r1cs_vks.emplace_back(mp_compliance_step_keypair.vk);
508  keypair.vk.translation_step_r1cs_vks.emplace_back(mp_translation_step_keypair.vk);
509  }
510 
511  std::cout << "Compute set commitment and corresponding membership proofs" << std::endl;
512  const set_commitment cm = all_translation_vks.get_commitment();
513  keypair.pk.commitment_to_translation_step_r1cs_vks = cm;
514  keypair.vk.commitment_to_translation_step_r1cs_vks = cm;
515  for (std::size_t i = 0; i < compliance_predicates.size(); ++i) {
516  const std::vector<bool> vk_bits =
517  r1cs_ppzksnark_verification_key_variable<curve_A_pp>::get_verification_key_bits(
518  keypair.vk.translation_step_r1cs_vks[i]);
519  const set_membership_proof proof = all_translation_vks.get_membership_proof(vk_bits);
520 
521  keypair.pk.compliance_step_r1cs_vk_membership_proofs.emplace_back(proof);
522  }
523 
524  return keypair;
525  }
526 
527  template<typename PCD_ppT>
528  r1cs_mp_ppzkpcd_proof<PCD_ppT>
530  const std::size_t compliance_predicate_name,
531  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
532  const r1cs_mp_ppzkpcd_auxiliary_input<PCD_ppT> &auxiliary_input,
533  const std::vector<r1cs_mp_ppzkpcd_proof<PCD_ppT>> &prev_proofs) {
534  typedef typename PCD_ppT::curve_A_pp curve_A_pp;
535  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
536 
537  typedef typename curve_A_pp::scalar_field_type FieldT_A;
538  typedef typename curve_B_pp::scalar_field_type FieldT_B;
539 
540  std::cout << "Call to r1cs_mp_ppzkpcd_prover" << std::endl;
541 
542  auto it = pk.compliance_predicate_name_to_idx.find(compliance_predicate_name);
543  assert(it != pk.compliance_predicate_name_to_idx.end());
544  const std::size_t compliance_predicate_idx = it->second;
545 
546  std::cout << "Prove compliance step" << std::endl;
547  assert(compliance_predicate_idx < pk.compliance_predicates.size());
548  assert(prev_proofs.size() <= pk.compliance_predicates[compliance_predicate_idx].max_arity);
549 
550  const std::size_t arity = prev_proofs.size();
551  const std::size_t max_arity = pk.compliance_predicates[compliance_predicate_idx].max_arity;
552 
553  if (pk.compliance_predicates[compliance_predicate_idx].relies_on_same_type_inputs) {
554  const std::size_t input_predicate_idx = prev_proofs[0].compliance_predicate_idx;
555  for (std::size_t i = 1; i < arity; ++i) {
556  assert(prev_proofs[i].compliance_predicate_idx == input_predicate_idx);
557  }
558  }
559 
560  std::vector<typename r1cs_ppzksnark<curve_B_pp>::proof_type> padded_proofs(max_arity);
561  for (std::size_t i = 0; i < arity; ++i) {
562  padded_proofs[i] = prev_proofs[i].r1cs_proof;
563  }
564 
565  std::vector<typename r1cs_ppzksnark<curve_B_pp>::verification_key_type> translation_step_vks;
566  std::vector<set_membership_proof> membership_proofs;
567 
568  for (std::size_t i = 0; i < arity; ++i) {
569  const std::size_t input_predicate_idx = prev_proofs[i].compliance_predicate_idx;
570  translation_step_vks.emplace_back(pk.translation_step_r1cs_vks[input_predicate_idx]);
571  membership_proofs.emplace_back(
572  pk.compliance_step_r1cs_vk_membership_proofs[input_predicate_idx]);
573 
574 #ifdef DEBUG
575  if (auxiliary_input.incoming_messages[i]->type != 0) {
576  printf("check proof for message %zu\n", i);
577  const r1cs_primary_input<FieldT_B> translated_msg =
578  get_mp_translation_step_pcd_circuit_input<curve_B_pp>(
581  translation_step_vks[i], translated_msg, padded_proofs[i]);
582  assert(bit);
583  } else {
584  printf("message %zu is base case\n", i);
585  }
586 #endif
587  }
588 
589  /* pad with dummy vks/membership proofs */
590  for (std::size_t i = arity; i < max_arity; ++i) {
591  printf("proof %zu will be a dummy\n", arity);
592  translation_step_vks.emplace_back(pk.translation_step_r1cs_vks[0]);
593  membership_proofs.emplace_back(pk.compliance_step_r1cs_vk_membership_proofs[0]);
594  }
595 
596  mp_compliance_step_pcd_circuit_maker<curve_A_pp> mp_compliance_step_pcd_circuit(
597  pk.compliance_predicates[compliance_predicate_idx], pk.compliance_predicates.size());
598 
599  mp_compliance_step_pcd_circuit.generate_r1cs_witness(pk.commitment_to_translation_step_r1cs_vks,
600  translation_step_vks,
601  membership_proofs,
602  primary_input,
603  auxiliary_input,
604  padded_proofs);
605 
606  const r1cs_primary_input<FieldT_A> compliance_step_primary_input =
607  mp_compliance_step_pcd_circuit.get_primary_input();
608  const r1cs_auxiliary_input<FieldT_A> compliance_step_auxiliary_input =
609  mp_compliance_step_pcd_circuit.get_auxiliary_input();
610  const typename r1cs_ppzksnark<curve_A_pp>::proof_type compliance_step_proof =
612  compliance_step_primary_input,
613  compliance_step_auxiliary_input);
614 
615 #ifdef DEBUG
616  const r1cs_primary_input<FieldT_A> compliance_step_input =
617  get_mp_compliance_step_pcd_circuit_input<curve_A_pp>(pk.commitment_to_translation_step_r1cs_vks,
618  primary_input.outgoing_message);
620  pk.compliance_step_r1cs_vks[compliance_predicate_idx],
621  compliance_step_input,
622  compliance_step_proof);
623  assert(compliance_step_ok);
624 #endif
625 
626  std::cout << "Prove translation step" << std::endl;
627  mp_translation_step_pcd_circuit_maker<curve_B_pp> mp_translation_step_pcd_circuit(
628  pk.compliance_step_r1cs_vks[compliance_predicate_idx]);
629 
630  const r1cs_primary_input<FieldT_B> translation_step_primary_input =
631  get_mp_translation_step_pcd_circuit_input<curve_B_pp>(
632  pk.commitment_to_translation_step_r1cs_vks, primary_input);
633  mp_translation_step_pcd_circuit.generate_r1cs_witness(translation_step_primary_input,
634  compliance_step_proof);
635  const r1cs_auxiliary_input<FieldT_B> translation_step_auxiliary_input =
636  mp_translation_step_pcd_circuit.get_auxiliary_input();
637 
638  const typename r1cs_ppzksnark<curve_B_pp>::proof_type translation_step_proof =
640  translation_step_primary_input,
641  translation_step_auxiliary_input);
642 
643 #ifdef DEBUG
644  const bool translation_step_ok = r1cs_ppzksnark<curve_B_pp>::verifier_strong_input_consistency(
645  pk.translation_step_r1cs_vks[compliance_predicate_idx],
646  translation_step_primary_input,
647  translation_step_proof);
648  assert(translation_step_ok);
649 #endif
650 
652  result.compliance_predicate_idx = compliance_predicate_idx;
653  result.r1cs_proof = translation_step_proof;
654  return result;
655  }
656 
657  template<typename PCD_ppT>
659  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
661  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
662 
663  std::cout << "Call to r1cs_mp_ppzkpcd_online_verifier" << std::endl;
665  get_mp_translation_step_pcd_circuit_input<curve_B_pp>(
666  pvk.commitment_to_translation_step_r1cs_vks, primary_input);
667  const bool result = r1cs_ppzksnark::online_verifier_strong_input_consistency(
668  pvk.translation_step_r1cs_pvks[proof.compliance_predicate_idx], r1cs_input, proof.r1cs_proof);
669 
670  return result;
671  }
672 
673  template<typename PCD_ppT>
674  r1cs_mp_ppzkpcd_processed_verification_key<PCD_ppT>
676  typedef typename PCD_ppT::curve_A_pp curve_A_pp;
677  typedef typename PCD_ppT::curve_B_pp curve_B_pp;
678 
679  std::cout << "Call to r1cs_mp_ppzkpcd_processed_verification_key" << std::endl;
680 
683 
684  for (std::size_t i = 0; i < vk.compliance_step_r1cs_vks.size(); ++i) {
686  compliance_step_r1cs_pvk =
689  translation_step_r1cs_pvk =
691 
692  result.compliance_step_r1cs_pvks.emplace_back(compliance_step_r1cs_pvk);
693  result.translation_step_r1cs_pvks.emplace_back(translation_step_r1cs_pvk);
694  }
695 
696  return result;
697  }
698 
699  template<typename PCD_ppT>
701  const r1cs_mp_ppzkpcd_primary_input<PCD_ppT> &primary_input,
703  std::cout << "Call to r1cs_mp_ppzkpcd_verifier" << std::endl;
705  const bool result = r1cs_mp_ppzkpcd_online_verifier(pvk, primary_input, proof);
706 
707  return result;
708  }
709 
710  } // namespace snark
711  } // namespace zk
712  } // namespace crypto3
713 } // namespace nil
714 
715 #endif // CRYPTO3_R1CS_MP_PPZKPCD_HPP
snark::r1cs_auxiliary_input< FieldType > get_auxiliary_input() const
Definition: mp_pcd_circuits.hpp:524
void generate_r1cs_constraints()
Definition: mp_pcd_circuits.hpp:428
snark::r1cs_primary_input< FieldType > get_primary_input() const
Definition: mp_pcd_circuits.hpp:518
void generate_r1cs_witness(const set_commitment &commitment_to_translation_step_r1cs_vks, const std::vector< r1cs_ppzksnark_verification_key< other_curve< CurveType >>> &mp_translation_step_pcd_circuit_vks, const std::vector< set_membership_proof > &vk_membership_proofs, 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 >>> &translation_step_proofs)
Definition: mp_pcd_circuits.hpp:529
snark::r1cs_constraint_system< FieldType > get_circuit() const
Definition: mp_pcd_circuits.hpp:512
static std::size_t input_size_in_elts()
Definition: mp_pcd_circuits.hpp:718
snark::r1cs_auxiliary_input< FieldType > get_auxiliary_input() const
Definition: mp_pcd_circuits.hpp:703
void generate_r1cs_witness(const snark::r1cs_primary_input< typename CurveType::scalar_field_type > translation_step_input, const r1cs_ppzksnark_proof< other_curve< CurveType >> &prev_proof)
Definition: mp_pcd_circuits.hpp:683
void generate_r1cs_constraints()
Definition: mp_pcd_circuits.hpp:668
snark::r1cs_constraint_system< FieldType > get_circuit() const
Definition: mp_pcd_circuits.hpp:678
Definition: snark/proof.hpp:37
Definition: r1cs_mp_ppzkpcd.hpp:218
r1cs_mp_ppzkpcd_keypair(r1cs_mp_ppzkpcd_keypair< PCD_ppT > &&other)=default
r1cs_mp_ppzkpcd_proving_key< PCD_ppT > pk
Definition: r1cs_mp_ppzkpcd.hpp:220
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:225
r1cs_mp_ppzkpcd_verification_key< PCD_ppT > vk
Definition: r1cs_mp_ppzkpcd.hpp:221
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_mp_ppzkpcd.hpp:179
bool operator==(const r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > &other) const
Definition: r1cs_mp_ppzkpcd.hpp:402
r1cs_mp_ppzkpcd_processed_verification_key(const r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > &other)=default
std::size_t size_in_bits() const
Definition: r1cs_mp_ppzkpcd.hpp:387
r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > & operator=(const r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > &other)=default
std::vector< typename r1cs_ppzksnark< A_pp >::processed_verification_key_type > compliance_step_r1cs_pvks
Definition: r1cs_mp_ppzkpcd.hpp:183
set_commitment commitment_to_translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:186
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_mp_ppzkpcd.hpp:180
r1cs_mp_ppzkpcd_processed_verification_key(r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > &&other)=default
std::vector< typename r1cs_ppzksnark< B_pp >::processed_verification_key_type > translation_step_r1cs_pvks
Definition: r1cs_mp_ppzkpcd.hpp:185
r1cs_mp_ppzkpcd_processed_verification_key(std::vector< typename r1cs_ppzksnark< A_pp >::processed_verification_key_type > &&compliance_step_r1cs_pvks, std::vector< typename r1cs_ppzksnark< B_pp >::processed_verification_key_type > &&translation_step_r1cs_pvks, const set_commitment &commitment_to_translation_step_r1cs_vks)
Definition: r1cs_mp_ppzkpcd.hpp:193
Definition: r1cs_mp_ppzkpcd.hpp:237
r1cs_ppzksnark< typename PCD_ppT::curve_B_pp >::proof_type r1cs_proof
Definition: r1cs_mp_ppzkpcd.hpp:240
std::size_t compliance_predicate_idx
Definition: r1cs_mp_ppzkpcd.hpp:239
bool operator==(const r1cs_mp_ppzkpcd_proof< PCD_ppT > &other) const
Definition: r1cs_mp_ppzkpcd.hpp:411
r1cs_mp_ppzkpcd_proof(const std::size_t compliance_predicate_idx, const typename r1cs_ppzksnark< typename PCD_ppT::curve_B_pp >::proof_type &r1cs_proof)
Definition: r1cs_mp_ppzkpcd.hpp:243
bool is_well_formed() const
Definition: r1cs_mp_ppzkpcd.hpp:334
std::size_t size_in_bits() const
Definition: r1cs_mp_ppzkpcd.hpp:317
std::vector< typename r1cs_ppzksnark< B_pp >::verification_key_type > translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:89
r1cs_mp_ppzkpcd_proving_key()
Definition: r1cs_mp_ppzkpcd.hpp:96
std::map< std::size_t, std::size_t > compliance_predicate_name_to_idx
Definition: r1cs_mp_ppzkpcd.hpp:94
r1cs_mp_ppzkpcd_proving_key(r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &&other)=default
bool operator==(const r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &other) const
Definition: r1cs_mp_ppzkpcd.hpp:348
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_mp_ppzkpcd.hpp:81
r1cs_mp_ppzkpcd_proving_key(const std::vector< r1cs_mp_ppzkpcd_compliance_predicate< PCD_ppT >> &compliance_predicates, const std::vector< typename r1cs_ppzksnark< A_pp >::proving_key_type > &compliance_step_r1cs_pk, const std::vector< typename r1cs_ppzksnark< B_pp >::proving_key_type > &translation_step_r1cs_pk, const std::vector< typename r1cs_ppzksnark< A_pp >::verification_key_type > &compliance_step_r1cs_vk, const std::vector< typename r1cs_ppzksnark< B_pp >::verification_key_type > &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< std::size_t, std::size_t > &compliance_predicate_name_to_idx)
Definition: r1cs_mp_ppzkpcd.hpp:99
std::vector< set_membership_proof > compliance_step_r1cs_vk_membership_proofs
Definition: r1cs_mp_ppzkpcd.hpp:92
std::vector< r1cs_mp_ppzkpcd_compliance_predicate< PCD_ppT > > compliance_predicates
Definition: r1cs_mp_ppzkpcd.hpp:83
std::vector< typename r1cs_ppzksnark< B_pp >::proving_key_type > translation_step_r1cs_pks
Definition: r1cs_mp_ppzkpcd.hpp:86
r1cs_mp_ppzkpcd_proving_key(const r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &other)=default
std::vector< typename r1cs_ppzksnark< A_pp >::verification_key_type > compliance_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:88
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_mp_ppzkpcd.hpp:80
std::vector< typename r1cs_ppzksnark< A_pp >::proving_key_type > compliance_step_r1cs_pks
Definition: r1cs_mp_ppzkpcd.hpp:85
set_commitment commitment_to_translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:91
r1cs_mp_ppzkpcd_proving_key< PCD_ppT > & operator=(const r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &other)=default
PCD_ppT::curve_B_pp B_pp
Definition: r1cs_mp_ppzkpcd.hpp:139
std::vector< typename r1cs_ppzksnark< B_pp >::verification_key_type > translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:142
r1cs_mp_ppzkpcd_verification_key(const r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &other)=default
PCD_ppT::curve_A_pp A_pp
Definition: r1cs_mp_ppzkpcd.hpp:138
set_commitment commitment_to_translation_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:143
std::size_t size_in_bits() const
Definition: r1cs_mp_ppzkpcd.hpp:363
std::vector< typename r1cs_ppzksnark< A_pp >::verification_key_type > compliance_step_r1cs_vks
Definition: r1cs_mp_ppzkpcd.hpp:141
bool operator==(const r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &other) const
Definition: r1cs_mp_ppzkpcd.hpp:378
r1cs_mp_ppzkpcd_verification_key(const std::vector< typename r1cs_ppzksnark< A_pp >::verification_key_type > &compliance_step_r1cs_vks, const std::vector< typename r1cs_ppzksnark< B_pp >::verification_key_type > &translation_step_r1cs_vks, const set_commitment &commitment_to_translation_step_r1cs_vks)
Definition: r1cs_mp_ppzkpcd.hpp:148
r1cs_mp_ppzkpcd_verification_key(r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &&other)=default
r1cs_mp_ppzkpcd_verification_key< PCD_ppT > & operator=(const r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &other)=default
std::vector< std::shared_ptr< r1cs_pcd_message< FieldType > > > incoming_messages
Definition: r1cs_pcd_params.hpp:56
std::shared_ptr< r1cs_pcd_message< FieldType > > outgoing_message
Definition: r1cs_pcd_params.hpp:42
Definition: compliance_predicate.hpp:123
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_ppzksnark/verification_key.hpp:102
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: blueprint/include/nil/crypto3/zk/components/schemes/snark/set_commitment.hpp:57
void add(const std::vector< bool > &value)
Definition: blueprint/include/nil/crypto3/zk/components/schemes/snark/set_commitment.hpp:75
set_membership_proof get_membership_proof(const std::vector< bool > &value) const
Definition: blueprint/include/nil/crypto3/zk/components/schemes/snark/set_commitment.hpp:95
set_commitment get_commitment() const
Definition: blueprint/include/nil/crypto3/zk/components/schemes/snark/set_commitment.hpp:91
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_mp_ppzkpcd_proof< PCD_ppT > r1cs_mp_ppzkpcd_prover(const r1cs_mp_ppzkpcd_proving_key< PCD_ppT > &pk, const std::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)
Definition: r1cs_mp_ppzkpcd.hpp:529
r1cs_mp_ppzkpcd_processed_verification_key< PCD_ppT > r1cs_mp_ppzkpcd_process_vk(const r1cs_mp_ppzkpcd_verification_key< PCD_ppT > &vk)
Definition: r1cs_mp_ppzkpcd.hpp:675
std::vector< typename FieldType::value_type > r1cs_auxiliary_input
Definition: r1cs.hpp:104
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)
Definition: r1cs_mp_ppzkpcd.hpp:700
std::pair< typename ZkScheme::proving_key, typename ZkScheme::verification_key > keypair
Definition: keypair.hpp:35
r1cs_mp_ppzkpcd_keypair< PCD_ppT > r1cs_mp_ppzkpcd_generator(const std::vector< r1cs_mp_ppzkpcd_compliance_predicate< PCD_ppT >> &compliance_predicates)
Definition: r1cs_mp_ppzkpcd.hpp:417
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)
Definition: r1cs_mp_ppzkpcd.hpp:658
std::vector< typename FieldType::value_type > r1cs_primary_input
Definition: r1cs.hpp:101
std::vector< bool > set_commitment
Definition: blueprint/include/nil/crypto3/zk/components/schemes/snark/set_commitment.hpp:37
Definition: pair.hpp:31
Definition: blueprint/include/nil/crypto3/zk/components/schemes/snark/set_commitment.hpp:39