Zecale - Reconciling Privacy and Scalability on Smart-Contract Chains  0.5
Reference implementation of the Zecale protocol by Clearmatics
aggregator_gadget.hpp
Go to the documentation of this file.
1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
2 //
3 // SPDX-License-Identifier: LGPL-3.0+
4 
5 #ifndef __ZECALE_CIRCUITS_AGGREGATOR_GADGET_HPP_
6 #define __ZECALE_CIRCUITS_AGGREGATOR_GADGET_HPP_
7 
8 #include <libff/algebra/fields/field_utils.hpp>
9 #include <libsnark/gadgetlib1/gadget.hpp>
10 #include <libsnark/gadgetlib1/gadgets/basic_gadgets.hpp>
11 #include <libsnark/gadgetlib1/gadgets/pairing/pairing_params.hpp>
12 #include <libzeth/core/extended_proof.hpp>
13 
14 namespace libzecale
15 {
16 
31 template<typename wppT, typename nverifierT, size_t NumProofs>
32 class aggregator_gadget : libsnark::gadget<libff::Fr<wppT>>
33 {
34 private:
35  using npp = libsnark::other_curve<wppT>;
36  using nsnark = typename nverifierT::snark;
37  using process_verification_key_gadget =
38  typename nverifierT::process_verification_key_gadget;
39  using online_verifier_gadget = typename nverifierT::online_verifier_gadget;
40  using proof_variable_gadget = typename nverifierT::proof_variable_gadget;
41  using verification_key_variable_gadget =
42  typename nverifierT::verification_key_variable_gadget;
43  using processed_verification_key_variable_gadget =
44  typename nverifierT::processed_verification_key_variable_gadget;
45  using input_packing_gadget = libsnark::multipacking_gadget<libff::Fr<wppT>>;
46 
47  const size_t num_inputs_per_nested_proof;
48 
49  // TODO: Remove unused variables
50 
52  processed_verification_key_variable_gadget processed_vk;
53 
54  // Required in order to generate the bit strings from instance value.
55  std::array<libsnark::pb_variable_array<libff::Fr<wppT>>, NumProofs>
56  nested_primary_inputs;
57 
61  std::array<libsnark::pb_variable_array<libff::Fr<wppT>>, NumProofs>
62  nested_primary_inputs_bits;
63 
65  process_verification_key_gadget vk_processor;
66 
68  std::vector<std::shared_ptr<input_packing_gadget>>
69  nested_primary_input_packers;
70 
71  // Gadgets that verify the proofs and inputs against nested_vk.
72  std::array<std::shared_ptr<online_verifier_gadget>, NumProofs> verifiers;
73 
74 public:
76  libsnark::protoboard<libff::Fr<wppT>> &pb,
77  const verification_key_variable_gadget &vk,
78  const std::array<
79  libsnark::pb_variable_array<libff::Fr<wppT>>,
80  NumProofs> &inputs,
81  const std::array<std::shared_ptr<proof_variable_gadget>, NumProofs>
82  &proofs,
83  const std::array<libsnark::pb_variable<libff::Fr<wppT>>, NumProofs>
84  &proof_results,
85  const std::string &annotation_prefix);
86 
88 
92  const std::array<
93  const libsnark::r1cs_primary_input<libff::Fr<npp>> *,
94  NumProofs> &in_extended_proofs);
95 };
96 
97 } // namespace libzecale
98 
100 
101 #endif // __ZECALE_CIRCUITS_AGGREGATOR_GADGET_HPP_
libzecale::aggregator_gadget
Definition: aggregator_gadget.hpp:32
aggregator_gadget.tcc
libzecale::aggregator_gadget::aggregator_gadget
aggregator_gadget(libsnark::protoboard< libff::Fr< wppT >> &pb, const verification_key_variable_gadget &vk, const std::array< libsnark::pb_variable_array< libff::Fr< wppT >>, NumProofs > &inputs, const std::array< std::shared_ptr< proof_variable_gadget >, NumProofs > &proofs, const std::array< libsnark::pb_variable< libff::Fr< wppT >>, NumProofs > &proof_results, const std::string &annotation_prefix)
libzecale
Definition: aggregator_circuit.hpp:15
libzecale::aggregator_gadget::generate_r1cs_witness
void generate_r1cs_witness(const std::array< const libsnark::r1cs_primary_input< libff::Fr< npp >> *, NumProofs > &in_extended_proofs)
libzecale::aggregator_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()