2  *****************************************************************************
 
    4  Implementation of interfaces for a delegated random-access memory.
 
    6  See delegated_ra_memory.hpp .
 
    8  *****************************************************************************
 
    9  * @author     This file is part of libsnark, developed by SCIPR Lab
 
   10  *             and contributors (see AUTHORS).
 
   11  * @copyright  MIT license (see LICENSE file)
 
   12  *****************************************************************************/
 
   14 #ifndef DELEGATED_RA_MEMORY_TCC
 
   15 #define DELEGATED_RA_MEMORY_TCC
 
   18 #include <libff/common/profiling.hpp>
 
   19 #include <libff/common/utils.hpp>
 
   24 template<typename HashT>
 
   25 libff::bit_vector delegated_ra_memory<HashT>::int_to_tree_elem(
 
   28     libff::bit_vector v(value_size, false);
 
   29     for (size_t k = 0; k < value_size; ++k) {
 
   30         v[k] = ((i & (1ul << k)) != 0);
 
   35 template<typename HashT>
 
   36 size_t delegated_ra_memory<HashT>::int_from_tree_elem(
 
   37     const libff::bit_vector &v) const
 
   40     for (size_t i = 0; i < value_size; ++i) {
 
   41         result |= (v[i] ? 1ul : 0ul) << i;
 
   47 template<typename HashT>
 
   48 delegated_ra_memory<HashT>::delegated_ra_memory(
 
   49     const size_t num_addresses, const size_t value_size)
 
   50     : memory_interface(num_addresses, value_size)
 
   53         new merkle_tree<HashT>(libff::log2(num_addresses), value_size));
 
   56 template<typename HashT>
 
   57 delegated_ra_memory<HashT>::delegated_ra_memory(
 
   58     const size_t num_addresses,
 
   59     const size_t value_size,
 
   60     const std::vector<size_t> &contents_as_vector)
 
   61     : memory_interface(num_addresses, value_size)
 
   63     std::vector<libff::bit_vector> contents_as_bit_vector_vector(
 
   66         contents_as_vector.begin(),
 
   67         contents_as_vector.end(),
 
   68         contents_as_bit_vector_vector,
 
   69         [this](size_t value) { return int_to_tree_elem(value); });
 
   70     contents.reset(new merkle_tree<HashT>(
 
   71         libff::log2(num_addresses), value_size, contents_as_bit_vector_vector));
 
   74 template<typename HashT>
 
   75 delegated_ra_memory<HashT>::delegated_ra_memory(
 
   76     const size_t num_addresses,
 
   77     const size_t value_size,
 
   78     const std::map<size_t, size_t> &contents_as_map)
 
   79     : memory_interface(num_addresses, value_size)
 
   81     std::map<size_t, libff::bit_vector> contents_as_bit_vector_map;
 
   82     for (auto &it : contents_as_map) {
 
   83         contents_as_bit_vector_map[it.first] = int_to_tree_elem(it.second);
 
   86     contents.reset(new merkle_tree<HashT>(
 
   87         libff::log2(num_addresses), value_size, contents_as_bit_vector_map));
 
   90 template<typename HashT>
 
   91 size_t delegated_ra_memory<HashT>::get_value(const size_t address) const
 
   93     return int_from_tree_elem(contents->get_value(address));
 
   96 template<typename HashT>
 
   97 void delegated_ra_memory<HashT>::set_value(
 
   98     const size_t address, const size_t value)
 
  100     contents->set_value(address, int_to_tree_elem(value));
 
  103 template<typename HashT>
 
  104 typename HashT::hash_value_type delegated_ra_memory<HashT>::get_root() const
 
  106     return contents->get_root();
 
  109 template<typename HashT>
 
  110 typename HashT::merkle_authentication_path_type delegated_ra_memory<
 
  111     HashT>::get_path(const size_t address) const
 
  113     return contents->get_path(address);
 
  116 template<typename HashT> void delegated_ra_memory<HashT>::dump() const
 
  121 } // namespace libsnark
 
  123 #endif // DELEGATED_RA_MEMORY_TCC