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 *****************************************************************************/
8 #ifndef SET_MEMBERSHIP_PROOF_VARIABLE_TCC_
9 #define SET_MEMBERSHIP_PROOF_VARIABLE_TCC_
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))
24 address_bits.allocate(
25 pb, tree_depth, FMT(annotation_prefix, " address_bits"));
27 new merkle_authentication_path_variable<FieldT, HashT>(
28 pb, tree_depth, FMT(annotation_prefix, " merkle_path")));
32 template<typename FieldT, typename HashT>
33 void set_membership_proof_variable<FieldT, HashT>::generate_r1cs_constraints()
36 for (size_t i = 0; i < tree_depth; ++i) {
37 generate_boolean_r1cs_constraint<FieldT>(
40 FMT(this->annotation_prefix, " address_bits"));
42 merkle_path->generate_r1cs_constraints();
46 template<typename FieldT, typename HashT>
47 void set_membership_proof_variable<FieldT, HashT>::generate_r1cs_witness(
48 const set_membership_proof &proof)
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);
57 template<typename FieldT, typename HashT>
58 set_membership_proof set_membership_proof_variable<FieldT, HashT>::
59 get_membership_proof() const
61 set_membership_proof result;
63 if (tree_depth == 0) {
67 address_bits.get_field_element_from_bits(this->pb).as_ulong();
69 merkle_path->get_authentication_path(result.address);
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)
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);
85 return pb.full_variable_assignment();
88 } // namespace libsnark
90 #endif // SET_MEMBERSHIP_PROOF_VARIABLE_TCC