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