Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
delegated_ra_memory.tcc
Go to the documentation of this file.
1 /** @file
2  *****************************************************************************
3 
4  Implementation of interfaces for a delegated random-access memory.
5 
6  See delegated_ra_memory.hpp .
7 
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  *****************************************************************************/
13 
14 #ifndef DELEGATED_RA_MEMORY_TCC
15 #define DELEGATED_RA_MEMORY_TCC
16 
17 #include <algorithm>
18 #include <libff/common/profiling.hpp>
19 #include <libff/common/utils.hpp>
20 
21 namespace libsnark
22 {
23 
24 template<typename HashT>
25 libff::bit_vector delegated_ra_memory<HashT>::int_to_tree_elem(
26  const size_t i) const
27 {
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);
31  }
32  return v;
33 }
34 
35 template<typename HashT>
36 size_t delegated_ra_memory<HashT>::int_from_tree_elem(
37  const libff::bit_vector &v) const
38 {
39  size_t result = 0;
40  for (size_t i = 0; i < value_size; ++i) {
41  result |= (v[i] ? 1ul : 0ul) << i;
42  }
43 
44  return result;
45 }
46 
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)
51 {
52  contents.reset(
53  new merkle_tree<HashT>(libff::log2(num_addresses), value_size));
54 }
55 
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)
62 {
63  std::vector<libff::bit_vector> contents_as_bit_vector_vector(
64  contents.size());
65  std::transform(
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));
72 }
73 
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)
80 {
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);
84  }
85 
86  contents.reset(new merkle_tree<HashT>(
87  libff::log2(num_addresses), value_size, contents_as_bit_vector_map));
88 }
89 
90 template<typename HashT>
91 size_t delegated_ra_memory<HashT>::get_value(const size_t address) const
92 {
93  return int_from_tree_elem(contents->get_value(address));
94 }
95 
96 template<typename HashT>
97 void delegated_ra_memory<HashT>::set_value(
98  const size_t address, const size_t value)
99 {
100  contents->set_value(address, int_to_tree_elem(value));
101 }
102 
103 template<typename HashT>
104 typename HashT::hash_value_type delegated_ra_memory<HashT>::get_root() const
105 {
106  return contents->get_root();
107 }
108 
109 template<typename HashT>
110 typename HashT::merkle_authentication_path_type delegated_ra_memory<
111  HashT>::get_path(const size_t address) const
112 {
113  return contents->get_path(address);
114 }
115 
116 template<typename HashT> void delegated_ra_memory<HashT>::dump() const
117 {
118  contents->dump();
119 }
120 
121 } // namespace libsnark
122 
123 #endif // DELEGATED_RA_MEMORY_TCC