Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
witness_stack.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "serde.hpp"
5
6namespace Witnesses {
7struct Helpers {
8 static std::map<std::string, msgpack::object const*> make_kvmap(msgpack::object const& o, std::string const& name)
9 {
10 if (o.type != msgpack::type::MAP) {
11 std::cerr << o << std::endl;
12 throw_or_abort("expected MAP for " + name);
13 }
15 for (uint32_t i = 0; i < o.via.map.size; ++i) {
16 if (o.via.map.ptr[i].key.type != msgpack::type::STR) {
17 std::cerr << o << std::endl;
18 throw_or_abort("expected STR for keys of " + name);
19 }
20 kvmap.emplace(std::string(o.via.map.ptr[i].key.via.str.ptr, o.via.map.ptr[i].key.via.str.size),
21 &o.via.map.ptr[i].val);
22 }
23 return kvmap;
24 }
25
26 template <typename T>
28 std::string const& struct_name,
29 std::string const& field_name,
30 T& field,
31 bool is_optional)
32 {
33 auto it = kvmap.find(field_name);
34 if (it != kvmap.end()) {
35 try {
36 it->second->convert(field);
37 } catch (const msgpack::type_error&) {
38 std::cerr << *it->second << std::endl;
39 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
40 }
41 } else if (!is_optional) {
42 throw_or_abort("missing field: " + struct_name + "::" + field_name);
43 }
44 }
45
46 template <typename T>
47 static void conv_fld_from_array(msgpack::object_array const& array,
48 std::string const& struct_name,
49 std::string const& field_name,
50 T& field,
51 uint32_t index)
52 {
53 if (index >= array.size) {
54 throw_or_abort("index out of bounds: " + struct_name + "::" + field_name + " at " + std::to_string(index));
55 }
56 auto element = array.ptr[index];
57 try {
58 element.convert(field);
59 } catch (const msgpack::type_error&) {
60 std::cerr << element << std::endl;
61 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
62 }
63 }
64};
65} // namespace Witnesses
66
67namespace Witnesses {
68
69struct Witness {
70 uint32_t value;
71
72 friend bool operator==(const Witness&, const Witness&);
73
74 bool operator<(Witness const& rhs) const { return value < rhs.value; }
75 void msgpack_pack(auto& packer) const { packer.pack(value); }
76
77 void msgpack_unpack(msgpack::object const& o)
78 {
79 try {
80 o.convert(value);
81 } catch (const msgpack::type_error&) {
82 std::cerr << o << std::endl;
83 throw_or_abort("error converting into newtype 'Witness'");
84 }
85 }
86};
87
88struct WitnessMap {
90
91 friend bool operator==(const WitnessMap&, const WitnessMap&);
92
93 void msgpack_pack(auto& packer) const { packer.pack(value); }
94
95 void msgpack_unpack(msgpack::object const& o)
96 {
97 try {
98 o.convert(value);
99 } catch (const msgpack::type_error&) {
100 std::cerr << o << std::endl;
101 throw_or_abort("error converting into newtype 'WitnessMap'");
102 }
103 }
104};
105
106struct StackItem {
107 uint32_t index;
109
110 friend bool operator==(const StackItem&, const StackItem&);
111
112 void msgpack_pack(auto& packer) const
113 {
114 packer.pack_array(2);
115 packer.pack(index);
116 packer.pack(witness);
117 }
118
119 void msgpack_unpack(msgpack::object const& o)
120 {
121 std::string name = "StackItem";
122 if (o.type == msgpack::type::MAP) {
123 auto kvmap = Helpers::make_kvmap(o, name);
124 Helpers::conv_fld_from_kvmap(kvmap, name, "index", index, false);
125 Helpers::conv_fld_from_kvmap(kvmap, name, "witness", witness, false);
126 } else if (o.type == msgpack::type::ARRAY) {
127 auto array = o.via.array;
128 Helpers::conv_fld_from_array(array, name, "index", index, 0);
129 Helpers::conv_fld_from_array(array, name, "witness", witness, 1);
130 } else {
131 throw_or_abort("expected MAP or ARRAY for " + name);
132 }
133 }
134};
135
137 std::vector<Witnesses::StackItem> stack;
138
139 friend bool operator==(const WitnessStack&, const WitnessStack&);
140
141 void msgpack_pack(auto& packer) const
142 {
143 packer.pack_array(1);
144 packer.pack(stack);
145 }
146
147 void msgpack_unpack(msgpack::object const& o)
148 {
149 std::string name = "WitnessStack";
150 if (o.type == msgpack::type::MAP) {
151 auto kvmap = Helpers::make_kvmap(o, name);
152 Helpers::conv_fld_from_kvmap(kvmap, name, "stack", stack, false);
153 } else if (o.type == msgpack::type::ARRAY) {
154 auto array = o.via.array;
155 Helpers::conv_fld_from_array(array, name, "stack", stack, 0);
156 } else {
157 throw_or_abort("expected MAP or ARRAY for " + name);
158 }
159 }
160};
161
162} // end of namespace Witnesses
163
164namespace Witnesses {
165
166inline bool operator==(const StackItem& lhs, const StackItem& rhs)
167{
168 if (!(lhs.index == rhs.index)) {
169 return false;
170 }
171 if (!(lhs.witness == rhs.witness)) {
172 return false;
173 }
174 return true;
175}
176
177} // end of namespace Witnesses
178
179template <>
180template <typename Serializer>
182{
183 serializer.increase_container_depth();
184 serde::Serializable<decltype(obj.index)>::serialize(obj.index, serializer);
185 serde::Serializable<decltype(obj.witness)>::serialize(obj.witness, serializer);
186 serializer.decrease_container_depth();
187}
188
189template <>
190template <typename Deserializer>
192{
193 deserializer.increase_container_depth();
195 obj.index = serde::Deserializable<decltype(obj.index)>::deserialize(deserializer);
196 obj.witness = serde::Deserializable<decltype(obj.witness)>::deserialize(deserializer);
197 deserializer.decrease_container_depth();
198 return obj;
199}
200
201namespace Witnesses {
202
203inline bool operator==(const Witness& lhs, const Witness& rhs)
204{
205 if (!(lhs.value == rhs.value)) {
206 return false;
207 }
208 return true;
209}
210
211} // end of namespace Witnesses
212
213template <>
214template <typename Serializer>
216{
217 serializer.increase_container_depth();
218 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
219 serializer.decrease_container_depth();
220}
221
222template <>
223template <typename Deserializer>
225{
226 deserializer.increase_container_depth();
228 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
229 deserializer.decrease_container_depth();
230 return obj;
231}
232
233namespace Witnesses {
234
235inline bool operator==(const WitnessMap& lhs, const WitnessMap& rhs)
236{
237 if (!(lhs.value == rhs.value)) {
238 return false;
239 }
240 return true;
241}
242
243} // end of namespace Witnesses
244
245template <>
246template <typename Serializer>
248{
249 serializer.increase_container_depth();
250 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
251 serializer.decrease_container_depth();
252}
253
254template <>
255template <typename Deserializer>
257{
258 deserializer.increase_container_depth();
260 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
261 deserializer.decrease_container_depth();
262 return obj;
263}
264
265namespace Witnesses {
266
267inline bool operator==(const WitnessStack& lhs, const WitnessStack& rhs)
268{
269 if (!(lhs.stack == rhs.stack)) {
270 return false;
271 }
272 return true;
273}
274
275} // end of namespace Witnesses
276
277template <>
278template <typename Serializer>
280{
281 serializer.increase_container_depth();
282 serde::Serializable<decltype(obj.stack)>::serialize(obj.stack, serializer);
283 serializer.decrease_container_depth();
284}
285
286template <>
287template <typename Deserializer>
289{
290 deserializer.increase_container_depth();
292 obj.stack = serde::Deserializable<decltype(obj.stack)>::deserialize(deserializer);
293 deserializer.decrease_container_depth();
294 return obj;
295}
bool operator==(const StackItem &lhs, const StackItem &rhs)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
static std::map< std::string, msgpack::object const * > make_kvmap(msgpack::object const &o, std::string const &name)
static void conv_fld_from_array(msgpack::object_array const &array, std::string const &struct_name, std::string const &field_name, T &field, uint32_t index)
static void conv_fld_from_kvmap(std::map< std::string, msgpack::object const * > const &kvmap, std::string const &struct_name, std::string const &field_name, T &field, bool is_optional)
void msgpack_pack(auto &packer) const
friend bool operator==(const StackItem &, const StackItem &)
Witnesses::WitnessMap witness
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
bool operator<(Witness const &rhs) const
friend bool operator==(const Witness &, const Witness &)
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
friend bool operator==(const WitnessMap &, const WitnessMap &)
std::map< Witnesses::Witness, std::vector< uint8_t > > value
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
std::vector< Witnesses::StackItem > stack
friend bool operator==(const WitnessStack &, const WitnessStack &)
void msgpack_unpack(msgpack::object const &o)
static T deserialize(Deserializer &deserializer)
static void serialize(const T &value, Serializer &serializer)
void throw_or_abort(std::string const &err)