Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
binary_operation.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 __ZETH_CIRCUITS_BINARY_OPERATION_HPP__
6 #define __ZETH_CIRCUITS_BINARY_OPERATION_HPP__
7 
9 #include "libzeth/core/bits.hpp"
10 #include "math.h"
11 
12 #include <libsnark/gadgetlib1/gadget.hpp>
13 #include <libsnark/gadgetlib1/gadgets/basic_gadgets.hpp>
14 
15 namespace libzeth
16 {
17 
21 template<typename FieldT> class xor_gadget : public libsnark::gadget<FieldT>
22 {
23 
24 private:
25  const libsnark::pb_variable_array<FieldT> a;
26  const libsnark::pb_variable_array<FieldT> b;
27 
28 public:
29  libsnark::pb_variable_array<FieldT> res;
30 
31  xor_gadget(
32  libsnark::protoboard<FieldT> &pb,
33  const libsnark::pb_variable_array<FieldT> &a,
34  const libsnark::pb_variable_array<FieldT> &b,
35  const libsnark::pb_variable_array<FieldT> &res,
36  const std::string &annotation_prefix = "xor_gadget");
37 
39  void generate_r1cs_witness();
40 };
41 
45 template<typename FieldT>
46 class xor_constant_gadget : public libsnark::gadget<FieldT>
47 {
48 private:
49  const libsnark::pb_variable_array<FieldT> a;
50  const libsnark::pb_variable_array<FieldT> b;
51  const std::vector<FieldT> c;
52 
53 public:
54  libsnark::pb_variable_array<FieldT> res;
55 
57  libsnark::protoboard<FieldT> &pb,
58  const libsnark::pb_variable_array<FieldT> &a,
59  const libsnark::pb_variable_array<FieldT> &b,
60  const std::vector<FieldT> &c,
61  const libsnark::pb_variable_array<FieldT> &res,
62  const std::string &annotation_prefix = "xor_constant_gadget");
63 
65  void generate_r1cs_witness();
66 };
67 
71 template<typename FieldT> class xor_rot_gadget : public libsnark::gadget<FieldT>
72 {
73 private:
74  const libsnark::pb_variable_array<FieldT> a;
75  const libsnark::pb_variable_array<FieldT> b;
76  const size_t shift;
77 
78 public:
79  libsnark::pb_variable_array<FieldT> res;
80 
82  libsnark::protoboard<FieldT> &pb,
83  const libsnark::pb_variable_array<FieldT> &a,
84  const libsnark::pb_variable_array<FieldT> &b,
85  const size_t shift,
86  const libsnark::pb_variable_array<FieldT> &res,
87  const std::string &annotation_prefix = "xor_rot_gadget");
88 
90  void generate_r1cs_witness();
91 };
92 
97 template<typename FieldT>
98 class double_bit32_sum_eq_gadget : public libsnark::gadget<FieldT>
99 {
100 private:
101  libsnark::pb_variable_array<FieldT> a;
102  libsnark::pb_variable_array<FieldT> b;
103 
104 public:
105  libsnark::pb_variable_array<FieldT> res;
106 
108  libsnark::protoboard<FieldT> &pb,
109  const libsnark::pb_variable_array<FieldT> &a,
110  const libsnark::pb_variable_array<FieldT> &b,
111  const libsnark::pb_variable_array<FieldT> &res,
112  const std::string &annotation_prefix = "double_bit32_sum_eq_gadget");
113 
114  void generate_r1cs_constraints(bool enforce_boolean = true);
115  void generate_r1cs_witness();
116 };
117 
118 } // namespace libzeth
119 
121 
122 #endif // __ZETH_CIRCUITS_BINARY_OPERATION_HPP__
libzeth::double_bit32_sum_eq_gadget::res
libsnark::pb_variable_array< FieldT > res
Definition: binary_operation.hpp:105
libzeth::xor_rot_gadget::xor_rot_gadget
xor_rot_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable_array< FieldT > &a, const libsnark::pb_variable_array< FieldT > &b, const size_t shift, const libsnark::pb_variable_array< FieldT > &res, const std::string &annotation_prefix="xor_rot_gadget")
libzeth::double_bit32_sum_eq_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libzeth::xor_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libzeth::xor_gadget::xor_gadget
xor_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable_array< FieldT > &a, const libsnark::pb_variable_array< FieldT > &b, const libsnark::pb_variable_array< FieldT > &res, const std::string &annotation_prefix="xor_gadget")
libzeth::xor_constant_gadget
Definition: binary_operation.hpp:46
binary_operation.tcc
libzeth
Definition: binary_operation.hpp:15
libzeth::xor_rot_gadget::res
libsnark::pb_variable_array< FieldT > res
Definition: binary_operation.hpp:79
libzeth::xor_constant_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libzeth::xor_constant_gadget::xor_constant_gadget
xor_constant_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable_array< FieldT > &a, const libsnark::pb_variable_array< FieldT > &b, const std::vector< FieldT > &c, const libsnark::pb_variable_array< FieldT > &res, const std::string &annotation_prefix="xor_constant_gadget")
circuit_utils.hpp
libzeth::xor_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libzeth::xor_rot_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libzeth::xor_rot_gadget
Definition: binary_operation.hpp:71
libzeth::xor_constant_gadget::res
libsnark::pb_variable_array< FieldT > res
Definition: binary_operation.hpp:54
libzeth::xor_gadget
Definition: binary_operation.hpp:21
libzeth::xor_constant_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libzeth::xor_rot_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
bits.hpp
libzeth::double_bit32_sum_eq_gadget::double_bit32_sum_eq_gadget
double_bit32_sum_eq_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable_array< FieldT > &a, const libsnark::pb_variable_array< FieldT > &b, const libsnark::pb_variable_array< FieldT > &res, const std::string &annotation_prefix="double_bit32_sum_eq_gadget")
libzeth::xor_gadget::res
libsnark::pb_variable_array< FieldT > res
Definition: binary_operation.hpp:29
libzeth::double_bit32_sum_eq_gadget
Definition: binary_operation.hpp:98
libzeth::double_bit32_sum_eq_gadget::generate_r1cs_constraints
void generate_r1cs_constraints(bool enforce_boolean=true)