diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.cpp index 0b5fbf1dc138..2e700125a5f7 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.cpp @@ -32,7 +32,7 @@ using namespace bb; template T deserialize_any_format(std::vector const& buf, std::function decode_msgpack, - std::function)> decode_binpack) + std::function)> decode_bincode) { // We can't rely on exceptions to try to deserialize binpack, falling back to // msgpack if it fails, because exceptions are (or were) not supported in Wasm @@ -67,12 +67,12 @@ T deserialize_any_format(std::vector const& buf, } } } - // `buf[0] == 0` would indicate bincode starting with a format byte, + // `buf[0] == 1` would indicate bincode starting with a format byte, // but if it's a coincidence and it fails to parse then we can't recover // from it, so let's just acknowledge that for now we don't want to // exercise this code path and treat the whole data as bincode. } - return decode_binpack(buf); + return decode_bincode(buf); } /** diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp index 64e761c25684..564cf86de06f 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp @@ -4,6 +4,47 @@ #include "msgpack.hpp" #include "serde.hpp" +namespace Acir { +struct Helpers { + static std::map make_kvmap(msgpack::object const& o, std::string const& name) + { + if (o.type != msgpack::type::MAP) { + std::cerr << o << std::endl; + throw_or_abort("expected MAP for " + name); + } + std::map kvmap; + for (uint32_t i = 0; i < o.via.map.size; ++i) { + if (o.via.map.ptr[i].key.type != msgpack::type::STR) { + std::cerr << o << std::endl; + throw_or_abort("expected STR for keys of " + name); + } + kvmap.emplace(std::string(o.via.map.ptr[i].key.via.str.ptr, o.via.map.ptr[i].key.via.str.size), + &o.via.map.ptr[i].val); + } + return kvmap; + } + template + static void conv_fld_from_kvmap(std::map const& kvmap, + std::string const& struct_name, + std::string const& field_name, + T& field, + bool is_optional) + { + auto it = kvmap.find(field_name); + if (it != kvmap.end()) { + try { + it->second->convert(field); + } catch (const msgpack::type_error&) { + std::cerr << *it->second << std::endl; + throw_or_abort("error converting into field " + struct_name + "::" + field_name); + } + } else if (!is_optional) { + throw_or_abort("missing field: " + struct_name + "::" + field_name); + } + } +}; +} // namespace Acir + namespace Acir { struct BinaryFieldOp { @@ -838,7 +879,20 @@ struct HeapArray { std::vector bincodeSerialize() const; static HeapArray bincodeDeserialize(std::vector); - MSGPACK_FIELDS(pointer, size); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("pointer", pointer)); + packer.pack(std::make_pair("size", size)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "HeapArray"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "pointer", pointer, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false); + } }; struct HeapVector { @@ -849,7 +903,20 @@ struct HeapVector { std::vector bincodeSerialize() const; static HeapVector bincodeDeserialize(std::vector); - MSGPACK_FIELDS(pointer, size); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("pointer", pointer)); + packer.pack(std::make_pair("size", size)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "HeapVector"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "pointer", pointer, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false); + } }; struct BlackBoxOp { @@ -864,7 +931,24 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static AES128Encrypt bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, iv, key, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(4); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("iv", iv)); + packer.pack(std::make_pair("key", key)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "AES128Encrypt"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "iv", iv, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "key", key, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct Blake2s { @@ -875,7 +959,20 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static Blake2s bincodeDeserialize(std::vector); - MSGPACK_FIELDS(message, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("message", message)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Blake2s"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct Blake3 { @@ -886,7 +983,20 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static Blake3 bincodeDeserialize(std::vector); - MSGPACK_FIELDS(message, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("message", message)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Blake3"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct Keccakf1600 { @@ -897,7 +1007,20 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static Keccakf1600 bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("input", input)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Keccakf1600"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct EcdsaSecp256k1 { @@ -911,7 +1034,26 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static EcdsaSecp256k1 bincodeDeserialize(std::vector); - MSGPACK_FIELDS(hashed_msg, public_key_x, public_key_y, signature, result); + void msgpack_pack(auto& packer) const + { + packer.pack_map(5); + packer.pack(std::make_pair("hashed_msg", hashed_msg)); + packer.pack(std::make_pair("public_key_x", public_key_x)); + packer.pack(std::make_pair("public_key_y", public_key_y)); + packer.pack(std::make_pair("signature", signature)); + packer.pack(std::make_pair("result", result)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "EcdsaSecp256k1"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_msg", hashed_msg, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false); + } }; struct EcdsaSecp256r1 { @@ -925,7 +1067,26 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static EcdsaSecp256r1 bincodeDeserialize(std::vector); - MSGPACK_FIELDS(hashed_msg, public_key_x, public_key_y, signature, result); + void msgpack_pack(auto& packer) const + { + packer.pack_map(5); + packer.pack(std::make_pair("hashed_msg", hashed_msg)); + packer.pack(std::make_pair("public_key_x", public_key_x)); + packer.pack(std::make_pair("public_key_y", public_key_y)); + packer.pack(std::make_pair("signature", signature)); + packer.pack(std::make_pair("result", result)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "EcdsaSecp256r1"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_msg", hashed_msg, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false); + } }; struct MultiScalarMul { @@ -937,7 +1098,22 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static MultiScalarMul bincodeDeserialize(std::vector); - MSGPACK_FIELDS(points, scalars, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("points", points)); + packer.pack(std::make_pair("scalars", scalars)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "MultiScalarMul"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "points", points, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "scalars", scalars, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct EmbeddedCurveAdd { @@ -953,7 +1129,30 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static EmbeddedCurveAdd bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input1_x, input1_y, input1_infinite, input2_x, input2_y, input2_infinite, result); + void msgpack_pack(auto& packer) const + { + packer.pack_map(7); + packer.pack(std::make_pair("input1_x", input1_x)); + packer.pack(std::make_pair("input1_y", input1_y)); + packer.pack(std::make_pair("input1_infinite", input1_infinite)); + packer.pack(std::make_pair("input2_x", input2_x)); + packer.pack(std::make_pair("input2_y", input2_y)); + packer.pack(std::make_pair("input2_infinite", input2_infinite)); + packer.pack(std::make_pair("result", result)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "EmbeddedCurveAdd"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input1_x", input1_x, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "input1_y", input1_y, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "input1_infinite", input1_infinite, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "input2_x", input2_x, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "input2_y", input2_y, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "input2_infinite", input2_infinite, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false); + } }; struct BigIntAdd { @@ -965,7 +1164,22 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static BigIntAdd bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntAdd"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntSub { @@ -977,7 +1191,22 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static BigIntSub bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntSub"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntMul { @@ -989,7 +1218,22 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static BigIntMul bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntMul"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntDiv { @@ -1001,7 +1245,22 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static BigIntDiv bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntDiv"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntFromLeBytes { @@ -1013,7 +1272,22 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static BigIntFromLeBytes bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, modulus, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("modulus", modulus)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntFromLeBytes"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "modulus", modulus, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntToLeBytes { @@ -1024,7 +1298,20 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static BigIntToLeBytes bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("input", input)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntToLeBytes"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct Poseidon2Permutation { @@ -1036,7 +1323,22 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static Poseidon2Permutation bincodeDeserialize(std::vector); - MSGPACK_FIELDS(message, output, len); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("message", message)); + packer.pack(std::make_pair("output", output)); + packer.pack(std::make_pair("len", len)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Poseidon2Permutation"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "len", len, false); + } }; struct Sha256Compression { @@ -1048,7 +1350,22 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static Sha256Compression bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input, hash_values, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("input", input)); + packer.pack(std::make_pair("hash_values", hash_values)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Sha256Compression"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "hash_values", hash_values, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct ToRadix { @@ -1062,7 +1379,26 @@ struct BlackBoxOp { std::vector bincodeSerialize() const; static ToRadix bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input, radix, output_pointer, num_limbs, output_bits); + void msgpack_pack(auto& packer) const + { + packer.pack_map(5); + packer.pack(std::make_pair("input", input)); + packer.pack(std::make_pair("radix", radix)); + packer.pack(std::make_pair("output_pointer", output_pointer)); + packer.pack(std::make_pair("num_limbs", num_limbs)); + packer.pack(std::make_pair("output_bits", output_bits)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "ToRadix"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "radix", radix, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output_pointer", output_pointer, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "num_limbs", num_limbs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output_bits", output_bits, false); + } }; std::variant bincodeSerialize() const; static Array bincodeDeserialize(std::vector); - MSGPACK_FIELDS(value_types, size); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("value_types", value_types)); + packer.pack(std::make_pair("size", size)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Array"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "value_types", value_types, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false); + } }; struct Vector { @@ -1418,7 +1767,18 @@ struct HeapValueType { std::vector bincodeSerialize() const; static Vector bincodeDeserialize(std::vector); - MSGPACK_FIELDS(value_types); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("value_types", value_types)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Vector"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "value_types", value_types, false); + } }; std::variant value; @@ -1691,7 +2051,24 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static BinaryFieldOp bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination, op, lhs, rhs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(4); + packer.pack(std::make_pair("destination", destination)); + packer.pack(std::make_pair("op", op)); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BinaryFieldOp"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + } }; struct BinaryIntOp { @@ -1705,7 +2082,26 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static BinaryIntOp bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination, op, bit_size, lhs, rhs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(5); + packer.pack(std::make_pair("destination", destination)); + packer.pack(std::make_pair("op", op)); + packer.pack(std::make_pair("bit_size", bit_size)); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BinaryIntOp"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + } }; struct Not { @@ -1717,7 +2113,22 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Not bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination, source, bit_size); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("destination", destination)); + packer.pack(std::make_pair("source", source)); + packer.pack(std::make_pair("bit_size", bit_size)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Not"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false); + } }; struct Cast { @@ -1729,7 +2140,22 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Cast bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination, source, bit_size); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("destination", destination)); + packer.pack(std::make_pair("source", source)); + packer.pack(std::make_pair("bit_size", bit_size)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Cast"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false); + } }; struct JumpIfNot { @@ -1740,7 +2166,20 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static JumpIfNot bincodeDeserialize(std::vector); - MSGPACK_FIELDS(condition, location); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("condition", condition)); + packer.pack(std::make_pair("location", location)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "JumpIfNot"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "condition", condition, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false); + } }; struct JumpIf { @@ -1751,7 +2190,20 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static JumpIf bincodeDeserialize(std::vector); - MSGPACK_FIELDS(condition, location); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("condition", condition)); + packer.pack(std::make_pair("location", location)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "JumpIf"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "condition", condition, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false); + } }; struct Jump { @@ -1761,7 +2213,18 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Jump bincodeDeserialize(std::vector); - MSGPACK_FIELDS(location); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("location", location)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Jump"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false); + } }; struct CalldataCopy { @@ -1773,7 +2236,22 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static CalldataCopy bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination_address, size_address, offset_address); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("destination_address", destination_address)); + packer.pack(std::make_pair("size_address", size_address)); + packer.pack(std::make_pair("offset_address", offset_address)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "CalldataCopy"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination_address", destination_address, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "size_address", size_address, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "offset_address", offset_address, false); + } }; struct Call { @@ -1783,7 +2261,18 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Call bincodeDeserialize(std::vector); - MSGPACK_FIELDS(location); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("location", location)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Call"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false); + } }; struct Const { @@ -1795,7 +2284,22 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Const bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination, bit_size, value); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("destination", destination)); + packer.pack(std::make_pair("bit_size", bit_size)); + packer.pack(std::make_pair("value", value)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Const"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false); + } }; struct IndirectConst { @@ -1807,7 +2311,22 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static IndirectConst bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination_pointer, bit_size, value); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("destination_pointer", destination_pointer)); + packer.pack(std::make_pair("bit_size", bit_size)); + packer.pack(std::make_pair("value", value)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "IndirectConst"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination_pointer", destination_pointer, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false); + } }; struct Return { @@ -1830,7 +2349,26 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static ForeignCall bincodeDeserialize(std::vector); - MSGPACK_FIELDS(function, destinations, destination_value_types, inputs, input_value_types); + void msgpack_pack(auto& packer) const + { + packer.pack_map(5); + packer.pack(std::make_pair("function", function)); + packer.pack(std::make_pair("destinations", destinations)); + packer.pack(std::make_pair("destination_value_types", destination_value_types)); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("input_value_types", input_value_types)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "ForeignCall"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "function", function, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "destinations", destinations, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination_value_types", destination_value_types, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "input_value_types", input_value_types, false); + } }; struct Mov { @@ -1841,7 +2379,20 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Mov bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination, source); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("destination", destination)); + packer.pack(std::make_pair("source", source)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Mov"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false); + } }; struct ConditionalMov { @@ -1854,7 +2405,24 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static ConditionalMov bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination, source_a, source_b, condition); + void msgpack_pack(auto& packer) const + { + packer.pack_map(4); + packer.pack(std::make_pair("destination", destination)); + packer.pack(std::make_pair("source_a", source_a)); + packer.pack(std::make_pair("source_b", source_b)); + packer.pack(std::make_pair("condition", condition)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "ConditionalMov"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "source_a", source_a, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "source_b", source_b, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "condition", condition, false); + } }; struct Load { @@ -1865,7 +2433,20 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Load bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination, source_pointer); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("destination", destination)); + packer.pack(std::make_pair("source_pointer", source_pointer)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Load"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "source_pointer", source_pointer, false); + } }; struct Store { @@ -1876,7 +2457,20 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Store bincodeDeserialize(std::vector); - MSGPACK_FIELDS(destination_pointer, source); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("destination_pointer", destination_pointer)); + packer.pack(std::make_pair("source", source)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Store"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "destination_pointer", destination_pointer, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false); + } }; struct BlackBox { @@ -1906,7 +2500,18 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Trap bincodeDeserialize(std::vector); - MSGPACK_FIELDS(revert_data); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("revert_data", revert_data)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Trap"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "revert_data", revert_data, false); + } }; struct Stop { @@ -1916,7 +2521,18 @@ struct BrilligOpcode { std::vector bincodeSerialize() const; static Stop bincodeDeserialize(std::vector); - MSGPACK_FIELDS(return_data); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("return_data", return_data)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Stop"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "return_data", return_data, false); + } }; std::variant bincodeSerialize() const; static FunctionInput bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input, num_bits); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("input", input)); + packer.pack(std::make_pair("num_bits", num_bits)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "FunctionInput"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "num_bits", num_bits, false); + } }; struct BlackBoxFuncCall { @@ -2437,7 +3066,24 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static AES128Encrypt bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, iv, key, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(4); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("iv", iv)); + packer.pack(std::make_pair("key", key)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "AES128Encrypt"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "iv", iv, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "key", key, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct AND { @@ -2449,7 +3095,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static AND bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "AND"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct XOR { @@ -2461,7 +3122,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static XOR bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "XOR"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct RANGE { @@ -2471,7 +3147,18 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static RANGE bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("input", input)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "RANGE"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false); + } }; struct Blake2s { @@ -2482,7 +3169,20 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static Blake2s bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Blake2s"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct Blake3 { @@ -2493,7 +3193,20 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static Blake3 bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Blake3"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct EcdsaSecp256k1 { @@ -2507,7 +3220,26 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static EcdsaSecp256k1 bincodeDeserialize(std::vector); - MSGPACK_FIELDS(public_key_x, public_key_y, signature, hashed_message, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(5); + packer.pack(std::make_pair("public_key_x", public_key_x)); + packer.pack(std::make_pair("public_key_y", public_key_y)); + packer.pack(std::make_pair("signature", signature)); + packer.pack(std::make_pair("hashed_message", hashed_message)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "EcdsaSecp256k1"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_message", hashed_message, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct EcdsaSecp256r1 { @@ -2521,7 +3253,26 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static EcdsaSecp256r1 bincodeDeserialize(std::vector); - MSGPACK_FIELDS(public_key_x, public_key_y, signature, hashed_message, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(5); + packer.pack(std::make_pair("public_key_x", public_key_x)); + packer.pack(std::make_pair("public_key_y", public_key_y)); + packer.pack(std::make_pair("signature", signature)); + packer.pack(std::make_pair("hashed_message", hashed_message)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "EcdsaSecp256r1"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_message", hashed_message, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct MultiScalarMul { @@ -2533,7 +3284,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static MultiScalarMul bincodeDeserialize(std::vector); - MSGPACK_FIELDS(points, scalars, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("points", points)); + packer.pack(std::make_pair("scalars", scalars)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "MultiScalarMul"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "points", points, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "scalars", scalars, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct EmbeddedCurveAdd { @@ -2545,7 +3311,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static EmbeddedCurveAdd bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input1, input2, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("input1", input1)); + packer.pack(std::make_pair("input2", input2)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "EmbeddedCurveAdd"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input1", input1, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "input2", input2, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct Keccakf1600 { @@ -2556,7 +3337,20 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static Keccakf1600 bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Keccakf1600"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct RecursiveAggregation { @@ -2570,7 +3364,26 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static RecursiveAggregation bincodeDeserialize(std::vector); - MSGPACK_FIELDS(verification_key, proof, public_inputs, key_hash, proof_type); + void msgpack_pack(auto& packer) const + { + packer.pack_map(5); + packer.pack(std::make_pair("verification_key", verification_key)); + packer.pack(std::make_pair("proof", proof)); + packer.pack(std::make_pair("public_inputs", public_inputs)); + packer.pack(std::make_pair("key_hash", key_hash)); + packer.pack(std::make_pair("proof_type", proof_type)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "RecursiveAggregation"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "verification_key", verification_key, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "proof", proof, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_inputs", public_inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "key_hash", key_hash, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "proof_type", proof_type, false); + } }; struct BigIntAdd { @@ -2582,7 +3395,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static BigIntAdd bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntAdd"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntSub { @@ -2594,7 +3422,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static BigIntSub bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntSub"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntMul { @@ -2606,7 +3449,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static BigIntMul bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntMul"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntDiv { @@ -2618,7 +3476,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static BigIntDiv bincodeDeserialize(std::vector); - MSGPACK_FIELDS(lhs, rhs, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("lhs", lhs)); + packer.pack(std::make_pair("rhs", rhs)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntDiv"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntFromLeBytes { @@ -2630,7 +3503,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static BigIntFromLeBytes bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, modulus, output); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("modulus", modulus)); + packer.pack(std::make_pair("output", output)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntFromLeBytes"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "modulus", modulus, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false); + } }; struct BigIntToLeBytes { @@ -2641,7 +3529,20 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static BigIntToLeBytes bincodeDeserialize(std::vector); - MSGPACK_FIELDS(input, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("input", input)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BigIntToLeBytes"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; struct Poseidon2Permutation { @@ -2653,7 +3554,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static Poseidon2Permutation bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, outputs, len); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("outputs", outputs)); + packer.pack(std::make_pair("len", len)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Poseidon2Permutation"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "len", len, false); + } }; struct Sha256Compression { @@ -2665,7 +3581,22 @@ struct BlackBoxFuncCall { std::vector bincodeSerialize() const; static Sha256Compression bincodeDeserialize(std::vector); - MSGPACK_FIELDS(inputs, hash_values, outputs); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("hash_values", hash_values)); + packer.pack(std::make_pair("outputs", outputs)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Sha256Compression"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "hash_values", hash_values, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + } }; std::variant bincodeSerialize() const; static Expression bincodeDeserialize(std::vector); - MSGPACK_FIELDS(mul_terms, linear_combinations, q_c); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("mul_terms", mul_terms)); + packer.pack(std::make_pair("linear_combinations", linear_combinations)); + packer.pack(std::make_pair("q_c", q_c)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Expression"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "mul_terms", mul_terms, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "linear_combinations", linear_combinations, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "q_c", q_c, false); + } }; struct BrilligInputs { @@ -3475,7 +4421,22 @@ struct MemOp { std::vector bincodeSerialize() const; static MemOp bincodeDeserialize(std::vector); - MSGPACK_FIELDS(operation, index, value); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("operation", operation)); + packer.pack(std::make_pair("index", index)); + packer.pack(std::make_pair("value", value)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "MemOp"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "operation", operation, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "index", index, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false); + } }; struct Opcode { @@ -3529,7 +4490,22 @@ struct Opcode { std::vector bincodeSerialize() const; static MemoryOp bincodeDeserialize(std::vector); - MSGPACK_FIELDS(block_id, op, predicate); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("block_id", block_id)); + packer.pack(std::make_pair("op", op)); + packer.pack(std::make_pair("predicate", predicate)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "MemoryOp"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "block_id", block_id, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, true); + } }; struct MemoryInit { @@ -3541,7 +4517,22 @@ struct Opcode { std::vector bincodeSerialize() const; static MemoryInit bincodeDeserialize(std::vector); - MSGPACK_FIELDS(block_id, init, block_type); + void msgpack_pack(auto& packer) const + { + packer.pack_map(3); + packer.pack(std::make_pair("block_id", block_id)); + packer.pack(std::make_pair("init", init)); + packer.pack(std::make_pair("block_type", block_type)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "MemoryInit"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "block_id", block_id, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "init", init, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "block_type", block_type, false); + } }; struct BrilligCall { @@ -3554,7 +4545,24 @@ struct Opcode { std::vector bincodeSerialize() const; static BrilligCall bincodeDeserialize(std::vector); - MSGPACK_FIELDS(id, inputs, outputs, predicate); + void msgpack_pack(auto& packer) const + { + packer.pack_map(4); + packer.pack(std::make_pair("id", id)); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("outputs", outputs)); + packer.pack(std::make_pair("predicate", predicate)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BrilligCall"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "id", id, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, true); + } }; struct Call { @@ -3567,7 +4575,24 @@ struct Opcode { std::vector bincodeSerialize() const; static Call bincodeDeserialize(std::vector); - MSGPACK_FIELDS(id, inputs, outputs, predicate); + void msgpack_pack(auto& packer) const + { + packer.pack_map(4); + packer.pack(std::make_pair("id", id)); + packer.pack(std::make_pair("inputs", inputs)); + packer.pack(std::make_pair("outputs", outputs)); + packer.pack(std::make_pair("predicate", predicate)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Call"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "id", id, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, true); + } }; std::variant value; @@ -3844,7 +4869,20 @@ struct AssertionPayload { std::vector bincodeSerialize() const; static AssertionPayload bincodeDeserialize(std::vector); - MSGPACK_FIELDS(error_selector, payload); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("error_selector", error_selector)); + packer.pack(std::make_pair("payload", payload)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "AssertionPayload"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "error_selector", error_selector, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "payload", payload, false); + } }; struct ExpressionWidth { @@ -3865,7 +4903,18 @@ struct ExpressionWidth { std::vector bincodeSerialize() const; static Bounded bincodeDeserialize(std::vector); - MSGPACK_FIELDS(width); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("width", width)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Bounded"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "width", width, false); + } }; std::variant value; @@ -3975,7 +5024,20 @@ struct OpcodeLocation { std::vector bincodeSerialize() const; static Brillig bincodeDeserialize(std::vector); - MSGPACK_FIELDS(acir_index, brillig_index); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("acir_index", acir_index)); + packer.pack(std::make_pair("brillig_index", brillig_index)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Brillig"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "acir_index", acir_index, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "brillig_index", brillig_index, false); + } }; std::variant value; @@ -4095,13 +5157,30 @@ struct Circuit { std::vector bincodeSerialize() const; static Circuit bincodeDeserialize(std::vector); - MSGPACK_FIELDS(current_witness_index, - opcodes, - expression_width, - private_parameters, - public_parameters, - return_values, - assert_messages); + void msgpack_pack(auto& packer) const + { + packer.pack_map(7); + packer.pack(std::make_pair("current_witness_index", current_witness_index)); + packer.pack(std::make_pair("opcodes", opcodes)); + packer.pack(std::make_pair("expression_width", expression_width)); + packer.pack(std::make_pair("private_parameters", private_parameters)); + packer.pack(std::make_pair("public_parameters", public_parameters)); + packer.pack(std::make_pair("return_values", return_values)); + packer.pack(std::make_pair("assert_messages", assert_messages)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Circuit"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "current_witness_index", current_witness_index, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "opcodes", opcodes, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "expression_width", expression_width, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "private_parameters", private_parameters, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "public_parameters", public_parameters, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "return_values", return_values, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "assert_messages", assert_messages, false); + } }; struct BrilligBytecode { @@ -4111,7 +5190,18 @@ struct BrilligBytecode { std::vector bincodeSerialize() const; static BrilligBytecode bincodeDeserialize(std::vector); - MSGPACK_FIELDS(bytecode); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("bytecode", bytecode)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "BrilligBytecode"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "bytecode", bytecode, false); + } }; struct Program { @@ -4122,7 +5212,20 @@ struct Program { std::vector bincodeSerialize() const; static Program bincodeDeserialize(std::vector); - MSGPACK_FIELDS(functions, unconstrained_functions); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("functions", functions)); + packer.pack(std::make_pair("unconstrained_functions", unconstrained_functions)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "Program"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "functions", functions, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "unconstrained_functions", unconstrained_functions, false); + } }; struct ProgramWithoutBrillig { @@ -4132,7 +5235,18 @@ struct ProgramWithoutBrillig { std::vector bincodeSerialize() const; static ProgramWithoutBrillig bincodeDeserialize(std::vector); - MSGPACK_FIELDS(functions); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("functions", functions)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "ProgramWithoutBrillig"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "functions", functions, false); + } }; } // end of namespace Acir diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_stack.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_stack.hpp index 9cf5d5b48269..17e3455aa845 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_stack.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/witness_stack.hpp @@ -4,6 +4,47 @@ #include "msgpack.hpp" #include "serde.hpp" +namespace Witnesses { +struct Helpers { + static std::map make_kvmap(msgpack::object const& o, std::string const& name) + { + if (o.type != msgpack::type::MAP) { + std::cerr << o << std::endl; + throw_or_abort("expected MAP for " + name); + } + std::map kvmap; + for (uint32_t i = 0; i < o.via.map.size; ++i) { + if (o.via.map.ptr[i].key.type != msgpack::type::STR) { + std::cerr << o << std::endl; + throw_or_abort("expected STR for keys of " + name); + } + kvmap.emplace(std::string(o.via.map.ptr[i].key.via.str.ptr, o.via.map.ptr[i].key.via.str.size), + &o.via.map.ptr[i].val); + } + return kvmap; + } + template + static void conv_fld_from_kvmap(std::map const& kvmap, + std::string const& struct_name, + std::string const& field_name, + T& field, + bool is_optional) + { + auto it = kvmap.find(field_name); + if (it != kvmap.end()) { + try { + it->second->convert(field); + } catch (const msgpack::type_error&) { + std::cerr << *it->second << std::endl; + throw_or_abort("error converting into field " + struct_name + "::" + field_name); + } + } else if (!is_optional) { + throw_or_abort("missing field: " + struct_name + "::" + field_name); + } + } +}; +} // namespace Witnesses + namespace Witnesses { struct Witness { @@ -55,7 +96,20 @@ struct StackItem { std::vector bincodeSerialize() const; static StackItem bincodeDeserialize(std::vector); - MSGPACK_FIELDS(index, witness); + void msgpack_pack(auto& packer) const + { + packer.pack_map(2); + packer.pack(std::make_pair("index", index)); + packer.pack(std::make_pair("witness", witness)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "StackItem"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "index", index, false); + Helpers::conv_fld_from_kvmap(kvmap, name, "witness", witness, false); + } }; struct WitnessStack { @@ -65,7 +119,18 @@ struct WitnessStack { std::vector bincodeSerialize() const; static WitnessStack bincodeDeserialize(std::vector); - MSGPACK_FIELDS(stack); + void msgpack_pack(auto& packer) const + { + packer.pack_map(1); + packer.pack(std::make_pair("stack", stack)); + } + + void msgpack_unpack(msgpack::object const& o) + { + auto name = "WitnessStack"; + auto kvmap = Helpers::make_kvmap(o, name); + Helpers::conv_fld_from_kvmap(kvmap, name, "stack", stack, false); + } }; } // end of namespace Witnesses