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_unpack(msgpack::object const& o)
76 {
77 try {
78 o.convert(value);
79 } catch (const msgpack::type_error&) {
80 std::cerr << o << std::endl;
81 throw_or_abort("error converting into newtype 'Witness'");
82 }
83 }
84};
85
86struct WitnessMap {
88
89 friend bool operator==(const WitnessMap&, const WitnessMap&);
90
91 void msgpack_unpack(msgpack::object const& o)
92 {
93 try {
94 o.convert(value);
95 } catch (const msgpack::type_error&) {
96 std::cerr << o << std::endl;
97 throw_or_abort("error converting into newtype 'WitnessMap'");
98 }
99 }
100};
101
102struct StackItem {
103 uint32_t index;
105
106 friend bool operator==(const StackItem&, const StackItem&);
107
108 void msgpack_unpack(msgpack::object const& o)
109 {
110 std::string name = "StackItem";
111 if (o.type == msgpack::type::MAP) {
112 auto kvmap = Helpers::make_kvmap(o, name);
113 Helpers::conv_fld_from_kvmap(kvmap, name, "index", index, false);
114 Helpers::conv_fld_from_kvmap(kvmap, name, "witness", witness, false);
115 } else if (o.type == msgpack::type::ARRAY) {
116 auto array = o.via.array;
117 Helpers::conv_fld_from_array(array, name, "index", index, 0);
118 Helpers::conv_fld_from_array(array, name, "witness", witness, 1);
119 } else {
120 throw_or_abort("expected MAP or ARRAY for " + name);
121 }
122 }
123};
124
126 std::vector<Witnesses::StackItem> stack;
127
128 friend bool operator==(const WitnessStack&, const WitnessStack&);
129
130 void msgpack_unpack(msgpack::object const& o)
131 {
132 std::string name = "WitnessStack";
133 if (o.type == msgpack::type::MAP) {
134 auto kvmap = Helpers::make_kvmap(o, name);
135 Helpers::conv_fld_from_kvmap(kvmap, name, "stack", stack, false);
136 } else if (o.type == msgpack::type::ARRAY) {
137 auto array = o.via.array;
138 Helpers::conv_fld_from_array(array, name, "stack", stack, 0);
139 } else {
140 throw_or_abort("expected MAP or ARRAY for " + name);
141 }
142 }
143};
144
145} // end of namespace Witnesses
146
147namespace Witnesses {
148
149inline bool operator==(const StackItem& lhs, const StackItem& rhs)
150{
151 if (!(lhs.index == rhs.index)) {
152 return false;
153 }
154 if (!(lhs.witness == rhs.witness)) {
155 return false;
156 }
157 return true;
158}
159
160} // end of namespace Witnesses
161
162template <>
163template <typename Serializer>
165{
166 serializer.increase_container_depth();
167 serde::Serializable<decltype(obj.index)>::serialize(obj.index, serializer);
168 serde::Serializable<decltype(obj.witness)>::serialize(obj.witness, serializer);
169 serializer.decrease_container_depth();
170}
171
172template <>
173template <typename Deserializer>
175{
176 deserializer.increase_container_depth();
178 obj.index = serde::Deserializable<decltype(obj.index)>::deserialize(deserializer);
179 obj.witness = serde::Deserializable<decltype(obj.witness)>::deserialize(deserializer);
180 deserializer.decrease_container_depth();
181 return obj;
182}
183
184namespace Witnesses {
185
186inline bool operator==(const Witness& lhs, const Witness& rhs)
187{
188 return lhs.value == rhs.value;
189}
190
191} // end of namespace Witnesses
192
193template <>
194template <typename Serializer>
196{
197 serializer.increase_container_depth();
198 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
199 serializer.decrease_container_depth();
200}
201
202template <>
203template <typename Deserializer>
205{
206 deserializer.increase_container_depth();
208 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
209 deserializer.decrease_container_depth();
210 return obj;
211}
212
213namespace Witnesses {
214
215inline bool operator==(const WitnessMap& lhs, const WitnessMap& rhs)
216{
217 return lhs.value == rhs.value;
218}
219
220} // end of namespace Witnesses
221
222template <>
223template <typename Serializer>
225{
226 serializer.increase_container_depth();
227 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
228 serializer.decrease_container_depth();
229}
230
231template <>
232template <typename Deserializer>
234{
235 deserializer.increase_container_depth();
237 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
238 deserializer.decrease_container_depth();
239 return obj;
240}
241
242namespace Witnesses {
243
244inline bool operator==(const WitnessStack& lhs, const WitnessStack& rhs)
245{
246 return lhs.stack == rhs.stack;
247}
248
249} // end of namespace Witnesses
250
251template <>
252template <typename Serializer>
254{
255 serializer.increase_container_depth();
256 serde::Serializable<decltype(obj.stack)>::serialize(obj.stack, serializer);
257 serializer.decrease_container_depth();
258}
259
260template <>
261template <typename Deserializer>
263{
264 deserializer.increase_container_depth();
266 obj.stack = serde::Deserializable<decltype(obj.stack)>::deserialize(deserializer);
267 deserializer.decrease_container_depth();
268 return obj;
269}
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)
friend bool operator==(const StackItem &, const StackItem &)
Witnesses::WitnessMap witness
void msgpack_unpack(msgpack::object const &o)
bool operator<(Witness const &rhs) const
friend bool operator==(const Witness &, const Witness &)
void msgpack_unpack(msgpack::object const &o)
friend bool operator==(const WitnessMap &, const WitnessMap &)
std::map< Witnesses::Witness, std::vector< uint8_t > > value
void msgpack_unpack(msgpack::object const &o)
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)