Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
g_primitive.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_G_PRIMITIVE_HPP__
6 #define __ZETH_CIRCUITS_G_PRIMITIVE_HPP__
7 
10 #include "libzeth/core/bits.hpp"
11 
12 #include <libsnark/gadgetlib1/gadget.hpp>
13 #include <libsnark/gadgetlib1/gadgets/basic_gadgets.hpp>
14 
15 namespace libzeth
16 {
17 
20 template<typename FieldT> class g_primitive : public libsnark::gadget<FieldT>
21 {
22 private:
23  // See: Section 2.1 https://tools.ietf.org/html/rfc7693
24  static const int rotation_constant_r1 = 16;
25  static const int rotation_constant_r2 = 12;
26  static const int rotation_constant_r3 = 8;
27  static const int rotation_constant_r4 = 7;
28 
29  libsnark::pb_variable_array<FieldT> a1;
30  libsnark::pb_variable_array<FieldT> a1_temp;
31  libsnark::pb_variable_array<FieldT> a2_temp;
32  libsnark::pb_variable_array<FieldT> b1;
33  libsnark::pb_variable_array<FieldT> c1;
34  libsnark::pb_variable_array<FieldT> d1;
35 
36  libsnark::pb_variable_array<FieldT> a2;
37  libsnark::pb_variable_array<FieldT> b2;
38  libsnark::pb_variable_array<FieldT> c2;
39  libsnark::pb_variable_array<FieldT> d2;
40 
41  std::shared_ptr<xor_rot_gadget<FieldT>> d1_xor_gadget;
42  std::shared_ptr<xor_rot_gadget<FieldT>> b1_xor_gadget;
43  std::shared_ptr<xor_rot_gadget<FieldT>> d2_xor_gadget;
44  std::shared_ptr<xor_rot_gadget<FieldT>> b2_xor_gadget;
45  std::shared_ptr<double_bit32_sum_eq_gadget<FieldT>> a1_1_sum_gadget;
46  std::shared_ptr<double_bit32_sum_eq_gadget<FieldT>> a1_2_sum_gadget;
47  std::shared_ptr<double_bit32_sum_eq_gadget<FieldT>> c1_sum_gadget;
48  std::shared_ptr<double_bit32_sum_eq_gadget<FieldT>> a2_1_sum_gadget;
49  std::shared_ptr<double_bit32_sum_eq_gadget<FieldT>> a2_2_sum_gadget;
50  std::shared_ptr<double_bit32_sum_eq_gadget<FieldT>> c2_sum_gadget;
51 
52 public:
54  libsnark::protoboard<FieldT> &pb,
55  libsnark::pb_variable_array<FieldT> a,
56  libsnark::pb_variable_array<FieldT> b,
57  libsnark::pb_variable_array<FieldT> c,
58  libsnark::pb_variable_array<FieldT> d,
59  libsnark::pb_variable_array<FieldT> x,
60  libsnark::pb_variable_array<FieldT> y,
61  libsnark::pb_variable_array<FieldT> a2,
62  libsnark::pb_variable_array<FieldT> b2,
63  libsnark::pb_variable_array<FieldT> c2,
64  libsnark::pb_variable_array<FieldT> d2,
65  const std::string &annotation_prefix = "g_primitive_gadget");
66 
68  void generate_r1cs_witness();
69 };
70 
71 } // namespace libzeth
72 
74 
75 #endif // __ZETH_CIRCUITS_G_PRIMITIVE_HPP__
libzeth::g_primitive::generate_r1cs_constraints
void generate_r1cs_constraints()
binary_operation.hpp
libzeth
Definition: binary_operation.hpp:15
libzeth::g_primitive::generate_r1cs_witness
void generate_r1cs_witness()
circuit_utils.hpp
libzeth::g_primitive
Definition: g_primitive.hpp:20
libzeth::g_primitive::g_primitive
g_primitive(libsnark::protoboard< FieldT > &pb, libsnark::pb_variable_array< FieldT > a, libsnark::pb_variable_array< FieldT > b, libsnark::pb_variable_array< FieldT > c, libsnark::pb_variable_array< FieldT > d, libsnark::pb_variable_array< FieldT > x, libsnark::pb_variable_array< FieldT > y, libsnark::pb_variable_array< FieldT > a2, libsnark::pb_variable_array< FieldT > b2, libsnark::pb_variable_array< FieldT > c2, libsnark::pb_variable_array< FieldT > d2, const std::string &annotation_prefix="g_primitive_gadget")
g_primitive.tcc
bits.hpp