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