Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
set_membership_proof_variable.tcc
Go to the documentation of this file.
1 /**
2  *****************************************************************************
3  * @author This file is part of libsnark, developed by SCIPR Lab
4  * and contributors (see AUTHORS).
5  * @copyright MIT license (see LICENSE file)
6  *****************************************************************************/
7 
8 #ifndef SET_MEMBERSHIP_PROOF_VARIABLE_TCC_
9 #define SET_MEMBERSHIP_PROOF_VARIABLE_TCC_
10 
11 namespace libsnark
12 {
13 
14 template<typename FieldT, typename HashT>
15 set_membership_proof_variable<FieldT, HashT>::set_membership_proof_variable(
16  protoboard<FieldT> &pb,
17  const size_t max_entries,
18  const std::string &annotation_prefix)
19  : gadget<FieldT>(pb, annotation_prefix)
20  , max_entries(max_entries)
21  , tree_depth(libff::log2(max_entries))
22 {
23  if (tree_depth > 0) {
24  address_bits.allocate(
25  pb, tree_depth, FMT(annotation_prefix, " address_bits"));
26  merkle_path.reset(
27  new merkle_authentication_path_variable<FieldT, HashT>(
28  pb, tree_depth, FMT(annotation_prefix, " merkle_path")));
29  }
30 }
31 
32 template<typename FieldT, typename HashT>
33 void set_membership_proof_variable<FieldT, HashT>::generate_r1cs_constraints()
34 {
35  if (tree_depth > 0) {
36  for (size_t i = 0; i < tree_depth; ++i) {
37  generate_boolean_r1cs_constraint<FieldT>(
38  this->pb,
39  address_bits[i],
40  FMT(this->annotation_prefix, " address_bits"));
41  }
42  merkle_path->generate_r1cs_constraints();
43  }
44 }
45 
46 template<typename FieldT, typename HashT>
47 void set_membership_proof_variable<FieldT, HashT>::generate_r1cs_witness(
48  const set_membership_proof &proof)
49 {
50  if (tree_depth > 0) {
51  address_bits.fill_with_bits_of_field_element(
52  this->pb, FieldT(proof.address));
53  merkle_path->generate_r1cs_witness(proof.address, proof.merkle_path);
54  }
55 }
56 
57 template<typename FieldT, typename HashT>
58 set_membership_proof set_membership_proof_variable<FieldT, HashT>::
59  get_membership_proof() const
60 {
61  set_membership_proof result;
62 
63  if (tree_depth == 0) {
64  result.address = 0;
65  } else {
66  result.address =
67  address_bits.get_field_element_from_bits(this->pb).as_ulong();
68  result.merkle_path =
69  merkle_path->get_authentication_path(result.address);
70  }
71 
72  return result;
73 }
74 
75 template<typename FieldT, typename HashT>
76 r1cs_variable_assignment<FieldT> set_membership_proof_variable<FieldT, HashT>::
77  as_r1cs_variable_assignment(const set_membership_proof &proof)
78 {
79  protoboard<FieldT> pb;
80  const size_t max_entries = (1ul << (proof.merkle_path.size()));
81  set_membership_proof_variable<FieldT, HashT> proof_variable(
82  pb, max_entries, "proof_variable");
83  proof_variable.generate_r1cs_witness(proof);
84 
85  return pb.full_variable_assignment();
86 }
87 
88 } // namespace libsnark
89 
90 #endif // SET_MEMBERSHIP_PROOF_VARIABLE_TCC