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 "bincode.hpp"
5#include "serde.hpp"
6
7namespace Witnesses {
8struct Helpers {
9 static std::map<std::string, msgpack::object const*> make_kvmap(msgpack::object const& o, std::string const& name)
10 {
11 if (o.type != msgpack::type::MAP) {
12 std::cerr << o << std::endl;
13 throw_or_abort("expected MAP for " + name);
14 }
16 for (uint32_t i = 0; i < o.via.map.size; ++i) {
17 if (o.via.map.ptr[i].key.type != msgpack::type::STR) {
18 std::cerr << o << std::endl;
19 throw_or_abort("expected STR for keys of " + name);
20 }
21 kvmap.emplace(std::string(o.via.map.ptr[i].key.via.str.ptr, o.via.map.ptr[i].key.via.str.size),
22 &o.via.map.ptr[i].val);
23 }
24 return kvmap;
25 }
26
27 template <typename T>
29 std::string const& struct_name,
30 std::string const& field_name,
31 T& field,
32 bool is_optional)
33 {
34 auto it = kvmap.find(field_name);
35 if (it != kvmap.end()) {
36 try {
37 it->second->convert(field);
38 } catch (const msgpack::type_error&) {
39 std::cerr << *it->second << std::endl;
40 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
41 }
42 } else if (!is_optional) {
43 throw_or_abort("missing field: " + struct_name + "::" + field_name);
44 }
45 }
46
47 template <typename T>
48 static void conv_fld_from_array(msgpack::object_array const& array,
49 std::string const& struct_name,
50 std::string const& field_name,
51 T& field,
52 uint32_t index)
53 {
54 if (index >= array.size) {
55 throw_or_abort("index out of bounds: " + struct_name + "::" + field_name + " at " + std::to_string(index));
56 }
57 auto element = array.ptr[index];
58 try {
59 element.convert(field);
60 } catch (const msgpack::type_error&) {
61 std::cerr << element << std::endl;
62 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
63 }
64 }
65};
66} // namespace Witnesses
67
68namespace Witnesses {
69
70struct Witness {
71 uint32_t value;
72
73 friend bool operator==(const Witness&, const Witness&);
74 std::vector<uint8_t> bincodeSerialize() const;
75 static Witness bincodeDeserialize(std::vector<uint8_t>);
76
77 bool operator<(Witness const& rhs) const { return value < rhs.value; }
78 void msgpack_pack(auto& packer) const { packer.pack(value); }
79
80 void msgpack_unpack(msgpack::object const& o)
81 {
82 try {
83 o.convert(value);
84 } catch (const msgpack::type_error&) {
85 std::cerr << o << std::endl;
86 throw_or_abort("error converting into newtype 'Witness'");
87 }
88 }
89};
90
91struct WitnessMap {
93
94 friend bool operator==(const WitnessMap&, const WitnessMap&);
95 std::vector<uint8_t> bincodeSerialize() const;
96 static WitnessMap bincodeDeserialize(std::vector<uint8_t>);
97
98 void msgpack_pack(auto& packer) const { packer.pack(value); }
99
100 void msgpack_unpack(msgpack::object const& o)
101 {
102 try {
103 o.convert(value);
104 } catch (const msgpack::type_error&) {
105 std::cerr << o << std::endl;
106 throw_or_abort("error converting into newtype 'WitnessMap'");
107 }
108 }
109};
110
111struct StackItem {
112 uint32_t index;
114
115 friend bool operator==(const StackItem&, const StackItem&);
116 std::vector<uint8_t> bincodeSerialize() const;
117 static StackItem bincodeDeserialize(std::vector<uint8_t>);
118
119 void msgpack_pack(auto& packer) const
120 {
121 packer.pack_map(2);
122 packer.pack(std::make_pair("index", index));
123 packer.pack(std::make_pair("witness", witness));
124 }
125
126 void msgpack_unpack(msgpack::object const& o)
127 {
128 std::string name = "StackItem";
129 if (o.type == msgpack::type::MAP) {
130 auto kvmap = Helpers::make_kvmap(o, name);
131 Helpers::conv_fld_from_kvmap(kvmap, name, "index", index, false);
132 Helpers::conv_fld_from_kvmap(kvmap, name, "witness", witness, false);
133 } else if (o.type == msgpack::type::ARRAY) {
134 auto array = o.via.array;
135 Helpers::conv_fld_from_array(array, name, "index", index, 0);
136 Helpers::conv_fld_from_array(array, name, "witness", witness, 1);
137 } else {
138 throw_or_abort("expected MAP or ARRAY for " + name);
139 }
140 }
141};
142
144 std::vector<Witnesses::StackItem> stack;
145
146 friend bool operator==(const WitnessStack&, const WitnessStack&);
147 std::vector<uint8_t> bincodeSerialize() const;
148 static WitnessStack bincodeDeserialize(std::vector<uint8_t>);
149
150 void msgpack_pack(auto& packer) const
151 {
152 packer.pack_map(1);
153 packer.pack(std::make_pair("stack", stack));
154 }
155
156 void msgpack_unpack(msgpack::object const& o)
157 {
158 std::string name = "WitnessStack";
159 if (o.type == msgpack::type::MAP) {
160 auto kvmap = Helpers::make_kvmap(o, name);
161 Helpers::conv_fld_from_kvmap(kvmap, name, "stack", stack, false);
162 } else if (o.type == msgpack::type::ARRAY) {
163 auto array = o.via.array;
164 Helpers::conv_fld_from_array(array, name, "stack", stack, 0);
165 } else {
166 throw_or_abort("expected MAP or ARRAY for " + name);
167 }
168 }
169};
170
171} // end of namespace Witnesses
172
173namespace Witnesses {
174
175inline bool operator==(const StackItem& lhs, const StackItem& rhs)
176{
177 if (!(lhs.index == rhs.index)) {
178 return false;
179 }
180 if (!(lhs.witness == rhs.witness)) {
181 return false;
182 }
183 return true;
184}
185
186inline std::vector<uint8_t> StackItem::bincodeSerialize() const
187{
188 auto serializer = serde::BincodeSerializer();
190 return std::move(serializer).bytes();
191}
192
193inline StackItem StackItem::bincodeDeserialize(std::vector<uint8_t> input)
194{
195 auto deserializer = serde::BincodeDeserializer(input);
197 if (deserializer.get_buffer_offset() < input.size()) {
198 throw_or_abort("Some input bytes were not read");
199 }
200 return value;
201}
202
203} // end of namespace Witnesses
204
205template <>
206template <typename Serializer>
208{
209 serializer.increase_container_depth();
210 serde::Serializable<decltype(obj.index)>::serialize(obj.index, serializer);
211 serde::Serializable<decltype(obj.witness)>::serialize(obj.witness, serializer);
212 serializer.decrease_container_depth();
213}
214
215template <>
216template <typename Deserializer>
218{
219 deserializer.increase_container_depth();
221 obj.index = serde::Deserializable<decltype(obj.index)>::deserialize(deserializer);
222 obj.witness = serde::Deserializable<decltype(obj.witness)>::deserialize(deserializer);
223 deserializer.decrease_container_depth();
224 return obj;
225}
226
227namespace Witnesses {
228
229inline bool operator==(const Witness& lhs, const Witness& rhs)
230{
231 if (!(lhs.value == rhs.value)) {
232 return false;
233 }
234 return true;
235}
236
237inline std::vector<uint8_t> Witness::bincodeSerialize() const
238{
239 auto serializer = serde::BincodeSerializer();
241 return std::move(serializer).bytes();
242}
243
244inline Witness Witness::bincodeDeserialize(std::vector<uint8_t> input)
245{
246 auto deserializer = serde::BincodeDeserializer(input);
248 if (deserializer.get_buffer_offset() < input.size()) {
249 throw_or_abort("Some input bytes were not read");
250 }
251 return value;
252}
253
254} // end of namespace Witnesses
255
256template <>
257template <typename Serializer>
259{
260 serializer.increase_container_depth();
261 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
262 serializer.decrease_container_depth();
263}
264
265template <>
266template <typename Deserializer>
268{
269 deserializer.increase_container_depth();
271 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
272 deserializer.decrease_container_depth();
273 return obj;
274}
275
276namespace Witnesses {
277
278inline bool operator==(const WitnessMap& lhs, const WitnessMap& rhs)
279{
280 if (!(lhs.value == rhs.value)) {
281 return false;
282 }
283 return true;
284}
285
286inline std::vector<uint8_t> WitnessMap::bincodeSerialize() const
287{
288 auto serializer = serde::BincodeSerializer();
290 return std::move(serializer).bytes();
291}
292
293inline WitnessMap WitnessMap::bincodeDeserialize(std::vector<uint8_t> input)
294{
295 auto deserializer = serde::BincodeDeserializer(input);
297 if (deserializer.get_buffer_offset() < input.size()) {
298 throw_or_abort("Some input bytes were not read");
299 }
300 return value;
301}
302
303} // end of namespace Witnesses
304
305template <>
306template <typename Serializer>
308{
309 serializer.increase_container_depth();
310 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
311 serializer.decrease_container_depth();
312}
313
314template <>
315template <typename Deserializer>
317{
318 deserializer.increase_container_depth();
320 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
321 deserializer.decrease_container_depth();
322 return obj;
323}
324
325namespace Witnesses {
326
327inline bool operator==(const WitnessStack& lhs, const WitnessStack& rhs)
328{
329 if (!(lhs.stack == rhs.stack)) {
330 return false;
331 }
332 return true;
333}
334
335inline std::vector<uint8_t> WitnessStack::bincodeSerialize() const
336{
337 auto serializer = serde::BincodeSerializer();
339 return std::move(serializer).bytes();
340}
341
342inline WitnessStack WitnessStack::bincodeDeserialize(std::vector<uint8_t> input)
343{
344 auto deserializer = serde::BincodeDeserializer(input);
346 if (deserializer.get_buffer_offset() < input.size()) {
347 throw_or_abort("Some input bytes were not read");
348 }
349 return value;
350}
351
352} // end of namespace Witnesses
353
354template <>
355template <typename Serializer>
357{
358 serializer.increase_container_depth();
359 serde::Serializable<decltype(obj.stack)>::serialize(obj.stack, serializer);
360 serializer.decrease_container_depth();
361}
362
363template <>
364template <typename Deserializer>
366{
367 deserializer.increase_container_depth();
369 obj.stack = serde::Deserializable<decltype(obj.stack)>::deserialize(deserializer);
370 deserializer.decrease_container_depth();
371 return obj;
372}
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
std::vector< uint8_t > bincodeSerialize() const
void msgpack_unpack(msgpack::object const &o)
static StackItem bincodeDeserialize(std::vector< uint8_t >)
std::vector< uint8_t > bincodeSerialize() const
void msgpack_pack(auto &packer) const
bool operator<(Witness const &rhs) const
friend bool operator==(const Witness &, const Witness &)
static Witness bincodeDeserialize(std::vector< uint8_t >)
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
friend bool operator==(const WitnessMap &, const WitnessMap &)
std::vector< uint8_t > bincodeSerialize() const
static WitnessMap bincodeDeserialize(std::vector< uint8_t >)
std::map< Witnesses::Witness, std::vector< uint8_t > > value
void msgpack_unpack(msgpack::object const &o)
static WitnessStack bincodeDeserialize(std::vector< uint8_t >)
void msgpack_pack(auto &packer) const
std::vector< Witnesses::StackItem > stack
friend bool operator==(const WitnessStack &, const WitnessStack &)
std::vector< uint8_t > bincodeSerialize() const
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)