Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
commitment.hpp
Go to the documentation of this file.
1 #ifndef __ZETH_CIRCUITS_COMMITMENT_HPP__
2 #define __ZETH_CIRCUITS_COMMITMENT_HPP__
3 
4 // DISCLAIMER:
5 // Content Taken and adapted from Zcash
6 // https://github.com/zcash/zcash/blob/master/src/zcash/circuit/commitment.tcc
7 
9 
10 #include <libsnark/gadgetlib1/gadget.hpp>
11 #include <libsnark/gadgetlib1/gadgets/hashes/hash_io.hpp>
12 
13 namespace libzeth
14 {
15 
16 template<typename FieldT, typename HashT>
17 class COMM_gadget : public libsnark::gadget<FieldT>
18 {
19 private:
20  // input variable block = {x, y}
21  std::shared_ptr<libsnark::block_variable<FieldT>> block;
22 
23  // Hash gadget used as a commitment
24  std::shared_ptr<HashT> hasher;
25 
26  // hash digest = HashT(x || y)
27  std::shared_ptr<libsnark::digest_variable<FieldT>> result;
28 
29 public:
31  libsnark::protoboard<FieldT> &pb,
32  const libsnark::pb_variable_array<FieldT> &x,
33  const libsnark::pb_variable_array<FieldT> &y,
34  std::shared_ptr<libsnark::digest_variable<FieldT>> result,
35  const std::string &annotation_prefix = "COMM_gadget");
37  void generate_r1cs_witness();
38 };
39 
40 // See Zerocash extended paper, page 22
41 // The commitment cm is computed as
42 // HashT(HashT( trap_r || [HashT(a_pk, rho)]_[128]) || "0"*192 || v)
43 // We denote by trap_r the trapdoor r
44 template<typename FieldT, typename HashT>
45 class COMM_cm_gadget : public libsnark::gadget<FieldT>
46 {
47 private:
48  // input variable
49  libsnark::pb_variable_array<FieldT> input;
50  libsnark::pb_variable_array<FieldT> a_pk;
51  libsnark::pb_variable_array<FieldT> rho;
52  libsnark::pb_variable_array<FieldT> trap_r;
53  libsnark::pb_variable_array<FieldT> value_v;
54  std::shared_ptr<libsnark::digest_variable<FieldT>> temp_result;
55 
56  // Hash gadgets used as inner, outer and final commitments
57  std::shared_ptr<COMM_gadget<FieldT, HashT>> com_gadget;
58 
59  // Packing gadget to output field element
60  std::shared_ptr<libsnark::packing_gadget<FieldT>> bits_to_field;
61 
62 public:
64  libsnark::protoboard<FieldT> &pb,
65  // ZethNote public address key, 256 bits
66  const libsnark::pb_variable_array<FieldT> &a_pk,
67  // ZethNote nullifier's preimage, 256 bits
68  const libsnark::pb_variable_array<FieldT> &rho,
69  // ZethNote randomness, 256 bits
70  const libsnark::pb_variable_array<FieldT> &trap_r,
71  // ZethNote value 64 bits
72  const libsnark::pb_variable_array<FieldT> &value_v,
73  libsnark::pb_variable<FieldT> result,
74  const std::string &annotation_prefix = "COMM_cm_gadget");
75 
77  void generate_r1cs_witness();
78 };
79 
80 } // namespace libzeth
81 
83 
84 #endif // __ZETH_CIRCUITS_COMMITMENT_HPP__
libzeth::COMM_cm_gadget
Definition: commitment.hpp:45
libzeth::COMM_cm_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libzeth::COMM_gadget
Definition: commitment.hpp:17
libzeth
Definition: binary_operation.hpp:15
libzeth::COMM_gadget::COMM_gadget
COMM_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable_array< FieldT > &x, const libsnark::pb_variable_array< FieldT > &y, std::shared_ptr< libsnark::digest_variable< FieldT >> result, const std::string &annotation_prefix="COMM_gadget")
libzeth::COMM_gadget::generate_r1cs_witness
void generate_r1cs_witness()
zeth_constants.hpp
libzeth::COMM_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
commitment.tcc
libzeth::COMM_cm_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libzeth::COMM_cm_gadget::COMM_cm_gadget
COMM_cm_gadget(libsnark::protoboard< FieldT > &pb, const libsnark::pb_variable_array< FieldT > &a_pk, const libsnark::pb_variable_array< FieldT > &rho, const libsnark::pb_variable_array< FieldT > &trap_r, const libsnark::pb_variable_array< FieldT > &value_v, libsnark::pb_variable< FieldT > result, const std::string &annotation_prefix="COMM_cm_gadget")