sp_pcd_circuits.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 functionality for creating and using the two PCD circuits in
26 // a single-predicate PCD construction.
27 //
28 // The implementation follows, extends, and optimizes the approach described
29 // in \[BCTV14]. At high level, there is a "compliance step" circuit and a
30 // "translation step" circuit. For more details see Section 4 of \[BCTV14].
31 //
32 //
33 // References:
34 //
35 // \[BCTV14]:
36 // "Scalable Zero Knowledge via Cycles of Elliptic Curves",
37 // Eli Ben-Sasson, Alessandro Chiesa, Eran Tromer, Madars Virza,
38 // CRYPTO 2014,
39 // <http://eprint.iacr.org/2014/595>
40 //---------------------------------------------------------------------------//
41 
42 #ifndef CRYPTO3_ZK_SP_PCD_CIRCUITS_HPP
43 #define CRYPTO3_ZK_SP_PCD_CIRCUITS_HPP
44 
45 #include <nil/crypto3/zk/snark/components/component_from_r1cs.hpp>
46 #include <nil/crypto3/zk/snark/components/hashes/crh_component.hpp>
47 #include <nil/crypto3/zk/snark/components/pairing/pairing_params.hpp>
48 #include <nil/crypto3/zk/snark/components/verifiers/r1cs_ppzksnark_verifier_component.hpp>
49 
50 #include <nil/crypto3/zk/snark/blueprint.hpp>
51 #include <nil/crypto3/zk/snark/schemes/pcd/r1cs_pcd/compliance_predicate/cp_handler.hpp>
52 
53 namespace nil {
54  namespace crypto3 {
55  namespace zk {
56  namespace snark {
57 
58  /**************************** Compliance step ********************************/
59 
66  template<typename CurveType>
68  public:
69  typedef typename CurveType::scalar_field_type FieldType;
70 
72 
73  blueprint<FieldType> bp;
74 
76 
77  std::shared_ptr<block_variable<FieldType>> block_for_outgoing_message;
78  std::shared_ptr<crh_with_field_out_component<FieldType>> hash_outgoing_message;
79 
80  std::vector<block_variable<FieldType>> blocks_for_incoming_messages;
81  std::vector<blueprint_variable_vector<FieldType>>
83  std::vector<multipacking_component<FieldType>>
85  std::vector<blueprint_variable_vector<FieldType>>
87  std::vector<crh_with_field_out_component<FieldType>> hash_incoming_messages;
88 
89  std::shared_ptr<r1cs_ppzksnark_verification_key_variable<CurveType>> sp_translation_step_vk;
90  blueprint_variable_vector<FieldType> sp_translation_step_vk_bits;
91 
93  blueprint_variable_vector<FieldType> outgoing_message_payload;
94  blueprint_variable_vector<FieldType> outgoing_message_vars;
95 
97  std::vector<variable<FieldType>> incoming_message_types;
98  std::vector<blueprint_variable_vector<FieldType>> incoming_message_payloads;
99  std::vector<blueprint_variable_vector<FieldType>> incoming_message_vars;
100 
101  blueprint_variable_vector<FieldType> local_data;
102  blueprint_variable_vector<FieldType> cp_witness;
103  std::shared_ptr<component_from_r1cs<FieldType>> compliance_predicate_as_component;
104 
105  blueprint_variable_vector<FieldType> outgoing_message_bits;
106  std::shared_ptr<multipacking_component<FieldType>> unpack_outgoing_message;
107 
108  std::vector<blueprint_variable_vector<FieldType>> incoming_messages_bits;
109  std::vector<multipacking_component<FieldType>> unpack_incoming_messages;
110 
111  blueprint_variable_vector<FieldType> sp_compliance_step_pcd_circuit_input;
112  blueprint_variable_vector<FieldType> padded_translation_step_vk_and_outgoing_message_digest;
113  std::vector<blueprint_variable_vector<FieldType>>
115 
116  std::vector<blueprint_variable_vector<FieldType>> verifier_input;
117  std::vector<r1cs_ppzksnark_proof_variable<CurveType>> proof;
119  std::vector<r1cs_ppzksnark_verifier_component<CurveType>> verifiers;
120 
125 
127  const r1cs_ppzksnark_verification_key<other_curve<CurveType>> &translation_step_pcd_circuit_vk,
129  &compliance_predicate_primary_input,
131  &compliance_predicate_auxiliary_input,
132  const std::vector<r1cs_ppzksnark_proof<other_curve<CurveType>>> &incoming_proofs);
135 
136  static std::size_t field_logsize();
137  static std::size_t field_capacity();
138  static std::size_t input_size_in_elts();
139  static std::size_t input_capacity_in_bits();
140  static std::size_t input_size_in_bits();
141  };
142 
143  /*************************** Translation step ********************************/
144 
150  template<typename CurveType>
152  public:
153  typedef typename CurveType::scalar_field_type FieldType;
154 
155  blueprint<FieldType> bp;
156 
157  blueprint_variable_vector<FieldType> sp_translation_step_pcd_circuit_input;
158  blueprint_variable_vector<FieldType> unpacked_sp_translation_step_pcd_circuit_input;
159  blueprint_variable_vector<FieldType> verifier_input;
160  std::shared_ptr<multipacking_component<FieldType>> unpack_sp_translation_step_pcd_circuit_input;
161 
162  std::shared_ptr<r1cs_ppzksnark_preprocessed_r1cs_ppzksnark_verification_key_variable<CurveType>>
164  std::shared_ptr<r1cs_ppzksnark_proof_variable<CurveType>> proof;
165  std::shared_ptr<r1cs_ppzksnark_online_verifier_component<CurveType>> online_verifier;
166 
168  const r1cs_ppzksnark_verification_key<other_curve<CurveType>> &compliance_step_vk);
171 
174  translation_step_input,
175  const r1cs_ppzksnark_proof<other_curve<CurveType>> &compliance_step_proof);
178 
179  static std::size_t field_logsize();
180  static std::size_t field_capacity();
181  static std::size_t input_size_in_elts();
182  static std::size_t input_capacity_in_bits();
183  static std::size_t input_size_in_bits();
184  };
185 
186  /****************************** Input maps ***********************************/
187 
191  template<typename CurveType>
193  const std::vector<bool> &sp_translation_step_vk_bits,
195  &primary_input);
196 
200  template<typename CurveType>
202  const std::vector<bool> &sp_translation_step_vk_bits,
204  other_curve<CurveType>::scalar_field_type::value_type> &primary_input);
205 
206  template<typename CurveType>
208  const r1cs_pcd_compliance_predicate<FieldType> &compliance_predicate) :
209  compliance_predicate(compliance_predicate) {
210  /* calculate some useful sizes */
211  assert(compliance_predicate.is_well_formed());
212  assert(compliance_predicate.has_equal_input_and_output_lengths());
213 
214  const std::size_t compliance_predicate_arity = compliance_predicate.max_arity;
215  const std::size_t digest_size = crh_with_field_out_component<FieldType>::get_digest_len();
216  const std::size_t msg_size_in_bits =
217  field_logsize() * (1 + compliance_predicate.outgoing_message_payload_length);
218  const std::size_t sp_translation_step_vk_size_in_bits =
219  r1cs_ppzksnark_verification_key_variable<CurveType>::size_in_bits(
220  sp_translation_step_pcd_circuit_maker<other_curve<CurveType>>::input_size_in_elts());
221  const std::size_t padded_verifier_input_size =
223 
224  const std::size_t block_size = msg_size_in_bits + sp_translation_step_vk_size_in_bits;
225  crh_with_bit_out_component<FieldType>::sample_randomness(block_size);
226 
227  /* allocate input of the compliance PCD circuit */
229 
230  /* allocate inputs to the compliance predicate */
231  outgoing_message_type.allocate(bp);
232  outgoing_message_payload.allocate(bp, compliance_predicate.outgoing_message_payload_length);
233 
237 
238  arity.allocate(bp);
239 
240  incoming_message_types.resize(compliance_predicate_arity);
241  incoming_message_payloads.resize(compliance_predicate_arity);
242  incoming_message_vars.resize(compliance_predicate_arity);
243  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
244  incoming_message_types[i].allocate(bp);
245  incoming_message_payloads[i].allocate(bp, compliance_predicate.outgoing_message_payload_length);
246 
248  incoming_message_vars[i].insert(incoming_message_vars[i].end(),
249  incoming_message_payloads[i].begin(),
250  incoming_message_payloads[i].end());
251  }
252 
253  local_data.allocate(bp, compliance_predicate.local_data_length);
254  cp_witness.allocate(bp, compliance_predicate.witness_length);
255 
256  /* convert compliance predicate from a constraint system into a component */
257  blueprint_variable_vector<FieldType> incoming_messages_concat;
258  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
259  incoming_messages_concat.insert(incoming_messages_concat.end(),
260  incoming_message_vars[i].begin(),
261  incoming_message_vars[i].end());
262  }
263 
264  compliance_predicate_as_component.reset(new component_from_r1cs<FieldType>(
265  bp,
266  {outgoing_message_vars, blueprint_variable_vector<FieldType>(1, arity),
267  incoming_messages_concat, local_data, cp_witness},
268  compliance_predicate.constraint_system));
269 
270  /* unpack messages to bits */
271  outgoing_message_bits.allocate(bp, msg_size_in_bits);
272  unpack_outgoing_message.reset(new multipacking_component<FieldType>(
274 
275  incoming_messages_bits.resize(compliance_predicate_arity);
276  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
277  incoming_messages_bits[i].allocate(bp, msg_size_in_bits);
278  unpack_incoming_messages.emplace_back(multipacking_component<FieldType>(
280  }
281 
282  /* allocate digests */
283  sp_translation_step_vk_and_incoming_message_payload_digests.resize(compliance_predicate_arity);
284  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
286  }
287 
288  /* allocate blocks */
289  sp_translation_step_vk_bits.allocate(bp, sp_translation_step_vk_size_in_bits);
290 
292  new block_variable<FieldType>(bp, {sp_translation_step_vk_bits, outgoing_message_bits}));
293 
294  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
295  blocks_for_incoming_messages.emplace_back(
296  block_variable<FieldType>(bp, {sp_translation_step_vk_bits, incoming_messages_bits[i]}));
297  }
298 
299  /* allocate hash checkers */
300  hash_outgoing_message.reset(new crh_with_field_out_component<FieldType>(
302 
303  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
304  hash_incoming_messages.emplace_back(crh_with_field_out_component<FieldType>(
305  bp, block_size, blocks_for_incoming_messages[i],
307  }
308 
309  /* allocate useful zero variable */
310  zero.allocate(bp);
311 
312  /* prepare arguments for the verifier */
313  sp_translation_step_vk.reset(new r1cs_ppzksnark_verification_key_variable<CurveType>(
315  sp_translation_step_pcd_circuit_maker<other_curve<CurveType>>::input_size_in_elts()));
316 
317  verification_result.allocate(bp);
318  sp_translation_step_vk_and_incoming_message_payload_digest_bits.resize(compliance_predicate_arity);
319 
320  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
322  bp, digest_size * field_logsize());
324  multipacking_component<FieldType>(
325  bp,
328  field_logsize()));
329 
331  while (verifier_input[i].size() < padded_verifier_input_size) {
332  verifier_input[i].emplace_back(zero);
333  }
334 
335  proof.emplace_back(r1cs_ppzksnark_proof_variable<CurveType>(bp));
336  verifiers.emplace_back(r1cs_ppzksnark_verifier_component<CurveType>(
337  bp,
339  verifier_input[i],
340  sp_translation_step_pcd_circuit_maker<other_curve<CurveType>>::field_capacity(),
341  proof[i],
343  }
344 
345  bp.set_input_sizes(input_size_in_elts());
346  }
347 
348  template<typename CurveType>
350  const std::size_t digest_size = crh_with_bit_out_component<FieldType>::get_digest_len();
351  const std::size_t dimension = knapsack_dimension<FieldType>::dimension;
352  const std::size_t compliance_predicate_arity = compliance_predicate.max_arity;
353  unpack_outgoing_message->generate_r1cs_constraints(true);
354 
355  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
356  unpack_incoming_messages[i].generate_r1cs_constraints(true);
357  }
358 
359  sp_translation_step_vk->generate_r1cs_constraints(true);
360 
361  hash_outgoing_message->generate_r1cs_constraints();
362 
363  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
364  hash_incoming_messages[i].generate_r1cs_constraints();
365  }
366 
367  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
368  unpack_sp_translation_step_vk_and_incoming_message_payload_digests[i].generate_r1cs_constraints(
369  true);
370  }
371 
372  compliance_predicate_as_component->generate_r1cs_constraints();
373 
374  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
375  proof[i].generate_r1cs_constraints();
376  }
377 
378  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
379  verifiers[i].generate_r1cs_constraints();
380  }
381 
382  generate_r1cs_equals_const_constraint<FieldType>(bp, zero, FieldType::value_type::zero());
383  generate_boolean_r1cs_constraint<FieldType>(bp, verification_result);
384 
385  /* type * (1-verification_result) = 0 */
386  bp.add_r1cs_constraint(
387  r1cs_constraint<FieldType>(incoming_message_types[0], 1 - verification_result, 0));
388 
389  /* all types equal */
390  for (std::size_t i = 1; i < compliance_predicate.max_arity; ++i) {
391  bp.add_r1cs_constraint(
392  r1cs_constraint<FieldType>(1, incoming_message_types[0], incoming_message_types[i]));
393  }
394 
395  bp.add_r1cs_constraint(r1cs_constraint<FieldType>(1, arity, compliance_predicate_arity));
396  bp.add_r1cs_constraint(r1cs_constraint<FieldType>(
397  1, outgoing_message_type, typename FieldType::value_type(compliance_predicate.type)));
398  }
399 
400  template<typename CurveType>
403  return bp.get_constraint_system();
404  }
405 
406  template<typename CurveType>
409  return bp.primary_input();
410  }
411 
412  template<typename CurveType>
415  return bp.auxiliary_input();
416  }
417 
418  template<typename CurveType>
420  const r1cs_ppzksnark_verification_key<other_curve<CurveType>> &sp_translation_step_pcd_circuit_vk,
421  const r1cs_pcd_compliance_predicate_primary_input<FieldType> &compliance_predicate_primary_input,
423  &compliance_predicate_auxiliary_input,
424  const std::vector<r1cs_ppzksnark_proof<other_curve<CurveType>>> &incoming_proofs) {
425  const std::size_t compliance_predicate_arity = compliance_predicate.max_arity;
426  this->bp.clear_values();
427  this->bp.val(zero) = FieldType::value_type::zero();
428 
429  compliance_predicate_as_component->generate_r1cs_witness(
430  compliance_predicate_primary_input.as_r1cs_primary_input(),
431  compliance_predicate_auxiliary_input.as_r1cs_auxiliary_input(
432  compliance_predicate.incoming_message_payload_lengths));
433  this->bp.val(arity) = typename FieldType::value_type(compliance_predicate_arity);
434  unpack_outgoing_message->generate_r1cs_witness_from_packed();
435  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
436  unpack_incoming_messages[i].generate_r1cs_witness_from_packed();
437  }
438 
439  sp_translation_step_vk->generate_r1cs_witness(sp_translation_step_pcd_circuit_vk);
440  hash_outgoing_message->generate_r1cs_witness();
441  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
442  hash_incoming_messages[i].generate_r1cs_witness();
443  unpack_sp_translation_step_vk_and_incoming_message_payload_digests[i]
444  .generate_r1cs_witness_from_packed();
445  }
446 
447  for (std::size_t i = 0; i < compliance_predicate_arity; ++i) {
448  proof[i].generate_r1cs_witness(incoming_proofs[i]);
449  verifiers[i].generate_r1cs_witness();
450  }
451 
452  if (this->bp.val(incoming_message_types[0]) != FieldType::value_type::zero()) {
453  this->bp.val(verification_result) = FieldType::value_type::zero();
454  }
455  }
456 
457  template<typename CurveType>
459  return typename CurveType::scalar_field_type::value_bits;
460  }
461 
462  template<typename CurveType>
464  return typename CurveType::scalar_field_type::capacity();
465  }
466 
467  template<typename CurveType>
469  const std::size_t digest_size = crh_with_field_out_component<FieldType>::get_digest_len();
470  return digest_size;
471  }
472 
473  template<typename CurveType>
475  return input_size_in_elts() * field_capacity();
476  }
477 
478  template<typename CurveType>
480  return input_size_in_elts() * field_logsize();
481  }
482 
483  template<typename CurveType>
485  const r1cs_ppzksnark_verification_key<other_curve<CurveType>> &sp_compliance_step_vk) {
486  /* allocate input of the translation PCD circuit */
487  sp_translation_step_pcd_circuit_input.allocate(bp, input_size_in_elts());
488 
489  /* unpack translation step PCD circuit input */
490  unpacked_sp_translation_step_pcd_circuit_input.allocate(
491  bp, sp_compliance_step_pcd_circuit_maker<other_curve<CurveType>>::input_size_in_bits());
492  unpack_sp_translation_step_pcd_circuit_input.reset(
493  new multipacking_component<FieldType>(bp, unpacked_sp_translation_step_pcd_circuit_input,
494  sp_translation_step_pcd_circuit_input, field_capacity()));
495 
496  /* prepare arguments for the verifier */
497  hardcoded_sp_compliance_step_vk.reset(
498  new r1cs_ppzksnark_preprocessed_r1cs_ppzksnark_verification_key_variable<CurveType>(
499  bp, sp_compliance_step_vk));
500  proof.reset(new r1cs_ppzksnark_proof_variable<CurveType>(bp));
501 
502  /* verify previous proof */
503  online_verifier.reset(new r1cs_ppzksnark_online_verifier_component<CurveType>(
504  bp,
505  *hardcoded_sp_compliance_step_vk,
506  unpacked_sp_translation_step_pcd_circuit_input,
507  sp_compliance_step_pcd_circuit_maker<other_curve<CurveType>>::field_logsize(),
508  *proof,
509  variable<FieldType>(0)));
510  bp.set_input_sizes(input_size_in_elts());
511  }
512 
513  template<typename CurveType>
515  unpack_sp_translation_step_pcd_circuit_input->generate_r1cs_constraints(true);
516 
517  proof->generate_r1cs_constraints();
518 
519  online_verifier->generate_r1cs_constraints();
520  }
521 
522  template<typename CurveType>
525  return bp.get_constraint_system();
526  }
527 
528  template<typename CurveType>
531  sp_translation_step_input,
532  const r1cs_ppzksnark_proof<other_curve<CurveType>> &compliance_step_proof) {
533  this->bp.clear_values();
534  sp_translation_step_pcd_circuit_input.fill_with_field_elements(bp, sp_translation_step_input);
535  unpack_sp_translation_step_pcd_circuit_input->generate_r1cs_witness_from_packed();
536 
537  proof->generate_r1cs_witness(compliance_step_proof);
538  online_verifier->generate_r1cs_witness();
539  }
540 
541  template<typename CurveType>
544  return bp.primary_input();
545  }
546 
547  template<typename CurveType>
550  return bp.auxiliary_input();
551  }
552 
553  template<typename CurveType>
555  return typename CurveType::scalar_field_type::value_bits;
556  }
557 
558  template<typename CurveType>
560  return typename CurveType::scalar_field_type::capacity();
561  }
562 
563  template<typename CurveType>
565  return algebra::div_ceil(
566  sp_compliance_step_pcd_circuit_maker<other_curve<CurveType>>::input_size_in_bits(),
568  }
569 
570  template<typename CurveType>
572  return input_size_in_elts() * field_capacity();
573  }
574 
575  template<typename CurveType>
577  return input_size_in_elts() * field_logsize();
578  }
579 
580  template<typename CurveType>
582  const std::vector<bool> &sp_translation_step_vk_bits,
584  &primary_input) {
585  typedef typename CurveType::scalar_field_type FieldType;
586 
587  const r1cs_variable_assignment<FieldType> outgoing_message_as_va =
588  primary_input.outgoing_message->as_r1cs_variable_assignment();
589  std::vector<bool> msg_bits;
590  for (const typename FieldType::value_type &elt : outgoing_message_as_va) {
591  const std::vector<bool> elt_bits = algebra::convert_field_element_to_bit_vector(elt);
592  msg_bits.insert(msg_bits.end(), elt_bits.begin(), elt_bits.end());
593  }
594 
595  std::vector<bool> block;
596  block.insert(block.end(), sp_translation_step_vk_bits.begin(), sp_translation_step_vk_bits.end());
597  block.insert(block.end(), msg_bits.begin(), msg_bits.end());
598 
599  crh_with_field_out_component<FieldType>::sample_randomness(block.size());
600 
601  const std::vector<typename FieldType::value_type> digest =
602  crh_with_field_out_component<FieldType>::get_hash(block);
603 
604  return digest;
605  }
606 
607  template<typename CurveType>
609  const std::vector<bool> &sp_translation_step_vk_bits,
611  other_curve<CurveType>::scalar_field_type::value_type> &primary_input) {
612  typedef typename CurveType::scalar_field_type FieldType;
613 
614  const std::vector<other_curve<CurveType>::scalar_field_type::value_type>
615  sp_compliance_step_pcd_circuit_input =
616  get_sp_compliance_step_pcd_circuit_input<other_curve<CurveType>>(
617  sp_translation_step_vk_bits, primary_input);
618  std::vector<bool> sp_compliance_step_pcd_circuit_input_bits;
619  for (const other_curve<CurveType>::scalar_field_type::value_type &elt :
620  sp_compliance_step_pcd_circuit_input) {
621  const std::vector<bool> elt_bits = algebra::convert_field_element_to_bit_vector<
622  other_curve<CurveType>::scalar_field_type::value_type>(elt);
623  sp_compliance_step_pcd_circuit_input_bits.insert(
624  sp_compliance_step_pcd_circuit_input_bits.end(), elt_bits.begin(), elt_bits.end());
625  }
626 
627  sp_compliance_step_pcd_circuit_input_bits.resize(
629 
630  const r1cs_primary_input<FieldType> result =
631  algebra::pack_bit_vector_into_field_element_vector<FieldType>(
632  sp_compliance_step_pcd_circuit_input_bits,
634 
635  return result;
636  }
637  } // namespace snark
638  } // namespace zk
639  } // namespace crypto3
640 } // namespace nil
641 
642 #endif // CRYPTO3_ZK_SP_PCD_CIRCUITS_HPP
Definition: snark/proof.hpp:37
r1cs_auxiliary_input< FieldType > as_r1cs_auxiliary_input(const std::vector< std::size_t > &incoming_message_payload_lengths) const
Definition: r1cs_pcd_params.hpp:68
std::shared_ptr< r1cs_pcd_message< FieldType > > outgoing_message
Definition: r1cs_pcd_params.hpp:42
r1cs_primary_input< FieldType > as_r1cs_primary_input() const
Definition: r1cs_pcd_params.hpp:48
Definition: compliance_predicate.hpp:123
Definition: snark/systems/ppzksnark/r1cs_ppzksnark/proof.hpp:43
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_ppzksnark/verification_key.hpp:42
std::vector< multipacking_component< FieldType > > unpack_incoming_messages
Definition: sp_pcd_circuits.hpp:109
std::vector< r1cs_ppzksnark_verifier_component< CurveType > > verifiers
Definition: sp_pcd_circuits.hpp:119
blueprint_variable_vector< FieldType > sp_translation_step_vk_bits
Definition: sp_pcd_circuits.hpp:90
r1cs_auxiliary_input< FieldType > get_auxiliary_input() const
Definition: sp_pcd_circuits.hpp:414
sp_compliance_step_pcd_circuit_maker(const r1cs_pcd_compliance_predicate< FieldType > &compliance_predicate)
Definition: sp_pcd_circuits.hpp:207
std::vector< multipacking_component< FieldType > > unpack_sp_translation_step_vk_and_incoming_message_payload_digests
Definition: sp_pcd_circuits.hpp:84
std::shared_ptr< multipacking_component< FieldType > > unpack_outgoing_message
Definition: sp_pcd_circuits.hpp:106
static std::size_t input_capacity_in_bits()
Definition: sp_pcd_circuits.hpp:474
variable< FieldType > verification_result
Definition: sp_pcd_circuits.hpp:118
std::vector< blueprint_variable_vector< FieldType > > padded_translation_step_vk_and_incoming_messages_digests
Definition: sp_pcd_circuits.hpp:114
std::vector< block_variable< FieldType > > blocks_for_incoming_messages
Definition: sp_pcd_circuits.hpp:80
blueprint_variable_vector< FieldType > outgoing_message_vars
Definition: sp_pcd_circuits.hpp:94
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
std::shared_ptr< component_from_r1cs< FieldType > > compliance_predicate_as_component
Definition: sp_pcd_circuits.hpp:103
std::vector< crh_with_field_out_component< FieldType > > hash_incoming_messages
Definition: sp_pcd_circuits.hpp:87
variable< FieldType > arity
Definition: sp_pcd_circuits.hpp:96
static std::size_t input_size_in_elts()
Definition: sp_pcd_circuits.hpp:468
std::vector< variable< FieldType > > incoming_message_types
Definition: sp_pcd_circuits.hpp:97
static std::size_t field_capacity()
Definition: sp_pcd_circuits.hpp:463
CurveType::scalar_field_type FieldType
Definition: sp_pcd_circuits.hpp:69
variable< FieldType > outgoing_message_type
Definition: sp_pcd_circuits.hpp:92
void generate_r1cs_constraints()
Definition: sp_pcd_circuits.hpp:349
std::shared_ptr< crh_with_field_out_component< FieldType > > hash_outgoing_message
Definition: sp_pcd_circuits.hpp:78
r1cs_constraint_system< FieldType > get_circuit() const
Definition: sp_pcd_circuits.hpp:402
blueprint_variable_vector< FieldType > cp_witness
Definition: sp_pcd_circuits.hpp:102
static std::size_t input_size_in_bits()
Definition: sp_pcd_circuits.hpp:479
blueprint_variable_vector< FieldType > outgoing_message_payload
Definition: sp_pcd_circuits.hpp:93
blueprint_variable_vector< FieldType > padded_translation_step_vk_and_outgoing_message_digest
Definition: sp_pcd_circuits.hpp:112
variable< FieldType > zero
Definition: sp_pcd_circuits.hpp:75
blueprint_variable_vector< FieldType > sp_compliance_step_pcd_circuit_input
Definition: sp_pcd_circuits.hpp:111
std::vector< blueprint_variable_vector< FieldType > > verifier_input
Definition: sp_pcd_circuits.hpp:116
std::shared_ptr< block_variable< FieldType > > block_for_outgoing_message
Definition: sp_pcd_circuits.hpp:77
blueprint_variable_vector< FieldType > outgoing_message_bits
Definition: sp_pcd_circuits.hpp:105
std::shared_ptr< r1cs_ppzksnark_verification_key_variable< CurveType > > sp_translation_step_vk
Definition: sp_pcd_circuits.hpp:89
std::vector< r1cs_ppzksnark_proof_variable< CurveType > > proof
Definition: sp_pcd_circuits.hpp:117
std::vector< blueprint_variable_vector< FieldType > > sp_translation_step_vk_and_incoming_message_payload_digest_bits
Definition: sp_pcd_circuits.hpp:86
std::vector< blueprint_variable_vector< FieldType > > incoming_message_payloads
Definition: sp_pcd_circuits.hpp:98
std::vector< blueprint_variable_vector< FieldType > > incoming_message_vars
Definition: sp_pcd_circuits.hpp:99
blueprint< FieldType > bp
Definition: sp_pcd_circuits.hpp:73
static std::size_t field_logsize()
Definition: sp_pcd_circuits.hpp:458
blueprint_variable_vector< FieldType > local_data
Definition: sp_pcd_circuits.hpp:101
std::vector< blueprint_variable_vector< FieldType > > incoming_messages_bits
Definition: sp_pcd_circuits.hpp:108
r1cs_primary_input< FieldType > get_primary_input() const
Definition: sp_pcd_circuits.hpp:408
r1cs_pcd_compliance_predicate< FieldType > compliance_predicate
Definition: sp_pcd_circuits.hpp:71
std::vector< blueprint_variable_vector< FieldType > > sp_translation_step_vk_and_incoming_message_payload_digests
Definition: sp_pcd_circuits.hpp:82
std::shared_ptr< r1cs_ppzksnark_proof_variable< CurveType > > proof
Definition: sp_pcd_circuits.hpp:164
sp_translation_step_pcd_circuit_maker(const r1cs_ppzksnark_verification_key< other_curve< CurveType >> &compliance_step_vk)
Definition: sp_pcd_circuits.hpp:484
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
static std::size_t field_logsize()
Definition: sp_pcd_circuits.hpp:554
static std::size_t input_size_in_bits()
Definition: sp_pcd_circuits.hpp:576
std::shared_ptr< r1cs_ppzksnark_preprocessed_r1cs_ppzksnark_verification_key_variable< CurveType > > hardcoded_sp_compliance_step_vk
Definition: sp_pcd_circuits.hpp:163
r1cs_primary_input< FieldType > get_primary_input() const
Definition: sp_pcd_circuits.hpp:543
std::shared_ptr< r1cs_ppzksnark_online_verifier_component< CurveType > > online_verifier
Definition: sp_pcd_circuits.hpp:165
static std::size_t input_size_in_elts()
Definition: sp_pcd_circuits.hpp:564
blueprint_variable_vector< FieldType > sp_translation_step_pcd_circuit_input
Definition: sp_pcd_circuits.hpp:157
r1cs_constraint_system< FieldType > get_circuit() const
Definition: sp_pcd_circuits.hpp:524
static std::size_t input_capacity_in_bits()
Definition: sp_pcd_circuits.hpp:571
blueprint< FieldType > bp
Definition: sp_pcd_circuits.hpp:155
blueprint_variable_vector< FieldType > verifier_input
Definition: sp_pcd_circuits.hpp:159
CurveType::scalar_field_type FieldType
Definition: sp_pcd_circuits.hpp:153
std::shared_ptr< multipacking_component< FieldType > > unpack_sp_translation_step_pcd_circuit_input
Definition: sp_pcd_circuits.hpp:160
static std::size_t field_capacity()
Definition: sp_pcd_circuits.hpp:559
r1cs_auxiliary_input< FieldType > get_auxiliary_input() const
Definition: sp_pcd_circuits.hpp:549
blueprint_variable_vector< FieldType > unpacked_sp_translation_step_pcd_circuit_input
Definition: sp_pcd_circuits.hpp:158
vector(T, U...) -> vector< std::enable_if_t<(std::is_same_v< T, U > &&...), T >, 1+sizeof...(U)>
deduction guide for uniform initialization
boost::mpl::apply< AccumulatorSet, tag::block< Mode > >::type::result_type block(const AccumulatorSet &acc)
Definition: accumulators/block.hpp:259
std::vector< typename FieldType::value_type > r1cs_auxiliary_input
Definition: r1cs.hpp:104
r1cs_primary_input< typename CurveType::scalar_field_type > get_sp_translation_step_pcd_circuit_input(const std::vector< bool > &sp_translation_step_vk_bits, const r1cs_pcd_compliance_predicate_primary_input< other_curve< CurveType >::scalar_field_type::value_type > &primary_input)
Definition: sp_pcd_circuits.hpp:608
std::vector< typename FieldType::value_type > r1cs_primary_input
Definition: r1cs.hpp:101
r1cs_primary_input< typename CurveType::scalar_field_type > get_sp_compliance_step_pcd_circuit_input(const std::vector< bool > &sp_translation_step_vk_bits, const r1cs_pcd_compliance_predicate_primary_input< typename CurveType::scalar_field_type > &primary_input)
Definition: sp_pcd_circuits.hpp:581
std::vector< typename FieldType::value_type > r1cs_variable_assignment
Definition: r1cs.hpp:107
boost::container::small_vector< octet_type, DigestBits/octet_bits > digest
Definition: codec/include/nil/crypto3/detail/digest.hpp:71
Definition: pair.hpp:31
Definition: block/include/nil/crypto3/detail/digest.hpp:72
Definition: variable.hpp:66