diff --git a/.circleci/config.yml b/.circleci/config.yml index 8e8840ccac..2707d12eb5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -182,7 +182,7 @@ jobs: command: cond_spot_run_tests barretenberg-x86_64-linux-clang-assert 1 stdlib-tests - *save_logs - acir-format-tests: + dsl-tests: docker: - image: aztecprotocol/alpine-build-image resource_class: small @@ -191,7 +191,7 @@ jobs: - *setup_env - run: name: "Test" - command: cond_spot_run_tests barretenberg-x86_64-linux-clang-assert 1 acir_format_tests + command: cond_spot_run_tests barretenberg-x86_64-linux-clang-assert 1 dsl_tests - *save_logs barretenberg-tests: @@ -433,7 +433,7 @@ workflows: - wasm-linux-clang: *defaults - proof-system-tests: *bb_test - honk-tests: *bb_test - - acir-format-tests: *bb_test + - dsl-tests: *bb_test - barretenberg-tests: *bb_test - stdlib-tests: *bb_test - stdlib-recursion-turbo-tests: *bb_test diff --git a/acir_tests/Dockerfile b/acir_tests/Dockerfile index 6d7d07739d..b3da26dede 100644 --- a/acir_tests/Dockerfile +++ b/acir_tests/Dockerfile @@ -1,18 +1,13 @@ FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/barretenberg-x86_64-linux-clang-assert FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/bb.js -FROM rust:alpine AS atbbc -RUN apk update && apk add musl-dev -WORKDIR /usr/src/barretenberg/acir_tests -COPY acir-to-bberg-circuit acir-to-bberg-circuit -RUN cd acir-to-bberg-circuit && cargo build --release - FROM node:18-alpine RUN apk update && apk add git bash curl COPY --from=0 /usr/src/barretenberg/cpp/build /usr/src/barretenberg/cpp/build COPY --from=1 /usr/src/barretenberg/ts /usr/src/barretenberg/ts -COPY --from=2 /usr/src/barretenberg/acir_tests/acir-to-bberg-circuit /usr/src/barretenberg/acir_tests/acir-to-bberg-circuit WORKDIR /usr/src/barretenberg/acir_tests COPY . . +# Run all native tests. RUN ./run_acir_tests.sh -RUN BB=../ts/dest/main.js ./run_acir_tests.sh \ No newline at end of file +# Just run double_verify_proof as a sanity check as bb.js is quite slow. +RUN BB=../ts/dest/main.js ./run_acir_tests.sh double_verify_proof \ No newline at end of file diff --git a/acir_tests/acir-to-bberg-circuit/.gitignore b/acir_tests/acir-to-bberg-circuit/.gitignore deleted file mode 100644 index ea8c4bf7f3..0000000000 --- a/acir_tests/acir-to-bberg-circuit/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/acir_tests/acir-to-bberg-circuit/Cargo.lock b/acir_tests/acir-to-bberg-circuit/Cargo.lock deleted file mode 100644 index 4fdafa81aa..0000000000 --- a/acir_tests/acir-to-bberg-circuit/Cargo.lock +++ /dev/null @@ -1,1067 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "acir" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0f4d70cd78f13cc17b2b16953af71d1a4fd0aa923cc35e6741c1f810eccdad" -dependencies = [ - "acir_field 0.15.1", - "brillig_vm 0.15.1", - "flate2", - "rmp-serde", - "serde", - "thiserror", -] - -[[package]] -name = "acir" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502a9126627ae67868515031c2283e64f3e1fef5ff93850009ed89a8a24fac60" -dependencies = [ - "acir_field 0.17.0", - "brillig_vm 0.17.0", - "flate2", - "rmp-serde", - "serde", - "thiserror", -] - -[[package]] -name = "acir-to-bberg-circuit" -version = "0.1.0" -dependencies = [ - "acvm 0.17.0", - "base64", - "flate2", - "noirc_abi", - "serde", - "serde-big-array", - "serde_json", -] - -[[package]] -name = "acir_field" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74a1bdec0ba9ddb54d3337bb487a889dd212211a7daf6fe9fb175adf107eecdc" -dependencies = [ - "ark-bn254", - "ark-ff", - "cfg-if", - "hex", - "num-bigint", - "serde", -] - -[[package]] -name = "acir_field" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a98fe4e3f9156f5551c8c9686e8f720a990d000e1e666e08a86e938a36ac8be" -dependencies = [ - "ark-bn254", - "ark-ff", - "cfg-if", - "hex", - "num-bigint", - "serde", -] - -[[package]] -name = "acvm" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e27004072f628c96c5666068c0d9efae134423331859b60923265a017a5920b" -dependencies = [ - "acir 0.15.1", - "acvm_stdlib 0.15.1", - "async-trait", - "blake2", - "indexmap 1.9.3", - "k256", - "num-bigint", - "num-traits", - "sha2", - "sha3", - "thiserror", -] - -[[package]] -name = "acvm" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95315759a51115860af49a492791ae5155c3d2c0555eec1358faa5d74c763391" -dependencies = [ - "acir 0.17.0", - "acvm_stdlib 0.17.0", - "async-trait", - "blake2", - "indexmap 1.9.3", - "k256", - "num-bigint", - "num-traits", - "p256", - "sha2", - "sha3", - "thiserror", -] - -[[package]] -name = "acvm_stdlib" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a16b18f0dc47de9c3f60eb320dda05b31355d7d4f76239f75852cc5a518db69e" -dependencies = [ - "acir 0.15.1", -] - -[[package]] -name = "acvm_stdlib" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7d2d8407e55ac26078af1d783408525e7f906e531cb04adcc47650d7994f62" -dependencies = [ - "acir 0.17.0", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", -] - -[[package]] -name = "ark-bn254" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", - "itertools", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest", - "itertools", - "num-bigint", - "num-traits", - "paste", - "rustc_version", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "digest", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "async-trait" -version = "0.1.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79fa67157abdfd688a259b6648808757db9347af834624f27ec646da976aee5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "brillig_vm" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae057025d1898257631c65c63071209dc41093cf9c0d77cdaae976798fa18b93" -dependencies = [ - "acir_field 0.15.1", - "serde", -] - -[[package]] -name = "brillig_vm" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36821ba87dd1807784d679bca54d753665014b109f6acfe38516eec7f3d71941" -dependencies = [ - "acir_field 0.17.0", - "blake2", - "k256", - "p256", - "serde", - "sha2", - "sha3", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "const-oid" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6340df57935414636969091153f35f68d9f00bbc8fb4a9c6054706c213e6c6bc" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der", - "elliptic-curve", - "rfc6979", - "signature", -] - -[[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct", - "crypto-bigint", - "der", - "digest", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "equivalent" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core", - "subtle", -] - -[[package]] -name = "flate2" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "iter-extended" -version = "0.7.1" -source = "git+https://github.com/noir-lang/noir.git#e5773e47c212c7c8fa1a7d7456893b508cdb400c" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" - -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "sha2", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "noirc_abi" -version = "0.7.1" -source = "git+https://github.com/noir-lang/noir.git#e5773e47c212c7c8fa1a7d7456893b508cdb400c" -dependencies = [ - "acvm 0.15.1", - "iter-extended", - "serde", - "serde_json", - "thiserror", - "toml", -] - -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa", - "elliptic-curve", - "sha2", -] - -[[package]] -name = "paste" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint", - "hmac", - "zeroize", -] - -[[package]] -name = "rmp" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f" -dependencies = [ - "byteorder", - "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b13be192e0220b8afb7222aa5813cb62cc269ebb5cac346ca6487681d2913e" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "ryu" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" - -[[package]] -name = "serde" -version = "1.0.166" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d01b7404f9d441d3ad40e6a636a7782c377d2abdbe4fa2440e2edcc2f4f10db8" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-big-array" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.166" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd83d6dde2b6b2d466e14d9d1acce8816dedee94f735eac6395808b3483c6d6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", -] - -[[package]] -name = "serde_json" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" -dependencies = [ - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest", - "keccak", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c16a64ba9387ef3fdae4f9c1a7f07a0997fce91985c0336f1ddc1822b3b37802" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14928354b01c4d6a4f0e549069adef399a284e7995c7ccca94e8a07a5346c59" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", -] - -[[package]] -name = "toml" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebafdf5ad1220cb59e7d17cf4d2c72015297b75b19a10472f99b89225089240" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" -dependencies = [ - "indexmap 2.0.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "unicode-ident" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "winnow" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" -dependencies = [ - "memchr", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", -] diff --git a/acir_tests/acir-to-bberg-circuit/Cargo.toml b/acir_tests/acir-to-bberg-circuit/Cargo.toml deleted file mode 100644 index 21996a2841..0000000000 --- a/acir_tests/acir-to-bberg-circuit/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "acir-to-bberg-circuit" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde = { version = "1.0.136", features = ["derive"] } -serde_json = "1.0" -serde-big-array = "0.5.1" -flate2 = "1.0" -base64 = "0.13" - -acvm = { version = "0.17.0", features = ["bn254"] } -noirc_abi = { git = "https://github.com/noir-lang/noir.git" } diff --git a/acir_tests/acir-to-bberg-circuit/README.md b/acir_tests/acir-to-bberg-circuit/README.md deleted file mode 100644 index 46ac73fcd8..0000000000 --- a/acir_tests/acir-to-bberg-circuit/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# ACIR to bb.js circuit - -Convert an ACIR circuit generated by Noir. - -How to use the repo: - -1. Install the binary using the command below -``` -cargo install --path=. -``` - -2. Then enter your Noir project directory - -3. Compile a circuit using nargo. -``` -nargo compile test -``` - -4. Then run the command below -``` -acir-to-bberg-circuit -``` - -The default path will be `./target/main.json`, and it will change the JSON file directly. It should be noted that it will also overwrite the proving key and verification key to be empty if exist in the original build artifact. \ No newline at end of file diff --git a/acir_tests/acir-to-bberg-circuit/src/barretenberg_structures.rs b/acir_tests/acir-to-bberg-circuit/src/barretenberg_structures.rs deleted file mode 100644 index 8167a1e7af..0000000000 --- a/acir_tests/acir-to-bberg-circuit/src/barretenberg_structures.rs +++ /dev/null @@ -1,1379 +0,0 @@ -use acvm::acir::circuit::opcodes::{BlackBoxFuncCall, FunctionInput, MemoryBlock}; -use acvm::acir::circuit::{Circuit, Opcode}; -use acvm::acir::native_types::Expression; -use acvm::FieldElement; -use serde::{Deserialize, Serialize}; -use serde_big_array::BigArray; - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct Constraint { - pub(crate) a: i32, - pub(crate) b: i32, - pub(crate) c: i32, - pub(crate) qm: FieldElement, - pub(crate) ql: FieldElement, - pub(crate) qr: FieldElement, - pub(crate) qo: FieldElement, - pub(crate) qc: FieldElement, -} - -impl Default for Constraint { - fn default() -> Self { - Constraint { - a: 0, - b: 0, - c: 0, - qm: FieldElement::zero(), - ql: FieldElement::zero(), - qr: FieldElement::zero(), - qo: FieldElement::zero(), - qc: FieldElement::zero(), - } - } -} - -impl Constraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - // serialize Wires - buffer.extend_from_slice(&self.a.to_be_bytes()); - buffer.extend_from_slice(&self.b.to_be_bytes()); - buffer.extend_from_slice(&self.c.to_be_bytes()); - - // serialize selectors - buffer.extend_from_slice(&self.qm.to_be_bytes()); - buffer.extend_from_slice(&self.ql.to_be_bytes()); - buffer.extend_from_slice(&self.qr.to_be_bytes()); - buffer.extend_from_slice(&self.qo.to_be_bytes()); - buffer.extend_from_slice(&self.qc.to_be_bytes()); - - buffer - } - - fn set_linear_term(&mut self, x: FieldElement, witness: i32) { - if self.a == 0 || self.a == witness { - self.a = witness; - self.ql = x; - } else if self.b == 0 || self.b == witness { - self.b = witness; - self.qr = x; - } else if self.c == 0 || self.c == witness { - self.c = witness; - self.qo = x; - } else { - unreachable!("Cannot assign linear term to a constrain of width 3"); - } - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct RangeConstraint { - pub(crate) a: i32, - pub(crate) num_bits: i32, -} - -impl RangeConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - // Serializing Wires - buffer.extend_from_slice(&self.a.to_be_bytes()); - buffer.extend_from_slice(&self.num_bits.to_be_bytes()); - - buffer - } -} -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct EcdsaConstraint { - pub(crate) hashed_message: Vec, - // Required until Serde adopts const generics: https://github.com/serde-rs/serde/issues/1937 - #[serde(with = "BigArray")] - pub(crate) signature: [i32; 64], - pub(crate) public_key_x: [i32; 32], - pub(crate) public_key_y: [i32; 32], - pub(crate) result: i32, -} - -impl EcdsaConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let message_len = (self.hashed_message.len()) as u32; - buffer.extend_from_slice(&message_len.to_be_bytes()); - for constraint in self.hashed_message.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - let sig_len = (self.signature.len()) as u32; - buffer.extend_from_slice(&sig_len.to_be_bytes()); - for sig_byte in self.signature.iter() { - buffer.extend_from_slice(&sig_byte.to_be_bytes()); - } - - let pub_key_x_len = (self.public_key_x.len()) as u32; - buffer.extend_from_slice(&pub_key_x_len.to_be_bytes()); - for x_byte in self.public_key_x.iter() { - buffer.extend_from_slice(&x_byte.to_be_bytes()); - } - - let pub_key_y_len = (self.public_key_y.len()) as u32; - buffer.extend_from_slice(&pub_key_y_len.to_be_bytes()); - for y_byte in self.public_key_y.iter() { - buffer.extend_from_slice(&y_byte.to_be_bytes()); - } - - buffer.extend_from_slice(&self.result.to_be_bytes()); - - buffer - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct SchnorrConstraint { - pub(crate) message: Vec, - // Required until Serde adopts const generics: https://github.com/serde-rs/serde/issues/1937 - #[serde(with = "BigArray")] - pub(crate) signature: [i32; 64], - pub(crate) public_key_x: i32, - pub(crate) public_key_y: i32, - pub(crate) result: i32, -} - -impl SchnorrConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let message_len = (self.message.len()) as u32; - buffer.extend_from_slice(&message_len.to_be_bytes()); - for constraint in self.message.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - let sig_len = (self.signature.len()) as u32; - buffer.extend_from_slice(&sig_len.to_be_bytes()); - for sig_byte in self.signature.iter() { - buffer.extend_from_slice(&sig_byte.to_be_bytes()); - } - - buffer.extend_from_slice(&self.public_key_x.to_be_bytes()); - buffer.extend_from_slice(&self.public_key_y.to_be_bytes()); - buffer.extend_from_slice(&self.result.to_be_bytes()); - - buffer - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct Sha256Constraint { - pub(crate) inputs: Vec<(i32, i32)>, - pub(crate) result: [i32; 32], -} - -impl Sha256Constraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let inputs_len = self.inputs.len() as u32; - buffer.extend_from_slice(&inputs_len.to_be_bytes()); - for constraint in self.inputs.iter() { - buffer.extend_from_slice(&constraint.0.to_be_bytes()); - buffer.extend_from_slice(&constraint.1.to_be_bytes()); - } - - let result_len = self.result.len() as u32; - buffer.extend_from_slice(&result_len.to_be_bytes()); - for constraint in self.result.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - buffer - } -} -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct Blake2sConstraint { - pub(crate) inputs: Vec<(i32, i32)>, - pub(crate) result: [i32; 32], -} - -impl Blake2sConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let inputs_len = self.inputs.len() as u32; - buffer.extend_from_slice(&inputs_len.to_be_bytes()); - for constraint in self.inputs.iter() { - buffer.extend_from_slice(&constraint.0.to_be_bytes()); - buffer.extend_from_slice(&constraint.1.to_be_bytes()); - } - - let result_len = self.result.len() as u32; - buffer.extend_from_slice(&result_len.to_be_bytes()); - for constraint in self.result.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - buffer - } -} -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct HashToFieldConstraint { - pub(crate) inputs: Vec<(i32, i32)>, - pub(crate) result: i32, -} - -impl HashToFieldConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let inputs_len = self.inputs.len() as u32; - buffer.extend_from_slice(&inputs_len.to_be_bytes()); - for constraint in self.inputs.iter() { - buffer.extend_from_slice(&constraint.0.to_be_bytes()); - buffer.extend_from_slice(&constraint.1.to_be_bytes()); - } - - buffer.extend_from_slice(&self.result.to_be_bytes()); - - buffer - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct Keccak256Constraint { - pub(crate) inputs: Vec<(i32, i32)>, - pub(crate) result: [i32; 32], -} - -impl Keccak256Constraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let inputs_len = self.inputs.len() as u32; - buffer.extend_from_slice(&inputs_len.to_be_bytes()); - for constraint in self.inputs.iter() { - buffer.extend_from_slice(&constraint.0.to_be_bytes()); - buffer.extend_from_slice(&constraint.1.to_be_bytes()); - } - - let result_len = self.result.len() as u32; - buffer.extend_from_slice(&result_len.to_be_bytes()); - for constraint in self.result.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - buffer - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct Keccak256VarConstraint { - pub(crate) inputs: Vec<(i32, i32)>, - pub(crate) result: [i32; 32], - pub(crate) var_message_size: i32, -} - -impl Keccak256VarConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let inputs_len = self.inputs.len() as u32; - buffer.extend_from_slice(&inputs_len.to_be_bytes()); - for constraint in self.inputs.iter() { - buffer.extend_from_slice(&constraint.0.to_be_bytes()); - buffer.extend_from_slice(&constraint.1.to_be_bytes()); - } - - let result_len = self.result.len() as u32; - buffer.extend_from_slice(&result_len.to_be_bytes()); - for constraint in self.result.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - buffer.extend_from_slice(&self.var_message_size.to_be_bytes()); - - buffer - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct PedersenConstraint { - pub(crate) inputs: Vec, - pub(crate) hash_index: u32, - pub(crate) result_x: i32, - pub(crate) result_y: i32, -} - -impl PedersenConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let inputs_len = self.inputs.len() as u32; - buffer.extend_from_slice(&inputs_len.to_be_bytes()); - for constraint in self.inputs.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - buffer.extend_from_slice(&self.hash_index.to_be_bytes()); - - buffer.extend_from_slice(&self.result_x.to_be_bytes()); - buffer.extend_from_slice(&self.result_y.to_be_bytes()); - - buffer - } -} -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct FixedBaseScalarMulConstraint { - pub(crate) scalar: i32, - pub(crate) pubkey_x: i32, - pub(crate) pubkey_y: i32, -} - -impl FixedBaseScalarMulConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - // Serializing Wires - buffer.extend_from_slice(&self.scalar.to_be_bytes()); - buffer.extend_from_slice(&self.pubkey_x.to_be_bytes()); - buffer.extend_from_slice(&self.pubkey_y.to_be_bytes()); - - buffer - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct LogicConstraint { - pub(crate) a: i32, - pub(crate) b: i32, - pub(crate) result: i32, - pub(crate) num_bits: i32, - pub(crate) is_xor_gate: bool, -} - -impl LogicConstraint { - pub(crate) fn and(a: i32, b: i32, result: i32, num_bits: i32) -> LogicConstraint { - LogicConstraint { - a, - b, - result, - num_bits, - is_xor_gate: false, - } - } - pub(crate) fn xor(a: i32, b: i32, result: i32, num_bits: i32) -> LogicConstraint { - LogicConstraint { - a, - b, - result, - num_bits, - is_xor_gate: true, - } - } - - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - // Serializing Wires - buffer.extend_from_slice(&self.a.to_be_bytes()); - buffer.extend_from_slice(&self.b.to_be_bytes()); - buffer.extend_from_slice(&self.result.to_be_bytes()); - buffer.extend_from_slice(&self.num_bits.to_be_bytes()); - buffer.extend_from_slice(&i32::to_be_bytes(self.is_xor_gate as i32)); - - buffer - } -} - -#[derive(Clone, Hash, Debug, Default, Serialize, Deserialize)] -pub struct ConstraintSystem { - var_num: u32, - public_inputs: Vec, - - logic_constraints: Vec, - range_constraints: Vec, - sha256_constraints: Vec, - schnorr_constraints: Vec, - ecdsa_secp256k1_constraints: Vec, - ecdsa_secp256r1_constraints: Vec, - blake2s_constraints: Vec, - block_constraints: Vec, - keccak_constraints: Vec, - keccak_var_constraints: Vec, - pedersen_constraints: Vec, - hash_to_field_constraints: Vec, - fixed_base_scalar_mul_constraints: Vec, - recursion_constraints: Vec, - constraints: Vec, -} - -// This is a separate impl so the constructor can get the wasm_bindgen macro in the future -impl ConstraintSystem { - #[allow(dead_code)] - pub(crate) fn new() -> Self { - ConstraintSystem::default() - } -} - -// Builder-style impl, but we use all data types that can be defaulted so we don't need a separate builder struct -#[allow(dead_code)] -#[cfg(test)] -impl ConstraintSystem { - pub(crate) fn var_num(mut self, var_num: u32) -> Self { - self.var_num = var_num; - self - } - - pub(crate) fn public_inputs(mut self, public_inputs: Vec) -> Self { - self.public_inputs = public_inputs; - self - } - - pub(crate) fn logic_constraints(mut self, logic_constraints: Vec) -> Self { - self.logic_constraints = logic_constraints; - self - } - - pub(crate) fn range_constraints(mut self, range_constraints: Vec) -> Self { - self.range_constraints = range_constraints; - self - } - - pub(crate) fn sha256_constraints(mut self, sha256_constraints: Vec) -> Self { - self.sha256_constraints = sha256_constraints; - self - } - - pub(crate) fn schnorr_constraints( - mut self, - schnorr_constraints: Vec, - ) -> Self { - self.schnorr_constraints = schnorr_constraints; - self - } - - pub(crate) fn ecdsa_secp256k1_constraints( - mut self, - ecdsa_secp256k1_constraints: Vec, - ) -> Self { - self.ecdsa_secp256k1_constraints = ecdsa_secp256k1_constraints; - self - } - - pub(crate) fn ecdsa_secp256r1_constraints( - mut self, - ecdsa_secp256r1_constraints: Vec, - ) -> Self { - self.ecdsa_secp256r1_constraints = ecdsa_secp256r1_constraints; - self - } - - pub(crate) fn blake2s_constraints( - mut self, - blake2s_constraints: Vec, - ) -> Self { - self.blake2s_constraints = blake2s_constraints; - self - } - - pub(crate) fn keccak256_constraints( - mut self, - keccak256_constraints: Vec, - ) -> Self { - self.keccak_constraints = keccak256_constraints; - self - } - - pub(crate) fn pedersen_constraints( - mut self, - pedersen_constraints: Vec, - ) -> Self { - self.pedersen_constraints = pedersen_constraints; - self - } - - pub(crate) fn hash_to_field_constraints( - mut self, - hash_to_field_constraints: Vec, - ) -> Self { - self.hash_to_field_constraints = hash_to_field_constraints; - self - } - - pub(crate) fn fixed_base_scalar_mul_constraints( - mut self, - fixed_base_scalar_mul_constraints: Vec, - ) -> Self { - self.fixed_base_scalar_mul_constraints = fixed_base_scalar_mul_constraints; - self - } - - pub(crate) fn recursion_constraints( - mut self, - recursion_constraints: Vec, - ) -> Self { - self.recursion_constraints = recursion_constraints; - self - } - - pub(crate) fn constraints(mut self, constraints: Vec) -> Self { - self.constraints = constraints; - self - } - - pub(crate) fn block_constraints(mut self, block_constraints: Vec) -> Self { - self.block_constraints = block_constraints; - self - } -} - -impl ConstraintSystem { - pub fn to_bytes(&self) -> Vec { - let mut buffer: Vec = Vec::new(); - - // Push lengths onto the buffer - buffer.extend_from_slice(&self.var_num.to_be_bytes()); - - let pi_len = self.public_inputs.len() as u32; - buffer.extend_from_slice(&pi_len.to_be_bytes()); - for pub_input in self.public_inputs.iter() { - buffer.extend_from_slice(&pub_input.to_be_bytes()); - } - - // Serialize each Logic constraint - let logic_constraints_len = self.logic_constraints.len() as u32; - buffer.extend_from_slice(&logic_constraints_len.to_be_bytes()); - for constraint in self.logic_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Range constraint - let range_constraints_len = self.range_constraints.len() as u32; - buffer.extend_from_slice(&range_constraints_len.to_be_bytes()); - for constraint in self.range_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Sha256 constraint - let sha256_constraints_len = self.sha256_constraints.len() as u32; - buffer.extend_from_slice(&sha256_constraints_len.to_be_bytes()); - for constraint in self.sha256_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Schnorr constraint - let schnorr_len = self.schnorr_constraints.len() as u32; - buffer.extend_from_slice(&schnorr_len.to_be_bytes()); - for constraint in self.schnorr_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each ECDSA constraint - let ecdsa_k1_len = self.ecdsa_secp256k1_constraints.len() as u32; - buffer.extend_from_slice(&ecdsa_k1_len.to_be_bytes()); - for constraint in self.ecdsa_secp256k1_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - let ecdsa_r1_len = self.ecdsa_secp256r1_constraints.len() as u32; - buffer.extend_from_slice(&ecdsa_r1_len.to_be_bytes()); - for constraint in self.ecdsa_secp256r1_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Blake2s constraint - let blake2s_len = self.blake2s_constraints.len() as u32; - buffer.extend_from_slice(&blake2s_len.to_be_bytes()); - for constraint in self.blake2s_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Keccak constraint - let keccak_len = self.keccak_constraints.len() as u32; - buffer.extend_from_slice(&keccak_len.to_be_bytes()); - for constraint in self.keccak_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Keccak Var constraint - let keccak_var_len = self.keccak_var_constraints.len() as u32; - buffer.extend_from_slice(&keccak_var_len.to_be_bytes()); - for constraint in self.keccak_var_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Pedersen constraint - let pedersen_len = self.pedersen_constraints.len() as u32; - buffer.extend_from_slice(&pedersen_len.to_be_bytes()); - for constraint in self.pedersen_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each HashToField constraint - let h2f_len = self.hash_to_field_constraints.len() as u32; - buffer.extend_from_slice(&h2f_len.to_be_bytes()); - for constraint in self.hash_to_field_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each HashToField constraint - let fixed_base_scalar_mul_len = self.fixed_base_scalar_mul_constraints.len() as u32; - buffer.extend_from_slice(&fixed_base_scalar_mul_len.to_be_bytes()); - for constraint in self.fixed_base_scalar_mul_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - let recursion_constraints_len = self.recursion_constraints.len() as u32; - buffer.extend_from_slice(&recursion_constraints_len.to_be_bytes()); - for constraint in self.recursion_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Arithmetic constraint - let constraints_len = self.constraints.len() as u32; - buffer.extend_from_slice(&constraints_len.to_be_bytes()); - for constraint in self.constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - // Serialize each Block constraint - let len = self.block_constraints.len() as u32; - buffer.extend_from_slice(&len.to_be_bytes()); - for constraint in self.block_constraints.iter() { - buffer.extend(&constraint.to_bytes()); - } - - buffer - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct MemOpBarretenberg { - pub(crate) is_store: i8, - pub(crate) index: Constraint, - pub(crate) value: Constraint, -} -impl MemOpBarretenberg { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - buffer.extend_from_slice(&self.is_store.to_be_bytes()); - buffer.extend_from_slice(&self.index.to_bytes()); - buffer.extend_from_slice(&self.value.to_bytes()); - - buffer - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct BlockConstraint { - pub(crate) init: Vec, - pub(crate) trace: Vec, - pub(crate) is_ram: i8, -} - -impl BlockConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let len = self.init.len() as u32; - buffer.extend_from_slice(&len.to_be_bytes()); - for value in self.init.iter() { - buffer.extend_from_slice(&value.to_bytes()); - } - - let len = self.trace.len() as u32; - buffer.extend_from_slice(&len.to_be_bytes()); - for op in self.trace.iter() { - buffer.extend_from_slice(&op.to_bytes()); - } - buffer.extend_from_slice(&self.is_ram.to_be_bytes()); - - buffer - } - - fn from_memory_block(b: &MemoryBlock, is_ram_block: bool) -> BlockConstraint { - let mut init = Vec::new(); - let mut trace = Vec::new(); - let len = b.len as usize; - for op in b.trace.iter().take(len) { - assert_eq!(op.operation, Expression::one()); - init.push(serialize_arithmetic_gates(&op.value)); - } - for op in b.trace.iter().skip(len) { - let index = serialize_arithmetic_gates(&op.index); - let value = serialize_arithmetic_gates(&op.value); - let bb_op = MemOpBarretenberg { - is_store: op.operation.to_const().unwrap().to_u128() as i8, - index, - value, - }; - trace.push(bb_op); - } - let is_ram = i8::from(is_ram_block); - BlockConstraint { - init, - trace, - is_ram, - } - } -} - -#[derive(Clone, Hash, Debug, Serialize, Deserialize)] -pub(crate) struct RecursionConstraint { - pub(crate) key: Vec, // UP size is 115 - pub(crate) proof: Vec, // UP size is 94 - pub(crate) public_inputs: Vec, - pub(crate) key_hash: i32, - pub(crate) input_aggregation_object: [i32; 16], - pub(crate) output_aggregation_object: [i32; 16], - pub(crate) nested_aggregation_object: [i32; 16], -} - -impl RecursionConstraint { - fn to_bytes(&self) -> Vec { - let mut buffer = Vec::new(); - - let vk_len = (self.key.len()) as u32; - buffer.extend_from_slice(&vk_len.to_be_bytes()); - for constraint in self.key.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - let proof_len = (self.proof.len()) as u32; - buffer.extend_from_slice(&proof_len.to_be_bytes()); - for constraint in self.proof.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - let public_inputs_len = (self.public_inputs.len()) as u32; - buffer.extend_from_slice(&public_inputs_len.to_be_bytes()); - for constraint in self.public_inputs.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - buffer.extend_from_slice(&self.key_hash.to_be_bytes()); - - // The aggregation objects are both array's in barretenberg - // Thus, we do not need to write the length - for constraint in self.input_aggregation_object.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - for constraint in self.output_aggregation_object.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - for constraint in self.nested_aggregation_object.iter() { - buffer.extend_from_slice(&constraint.to_be_bytes()); - } - - buffer - } -} - -impl TryFrom<&Circuit> for ConstraintSystem { - type Error = String; - /// Converts an `IR` into the `StandardFormat` constraint system - fn try_from(circuit: &Circuit) -> Result { - // Create constraint system - let mut constraints: Vec = Vec::new(); - let mut range_constraints: Vec = Vec::new(); - let mut logic_constraints: Vec = Vec::new(); - let mut sha256_constraints: Vec = Vec::new(); - let mut blake2s_constraints: Vec = Vec::new(); - let mut block_constraints: Vec = Vec::new(); - let mut keccak_constraints: Vec = Vec::new(); - let mut keccak_var_constraints: Vec = Vec::new(); - let mut pedersen_constraints: Vec = Vec::new(); - let mut schnorr_constraints: Vec = Vec::new(); - let mut ecdsa_secp256k1_constraints: Vec = Vec::new(); - let mut ecdsa_secp256r1_constraints: Vec = Vec::new(); - let mut fixed_base_scalar_mul_constraints: Vec = Vec::new(); - let mut hash_to_field_constraints: Vec = Vec::new(); - let mut recursion_constraints: Vec = Vec::new(); - - for gate in circuit.opcodes.iter() { - match gate { - Opcode::Arithmetic(expression) => { - let constraint = serialize_arithmetic_gates(expression); - constraints.push(constraint); - } - Opcode::BlackBoxFuncCall(gadget_call) => { - match gadget_call { - BlackBoxFuncCall::RANGE { input } => { - let witness = input.witness; - let num_bits = input.num_bits; - - let range_constraint = RangeConstraint { - a: witness.witness_index() as i32, - num_bits: num_bits as i32, - }; - range_constraints.push(range_constraint); - } - BlackBoxFuncCall::AND { lhs, rhs, output } - | BlackBoxFuncCall::XOR { lhs, rhs, output } => { - let witness_lhs = lhs.witness; - let witness_rhs = rhs.witness; - - assert_eq!(lhs.num_bits, rhs.num_bits); - let num_bits = rhs.num_bits; - - match gadget_call { - BlackBoxFuncCall::AND { .. } => { - let and = LogicConstraint::and( - witness_lhs.witness_index() as i32, - witness_rhs.witness_index() as i32, - output.witness_index() as i32, - num_bits as i32, - ); - logic_constraints.push(and); - } - BlackBoxFuncCall::XOR { .. } => { - let xor = LogicConstraint::xor( - witness_lhs.witness_index() as i32, - witness_rhs.witness_index() as i32, - output.witness_index() as i32, - num_bits as i32, - ); - logic_constraints.push(xor); - } - _ => unreachable!("expected either an AND or XOR opcode"), - } - } - BlackBoxFuncCall::SHA256 { inputs, outputs } => { - let mut sha256_inputs: Vec<(i32, i32)> = Vec::new(); - for input in inputs.iter() { - let witness_index = input.witness.witness_index() as i32; - let num_bits = input.num_bits as i32; - sha256_inputs.push((witness_index, num_bits)); - } - - assert_eq!(outputs.len(), 32); - - let mut outputs_iter = outputs.iter(); - let mut result = [0i32; 32]; - for (i, res) in result.iter_mut().enumerate() { - let out_byte = outputs_iter.next().ok_or_else(|| { - format!( - "Missing rest of output. Tried to get byte {i} but failed" - ) - })?; - - let out_byte_index = out_byte.witness_index() as i32; - *res = out_byte_index - } - let sha256_constraint = Sha256Constraint { - inputs: sha256_inputs, - result, - }; - - sha256_constraints.push(sha256_constraint); - } - BlackBoxFuncCall::Blake2s { inputs, outputs } => { - let mut blake2s_inputs: Vec<(i32, i32)> = Vec::new(); - for input in inputs.iter() { - let witness_index = input.witness.witness_index() as i32; - let num_bits = input.num_bits as i32; - blake2s_inputs.push((witness_index, num_bits)); - } - - assert_eq!(outputs.len(), 32); - - let mut outputs_iter = outputs.iter(); - let mut result = [0i32; 32]; - for (i, res) in result.iter_mut().enumerate() { - let out_byte = outputs_iter.next().ok_or_else(|| { - format!( - "Missing rest of output. Tried to get byte {i} but failed" - ) - })?; - - let out_byte_index = out_byte.witness_index() as i32; - *res = out_byte_index - } - let blake2s_constraint = Blake2sConstraint { - inputs: blake2s_inputs, - result, - }; - - blake2s_constraints.push(blake2s_constraint); - } - BlackBoxFuncCall::SchnorrVerify { - public_key_x, - public_key_y, - signature, - message: message_inputs, - output, - } => { - // pub_key_x - let public_key_x = public_key_x.witness.witness_index() as i32; - // pub_key_y - let public_key_y = public_key_y.witness.witness_index() as i32; - // signature - let mut signature_iter = signature.iter(); - let mut signature = [0i32; 64]; - for (i, sig) in signature.iter_mut().enumerate() { - let sig_byte = - signature_iter.next().ok_or_else(|| format!("Missing rest of signature. Tried to get byte {i} but failed"))?; - let sig_byte_index = sig_byte.witness.witness_index() as i32; - *sig = sig_byte_index - } - - // The rest of the input is the message - let mut message = Vec::new(); - for msg in message_inputs.iter() { - let msg_byte_index = msg.witness.witness_index() as i32; - message.push(msg_byte_index); - } - - // result - let result = output.witness_index() as i32; - - let constraint = SchnorrConstraint { - message, - signature, - public_key_x, - public_key_y, - result, - }; - - schnorr_constraints.push(constraint); - } - BlackBoxFuncCall::Pedersen { - inputs: gadget_call_inputs, - domain_separator, - outputs, - } => { - let mut inputs = Vec::new(); - for scalar in gadget_call_inputs.iter() { - let scalar_index = scalar.witness.witness_index() as i32; - inputs.push(scalar_index); - } - - let result_x = outputs.0.witness_index() as i32; - let result_y = outputs.1.witness_index() as i32; - - let constraint = PedersenConstraint { - inputs, - hash_index: *domain_separator, - result_x, - result_y, - }; - - pedersen_constraints.push(constraint); - } - BlackBoxFuncCall::HashToField128Security { inputs, output } => { - let mut hash_to_field_inputs: Vec<(i32, i32)> = Vec::new(); - for input in inputs.iter() { - let witness_index = input.witness.witness_index() as i32; - let num_bits = input.num_bits as i32; - hash_to_field_inputs.push((witness_index, num_bits)); - } - - let result = output.witness_index() as i32; - - let hash_to_field_constraint = HashToFieldConstraint { - inputs: hash_to_field_inputs, - result, - }; - - hash_to_field_constraints.push(hash_to_field_constraint); - } - BlackBoxFuncCall::EcdsaSecp256k1 { - public_key_x: public_key_x_inputs, - public_key_y: public_key_y_inputs, - signature: signature_inputs, - hashed_message: hashed_message_inputs, - output, - } => { - // public key x - let mut public_key_x_inputs = public_key_x_inputs.iter(); - let mut public_key_x = [0i32; 32]; - for (i, pkx) in public_key_x.iter_mut().enumerate() { - let x_byte = public_key_x_inputs - .next() - .ok_or_else(|| format!("Missing rest of `x` component for public key. Tried to get byte {i} but failed"))?; - let x_byte_index = x_byte.witness.witness_index() as i32; - *pkx = x_byte_index; - } - - // public key y - let mut public_key_y_inputs = public_key_y_inputs.iter(); - let mut public_key_y = [0i32; 32]; - for (i, pky) in public_key_y.iter_mut().enumerate() { - let y_byte = public_key_y_inputs - .next() - .ok_or_else(|| format!("Missing rest of `y` component for public key. Tried to get byte {i} but failed"))?; - let y_byte_index = y_byte.witness.witness_index() as i32; - *pky = y_byte_index; - } - - // signature - let mut signature_inputs = signature_inputs.iter(); - let mut signature = [0i32; 64]; - for (i, sig) in signature.iter_mut().enumerate() { - let sig_byte = - signature_inputs.next().ok_or_else(|| format!("Missing rest of signature. Tried to get byte {i} but failed"))?; - let sig_byte_index = sig_byte.witness.witness_index() as i32; - *sig = sig_byte_index; - } - - // The rest of the input is the message - let mut hashed_message = Vec::new(); - for msg in hashed_message_inputs.iter() { - let msg_byte_index = msg.witness.witness_index() as i32; - hashed_message.push(msg_byte_index); - } - - // result - let result = output.witness_index() as i32; - - let constraint = EcdsaConstraint { - hashed_message, - signature, - public_key_x, - public_key_y, - result, - }; - - ecdsa_secp256k1_constraints.push(constraint); - } - BlackBoxFuncCall::EcdsaSecp256r1 { - public_key_x: public_key_x_inputs, - public_key_y: public_key_y_inputs, - signature: signature_inputs, - hashed_message: hashed_message_inputs, - output, - } => { - // public key x - let mut public_key_x_inputs = public_key_x_inputs.iter(); - let mut public_key_x = [0i32; 32]; - for (i, pkx) in public_key_x.iter_mut().enumerate() { - let x_byte = public_key_x_inputs - .next() - .ok_or_else(|| format!("Missing rest of `x` component for public key. Tried to get byte {i} but failed"))?; - let x_byte_index = x_byte.witness.witness_index() as i32; - *pkx = x_byte_index; - } - - // public key y - let mut public_key_y_inputs = public_key_y_inputs.iter(); - let mut public_key_y = [0i32; 32]; - for (i, pky) in public_key_y.iter_mut().enumerate() { - let y_byte = public_key_y_inputs - .next() - .ok_or_else(|| format!("Missing rest of `y` component for public key. Tried to get byte {i} but failed"))?; - let y_byte_index = y_byte.witness.witness_index() as i32; - *pky = y_byte_index; - } - - // signature - let mut signature_inputs = signature_inputs.iter(); - let mut signature = [0i32; 64]; - for (i, sig) in signature.iter_mut().enumerate() { - let sig_byte = - signature_inputs.next().ok_or_else(|| format!("Missing rest of signature. Tried to get byte {i} but failed"))?; - let sig_byte_index = sig_byte.witness.witness_index() as i32; - *sig = sig_byte_index; - } - - // The rest of the input is the message - let mut hashed_message = Vec::new(); - for msg in hashed_message_inputs.iter() { - let msg_byte_index = msg.witness.witness_index() as i32; - hashed_message.push(msg_byte_index); - } - - // result - let result = output.witness_index() as i32; - - let constraint = EcdsaConstraint { - hashed_message, - signature, - public_key_x, - public_key_y, - result, - }; - - ecdsa_secp256r1_constraints.push(constraint); - } - BlackBoxFuncCall::FixedBaseScalarMul { input, outputs } => { - let scalar = input.witness.witness_index() as i32; - - let pubkey_x = outputs.0.witness_index() as i32; - let pubkey_y = outputs.1.witness_index() as i32; - - let fixed_base_scalar_mul = FixedBaseScalarMulConstraint { - scalar, - pubkey_x, - pubkey_y, - }; - - fixed_base_scalar_mul_constraints.push(fixed_base_scalar_mul); - } - BlackBoxFuncCall::Keccak256 { inputs, outputs } => { - let mut keccak_inputs: Vec<(i32, i32)> = Vec::new(); - for input in inputs.iter() { - let witness_index = input.witness.witness_index() as i32; - let num_bits = input.num_bits as i32; - keccak_inputs.push((witness_index, num_bits)); - } - - assert_eq!(outputs.len(), 32); - - let mut outputs_iter = outputs.iter(); - let mut result = [0i32; 32]; - for (i, res) in result.iter_mut().enumerate() { - let out_byte = outputs_iter.next().ok_or_else(|| { - format!( - "Missing rest of output. Tried to get byte {i} but failed" - ) - })?; - - let out_byte_index = out_byte.witness_index() as i32; - *res = out_byte_index - } - let keccak_constraint = Keccak256Constraint { - inputs: keccak_inputs, - result, - }; - - keccak_constraints.push(keccak_constraint); - } - BlackBoxFuncCall::Keccak256VariableLength { - inputs, - var_message_size, - outputs, - } => { - let mut keccak_inputs: Vec<(i32, i32)> = Vec::new(); - for input in inputs.iter() { - let witness_index = input.witness.witness_index() as i32; - let num_bits = input.num_bits as i32; - keccak_inputs.push((witness_index, num_bits)); - } - - let var_message_size = var_message_size.witness.witness_index() as i32; - - assert_eq!(outputs.len(), 32); - - let mut outputs_iter = outputs.iter(); - let mut result = [0i32; 32]; - for (i, res) in result.iter_mut().enumerate() { - let out_byte = outputs_iter.next().ok_or_else(|| { - format!( - "Missing rest of output. Tried to get byte {i} but failed" - ) - })?; - - let out_byte_index = out_byte.witness_index() as i32; - *res = out_byte_index - } - let keccak_var_constraint = Keccak256VarConstraint { - inputs: keccak_inputs, - var_message_size, - result, - }; - - keccak_var_constraints.push(keccak_var_constraint); - } - BlackBoxFuncCall::RecursiveAggregation { - verification_key: key_inputs, - proof: proof_inputs, - public_inputs: public_inputs_inputs, - key_hash, - input_aggregation_object, - output_aggregation_object, - } => { - let mut key_inputs = key_inputs.iter(); - let mut key_array = [0i32; 114]; - for (i, vk_witness) in key_array.iter_mut().enumerate() { - let vk_field = key_inputs.next().unwrap_or_else(|| { - panic!( - "missing rest of vkey. Tried to get field {i} but failed" - ) - }); - let vk_field_index = vk_field.witness.witness_index() as i32; - *vk_witness = vk_field_index; - } - let key = key_array.to_vec(); - - let mut proof = Vec::new(); - for proof_field in proof_inputs.iter() { - let proof_field_index = proof_field.witness.witness_index() as i32; - proof.push(proof_field_index); - } - - let mut public_inputs = Vec::new(); - for public_input in public_inputs_inputs.iter() { - let public_input_field_index = - public_input.witness.witness_index() as i32; - public_inputs.push(public_input_field_index); - } - - // key_hash - let key_hash = key_hash.witness.witness_index() as i32; - - let input_agg_obj_inputs = - if let Some(input_aggregation_object) = input_aggregation_object { - input_aggregation_object.clone() - } else { - vec![FunctionInput::dummy(); output_aggregation_object.len()] - }; - - // input_aggregation_object - let mut input_agg_obj_inputs = input_agg_obj_inputs.iter(); - let mut input_aggregation_object = [0i32; 16]; - for (i, var) in input_aggregation_object.iter_mut().enumerate() { - let var_field = input_agg_obj_inputs.next().unwrap_or_else(|| panic!("missing rest of output aggregation object. Tried to get byte {i} but failed")); - let var_field_index = var_field.witness.witness_index() as i32; - *var = var_field_index; - } - - // nested_aggregation_object - let mut nested_aggregation_object: [i32; 16] = [0; 16]; - if key[5] == 1 { - nested_aggregation_object = key[6..22].try_into().expect("missing nested aggregation object. verification key most likely malformed"); - } - - // output_aggregation_object - let mut outputs_iter = output_aggregation_object.iter(); - let mut output_aggregation_object = [0i32; 16]; - for (i, var) in output_aggregation_object.iter_mut().enumerate() { - let var_field = outputs_iter.next().unwrap_or_else(|| panic!("missing rest of output aggregation object. Tried to get byte {i} but failed")); - let var_field_index = var_field.witness_index() as i32; - *var = var_field_index; - } - - let recursion_constraint = RecursionConstraint { - key, - proof, - public_inputs, - key_hash, - input_aggregation_object, - output_aggregation_object, - nested_aggregation_object, - }; - - recursion_constraints.push(recursion_constraint); - } - }; - } - Opcode::Directive(_) | Opcode::Brillig(_) => { - // Directives, Oracles and Brillig are only needed by the pwg - } - Opcode::Block(_) => { - // Block is managed by ACVM - } - Opcode::RAM(block) => { - block_constraints.push(BlockConstraint::from_memory_block(block, true)) - } - Opcode::ROM(block) => { - block_constraints.push(BlockConstraint::from_memory_block(block, false)) - } - } - } - - // Create constraint system - Ok(ConstraintSystem { - var_num: circuit.current_witness_index + 1, // number of witnesses is the witness index + 1; - public_inputs: circuit.public_inputs().indices(), - logic_constraints, - range_constraints, - sha256_constraints, - pedersen_constraints, - schnorr_constraints, - ecdsa_secp256k1_constraints, - ecdsa_secp256r1_constraints, - blake2s_constraints, - block_constraints, - keccak_constraints, - keccak_var_constraints, - hash_to_field_constraints, - constraints, - fixed_base_scalar_mul_constraints, - recursion_constraints, - }) - } -} - -#[allow(non_snake_case)] -fn serialize_arithmetic_gates(gate: &Expression) -> Constraint { - let mut cs = Constraint::default(); - // check mul gate - if !gate.mul_terms.is_empty() { - let mul_term = &gate.mul_terms[0]; - cs.qm = mul_term.0; - - // Get wL term - let wL = &mul_term.1; - cs.a = wL.witness_index() as i32; - - // Get wR term - let wR = &mul_term.2; - cs.b = wR.witness_index() as i32; - } - - for term in &gate.linear_combinations { - cs.set_linear_term(term.0, term.1.witness_index() as i32); - } - - // Add the qc term - cs.qc = gate.q_c; - cs -} - -#[cfg(test)] -mod tests { - use crate::barretenberg_structures::serialize_arithmetic_gates; - use acvm::acir::native_types::{Expression, Witness}; - use acvm::FieldElement; - - #[test] - fn serialize_expression() { - let x1 = Witness::new(1); - let x3 = Witness::new(3); - let two = FieldElement::one() + FieldElement::one(); - let e = Expression { - mul_terms: vec![(FieldElement::one(), x1, x1)], - linear_combinations: vec![(two, x1), (-FieldElement::one(), x3)], - q_c: FieldElement::one(), - }; - let constrain = serialize_arithmetic_gates(&e); - assert_eq!(constrain.a, 1); - assert_eq!(constrain.b, 1); - assert_eq!(constrain.c, 3); - - let x2 = Witness::new(2); - let x8 = Witness::new(8); - let e = Expression { - mul_terms: vec![(-FieldElement::one(), x1, x2)], - linear_combinations: vec![(-FieldElement::one(), x8)], - q_c: FieldElement::zero(), - }; - let constrain = serialize_arithmetic_gates(&e); - assert_eq!(constrain.a, 1); - assert_eq!(constrain.b, 2); - assert_eq!(constrain.c, 8); - - let e = Expression { - mul_terms: vec![], - linear_combinations: vec![(FieldElement::one(), x8)], - q_c: FieldElement::zero(), - }; - let constrain = serialize_arithmetic_gates(&e); - assert_eq!(constrain.a, 8); - assert_eq!(constrain.b, 0); - assert_eq!(constrain.c, 0); - - let e = Expression { - mul_terms: vec![(FieldElement::one(), x1, x2)], - linear_combinations: vec![ - (FieldElement::one(), x8), - (two, x2), - (-FieldElement::one(), x1), - ], - q_c: FieldElement::zero(), - }; - let constrain = serialize_arithmetic_gates(&e); - assert_eq!(constrain.a, 1); - assert_eq!(constrain.b, 2); - assert_eq!(constrain.c, 8); - } -} diff --git a/acir_tests/acir-to-bberg-circuit/src/main.rs b/acir_tests/acir-to-bberg-circuit/src/main.rs deleted file mode 100644 index d56241508a..0000000000 --- a/acir_tests/acir-to-bberg-circuit/src/main.rs +++ /dev/null @@ -1,75 +0,0 @@ -use acvm::acir::circuit::Circuit; -use noirc_abi::Abi; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use std::{fs::File, io::Write, path::Path}; - -use flate2::write::GzEncoder; -use flate2::Compression; - -mod barretenberg_structures; -use barretenberg_structures::ConstraintSystem; - -pub fn main() { - let path_string = std::env::args() - .nth(1) - .unwrap_or("./target/main.json".to_owned()); - let circuit_path = Path::new(&path_string); - - let circuit_bytes = std::fs::read(&circuit_path).unwrap(); - - let program: PreprocessedProgram = - serde_json::from_slice(&circuit_bytes).expect("could not deserialize program"); - - write_to_file(&serde_json::to_vec(&program).unwrap(), &circuit_path); -} - -fn write_to_file(bytes: &[u8], path: &Path) -> String { - let display = path.display(); - - let mut file = match File::create(path) { - Err(why) => panic!("couldn't create {display}: {why}"), - Ok(file) => file, - }; - - match file.write_all(bytes) { - Err(why) => panic!("couldn't write to {display}: {why}"), - Ok(_) => display.to_string(), - } -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct PreprocessedProgram { - pub backend: String, - pub abi: Abi, - - #[serde( - serialize_with = "serialize_circuit", - deserialize_with = "deserialize_circuit" - )] - pub bytecode: Circuit -} - -fn serialize_circuit(circuit: &Circuit, s: S) -> Result -where - S: Serializer, -{ - let cs: ConstraintSystem = - ConstraintSystem::try_from(circuit).expect("should have no malformed bb funcs"); - let circuit_bytes = cs.to_bytes(); - - let mut encoder = GzEncoder::new(Vec::new(), Compression::default()); - encoder.write_all(&circuit_bytes).unwrap(); - let compressed_bytes = encoder.finish().unwrap(); - - let b64_string = base64::encode(compressed_bytes); - s.serialize_str(&b64_string) -} - -fn deserialize_circuit<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - let circuit_bytes = Vec::::deserialize(deserializer)?; - let circuit = Circuit::read(&*circuit_bytes).unwrap(); - Ok(circuit) -} diff --git a/acir_tests/run_acir_tests.sh b/acir_tests/run_acir_tests.sh index 2adc8861c1..e4f864e3af 100755 --- a/acir_tests/run_acir_tests.sh +++ b/acir_tests/run_acir_tests.sh @@ -6,42 +6,34 @@ set -e BB=$PWD/${BB:-../cpp/build/bin/bb} -ATBBC=$PWD/acir-to-bberg-circuit/target/release/acir-to-bberg-circuit CRS_PATH=~/.bb-crs BRANCH=master # Pull down the test vectors from the noir repo, if we don't have the folder already. if [ ! -d acir_tests ]; then - rm -rf noir - git clone -b $BRANCH --filter=blob:none --no-checkout https://github.com/noir-lang/noir.git - cd noir - git sparse-checkout init --cone - git sparse-checkout set crates/nargo_cli/tests/test_data - git checkout - cd .. - mv noir/crates/nargo_cli/tests/test_data acir_tests - rm -rf noir -fi - -# Get the tool to convert acir to bb constraint buf, if we don't have it already. -if [ ! -f $ATBBC ]; then - cd acir-to-bberg-circuit - cargo build --release - cd .. + if [ -n "$TEST_SRC" ]; then + cp -R $TEST_SRC acir_tests + else + rm -rf noir + git clone -b $BRANCH --filter=blob:none --no-checkout https://github.com/noir-lang/noir.git + cd noir + git sparse-checkout init --cone + git sparse-checkout set crates/nargo_cli/tests/test_data + git checkout + cd .. + mv noir/crates/nargo_cli/tests/test_data acir_tests + rm -rf noir + fi fi cd acir_tests # Remove excluded and expected-to-fail tests. -rm -rf bit_shifts_runtime comptime_fail poseidonsponge_x5_254 sha2_blocks sha2_byte diamond_deps_0 range_fail +rm -rf bit_shifts_runtime comptime_fail poseidonsponge_x5_254 sha2_blocks sha2_byte diamond_deps_0 range_fail workspace* function test() { echo -n "Testing $1... " cd $1 - if [ ! -f target/translated ]; then - $ATBBC - touch target/translated - fi set +e if [ -n "$VERBOSE" ]; then $BB prove_and_verify -v -c $CRS_PATH @@ -50,14 +42,17 @@ function test() { fi result=$? set -e - cd .. if [ $result -eq 0 ]; then echo -e "\033[32mPASSED\033[0m" else echo -e "\033[31mFAILED\033[0m" + # Run again verbose. + $BB prove_and_verify -v -c $CRS_PATH exit 1 fi + + cd .. } if [ -n "$1" ]; then diff --git a/cpp/bin-test/target/main.json b/cpp/bin-test/target/main.json index 3883d10a30..82e0528eb6 100644 --- a/cpp/bin-test/target/main.json +++ b/cpp/bin-test/target/main.json @@ -1 +1 @@ -{"backend":"acvm-backend-barretenberg","abi":{"parameters":[{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}},"visibility":"private"},{"name":"proof","type":{"kind":"array","length":94,"type":{"kind":"field"}},"visibility":"private"},{"name":"public_inputs","type":{"kind":"array","length":1,"type":{"kind":"field"}},"visibility":"private"},{"name":"key_hash","type":{"kind":"field"},"visibility":"private"},{"name":"input_aggregation_object","type":{"kind":"array","length":16,"type":{"kind":"field"}},"visibility":"private"},{"name":"proof_b","type":{"kind":"array","length":94,"type":{"kind":"field"}},"visibility":"private"}],"param_witnesses":{"input_aggregation_object":[211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226],"key_hash":[210],"proof":[115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208],"proof_b":[227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320],"public_inputs":[209],"verification_key":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114]},"return_type":{"kind":"array","length":16,"type":{"kind":"field"}},"return_witnesses":[337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352]},"bytecode":"H4sIAAAAAAAA/+3WU6/dWQDG4fWObbNj2+7YMx17pmPbtm3Xtm1bX6G2zefk9KZJb5qT9KLpSp6dfbWzk/f3X3uXkkdKKbuVklu4ldu4nTu4k7u4m3u4l/u4nwd4kIeoWTb8bMErZO37LdmKrdmGbdmO7dmBHdmJndmFXSu/d9mdPdiTvdibfdiX/difAziQgziYQziUahzG4RzBkRzF0RzDsRzH8ZzAiZzEyZzCqZzG6ZzBmZzF2ZzDuZzH+VzAhVzExVxCdS7lMi7nCq7kKq7mGq7lOq7nBm7kJm6mBnYrdit2K3Yrdit2K3Yrdit2K3Yrdit2K3Yrdit2KzV5mIoGHuUxHucJnuQpnuYZnuU5nucFXuQlXl67Y8VnvsprvM4bvMlbvM07vMt7vM8HfMhHfMwnfMpnfM4XfMlXfM03fMt3fM8P/MhP/Mwv/Mpv/M4f/Mlf/M0//Mt//E8talOHutSjPg1oSCMa04SmNKM5LWhJK1rThra0oz0d6EgnOtOFrnSjOz3oSS9604e+9KM/AxjIIAYzhKEMYzgjGMkoRjOmVD5DYxlXqnyix+gxeoweo8foMXqMHqPH6DF6jB6jx+gxekyNUvWz+U7YtO6E8UxgIpOYzBSmMo3pzGAms5jNHOYyj/ksYCGLWMwSlrKM5axgJatYXZlPvERD0VA0FA1FQ9FQNBQNRUPRUDQUDUVD0VAqfg81FA1FQ9FQNBQNRUPRUDQUDUVD0VA0FA1FQ6mGhqKhaCgaioaioWgoGoqGoqFoKBqKhqKhaCgaioaioWgoGoqGoqFoKBqKhqKhaCgaioaioWgo1cs6d0JVn+mN/t9gvWcN6fQg96wIAAA=","proving_key":[],"verification_key":[]} \ No newline at end of file +{"backend":"acvm-backend-barretenberg","abi":{"parameters":[{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}},"visibility":"private"},{"name":"proof","type":{"kind":"array","length":94,"type":{"kind":"field"}},"visibility":"private"},{"name":"public_inputs","type":{"kind":"array","length":1,"type":{"kind":"field"}},"visibility":"private"},{"name":"key_hash","type":{"kind":"field"},"visibility":"private"},{"name":"input_aggregation_object","type":{"kind":"array","length":16,"type":{"kind":"field"}},"visibility":"private"},{"name":"proof_b","type":{"kind":"array","length":94,"type":{"kind":"field"}},"visibility":"private"}],"param_witnesses":{"input_aggregation_object":[211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226],"key_hash":[210],"proof":[115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208],"proof_b":[227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320],"public_inputs":[209],"verification_key":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114]},"return_type":{"kind":"array","length":16,"type":{"kind":"field"}},"return_witnesses":[337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352]},"bytecode":"H4sIAAAAAAAA/+3V05ObbRjA4WytrW3bdrdr79bWZ6Ofbdu2jdq2+y/UtvmkuXZmp8c96ME+M7+5cieZzJtJ5r2nxEUixSKxEx5G4kNTC80XI7HXoxZnCZZkKZZmGZZlOZZnBcazIiuxMquwKquxOmuwJmuxNuuwLuuxPhuwIRuxMZuwKZuxOVuwJVuxNduwLduxPTuwIzuxM7uwK7uxO3uwJ3uxN/uwL/uxPwdwIAcxgYOZyCQmM4WpTGM6M5jJLGYzh7nMYz6HcCiHcThHcCRHcTTHcCzHcTwncCIncTKn8AbeyJt4M2/hrbyNt/MO3sm7eDfv4b28j/dzaqHrjJ4HzA/yIT7MR/goH+PjfIJP8ik+zWf4LJ/j83yBL/IlvsxX+Cpf4+t8g2/yLb7Nd/gu3+P7/IAf8iN+zE/4KT/j5/yCX/Irfs1v+C2/4/f8gT/yJ/7MX/grf+Pv/IN/8i/+zX/4L//j/5zG6ZzBmZzF2ZzDuZzH+VzAhVzExVzCpVzG5VzBlVzF1VzDtVzH9dzAjdzEzYzuoejZYt7KK4siegaHdySGkkLJoZRQaigtlB7KCGWGskLZoZxQbigvlB9XtPiKFl/MBBYtvpjX2+LbZt7OHdzJXdzNPdzLfdzPAzzIQzzMIzzKYzzOEzzJUzzNMzzLczzPCyzoEqM3oKhxLMbiLMGSLMXSLMOyLMfyrMB4VmQlVmYVVmU1VmcN1mQt1mYd1mU91mcDNmQjNmYTNmUzNmcLtmQrtmYbtmU7tmcHdmQndmYXdmU3dmcP9mQv9mYf9mU/9ucADuQgJhT8/pHYuXrxxRVefNEnEpnEZKYwlWlMZwYzmcVs5jCXecwv+KO4jiFhHhoaFhoeGhEaGRoVGh0aExobGhcaH5oQmhiaFJpc8C2v4eddBhwvtmjWDgAA","proving_key":null,"verification_key":null} \ No newline at end of file diff --git a/cpp/bin-test/target/witness.tr b/cpp/bin-test/target/witness.tr index 2bbbfa6508..82e8cf3ff5 100644 Binary files a/cpp/bin-test/target/witness.tr and b/cpp/bin-test/target/witness.tr differ diff --git a/cpp/scripts/bb-tests.sh b/cpp/scripts/bb-tests.sh index 697d6a7bad..b7dd5c27b8 100755 --- a/cpp/scripts/bb-tests.sh +++ b/cpp/scripts/bb-tests.sh @@ -25,6 +25,7 @@ TESTS=( join_split_example_proofs_notes_tests srs_tests transcript_tests + dsl_tests ) TESTS_STR="${TESTS[@]}" diff --git a/cpp/src/CMakeLists.txt b/cpp/src/CMakeLists.txt index 852ee14059..e76e775d65 100644 --- a/cpp/src/CMakeLists.txt +++ b/cpp/src/CMakeLists.txt @@ -83,8 +83,7 @@ message(STATUS "Compiling all-in-one barretenberg archive") add_library( barretenberg STATIC - $ - $ + $ $ $ $ @@ -146,8 +145,7 @@ if(WASM) add_executable( barretenberg.wasm $ - $ - $ + $ $ $ $ diff --git a/cpp/src/barretenberg/bb/get_witness.hpp b/cpp/src/barretenberg/bb/get_witness.hpp new file mode 100644 index 0000000000..2e44f0cce4 --- /dev/null +++ b/cpp/src/barretenberg/bb/get_witness.hpp @@ -0,0 +1,12 @@ +#pragma once +#include "exec_pipe.hpp" + +/** + * We can assume for now we're running on a unix like system and use the following to extract the bytecode. + * Maybe we should consider bytecode being output into its own independent file alongside the JSON? + */ +inline std::vector get_witness_data(const std::string& path) +{ + std::string command = "cat " + path + " | gunzip"; + return exec_pipe(command); +} \ No newline at end of file diff --git a/cpp/src/barretenberg/bb/main.cpp b/cpp/src/barretenberg/bb/main.cpp index fe155a9c78..b6661560e8 100644 --- a/cpp/src/barretenberg/bb/main.cpp +++ b/cpp/src/barretenberg/bb/main.cpp @@ -1,11 +1,12 @@ #include "barretenberg/bb/get_crs.hpp" -#include "file_io.hpp" #include "get_bytecode.hpp" +#include "get_witness.hpp" #include -#include +#include #include #include #include +#include #include #include @@ -25,23 +26,20 @@ void init() acir_format::WitnessVector get_witness(std::string const& witness_path) { - auto witness_data = read_file(witness_path); - // We need to prefix the number of fields to comply with serialization format. - // TODO: Make noir side output witness data prefixed. - return from_buffer( - join({ to_buffer((uint32_t)witness_data.size() / 32), witness_data })); + auto witness_data = get_witness_data(witness_path); + return acir_format::witness_buf_to_witness_data(witness_data); } -acir_format::acir_format get_contraint_system(std::string const& json_path) +acir_format::acir_format get_constraint_system(std::string const& json_path) { auto bytecode = get_bytecode(json_path); - return from_buffer(bytecode.data()); + return acir_format::circuit_buf_to_acir_format(bytecode); } bool proveAndVerify(const std::string& jsonPath, const std::string& witnessPath, bool recursive) { auto acir_composer = new acir_proofs::AcirComposer(MAX_CIRCUIT_SIZE, verbose); - auto constraint_system = get_contraint_system(jsonPath); + auto constraint_system = get_constraint_system(jsonPath); auto witness = get_witness(witnessPath); auto proof = acir_composer->create_proof(srs::get_crs_factory(), constraint_system, witness, recursive); auto verified = acir_composer->verify_proof(proof, recursive); @@ -52,7 +50,7 @@ bool proveAndVerify(const std::string& jsonPath, const std::string& witnessPath, void prove(const std::string& jsonPath, const std::string& witnessPath, bool recursive, const std::string& outputPath) { auto acir_composer = new acir_proofs::AcirComposer(MAX_CIRCUIT_SIZE, verbose); - auto constraint_system = get_contraint_system(jsonPath); + auto constraint_system = get_constraint_system(jsonPath); auto witness = get_witness(witnessPath); auto proof = acir_composer->create_proof(srs::get_crs_factory(), constraint_system, witness, recursive); write_file(outputPath, proof); @@ -62,7 +60,7 @@ void prove(const std::string& jsonPath, const std::string& witnessPath, bool rec void gateCount(const std::string& jsonPath) { auto acir_composer = new acir_proofs::AcirComposer(MAX_CIRCUIT_SIZE, verbose); - auto constraint_system = get_contraint_system(jsonPath); + auto constraint_system = get_constraint_system(jsonPath); acir_composer->create_circuit(constraint_system); info("gates: ", acir_composer->get_total_circuit_size()); } @@ -80,7 +78,7 @@ bool verify(const std::string& proof_path, bool recursive, const std::string& vk void writeVk(const std::string& jsonPath, const std::string& outputPath) { auto acir_composer = new acir_proofs::AcirComposer(MAX_CIRCUIT_SIZE, verbose); - auto constraint_system = get_contraint_system(jsonPath); + auto constraint_system = get_constraint_system(jsonPath); acir_composer->init_proving_key(srs::get_crs_factory(), constraint_system); auto vk = acir_composer->init_verification_key(); write_file(outputPath, to_buffer(*vk)); @@ -139,47 +137,52 @@ std::string getOption(std::vector& args, const std::string& option, int main(int argc, char* argv[]) { - std::vector args(argv + 1, argv + argc); - verbose = flagPresent(args, "-v") || flagPresent(args, "--verbose"); - - if (args.empty()) { - std::cerr << "No command provided.\n"; + try { + std::vector args(argv + 1, argv + argc); + verbose = flagPresent(args, "-v") || flagPresent(args, "--verbose"); + + if (args.empty()) { + std::cerr << "No command provided.\n"; + return 1; + } + + std::string command = args[0]; + + std::string json_path = getOption(args, "-j", "./target/main.json"); + std::string witness_path = getOption(args, "-w", "./target/witness.tr"); + std::string proof_path = getOption(args, "-p", "./proofs/proof"); + std::string vk_path = getOption(args, "-k", "./target/vk"); + CRS_PATH = getOption(args, "-c", "./crs"); + bool recursive = flagPresent(args, "-r") || flagPresent(args, "--recursive"); + init(); + + if (command == "prove_and_verify") { + return proveAndVerify(json_path, witness_path, recursive) ? 0 : 1; + } else if (command == "prove") { + std::string output_path = getOption(args, "-o", "./proofs/proof"); + prove(json_path, witness_path, recursive, output_path); + } else if (command == "gates") { + gateCount(json_path); + } else if (command == "verify") { + verify(proof_path, recursive, vk_path); + } else if (command == "contract") { + std::string output_path = getOption(args, "-o", "./target/contract.sol"); + contract(output_path, vk_path); + } else if (command == "write_vk") { + std::string output_path = getOption(args, "-o", "./target/vk"); + writeVk(json_path, output_path); + } else if (command == "proof_as_fields") { + std::string output_path = getOption(args, "-o", proof_path + "_fields.json"); + proofAsFields(proof_path, vk_path, output_path); + } else if (command == "vk_as_fields") { + std::string output_path = getOption(args, "-o", vk_path + "_fields.json"); + vkAsFields(vk_path, output_path); + } else { + std::cerr << "Unknown command: " << command << "\n"; + return 1; + } + } catch (std::runtime_error const& err) { + std::cerr << err.what() << std::endl; return 1; } - - std::string command = args[0]; - - std::string json_path = getOption(args, "-j", "./target/main.json"); - std::string witness_path = getOption(args, "-w", "./target/witness.tr"); - std::string proof_path = getOption(args, "-p", "./proofs/proof"); - std::string vk_path = getOption(args, "-k", "./target/vk"); - CRS_PATH = getOption(args, "-c", "./crs"); - bool recursive = flagPresent(args, "-r") || flagPresent(args, "--recursive"); - init(); - - if (command == "prove_and_verify") { - return proveAndVerify(json_path, witness_path, recursive) ? 0 : 1; - } else if (command == "prove") { - std::string output_path = getOption(args, "-o", "./proofs/proof"); - prove(json_path, witness_path, recursive, output_path); - } else if (command == "gates") { - gateCount(json_path); - } else if (command == "verify") { - verify(proof_path, recursive, vk_path); - } else if (command == "contract") { - std::string output_path = getOption(args, "-o", "./target/contract.sol"); - contract(output_path, vk_path); - } else if (command == "write_vk") { - std::string output_path = getOption(args, "-o", "./target/vk"); - writeVk(json_path, output_path); - } else if (command == "proof_as_fields") { - std::string output_path = getOption(args, "-o", proof_path + "_fields.json"); - proofAsFields(proof_path, vk_path, output_path); - } else if (command == "vk_as_fields") { - std::string output_path = getOption(args, "-o", vk_path + "_fields.json"); - vkAsFields(vk_path, output_path); - } else { - std::cerr << "Unknown command: " << command << "\n"; - return -1; - } } \ No newline at end of file diff --git a/cpp/src/barretenberg/dsl/CMakeLists.txt b/cpp/src/barretenberg/dsl/CMakeLists.txt index f4697905ea..ec1bafe8b0 100644 --- a/cpp/src/barretenberg/dsl/CMakeLists.txt +++ b/cpp/src/barretenberg/dsl/CMakeLists.txt @@ -1,2 +1,12 @@ -add_subdirectory(acir_format) -add_subdirectory(acir_proofs) +barretenberg_module( + dsl + plonk + stdlib_primitives + stdlib_sha256 + stdlib_blake2s + stdlib_keccak + stdlib_pedersen_commitment + stdlib_merkle_tree + stdlib_schnorr + crypto_sha256 +) diff --git a/cpp/src/barretenberg/dsl/acir_format/CMakeLists.txt b/cpp/src/barretenberg/dsl/acir_format/CMakeLists.txt deleted file mode 100644 index 425a59fbc0..0000000000 --- a/cpp/src/barretenberg/dsl/acir_format/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -barretenberg_module( - acir_format - plonk - stdlib_primitives - stdlib_sha256 - stdlib_blake2s - stdlib_keccak - stdlib_pedersen_commitment - stdlib_merkle_tree - stdlib_schnorr - crypto_sha256 -) diff --git a/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.hpp b/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.hpp new file mode 100644 index 0000000000..da3f34d32d --- /dev/null +++ b/cpp/src/barretenberg/dsl/acir_format/acir_to_constraint_buf.hpp @@ -0,0 +1,279 @@ +#pragma once +#include "acir_format.hpp" +#include "barretenberg/common/container.hpp" +#include "barretenberg/dsl/acir_format/blake2s_constraint.hpp" +#include "barretenberg/dsl/acir_format/block_constraint.hpp" +#include "barretenberg/dsl/acir_format/ecdsa_secp256k1.hpp" +#include "barretenberg/dsl/acir_format/hash_to_field.hpp" +#include "barretenberg/dsl/acir_format/keccak_constraint.hpp" +#include "barretenberg/dsl/acir_format/logic_constraint.hpp" +#include "barretenberg/dsl/acir_format/pedersen.hpp" +#include "barretenberg/dsl/acir_format/range_constraint.hpp" +#include "barretenberg/dsl/acir_format/recursion_constraint.hpp" +#include "barretenberg/dsl/acir_format/schnorr_verify.hpp" +#include "barretenberg/dsl/acir_format/sha256_constraint.hpp" +#include "barretenberg/proof_system/arithmetization/gate_data.hpp" +#include "serde/index.hpp" +#include + +namespace acir_format { + +poly_triple serialize_arithmetic_gate(Circuit::Expression const& arg) +{ + poly_triple pt{ + .a = 0, + .b = 0, + .c = 0, + .q_m = 0, + .q_l = 0, + .q_r = 0, + .q_o = 0, + .q_c = 0, + }; + // Think this never longer than 1? + for (const auto& e : arg.mul_terms) { + uint256_t qm(std::get<0>(e)); + uint32_t a = std::get<1>(e).value; + uint32_t b = std::get<2>(e).value; + pt.q_m = qm; + pt.a = a; + pt.b = b; + } + for (const auto& e : arg.linear_combinations) { + barretenberg::fr x(uint256_t(std::get<0>(e))); + uint32_t witness = std::get<1>(e).value; + + if (pt.a == 0 || pt.a == witness) { + pt.a = witness; + pt.q_l = x; + } else if (pt.b == 0 || pt.b == witness) { + pt.b = witness; + pt.q_r = x; + } else if (pt.c == 0 || pt.c == witness) { + pt.c = witness; + pt.q_o = x; + } else { + throw_or_abort("Cannot assign linear term to a constrain of width 3"); + } + } + pt.q_c = uint256_t(arg.q_c); + return pt; +} + +void handle_arithmetic(Circuit::Opcode::Arithmetic const& arg, acir_format& af) +{ + af.constraints.push_back(serialize_arithmetic_gate(arg.value)); +} + +void handle_blackbox_func_call(Circuit::Opcode::BlackBoxFuncCall const& arg, acir_format& af) +{ + std::visit( + [&](auto&& arg) { + using T = std::decay_t; + if constexpr (std::is_same_v) { + af.logic_constraints.push_back(LogicConstraint{ + .a = arg.lhs.witness.value, + .b = arg.rhs.witness.value, + .result = arg.output.value, + .num_bits = arg.lhs.num_bits, + .is_xor_gate = false, + }); + } else if constexpr (std::is_same_v) { + af.logic_constraints.push_back(LogicConstraint{ + .a = arg.lhs.witness.value, + .b = arg.rhs.witness.value, + .result = arg.output.value, + .num_bits = arg.lhs.num_bits, + .is_xor_gate = true, + }); + } else if constexpr (std::is_same_v) { + af.range_constraints.push_back(RangeConstraint{ + .witness = arg.input.witness.value, + .num_bits = arg.input.num_bits, + }); + } else if constexpr (std::is_same_v) { + af.sha256_constraints.push_back(Sha256Constraint{ + .inputs = map(arg.inputs, + [](auto& e) { + return Sha256Input{ + .witness = e.witness.value, + .num_bits = e.num_bits, + }; + }), + .result = map(arg.outputs, [](auto& e) { return e.value; }), + }); + } else if constexpr (std::is_same_v) { + af.blake2s_constraints.push_back(Blake2sConstraint{ + .inputs = map(arg.inputs, + [](auto& e) { + return Blake2sInput{ + .witness = e.witness.value, + .num_bits = e.num_bits, + }; + }), + .result = map(arg.outputs, [](auto& e) { return e.value; }), + }); + } else if constexpr (std::is_same_v) { + af.schnorr_constraints.push_back(SchnorrConstraint{ + .message = map(arg.message, [](auto& e) { return e.witness.value; }), + .public_key_x = arg.public_key_x.witness.value, + .public_key_y = arg.public_key_y.witness.value, + .result = arg.output.value, + .signature = map(arg.signature, [](auto& e) { return e.witness.value; }), + }); + } else if constexpr (std::is_same_v) { + af.pedersen_constraints.push_back(PedersenConstraint{ + .scalars = map(arg.inputs, [](auto& e) { return e.witness.value; }), + .hash_index = arg.domain_separator, + .result_x = arg.outputs[0].value, + .result_y = arg.outputs[1].value, + }); + } else if constexpr (std::is_same_v) { + af.hash_to_field_constraints.push_back( + HashToFieldConstraint{ .inputs = map(arg.inputs, + [](auto& e) { + return HashToFieldInput{ + .witness = e.witness.value, + .num_bits = e.num_bits, + }; + }), + .result = arg.output.value }); + } else if constexpr (std::is_same_v) { + af.ecdsa_k1_constraints.push_back(EcdsaSecp256k1Constraint{ + .hashed_message = map(arg.hashed_message, [](auto& e) { return e.witness.value; }), + .pub_x_indices = map(arg.public_key_x, [](auto& e) { return e.witness.value; }), + .pub_y_indices = map(arg.public_key_y, [](auto& e) { return e.witness.value; }), + .result = arg.output.value, + .signature = map(arg.signature, [](auto& e) { return e.witness.value; }), + }); + } else if constexpr (std::is_same_v) { + af.ecdsa_r1_constraints.push_back(EcdsaSecp256r1Constraint{ + .hashed_message = map(arg.hashed_message, [](auto& e) { return e.witness.value; }), + .pub_x_indices = map(arg.public_key_x, [](auto& e) { return e.witness.value; }), + .pub_y_indices = map(arg.public_key_y, [](auto& e) { return e.witness.value; }), + .result = arg.output.value, + .signature = map(arg.signature, [](auto& e) { return e.witness.value; }), + }); + } else if constexpr (std::is_same_v) { + af.fixed_base_scalar_mul_constraints.push_back(FixedBaseScalarMul{ + .scalar = arg.input.witness.value, + .pub_key_x = arg.outputs[0].value, + .pub_key_y = arg.outputs[1].value, + }); + } else if constexpr (std::is_same_v) { + af.keccak_constraints.push_back(KeccakConstraint{ + .inputs = map(arg.inputs, + [](auto& e) { + return HashInput{ + .witness = e.witness.value, + .num_bits = e.num_bits, + }; + }), + .result = map(arg.outputs, [](auto& e) { return e.value; }), + }); + } else if constexpr (std::is_same_v) { + af.keccak_var_constraints.push_back(KeccakVarConstraint{ + .inputs = map(arg.inputs, + [](auto& e) { + return HashInput{ + .witness = e.witness.value, + .num_bits = e.num_bits, + }; + }), + .var_message_size = arg.var_message_size.witness.value, + .result = map(arg.outputs, [](auto& e) { return e.value; }), + }); + } else if constexpr (std::is_same_v) { + auto c = RecursionConstraint{ + .key = map(arg.verification_key, [](auto& e) { return e.witness.value; }), + .proof = map(arg.proof, [](auto& e) { return e.witness.value; }), + .public_inputs = map(arg.public_inputs, [](auto& e) { return e.witness.value; }), + .key_hash = arg.key_hash.witness.value, + .input_aggregation_object = {}, + .output_aggregation_object = {}, + .nested_aggregation_object = {}, + }; + if (arg.input_aggregation_object.has_value()) { + for (size_t i = 0; i < RecursionConstraint::AGGREGATION_OBJECT_SIZE; ++i) { + c.input_aggregation_object[i] = (*arg.input_aggregation_object)[i].witness.value; + } + } + for (size_t i = 0; i < RecursionConstraint::AGGREGATION_OBJECT_SIZE; ++i) { + c.output_aggregation_object[i] = arg.output_aggregation_object[i].value; + } + af.recursion_constraints.push_back(c); + } + }, + arg.value.value); +} + +void handle_memory(Circuit::MemoryBlock const& mem_block, bool is_ram, acir_format& af) +{ + std::vector init; + std::vector trace; + auto len = mem_block.len; + for (size_t i = 0; i < len; ++i) { + init.push_back(serialize_arithmetic_gate(mem_block.trace[i].value)); + } + for (size_t i = len; i < mem_block.trace.size(); ++i) { + auto index = serialize_arithmetic_gate(mem_block.trace[i].index); + auto value = serialize_arithmetic_gate(mem_block.trace[i].value); + auto op = mem_block.trace[i].operation; + if (!(op.mul_terms.empty() && op.linear_combinations.empty())) { + throw_or_abort("Expected constant."); + } + bool access_type(uint256_t(op.q_c)); + trace.push_back(MemOp{ + .access_type = access_type, + .index = index, + .value = value, + }); + } + af.block_constraints.push_back(BlockConstraint{ .init = init, .trace = trace, .type = (BlockType)is_ram }); +} + +acir_format circuit_buf_to_acir_format(std::vector const& buf) +{ + auto circuit = Circuit::Circuit::bincodeDeserialize(buf); + + acir_format af; + af.varnum = circuit.current_witness_index + 1; + af.public_inputs = join({ map(circuit.public_parameters.value, [](auto e) { return e.value; }), + map(circuit.return_values.value, [](auto e) { return e.value; }) }); + + for (auto gate : circuit.opcodes) { + std::visit( + [&](auto&& arg) { + using T = std::decay_t; + if constexpr (std::is_same_v) { + handle_arithmetic(arg, af); + } else if constexpr (std::is_same_v) { + handle_blackbox_func_call(arg, af); + } else if constexpr (std::is_same_v) { + handle_memory(arg.value, true, af); + } else if constexpr (std::is_same_v) { + handle_memory(arg.value, false, af); + } + }, + gate.value); + } + return af; +} + +WitnessVector witness_buf_to_witness_data(std::vector const& buf) +{ + auto w = WitnessMap::WitnessMap::bincodeDeserialize(buf); + WitnessVector wv; + size_t index = 1; + for (auto& e : w.value) { + while (index < e.first.value) { + wv.push_back(barretenberg::fr(0)); + index++; + } + wv.push_back(barretenberg::fr(uint256_t(e.second))); + index++; + } + return wv; +} + +} // namespace acir_format \ No newline at end of file diff --git a/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp b/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp new file mode 100644 index 0000000000..e37ed6ca54 --- /dev/null +++ b/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp @@ -0,0 +1,6303 @@ +#pragma once + +#include "bincode.hpp" +#include "serde.hpp" + +namespace Circuit { + +struct BinaryFieldOp { + + struct Add { + friend bool operator==(const Add&, const Add&); + std::vector bincodeSerialize() const; + static Add bincodeDeserialize(std::vector); + }; + + struct Sub { + friend bool operator==(const Sub&, const Sub&); + std::vector bincodeSerialize() const; + static Sub bincodeDeserialize(std::vector); + }; + + struct Mul { + friend bool operator==(const Mul&, const Mul&); + std::vector bincodeSerialize() const; + static Mul bincodeDeserialize(std::vector); + }; + + struct Div { + friend bool operator==(const Div&, const Div&); + std::vector bincodeSerialize() const; + static Div bincodeDeserialize(std::vector); + }; + + struct Equals { + friend bool operator==(const Equals&, const Equals&); + std::vector bincodeSerialize() const; + static Equals bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&); + std::vector bincodeSerialize() const; + static BinaryFieldOp bincodeDeserialize(std::vector); +}; + +struct BinaryIntOp { + + struct Add { + friend bool operator==(const Add&, const Add&); + std::vector bincodeSerialize() const; + static Add bincodeDeserialize(std::vector); + }; + + struct Sub { + friend bool operator==(const Sub&, const Sub&); + std::vector bincodeSerialize() const; + static Sub bincodeDeserialize(std::vector); + }; + + struct Mul { + friend bool operator==(const Mul&, const Mul&); + std::vector bincodeSerialize() const; + static Mul bincodeDeserialize(std::vector); + }; + + struct SignedDiv { + friend bool operator==(const SignedDiv&, const SignedDiv&); + std::vector bincodeSerialize() const; + static SignedDiv bincodeDeserialize(std::vector); + }; + + struct UnsignedDiv { + friend bool operator==(const UnsignedDiv&, const UnsignedDiv&); + std::vector bincodeSerialize() const; + static UnsignedDiv bincodeDeserialize(std::vector); + }; + + struct Equals { + friend bool operator==(const Equals&, const Equals&); + std::vector bincodeSerialize() const; + static Equals bincodeDeserialize(std::vector); + }; + + struct LessThan { + friend bool operator==(const LessThan&, const LessThan&); + std::vector bincodeSerialize() const; + static LessThan bincodeDeserialize(std::vector); + }; + + struct LessThanEquals { + friend bool operator==(const LessThanEquals&, const LessThanEquals&); + std::vector bincodeSerialize() const; + static LessThanEquals bincodeDeserialize(std::vector); + }; + + struct And { + friend bool operator==(const And&, const And&); + std::vector bincodeSerialize() const; + static And bincodeDeserialize(std::vector); + }; + + struct Or { + friend bool operator==(const Or&, const Or&); + std::vector bincodeSerialize() const; + static Or bincodeDeserialize(std::vector); + }; + + struct Xor { + friend bool operator==(const Xor&, const Xor&); + std::vector bincodeSerialize() const; + static Xor bincodeDeserialize(std::vector); + }; + + struct Shl { + friend bool operator==(const Shl&, const Shl&); + std::vector bincodeSerialize() const; + static Shl bincodeDeserialize(std::vector); + }; + + struct Shr { + friend bool operator==(const Shr&, const Shr&); + std::vector bincodeSerialize() const; + static Shr bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const BinaryIntOp&, const BinaryIntOp&); + std::vector bincodeSerialize() const; + static BinaryIntOp bincodeDeserialize(std::vector); +}; + +struct RegisterIndex { + uint64_t value; + + friend bool operator==(const RegisterIndex&, const RegisterIndex&); + std::vector bincodeSerialize() const; + static RegisterIndex bincodeDeserialize(std::vector); +}; + +struct HeapArray { + Circuit::RegisterIndex pointer; + uint64_t size; + + friend bool operator==(const HeapArray&, const HeapArray&); + std::vector bincodeSerialize() const; + static HeapArray bincodeDeserialize(std::vector); +}; + +struct HeapVector { + Circuit::RegisterIndex pointer; + Circuit::RegisterIndex size; + + friend bool operator==(const HeapVector&, const HeapVector&); + std::vector bincodeSerialize() const; + static HeapVector bincodeDeserialize(std::vector); +}; + +struct BlackBoxOp { + + struct Sha256 { + Circuit::HeapVector message; + Circuit::HeapArray output; + + friend bool operator==(const Sha256&, const Sha256&); + std::vector bincodeSerialize() const; + static Sha256 bincodeDeserialize(std::vector); + }; + + struct Blake2s { + Circuit::HeapVector message; + Circuit::HeapArray output; + + friend bool operator==(const Blake2s&, const Blake2s&); + std::vector bincodeSerialize() const; + static Blake2s bincodeDeserialize(std::vector); + }; + + struct Keccak256 { + Circuit::HeapVector message; + Circuit::HeapArray output; + + friend bool operator==(const Keccak256&, const Keccak256&); + std::vector bincodeSerialize() const; + static Keccak256 bincodeDeserialize(std::vector); + }; + + struct HashToField128Security { + Circuit::HeapVector message; + Circuit::RegisterIndex output; + + friend bool operator==(const HashToField128Security&, const HashToField128Security&); + std::vector bincodeSerialize() const; + static HashToField128Security bincodeDeserialize(std::vector); + }; + + struct EcdsaSecp256k1 { + Circuit::HeapVector hashed_msg; + Circuit::HeapArray public_key_x; + Circuit::HeapArray public_key_y; + Circuit::HeapArray signature; + Circuit::RegisterIndex result; + + friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&); + std::vector bincodeSerialize() const; + static EcdsaSecp256k1 bincodeDeserialize(std::vector); + }; + + struct EcdsaSecp256r1 { + Circuit::HeapVector hashed_msg; + Circuit::HeapArray public_key_x; + Circuit::HeapArray public_key_y; + Circuit::HeapArray signature; + Circuit::RegisterIndex result; + + friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&); + std::vector bincodeSerialize() const; + static EcdsaSecp256r1 bincodeDeserialize(std::vector); + }; + + struct SchnorrVerify { + Circuit::RegisterIndex public_key_x; + Circuit::RegisterIndex public_key_y; + Circuit::HeapVector message; + Circuit::HeapVector signature; + Circuit::RegisterIndex result; + + friend bool operator==(const SchnorrVerify&, const SchnorrVerify&); + std::vector bincodeSerialize() const; + static SchnorrVerify bincodeDeserialize(std::vector); + }; + + struct Pedersen { + Circuit::HeapVector inputs; + Circuit::RegisterIndex domain_separator; + Circuit::HeapArray output; + + friend bool operator==(const Pedersen&, const Pedersen&); + std::vector bincodeSerialize() const; + static Pedersen bincodeDeserialize(std::vector); + }; + + struct FixedBaseScalarMul { + Circuit::RegisterIndex input; + Circuit::HeapArray result; + + friend bool operator==(const FixedBaseScalarMul&, const FixedBaseScalarMul&); + std::vector bincodeSerialize() const; + static FixedBaseScalarMul bincodeDeserialize(std::vector); + }; + + std::variant + value; + + friend bool operator==(const BlackBoxOp&, const BlackBoxOp&); + std::vector bincodeSerialize() const; + static BlackBoxOp bincodeDeserialize(std::vector); +}; + +struct RegisterOrMemory { + + struct RegisterIndex { + Circuit::RegisterIndex value; + + friend bool operator==(const RegisterIndex&, const RegisterIndex&); + std::vector bincodeSerialize() const; + static RegisterIndex bincodeDeserialize(std::vector); + }; + + struct HeapArray { + Circuit::HeapArray value; + + friend bool operator==(const HeapArray&, const HeapArray&); + std::vector bincodeSerialize() const; + static HeapArray bincodeDeserialize(std::vector); + }; + + struct HeapVector { + Circuit::HeapVector value; + + friend bool operator==(const HeapVector&, const HeapVector&); + std::vector bincodeSerialize() const; + static HeapVector bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const RegisterOrMemory&, const RegisterOrMemory&); + std::vector bincodeSerialize() const; + static RegisterOrMemory bincodeDeserialize(std::vector); +}; + +struct Value { + std::string inner; + + friend bool operator==(const Value&, const Value&); + std::vector bincodeSerialize() const; + static Value bincodeDeserialize(std::vector); +}; + +struct BrilligOpcode { + + struct BinaryFieldOp { + Circuit::RegisterIndex destination; + Circuit::BinaryFieldOp op; + Circuit::RegisterIndex lhs; + Circuit::RegisterIndex rhs; + + friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&); + std::vector bincodeSerialize() const; + static BinaryFieldOp bincodeDeserialize(std::vector); + }; + + struct BinaryIntOp { + Circuit::RegisterIndex destination; + Circuit::BinaryIntOp op; + uint32_t bit_size; + Circuit::RegisterIndex lhs; + Circuit::RegisterIndex rhs; + + friend bool operator==(const BinaryIntOp&, const BinaryIntOp&); + std::vector bincodeSerialize() const; + static BinaryIntOp bincodeDeserialize(std::vector); + }; + + struct JumpIfNot { + Circuit::RegisterIndex condition; + uint64_t location; + + friend bool operator==(const JumpIfNot&, const JumpIfNot&); + std::vector bincodeSerialize() const; + static JumpIfNot bincodeDeserialize(std::vector); + }; + + struct JumpIf { + Circuit::RegisterIndex condition; + uint64_t location; + + friend bool operator==(const JumpIf&, const JumpIf&); + std::vector bincodeSerialize() const; + static JumpIf bincodeDeserialize(std::vector); + }; + + struct Jump { + uint64_t location; + + friend bool operator==(const Jump&, const Jump&); + std::vector bincodeSerialize() const; + static Jump bincodeDeserialize(std::vector); + }; + + struct Call { + uint64_t location; + + friend bool operator==(const Call&, const Call&); + std::vector bincodeSerialize() const; + static Call bincodeDeserialize(std::vector); + }; + + struct Const { + Circuit::RegisterIndex destination; + Circuit::Value value; + + friend bool operator==(const Const&, const Const&); + std::vector bincodeSerialize() const; + static Const bincodeDeserialize(std::vector); + }; + + struct Return { + friend bool operator==(const Return&, const Return&); + std::vector bincodeSerialize() const; + static Return bincodeDeserialize(std::vector); + }; + + struct ForeignCall { + std::string function; + std::vector destinations; + std::vector inputs; + + friend bool operator==(const ForeignCall&, const ForeignCall&); + std::vector bincodeSerialize() const; + static ForeignCall bincodeDeserialize(std::vector); + }; + + struct Mov { + Circuit::RegisterIndex destination; + Circuit::RegisterIndex source; + + friend bool operator==(const Mov&, const Mov&); + std::vector bincodeSerialize() const; + static Mov bincodeDeserialize(std::vector); + }; + + struct Load { + Circuit::RegisterIndex destination; + Circuit::RegisterIndex source_pointer; + + friend bool operator==(const Load&, const Load&); + std::vector bincodeSerialize() const; + static Load bincodeDeserialize(std::vector); + }; + + struct Store { + Circuit::RegisterIndex destination_pointer; + Circuit::RegisterIndex source; + + friend bool operator==(const Store&, const Store&); + std::vector bincodeSerialize() const; + static Store bincodeDeserialize(std::vector); + }; + + struct BlackBox { + Circuit::BlackBoxOp value; + + friend bool operator==(const BlackBox&, const BlackBox&); + std::vector bincodeSerialize() const; + static BlackBox bincodeDeserialize(std::vector); + }; + + struct Trap { + friend bool operator==(const Trap&, const Trap&); + std::vector bincodeSerialize() const; + static Trap bincodeDeserialize(std::vector); + }; + + struct Stop { + friend bool operator==(const Stop&, const Stop&); + std::vector bincodeSerialize() const; + static Stop bincodeDeserialize(std::vector); + }; + + std::variant + value; + + friend bool operator==(const BrilligOpcode&, const BrilligOpcode&); + std::vector bincodeSerialize() const; + static BrilligOpcode bincodeDeserialize(std::vector); +}; + +struct Witness { + uint32_t value; + + friend bool operator==(const Witness&, const Witness&); + std::vector bincodeSerialize() const; + static Witness bincodeDeserialize(std::vector); +}; + +struct Expression { + std::vector> mul_terms; + std::vector> linear_combinations; + std::string q_c; + + friend bool operator==(const Expression&, const Expression&); + std::vector bincodeSerialize() const; + static Expression bincodeDeserialize(std::vector); +}; + +struct BrilligInputs { + + struct Single { + Circuit::Expression value; + + friend bool operator==(const Single&, const Single&); + std::vector bincodeSerialize() const; + static Single bincodeDeserialize(std::vector); + }; + + struct Array { + std::vector value; + + friend bool operator==(const Array&, const Array&); + std::vector bincodeSerialize() const; + static Array bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const BrilligInputs&, const BrilligInputs&); + std::vector bincodeSerialize() const; + static BrilligInputs bincodeDeserialize(std::vector); +}; + +struct BrilligOutputs { + + struct Simple { + Circuit::Witness value; + + friend bool operator==(const Simple&, const Simple&); + std::vector bincodeSerialize() const; + static Simple bincodeDeserialize(std::vector); + }; + + struct Array { + std::vector value; + + friend bool operator==(const Array&, const Array&); + std::vector bincodeSerialize() const; + static Array bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const BrilligOutputs&, const BrilligOutputs&); + std::vector bincodeSerialize() const; + static BrilligOutputs bincodeDeserialize(std::vector); +}; + +struct ForeignCallOutput { + + struct Single { + Circuit::Value value; + + friend bool operator==(const Single&, const Single&); + std::vector bincodeSerialize() const; + static Single bincodeDeserialize(std::vector); + }; + + struct Array { + std::vector value; + + friend bool operator==(const Array&, const Array&); + std::vector bincodeSerialize() const; + static Array bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const ForeignCallOutput&, const ForeignCallOutput&); + std::vector bincodeSerialize() const; + static ForeignCallOutput bincodeDeserialize(std::vector); +}; + +struct ForeignCallResult { + std::vector values; + + friend bool operator==(const ForeignCallResult&, const ForeignCallResult&); + std::vector bincodeSerialize() const; + static ForeignCallResult bincodeDeserialize(std::vector); +}; + +struct Brillig { + std::vector inputs; + std::vector outputs; + std::vector foreign_call_results; + std::vector bytecode; + std::optional predicate; + + friend bool operator==(const Brillig&, const Brillig&); + std::vector bincodeSerialize() const; + static Brillig bincodeDeserialize(std::vector); +}; + +struct FunctionInput { + Circuit::Witness witness; + uint32_t num_bits; + + friend bool operator==(const FunctionInput&, const FunctionInput&); + std::vector bincodeSerialize() const; + static FunctionInput bincodeDeserialize(std::vector); +}; + +struct BlackBoxFuncCall { + + struct AND { + Circuit::FunctionInput lhs; + Circuit::FunctionInput rhs; + Circuit::Witness output; + + friend bool operator==(const AND&, const AND&); + std::vector bincodeSerialize() const; + static AND bincodeDeserialize(std::vector); + }; + + struct XOR { + Circuit::FunctionInput lhs; + Circuit::FunctionInput rhs; + Circuit::Witness output; + + friend bool operator==(const XOR&, const XOR&); + std::vector bincodeSerialize() const; + static XOR bincodeDeserialize(std::vector); + }; + + struct RANGE { + Circuit::FunctionInput input; + + friend bool operator==(const RANGE&, const RANGE&); + std::vector bincodeSerialize() const; + static RANGE bincodeDeserialize(std::vector); + }; + + struct SHA256 { + std::vector inputs; + std::vector outputs; + + friend bool operator==(const SHA256&, const SHA256&); + std::vector bincodeSerialize() const; + static SHA256 bincodeDeserialize(std::vector); + }; + + struct Blake2s { + std::vector inputs; + std::vector outputs; + + friend bool operator==(const Blake2s&, const Blake2s&); + std::vector bincodeSerialize() const; + static Blake2s bincodeDeserialize(std::vector); + }; + + struct SchnorrVerify { + Circuit::FunctionInput public_key_x; + Circuit::FunctionInput public_key_y; + std::vector signature; + std::vector message; + Circuit::Witness output; + + friend bool operator==(const SchnorrVerify&, const SchnorrVerify&); + std::vector bincodeSerialize() const; + static SchnorrVerify bincodeDeserialize(std::vector); + }; + + struct Pedersen { + std::vector inputs; + uint32_t domain_separator; + std::array outputs; + + friend bool operator==(const Pedersen&, const Pedersen&); + std::vector bincodeSerialize() const; + static Pedersen bincodeDeserialize(std::vector); + }; + + struct HashToField128Security { + std::vector inputs; + Circuit::Witness output; + + friend bool operator==(const HashToField128Security&, const HashToField128Security&); + std::vector bincodeSerialize() const; + static HashToField128Security bincodeDeserialize(std::vector); + }; + + struct EcdsaSecp256k1 { + std::vector public_key_x; + std::vector public_key_y; + std::vector signature; + std::vector hashed_message; + Circuit::Witness output; + + friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&); + std::vector bincodeSerialize() const; + static EcdsaSecp256k1 bincodeDeserialize(std::vector); + }; + + struct EcdsaSecp256r1 { + std::vector public_key_x; + std::vector public_key_y; + std::vector signature; + std::vector hashed_message; + Circuit::Witness output; + + friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&); + std::vector bincodeSerialize() const; + static EcdsaSecp256r1 bincodeDeserialize(std::vector); + }; + + struct FixedBaseScalarMul { + Circuit::FunctionInput input; + std::array outputs; + + friend bool operator==(const FixedBaseScalarMul&, const FixedBaseScalarMul&); + std::vector bincodeSerialize() const; + static FixedBaseScalarMul bincodeDeserialize(std::vector); + }; + + struct Keccak256 { + std::vector inputs; + std::vector outputs; + + friend bool operator==(const Keccak256&, const Keccak256&); + std::vector bincodeSerialize() const; + static Keccak256 bincodeDeserialize(std::vector); + }; + + struct Keccak256VariableLength { + std::vector inputs; + Circuit::FunctionInput var_message_size; + std::vector outputs; + + friend bool operator==(const Keccak256VariableLength&, const Keccak256VariableLength&); + std::vector bincodeSerialize() const; + static Keccak256VariableLength bincodeDeserialize(std::vector); + }; + + struct RecursiveAggregation { + std::vector verification_key; + std::vector proof; + std::vector public_inputs; + Circuit::FunctionInput key_hash; + std::optional> input_aggregation_object; + std::vector output_aggregation_object; + + friend bool operator==(const RecursiveAggregation&, const RecursiveAggregation&); + std::vector bincodeSerialize() const; + static RecursiveAggregation bincodeDeserialize(std::vector); + }; + + std::variant + value; + + friend bool operator==(const BlackBoxFuncCall&, const BlackBoxFuncCall&); + std::vector bincodeSerialize() const; + static BlackBoxFuncCall bincodeDeserialize(std::vector); +}; + +struct LogInfo { + + struct FinalizedOutput { + std::string value; + + friend bool operator==(const FinalizedOutput&, const FinalizedOutput&); + std::vector bincodeSerialize() const; + static FinalizedOutput bincodeDeserialize(std::vector); + }; + + struct WitnessOutput { + std::vector value; + + friend bool operator==(const WitnessOutput&, const WitnessOutput&); + std::vector bincodeSerialize() const; + static WitnessOutput bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const LogInfo&, const LogInfo&); + std::vector bincodeSerialize() const; + static LogInfo bincodeDeserialize(std::vector); +}; + +struct QuotientDirective { + Circuit::Expression a; + Circuit::Expression b; + Circuit::Witness q; + Circuit::Witness r; + std::optional predicate; + + friend bool operator==(const QuotientDirective&, const QuotientDirective&); + std::vector bincodeSerialize() const; + static QuotientDirective bincodeDeserialize(std::vector); +}; + +struct Directive { + + struct Invert { + Circuit::Witness x; + Circuit::Witness result; + + friend bool operator==(const Invert&, const Invert&); + std::vector bincodeSerialize() const; + static Invert bincodeDeserialize(std::vector); + }; + + struct Quotient { + Circuit::QuotientDirective value; + + friend bool operator==(const Quotient&, const Quotient&); + std::vector bincodeSerialize() const; + static Quotient bincodeDeserialize(std::vector); + }; + + struct ToLeRadix { + Circuit::Expression a; + std::vector b; + uint32_t radix; + + friend bool operator==(const ToLeRadix&, const ToLeRadix&); + std::vector bincodeSerialize() const; + static ToLeRadix bincodeDeserialize(std::vector); + }; + + struct PermutationSort { + std::vector> inputs; + uint32_t tuple; + std::vector bits; + std::vector sort_by; + + friend bool operator==(const PermutationSort&, const PermutationSort&); + std::vector bincodeSerialize() const; + static PermutationSort bincodeDeserialize(std::vector); + }; + + struct Log { + Circuit::LogInfo value; + + friend bool operator==(const Log&, const Log&); + std::vector bincodeSerialize() const; + static Log bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const Directive&, const Directive&); + std::vector bincodeSerialize() const; + static Directive bincodeDeserialize(std::vector); +}; + +struct BlockId { + uint32_t value; + + friend bool operator==(const BlockId&, const BlockId&); + std::vector bincodeSerialize() const; + static BlockId bincodeDeserialize(std::vector); +}; + +struct MemOp { + Circuit::Expression operation; + Circuit::Expression index; + Circuit::Expression value; + + friend bool operator==(const MemOp&, const MemOp&); + std::vector bincodeSerialize() const; + static MemOp bincodeDeserialize(std::vector); +}; + +struct MemoryBlock { + Circuit::BlockId id; + uint32_t len; + std::vector trace; + + friend bool operator==(const MemoryBlock&, const MemoryBlock&); + std::vector bincodeSerialize() const; + static MemoryBlock bincodeDeserialize(std::vector); +}; + +struct Opcode { + + struct Arithmetic { + Circuit::Expression value; + + friend bool operator==(const Arithmetic&, const Arithmetic&); + std::vector bincodeSerialize() const; + static Arithmetic bincodeDeserialize(std::vector); + }; + + struct BlackBoxFuncCall { + Circuit::BlackBoxFuncCall value; + + friend bool operator==(const BlackBoxFuncCall&, const BlackBoxFuncCall&); + std::vector bincodeSerialize() const; + static BlackBoxFuncCall bincodeDeserialize(std::vector); + }; + + struct Directive { + Circuit::Directive value; + + friend bool operator==(const Directive&, const Directive&); + std::vector bincodeSerialize() const; + static Directive bincodeDeserialize(std::vector); + }; + + struct Block { + Circuit::MemoryBlock value; + + friend bool operator==(const Block&, const Block&); + std::vector bincodeSerialize() const; + static Block bincodeDeserialize(std::vector); + }; + + struct ROM { + Circuit::MemoryBlock value; + + friend bool operator==(const ROM&, const ROM&); + std::vector bincodeSerialize() const; + static ROM bincodeDeserialize(std::vector); + }; + + struct RAM { + Circuit::MemoryBlock value; + + friend bool operator==(const RAM&, const RAM&); + std::vector bincodeSerialize() const; + static RAM bincodeDeserialize(std::vector); + }; + + struct Brillig { + Circuit::Brillig value; + + friend bool operator==(const Brillig&, const Brillig&); + std::vector bincodeSerialize() const; + static Brillig bincodeDeserialize(std::vector); + }; + + std::variant value; + + friend bool operator==(const Opcode&, const Opcode&); + std::vector bincodeSerialize() const; + static Opcode bincodeDeserialize(std::vector); +}; + +struct PublicInputs { + std::vector value; + + friend bool operator==(const PublicInputs&, const PublicInputs&); + std::vector bincodeSerialize() const; + static PublicInputs bincodeDeserialize(std::vector); +}; + +struct Circuit { + uint32_t current_witness_index; + std::vector opcodes; + PublicInputs public_parameters; + PublicInputs return_values; + + friend bool operator==(const Circuit&, const Circuit&); + std::vector bincodeSerialize() const; + static Circuit bincodeDeserialize(std::vector); +}; + +} // end of namespace Circuit + +namespace Circuit { + +inline bool operator==(const BinaryFieldOp& lhs, const BinaryFieldOp& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BinaryFieldOp::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp BinaryFieldOp::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::BinaryFieldOp serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::BinaryFieldOp obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryFieldOp::Add& lhs, const BinaryFieldOp::Add& rhs) +{ + return true; +} + +inline std::vector BinaryFieldOp::Add::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp::Add BinaryFieldOp::Add::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Add& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryFieldOp::Add serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryFieldOp::Add obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryFieldOp::Sub& lhs, const BinaryFieldOp::Sub& rhs) +{ + return true; +} + +inline std::vector BinaryFieldOp::Sub::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp::Sub BinaryFieldOp::Sub::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Sub& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryFieldOp::Sub serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryFieldOp::Sub obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryFieldOp::Mul& lhs, const BinaryFieldOp::Mul& rhs) +{ + return true; +} + +inline std::vector BinaryFieldOp::Mul::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp::Mul BinaryFieldOp::Mul::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Mul& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryFieldOp::Mul serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryFieldOp::Mul obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryFieldOp::Div& lhs, const BinaryFieldOp::Div& rhs) +{ + return true; +} + +inline std::vector BinaryFieldOp::Div::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp::Div BinaryFieldOp::Div::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Div& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryFieldOp::Div serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryFieldOp::Div obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryFieldOp::Equals& lhs, const BinaryFieldOp::Equals& rhs) +{ + return true; +} + +inline std::vector BinaryFieldOp::Equals::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryFieldOp::Equals BinaryFieldOp::Equals::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryFieldOp::Equals& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryFieldOp::Equals serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryFieldOp::Equals obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp& lhs, const BinaryIntOp& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BinaryIntOp::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp BinaryIntOp::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::BinaryIntOp serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::BinaryIntOp obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::Add& lhs, const BinaryIntOp::Add& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::Add::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::Add BinaryIntOp::Add::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::Add& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::Add serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryIntOp::Add obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::Sub& lhs, const BinaryIntOp::Sub& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::Sub::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::Sub BinaryIntOp::Sub::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::Sub& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::Sub serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryIntOp::Sub obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::Mul& lhs, const BinaryIntOp::Mul& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::Mul::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::Mul BinaryIntOp::Mul::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::Mul& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::Mul serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryIntOp::Mul obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::SignedDiv& lhs, const BinaryIntOp::SignedDiv& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::SignedDiv::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::SignedDiv BinaryIntOp::SignedDiv::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::SignedDiv& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::SignedDiv serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryIntOp::SignedDiv obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::UnsignedDiv& lhs, const BinaryIntOp::UnsignedDiv& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::UnsignedDiv::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::UnsignedDiv BinaryIntOp::UnsignedDiv::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::UnsignedDiv& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::UnsignedDiv serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryIntOp::UnsignedDiv obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::Equals& lhs, const BinaryIntOp::Equals& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::Equals::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::Equals BinaryIntOp::Equals::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::Equals& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::Equals serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryIntOp::Equals obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::LessThan& lhs, const BinaryIntOp::LessThan& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::LessThan::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::LessThan BinaryIntOp::LessThan::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::LessThan& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::LessThan serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryIntOp::LessThan obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::LessThanEquals& lhs, const BinaryIntOp::LessThanEquals& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::LessThanEquals::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::LessThanEquals BinaryIntOp::LessThanEquals::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BinaryIntOp::LessThanEquals& obj, Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::LessThanEquals serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BinaryIntOp::LessThanEquals obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::And& lhs, const BinaryIntOp::And& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::And::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::And BinaryIntOp::And::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::And& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::And serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryIntOp::And obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::Or& lhs, const BinaryIntOp::Or& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::Or::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::Or BinaryIntOp::Or::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::Or& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::Or serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryIntOp::Or obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::Xor& lhs, const BinaryIntOp::Xor& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::Xor::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::Xor BinaryIntOp::Xor::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::Xor& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::Xor serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryIntOp::Xor obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::Shl& lhs, const BinaryIntOp::Shl& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::Shl::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::Shl BinaryIntOp::Shl::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::Shl& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::Shl serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryIntOp::Shl obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BinaryIntOp::Shr& lhs, const BinaryIntOp::Shr& rhs) +{ + return true; +} + +inline std::vector BinaryIntOp::Shr::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BinaryIntOp::Shr BinaryIntOp::Shr::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BinaryIntOp::Shr& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BinaryIntOp::Shr serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BinaryIntOp::Shr obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall& lhs, const BlackBoxFuncCall& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall BlackBoxFuncCall::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall& obj, + Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::BlackBoxFuncCall serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::BlackBoxFuncCall obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::AND& lhs, const BlackBoxFuncCall::AND& rhs) +{ + if (!(lhs.lhs == rhs.lhs)) { + return false; + } + if (!(lhs.rhs == rhs.rhs)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::AND::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::AND BlackBoxFuncCall::AND::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::AND& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.lhs, serializer); + serde::Serializable::serialize(obj.rhs, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::AND serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::AND obj; + obj.lhs = serde::Deserializable::deserialize(deserializer); + obj.rhs = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::XOR& lhs, const BlackBoxFuncCall::XOR& rhs) +{ + if (!(lhs.lhs == rhs.lhs)) { + return false; + } + if (!(lhs.rhs == rhs.rhs)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::XOR::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::XOR BlackBoxFuncCall::XOR::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::XOR& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.lhs, serializer); + serde::Serializable::serialize(obj.rhs, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::XOR serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::XOR obj; + obj.lhs = serde::Deserializable::deserialize(deserializer); + obj.rhs = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::RANGE& lhs, const BlackBoxFuncCall::RANGE& rhs) +{ + if (!(lhs.input == rhs.input)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::RANGE::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::RANGE BlackBoxFuncCall::RANGE::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::RANGE& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.input, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::RANGE serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::RANGE obj; + obj.input = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::SHA256& lhs, const BlackBoxFuncCall::SHA256& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.outputs == rhs.outputs)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::SHA256::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::SHA256 BlackBoxFuncCall::SHA256::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::SHA256& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.outputs, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::SHA256 serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::SHA256 obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.outputs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::Blake2s& lhs, const BlackBoxFuncCall::Blake2s& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.outputs == rhs.outputs)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::Blake2s::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::Blake2s BlackBoxFuncCall::Blake2s::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Blake2s& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.outputs, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::Blake2s serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::Blake2s obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.outputs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::SchnorrVerify& lhs, const BlackBoxFuncCall::SchnorrVerify& rhs) +{ + if (!(lhs.public_key_x == rhs.public_key_x)) { + return false; + } + if (!(lhs.public_key_y == rhs.public_key_y)) { + return false; + } + if (!(lhs.signature == rhs.signature)) { + return false; + } + if (!(lhs.message == rhs.message)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::SchnorrVerify::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::SchnorrVerify BlackBoxFuncCall::SchnorrVerify::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxFuncCall::SchnorrVerify& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.public_key_x, serializer); + serde::Serializable::serialize(obj.public_key_y, serializer); + serde::Serializable::serialize(obj.signature, serializer); + serde::Serializable::serialize(obj.message, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::SchnorrVerify serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::SchnorrVerify obj; + obj.public_key_x = serde::Deserializable::deserialize(deserializer); + obj.public_key_y = serde::Deserializable::deserialize(deserializer); + obj.signature = serde::Deserializable::deserialize(deserializer); + obj.message = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::Pedersen& lhs, const BlackBoxFuncCall::Pedersen& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.domain_separator == rhs.domain_separator)) { + return false; + } + if (!(lhs.outputs == rhs.outputs)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::Pedersen::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::Pedersen BlackBoxFuncCall::Pedersen::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxFuncCall::Pedersen& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.domain_separator, serializer); + serde::Serializable::serialize(obj.outputs, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::Pedersen serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::Pedersen obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.domain_separator = serde::Deserializable::deserialize(deserializer); + obj.outputs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::HashToField128Security& lhs, + const BlackBoxFuncCall::HashToField128Security& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::HashToField128Security::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::HashToField128Security BlackBoxFuncCall::HashToField128Security::bincodeDeserialize( + std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxFuncCall::HashToField128Security& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::HashToField128Security serde::Deserializable< + Circuit::BlackBoxFuncCall::HashToField128Security>::deserialize(Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::HashToField128Security obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::EcdsaSecp256k1& lhs, const BlackBoxFuncCall::EcdsaSecp256k1& rhs) +{ + if (!(lhs.public_key_x == rhs.public_key_x)) { + return false; + } + if (!(lhs.public_key_y == rhs.public_key_y)) { + return false; + } + if (!(lhs.signature == rhs.signature)) { + return false; + } + if (!(lhs.hashed_message == rhs.hashed_message)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::EcdsaSecp256k1::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::EcdsaSecp256k1 BlackBoxFuncCall::EcdsaSecp256k1::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxFuncCall::EcdsaSecp256k1& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.public_key_x, serializer); + serde::Serializable::serialize(obj.public_key_y, serializer); + serde::Serializable::serialize(obj.signature, serializer); + serde::Serializable::serialize(obj.hashed_message, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::EcdsaSecp256k1 serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::EcdsaSecp256k1 obj; + obj.public_key_x = serde::Deserializable::deserialize(deserializer); + obj.public_key_y = serde::Deserializable::deserialize(deserializer); + obj.signature = serde::Deserializable::deserialize(deserializer); + obj.hashed_message = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::EcdsaSecp256r1& lhs, const BlackBoxFuncCall::EcdsaSecp256r1& rhs) +{ + if (!(lhs.public_key_x == rhs.public_key_x)) { + return false; + } + if (!(lhs.public_key_y == rhs.public_key_y)) { + return false; + } + if (!(lhs.signature == rhs.signature)) { + return false; + } + if (!(lhs.hashed_message == rhs.hashed_message)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::EcdsaSecp256r1::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::EcdsaSecp256r1 BlackBoxFuncCall::EcdsaSecp256r1::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxFuncCall::EcdsaSecp256r1& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.public_key_x, serializer); + serde::Serializable::serialize(obj.public_key_y, serializer); + serde::Serializable::serialize(obj.signature, serializer); + serde::Serializable::serialize(obj.hashed_message, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::EcdsaSecp256r1 serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::EcdsaSecp256r1 obj; + obj.public_key_x = serde::Deserializable::deserialize(deserializer); + obj.public_key_y = serde::Deserializable::deserialize(deserializer); + obj.signature = serde::Deserializable::deserialize(deserializer); + obj.hashed_message = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::FixedBaseScalarMul& lhs, const BlackBoxFuncCall::FixedBaseScalarMul& rhs) +{ + if (!(lhs.input == rhs.input)) { + return false; + } + if (!(lhs.outputs == rhs.outputs)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::FixedBaseScalarMul::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::FixedBaseScalarMul BlackBoxFuncCall::FixedBaseScalarMul::bincodeDeserialize( + std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxFuncCall::FixedBaseScalarMul& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.input, serializer); + serde::Serializable::serialize(obj.outputs, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::FixedBaseScalarMul serde::Deserializable< + Circuit::BlackBoxFuncCall::FixedBaseScalarMul>::deserialize(Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::FixedBaseScalarMul obj; + obj.input = serde::Deserializable::deserialize(deserializer); + obj.outputs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::Keccak256& lhs, const BlackBoxFuncCall::Keccak256& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.outputs == rhs.outputs)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::Keccak256::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::Keccak256 BlackBoxFuncCall::Keccak256::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxFuncCall::Keccak256& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.outputs, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::Keccak256 serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::Keccak256 obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.outputs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::Keccak256VariableLength& lhs, + const BlackBoxFuncCall::Keccak256VariableLength& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.var_message_size == rhs.var_message_size)) { + return false; + } + if (!(lhs.outputs == rhs.outputs)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::Keccak256VariableLength::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::Keccak256VariableLength BlackBoxFuncCall::Keccak256VariableLength::bincodeDeserialize( + std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxFuncCall::Keccak256VariableLength& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.var_message_size, serializer); + serde::Serializable::serialize(obj.outputs, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::Keccak256VariableLength serde::Deserializable< + Circuit::BlackBoxFuncCall::Keccak256VariableLength>::deserialize(Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::Keccak256VariableLength obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.var_message_size = serde::Deserializable::deserialize(deserializer); + obj.outputs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxFuncCall::RecursiveAggregation& lhs, + const BlackBoxFuncCall::RecursiveAggregation& rhs) +{ + if (!(lhs.verification_key == rhs.verification_key)) { + return false; + } + if (!(lhs.proof == rhs.proof)) { + return false; + } + if (!(lhs.public_inputs == rhs.public_inputs)) { + return false; + } + if (!(lhs.key_hash == rhs.key_hash)) { + return false; + } + if (!(lhs.input_aggregation_object == rhs.input_aggregation_object)) { + return false; + } + if (!(lhs.output_aggregation_object == rhs.output_aggregation_object)) { + return false; + } + return true; +} + +inline std::vector BlackBoxFuncCall::RecursiveAggregation::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxFuncCall::RecursiveAggregation BlackBoxFuncCall::RecursiveAggregation::bincodeDeserialize( + std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxFuncCall::RecursiveAggregation& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.verification_key, serializer); + serde::Serializable::serialize(obj.proof, serializer); + serde::Serializable::serialize(obj.public_inputs, serializer); + serde::Serializable::serialize(obj.key_hash, serializer); + serde::Serializable::serialize(obj.input_aggregation_object, serializer); + serde::Serializable::serialize(obj.output_aggregation_object, serializer); +} + +template <> +template +Circuit::BlackBoxFuncCall::RecursiveAggregation serde::Deserializable< + Circuit::BlackBoxFuncCall::RecursiveAggregation>::deserialize(Deserializer& deserializer) +{ + Circuit::BlackBoxFuncCall::RecursiveAggregation obj; + obj.verification_key = serde::Deserializable::deserialize(deserializer); + obj.proof = serde::Deserializable::deserialize(deserializer); + obj.public_inputs = serde::Deserializable::deserialize(deserializer); + obj.key_hash = serde::Deserializable::deserialize(deserializer); + obj.input_aggregation_object = + serde::Deserializable::deserialize(deserializer); + obj.output_aggregation_object = + serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp& lhs, const BlackBoxOp& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp BlackBoxOp::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxOp& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::BlackBoxOp serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::BlackBoxOp obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::Sha256& lhs, const BlackBoxOp::Sha256& rhs) +{ + if (!(lhs.message == rhs.message)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::Sha256::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::Sha256 BlackBoxOp::Sha256::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxOp::Sha256& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.message, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxOp::Sha256 serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BlackBoxOp::Sha256 obj; + obj.message = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::Blake2s& lhs, const BlackBoxOp::Blake2s& rhs) +{ + if (!(lhs.message == rhs.message)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::Blake2s::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::Blake2s BlackBoxOp::Blake2s::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxOp::Blake2s& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.message, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxOp::Blake2s serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxOp::Blake2s obj; + obj.message = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::Keccak256& lhs, const BlackBoxOp::Keccak256& rhs) +{ + if (!(lhs.message == rhs.message)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::Keccak256::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::Keccak256 BlackBoxOp::Keccak256::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxOp::Keccak256& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.message, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxOp::Keccak256 serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxOp::Keccak256 obj; + obj.message = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::HashToField128Security& lhs, const BlackBoxOp::HashToField128Security& rhs) +{ + if (!(lhs.message == rhs.message)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::HashToField128Security::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::HashToField128Security BlackBoxOp::HashToField128Security::bincodeDeserialize( + std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxOp::HashToField128Security& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.message, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxOp::HashToField128Security serde::Deserializable< + Circuit::BlackBoxOp::HashToField128Security>::deserialize(Deserializer& deserializer) +{ + Circuit::BlackBoxOp::HashToField128Security obj; + obj.message = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::EcdsaSecp256k1& lhs, const BlackBoxOp::EcdsaSecp256k1& rhs) +{ + if (!(lhs.hashed_msg == rhs.hashed_msg)) { + return false; + } + if (!(lhs.public_key_x == rhs.public_key_x)) { + return false; + } + if (!(lhs.public_key_y == rhs.public_key_y)) { + return false; + } + if (!(lhs.signature == rhs.signature)) { + return false; + } + if (!(lhs.result == rhs.result)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::EcdsaSecp256k1::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::EcdsaSecp256k1 BlackBoxOp::EcdsaSecp256k1::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxOp::EcdsaSecp256k1& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.hashed_msg, serializer); + serde::Serializable::serialize(obj.public_key_x, serializer); + serde::Serializable::serialize(obj.public_key_y, serializer); + serde::Serializable::serialize(obj.signature, serializer); + serde::Serializable::serialize(obj.result, serializer); +} + +template <> +template +Circuit::BlackBoxOp::EcdsaSecp256k1 serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxOp::EcdsaSecp256k1 obj; + obj.hashed_msg = serde::Deserializable::deserialize(deserializer); + obj.public_key_x = serde::Deserializable::deserialize(deserializer); + obj.public_key_y = serde::Deserializable::deserialize(deserializer); + obj.signature = serde::Deserializable::deserialize(deserializer); + obj.result = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::EcdsaSecp256r1& lhs, const BlackBoxOp::EcdsaSecp256r1& rhs) +{ + if (!(lhs.hashed_msg == rhs.hashed_msg)) { + return false; + } + if (!(lhs.public_key_x == rhs.public_key_x)) { + return false; + } + if (!(lhs.public_key_y == rhs.public_key_y)) { + return false; + } + if (!(lhs.signature == rhs.signature)) { + return false; + } + if (!(lhs.result == rhs.result)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::EcdsaSecp256r1::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::EcdsaSecp256r1 BlackBoxOp::EcdsaSecp256r1::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxOp::EcdsaSecp256r1& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.hashed_msg, serializer); + serde::Serializable::serialize(obj.public_key_x, serializer); + serde::Serializable::serialize(obj.public_key_y, serializer); + serde::Serializable::serialize(obj.signature, serializer); + serde::Serializable::serialize(obj.result, serializer); +} + +template <> +template +Circuit::BlackBoxOp::EcdsaSecp256r1 serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxOp::EcdsaSecp256r1 obj; + obj.hashed_msg = serde::Deserializable::deserialize(deserializer); + obj.public_key_x = serde::Deserializable::deserialize(deserializer); + obj.public_key_y = serde::Deserializable::deserialize(deserializer); + obj.signature = serde::Deserializable::deserialize(deserializer); + obj.result = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::SchnorrVerify& lhs, const BlackBoxOp::SchnorrVerify& rhs) +{ + if (!(lhs.public_key_x == rhs.public_key_x)) { + return false; + } + if (!(lhs.public_key_y == rhs.public_key_y)) { + return false; + } + if (!(lhs.message == rhs.message)) { + return false; + } + if (!(lhs.signature == rhs.signature)) { + return false; + } + if (!(lhs.result == rhs.result)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::SchnorrVerify::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::SchnorrVerify BlackBoxOp::SchnorrVerify::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxOp::SchnorrVerify& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.public_key_x, serializer); + serde::Serializable::serialize(obj.public_key_y, serializer); + serde::Serializable::serialize(obj.message, serializer); + serde::Serializable::serialize(obj.signature, serializer); + serde::Serializable::serialize(obj.result, serializer); +} + +template <> +template +Circuit::BlackBoxOp::SchnorrVerify serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxOp::SchnorrVerify obj; + obj.public_key_x = serde::Deserializable::deserialize(deserializer); + obj.public_key_y = serde::Deserializable::deserialize(deserializer); + obj.message = serde::Deserializable::deserialize(deserializer); + obj.signature = serde::Deserializable::deserialize(deserializer); + obj.result = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::Pedersen& lhs, const BlackBoxOp::Pedersen& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.domain_separator == rhs.domain_separator)) { + return false; + } + if (!(lhs.output == rhs.output)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::Pedersen::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::Pedersen BlackBoxOp::Pedersen::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlackBoxOp::Pedersen& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.domain_separator, serializer); + serde::Serializable::serialize(obj.output, serializer); +} + +template <> +template +Circuit::BlackBoxOp::Pedersen serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxOp::Pedersen obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.domain_separator = serde::Deserializable::deserialize(deserializer); + obj.output = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlackBoxOp::FixedBaseScalarMul& lhs, const BlackBoxOp::FixedBaseScalarMul& rhs) +{ + if (!(lhs.input == rhs.input)) { + return false; + } + if (!(lhs.result == rhs.result)) { + return false; + } + return true; +} + +inline std::vector BlackBoxOp::FixedBaseScalarMul::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlackBoxOp::FixedBaseScalarMul BlackBoxOp::FixedBaseScalarMul::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BlackBoxOp::FixedBaseScalarMul& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.input, serializer); + serde::Serializable::serialize(obj.result, serializer); +} + +template <> +template +Circuit::BlackBoxOp::FixedBaseScalarMul serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BlackBoxOp::FixedBaseScalarMul obj; + obj.input = serde::Deserializable::deserialize(deserializer); + obj.result = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BlockId& lhs, const BlockId& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BlockId::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BlockId BlockId::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BlockId& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::BlockId serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::BlockId obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Brillig& lhs, const Brillig& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.outputs == rhs.outputs)) { + return false; + } + if (!(lhs.foreign_call_results == rhs.foreign_call_results)) { + return false; + } + if (!(lhs.bytecode == rhs.bytecode)) { + return false; + } + if (!(lhs.predicate == rhs.predicate)) { + return false; + } + return true; +} + +inline std::vector Brillig::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Brillig Brillig::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Brillig& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.outputs, serializer); + serde::Serializable::serialize(obj.foreign_call_results, serializer); + serde::Serializable::serialize(obj.bytecode, serializer); + serde::Serializable::serialize(obj.predicate, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::Brillig serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::Brillig obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.outputs = serde::Deserializable::deserialize(deserializer); + obj.foreign_call_results = serde::Deserializable::deserialize(deserializer); + obj.bytecode = serde::Deserializable::deserialize(deserializer); + obj.predicate = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligInputs& lhs, const BrilligInputs& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligInputs::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligInputs BrilligInputs::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligInputs& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::BrilligInputs serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::BrilligInputs obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligInputs::Single& lhs, const BrilligInputs::Single& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligInputs::Single::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligInputs::Single BrilligInputs::Single::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligInputs::Single& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::BrilligInputs::Single serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligInputs::Single obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligInputs::Array& lhs, const BrilligInputs::Array& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligInputs::Array::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligInputs::Array BrilligInputs::Array::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligInputs::Array& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::BrilligInputs::Array serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligInputs::Array obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode& lhs, const BrilligOpcode& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode BrilligOpcode::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::BrilligOpcode serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::BrilligOpcode obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::BinaryFieldOp& lhs, const BrilligOpcode::BinaryFieldOp& rhs) +{ + if (!(lhs.destination == rhs.destination)) { + return false; + } + if (!(lhs.op == rhs.op)) { + return false; + } + if (!(lhs.lhs == rhs.lhs)) { + return false; + } + if (!(lhs.rhs == rhs.rhs)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::BinaryFieldOp::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::BinaryFieldOp BrilligOpcode::BinaryFieldOp::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::BrilligOpcode::BinaryFieldOp& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.destination, serializer); + serde::Serializable::serialize(obj.op, serializer); + serde::Serializable::serialize(obj.lhs, serializer); + serde::Serializable::serialize(obj.rhs, serializer); +} + +template <> +template +Circuit::BrilligOpcode::BinaryFieldOp serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::BinaryFieldOp obj; + obj.destination = serde::Deserializable::deserialize(deserializer); + obj.op = serde::Deserializable::deserialize(deserializer); + obj.lhs = serde::Deserializable::deserialize(deserializer); + obj.rhs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::BinaryIntOp& lhs, const BrilligOpcode::BinaryIntOp& rhs) +{ + if (!(lhs.destination == rhs.destination)) { + return false; + } + if (!(lhs.op == rhs.op)) { + return false; + } + if (!(lhs.bit_size == rhs.bit_size)) { + return false; + } + if (!(lhs.lhs == rhs.lhs)) { + return false; + } + if (!(lhs.rhs == rhs.rhs)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::BinaryIntOp::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::BinaryIntOp BrilligOpcode::BinaryIntOp::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::BinaryIntOp& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.destination, serializer); + serde::Serializable::serialize(obj.op, serializer); + serde::Serializable::serialize(obj.bit_size, serializer); + serde::Serializable::serialize(obj.lhs, serializer); + serde::Serializable::serialize(obj.rhs, serializer); +} + +template <> +template +Circuit::BrilligOpcode::BinaryIntOp serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::BinaryIntOp obj; + obj.destination = serde::Deserializable::deserialize(deserializer); + obj.op = serde::Deserializable::deserialize(deserializer); + obj.bit_size = serde::Deserializable::deserialize(deserializer); + obj.lhs = serde::Deserializable::deserialize(deserializer); + obj.rhs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::JumpIfNot& lhs, const BrilligOpcode::JumpIfNot& rhs) +{ + if (!(lhs.condition == rhs.condition)) { + return false; + } + if (!(lhs.location == rhs.location)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::JumpIfNot::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::JumpIfNot BrilligOpcode::JumpIfNot::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::JumpIfNot& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.condition, serializer); + serde::Serializable::serialize(obj.location, serializer); +} + +template <> +template +Circuit::BrilligOpcode::JumpIfNot serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::JumpIfNot obj; + obj.condition = serde::Deserializable::deserialize(deserializer); + obj.location = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::JumpIf& lhs, const BrilligOpcode::JumpIf& rhs) +{ + if (!(lhs.condition == rhs.condition)) { + return false; + } + if (!(lhs.location == rhs.location)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::JumpIf::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::JumpIf BrilligOpcode::JumpIf::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::JumpIf& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.condition, serializer); + serde::Serializable::serialize(obj.location, serializer); +} + +template <> +template +Circuit::BrilligOpcode::JumpIf serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::JumpIf obj; + obj.condition = serde::Deserializable::deserialize(deserializer); + obj.location = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Jump& lhs, const BrilligOpcode::Jump& rhs) +{ + if (!(lhs.location == rhs.location)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::Jump::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Jump BrilligOpcode::Jump::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Jump& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.location, serializer); +} + +template <> +template +Circuit::BrilligOpcode::Jump serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Jump obj; + obj.location = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Call& lhs, const BrilligOpcode::Call& rhs) +{ + if (!(lhs.location == rhs.location)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::Call::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Call BrilligOpcode::Call::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Call& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.location, serializer); +} + +template <> +template +Circuit::BrilligOpcode::Call serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Call obj; + obj.location = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Const& lhs, const BrilligOpcode::Const& rhs) +{ + if (!(lhs.destination == rhs.destination)) { + return false; + } + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::Const::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Const BrilligOpcode::Const::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Const& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.destination, serializer); + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::BrilligOpcode::Const serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Const obj; + obj.destination = serde::Deserializable::deserialize(deserializer); + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Return& lhs, const BrilligOpcode::Return& rhs) +{ + return true; +} + +inline std::vector BrilligOpcode::Return::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Return BrilligOpcode::Return::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Return& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BrilligOpcode::Return serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Return obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::ForeignCall& lhs, const BrilligOpcode::ForeignCall& rhs) +{ + if (!(lhs.function == rhs.function)) { + return false; + } + if (!(lhs.destinations == rhs.destinations)) { + return false; + } + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::ForeignCall::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::ForeignCall BrilligOpcode::ForeignCall::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::ForeignCall& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.function, serializer); + serde::Serializable::serialize(obj.destinations, serializer); + serde::Serializable::serialize(obj.inputs, serializer); +} + +template <> +template +Circuit::BrilligOpcode::ForeignCall serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::ForeignCall obj; + obj.function = serde::Deserializable::deserialize(deserializer); + obj.destinations = serde::Deserializable::deserialize(deserializer); + obj.inputs = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Mov& lhs, const BrilligOpcode::Mov& rhs) +{ + if (!(lhs.destination == rhs.destination)) { + return false; + } + if (!(lhs.source == rhs.source)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::Mov::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Mov BrilligOpcode::Mov::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Mov& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.destination, serializer); + serde::Serializable::serialize(obj.source, serializer); +} + +template <> +template +Circuit::BrilligOpcode::Mov serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Mov obj; + obj.destination = serde::Deserializable::deserialize(deserializer); + obj.source = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Load& lhs, const BrilligOpcode::Load& rhs) +{ + if (!(lhs.destination == rhs.destination)) { + return false; + } + if (!(lhs.source_pointer == rhs.source_pointer)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::Load::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Load BrilligOpcode::Load::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Load& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.destination, serializer); + serde::Serializable::serialize(obj.source_pointer, serializer); +} + +template <> +template +Circuit::BrilligOpcode::Load serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Load obj; + obj.destination = serde::Deserializable::deserialize(deserializer); + obj.source_pointer = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Store& lhs, const BrilligOpcode::Store& rhs) +{ + if (!(lhs.destination_pointer == rhs.destination_pointer)) { + return false; + } + if (!(lhs.source == rhs.source)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::Store::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Store BrilligOpcode::Store::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Store& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.destination_pointer, serializer); + serde::Serializable::serialize(obj.source, serializer); +} + +template <> +template +Circuit::BrilligOpcode::Store serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Store obj; + obj.destination_pointer = serde::Deserializable::deserialize(deserializer); + obj.source = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::BlackBox& lhs, const BrilligOpcode::BlackBox& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligOpcode::BlackBox::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::BlackBox BrilligOpcode::BlackBox::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::BlackBox& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::BrilligOpcode::BlackBox serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::BlackBox obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Trap& lhs, const BrilligOpcode::Trap& rhs) +{ + return true; +} + +inline std::vector BrilligOpcode::Trap::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Trap BrilligOpcode::Trap::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Trap& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BrilligOpcode::Trap serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Trap obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOpcode::Stop& lhs, const BrilligOpcode::Stop& rhs) +{ + return true; +} + +inline std::vector BrilligOpcode::Stop::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOpcode::Stop BrilligOpcode::Stop::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOpcode::Stop& obj, + Serializer& serializer) +{} + +template <> +template +Circuit::BrilligOpcode::Stop serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOpcode::Stop obj; + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOutputs& lhs, const BrilligOutputs& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligOutputs::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOutputs BrilligOutputs::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOutputs& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::BrilligOutputs serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::BrilligOutputs obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOutputs::Simple& lhs, const BrilligOutputs::Simple& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligOutputs::Simple::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOutputs::Simple BrilligOutputs::Simple::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOutputs::Simple& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::BrilligOutputs::Simple serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOutputs::Simple obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const BrilligOutputs::Array& lhs, const BrilligOutputs::Array& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector BrilligOutputs::Array::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline BrilligOutputs::Array BrilligOutputs::Array::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::BrilligOutputs::Array& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::BrilligOutputs::Array serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::BrilligOutputs::Array obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Circuit& lhs, const Circuit& rhs) +{ + if (!(lhs.current_witness_index == rhs.current_witness_index)) { + return false; + } + if (!(lhs.opcodes == rhs.opcodes)) { + return false; + } + if (!(lhs.public_parameters == rhs.public_parameters)) { + return false; + } + if (!(lhs.return_values == rhs.return_values)) { + return false; + } + return true; +} + +inline std::vector Circuit::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Circuit Circuit::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Circuit& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.current_witness_index, serializer); + serde::Serializable::serialize(obj.opcodes, serializer); + serde::Serializable::serialize(obj.public_parameters, serializer); + serde::Serializable::serialize(obj.return_values, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::Circuit serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::Circuit obj; + obj.current_witness_index = serde::Deserializable::deserialize(deserializer); + obj.opcodes = serde::Deserializable::deserialize(deserializer); + obj.public_parameters = serde::Deserializable::deserialize(deserializer); + obj.return_values = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Directive& lhs, const Directive& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Directive::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Directive Directive::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Directive& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::Directive serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::Directive obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Directive::Invert& lhs, const Directive::Invert& rhs) +{ + if (!(lhs.x == rhs.x)) { + return false; + } + if (!(lhs.result == rhs.result)) { + return false; + } + return true; +} + +inline std::vector Directive::Invert::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Directive::Invert Directive::Invert::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Directive::Invert& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.x, serializer); + serde::Serializable::serialize(obj.result, serializer); +} + +template <> +template +Circuit::Directive::Invert serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::Directive::Invert obj; + obj.x = serde::Deserializable::deserialize(deserializer); + obj.result = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Directive::Quotient& lhs, const Directive::Quotient& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Directive::Quotient::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Directive::Quotient Directive::Quotient::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Directive::Quotient& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Directive::Quotient serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::Directive::Quotient obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Directive::ToLeRadix& lhs, const Directive::ToLeRadix& rhs) +{ + if (!(lhs.a == rhs.a)) { + return false; + } + if (!(lhs.b == rhs.b)) { + return false; + } + if (!(lhs.radix == rhs.radix)) { + return false; + } + return true; +} + +inline std::vector Directive::ToLeRadix::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Directive::ToLeRadix Directive::ToLeRadix::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Directive::ToLeRadix& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.a, serializer); + serde::Serializable::serialize(obj.b, serializer); + serde::Serializable::serialize(obj.radix, serializer); +} + +template <> +template +Circuit::Directive::ToLeRadix serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::Directive::ToLeRadix obj; + obj.a = serde::Deserializable::deserialize(deserializer); + obj.b = serde::Deserializable::deserialize(deserializer); + obj.radix = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Directive::PermutationSort& lhs, const Directive::PermutationSort& rhs) +{ + if (!(lhs.inputs == rhs.inputs)) { + return false; + } + if (!(lhs.tuple == rhs.tuple)) { + return false; + } + if (!(lhs.bits == rhs.bits)) { + return false; + } + if (!(lhs.sort_by == rhs.sort_by)) { + return false; + } + return true; +} + +inline std::vector Directive::PermutationSort::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Directive::PermutationSort Directive::PermutationSort::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Directive::PermutationSort& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.inputs, serializer); + serde::Serializable::serialize(obj.tuple, serializer); + serde::Serializable::serialize(obj.bits, serializer); + serde::Serializable::serialize(obj.sort_by, serializer); +} + +template <> +template +Circuit::Directive::PermutationSort serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::Directive::PermutationSort obj; + obj.inputs = serde::Deserializable::deserialize(deserializer); + obj.tuple = serde::Deserializable::deserialize(deserializer); + obj.bits = serde::Deserializable::deserialize(deserializer); + obj.sort_by = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Directive::Log& lhs, const Directive::Log& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Directive::Log::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Directive::Log Directive::Log::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Directive::Log& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Directive::Log serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::Directive::Log obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Expression& lhs, const Expression& rhs) +{ + if (!(lhs.mul_terms == rhs.mul_terms)) { + return false; + } + if (!(lhs.linear_combinations == rhs.linear_combinations)) { + return false; + } + if (!(lhs.q_c == rhs.q_c)) { + return false; + } + return true; +} + +inline std::vector Expression::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Expression Expression::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Expression& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.mul_terms, serializer); + serde::Serializable::serialize(obj.linear_combinations, serializer); + serde::Serializable::serialize(obj.q_c, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::Expression serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::Expression obj; + obj.mul_terms = serde::Deserializable::deserialize(deserializer); + obj.linear_combinations = serde::Deserializable::deserialize(deserializer); + obj.q_c = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const ForeignCallOutput& lhs, const ForeignCallOutput& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector ForeignCallOutput::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline ForeignCallOutput ForeignCallOutput::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::ForeignCallOutput& obj, + Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::ForeignCallOutput serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::ForeignCallOutput obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const ForeignCallOutput::Single& lhs, const ForeignCallOutput::Single& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector ForeignCallOutput::Single::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline ForeignCallOutput::Single ForeignCallOutput::Single::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::ForeignCallOutput::Single& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::ForeignCallOutput::Single serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::ForeignCallOutput::Single obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const ForeignCallOutput::Array& lhs, const ForeignCallOutput::Array& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector ForeignCallOutput::Array::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline ForeignCallOutput::Array ForeignCallOutput::Array::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::ForeignCallOutput::Array& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::ForeignCallOutput::Array serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::ForeignCallOutput::Array obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const ForeignCallResult& lhs, const ForeignCallResult& rhs) +{ + if (!(lhs.values == rhs.values)) { + return false; + } + return true; +} + +inline std::vector ForeignCallResult::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline ForeignCallResult ForeignCallResult::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::ForeignCallResult& obj, + Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.values, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::ForeignCallResult serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::ForeignCallResult obj; + obj.values = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const FunctionInput& lhs, const FunctionInput& rhs) +{ + if (!(lhs.witness == rhs.witness)) { + return false; + } + if (!(lhs.num_bits == rhs.num_bits)) { + return false; + } + return true; +} + +inline std::vector FunctionInput::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline FunctionInput FunctionInput::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::FunctionInput& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.witness, serializer); + serde::Serializable::serialize(obj.num_bits, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::FunctionInput serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::FunctionInput obj; + obj.witness = serde::Deserializable::deserialize(deserializer); + obj.num_bits = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const HeapArray& lhs, const HeapArray& rhs) +{ + if (!(lhs.pointer == rhs.pointer)) { + return false; + } + if (!(lhs.size == rhs.size)) { + return false; + } + return true; +} + +inline std::vector HeapArray::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline HeapArray HeapArray::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::HeapArray& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.pointer, serializer); + serde::Serializable::serialize(obj.size, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::HeapArray serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::HeapArray obj; + obj.pointer = serde::Deserializable::deserialize(deserializer); + obj.size = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const HeapVector& lhs, const HeapVector& rhs) +{ + if (!(lhs.pointer == rhs.pointer)) { + return false; + } + if (!(lhs.size == rhs.size)) { + return false; + } + return true; +} + +inline std::vector HeapVector::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline HeapVector HeapVector::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::HeapVector& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.pointer, serializer); + serde::Serializable::serialize(obj.size, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::HeapVector serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::HeapVector obj; + obj.pointer = serde::Deserializable::deserialize(deserializer); + obj.size = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const LogInfo& lhs, const LogInfo& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector LogInfo::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline LogInfo LogInfo::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::LogInfo& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::LogInfo serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::LogInfo obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const LogInfo::FinalizedOutput& lhs, const LogInfo::FinalizedOutput& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector LogInfo::FinalizedOutput::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline LogInfo::FinalizedOutput LogInfo::FinalizedOutput::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::LogInfo::FinalizedOutput& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::LogInfo::FinalizedOutput serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::LogInfo::FinalizedOutput obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const LogInfo::WitnessOutput& lhs, const LogInfo::WitnessOutput& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector LogInfo::WitnessOutput::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline LogInfo::WitnessOutput LogInfo::WitnessOutput::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::LogInfo::WitnessOutput& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::LogInfo::WitnessOutput serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::LogInfo::WitnessOutput obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const MemOp& lhs, const MemOp& rhs) +{ + if (!(lhs.operation == rhs.operation)) { + return false; + } + if (!(lhs.index == rhs.index)) { + return false; + } + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector MemOp::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline MemOp MemOp::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::MemOp& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.operation, serializer); + serde::Serializable::serialize(obj.index, serializer); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::MemOp serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::MemOp obj; + obj.operation = serde::Deserializable::deserialize(deserializer); + obj.index = serde::Deserializable::deserialize(deserializer); + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const MemoryBlock& lhs, const MemoryBlock& rhs) +{ + if (!(lhs.id == rhs.id)) { + return false; + } + if (!(lhs.len == rhs.len)) { + return false; + } + if (!(lhs.trace == rhs.trace)) { + return false; + } + return true; +} + +inline std::vector MemoryBlock::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline MemoryBlock MemoryBlock::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::MemoryBlock& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.id, serializer); + serde::Serializable::serialize(obj.len, serializer); + serde::Serializable::serialize(obj.trace, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::MemoryBlock serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::MemoryBlock obj; + obj.id = serde::Deserializable::deserialize(deserializer); + obj.len = serde::Deserializable::deserialize(deserializer); + obj.trace = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Opcode& lhs, const Opcode& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Opcode::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Opcode Opcode::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Opcode& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::Opcode serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::Opcode obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Opcode::Arithmetic& lhs, const Opcode::Arithmetic& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Opcode::Arithmetic::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Opcode::Arithmetic Opcode::Arithmetic::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Opcode::Arithmetic& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Opcode::Arithmetic serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::Opcode::Arithmetic obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Opcode::BlackBoxFuncCall& lhs, const Opcode::BlackBoxFuncCall& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Opcode::BlackBoxFuncCall::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Opcode::BlackBoxFuncCall Opcode::BlackBoxFuncCall::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Opcode::BlackBoxFuncCall& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Opcode::BlackBoxFuncCall serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::Opcode::BlackBoxFuncCall obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Opcode::Directive& lhs, const Opcode::Directive& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Opcode::Directive::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Opcode::Directive Opcode::Directive::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Opcode::Directive& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Opcode::Directive serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::Opcode::Directive obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Opcode::Block& lhs, const Opcode::Block& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Opcode::Block::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Opcode::Block Opcode::Block::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Opcode::Block& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Opcode::Block serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::Opcode::Block obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Opcode::ROM& lhs, const Opcode::ROM& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Opcode::ROM::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Opcode::ROM Opcode::ROM::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Opcode::ROM& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Opcode::ROM serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::Opcode::ROM obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Opcode::RAM& lhs, const Opcode::RAM& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Opcode::RAM::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Opcode::RAM Opcode::RAM::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Opcode::RAM& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Opcode::RAM serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::Opcode::RAM obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Opcode::Brillig& lhs, const Opcode::Brillig& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Opcode::Brillig::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Opcode::Brillig Opcode::Brillig::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Opcode::Brillig& obj, + Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::Opcode::Brillig serde::Deserializable::deserialize(Deserializer& deserializer) +{ + Circuit::Opcode::Brillig obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const PublicInputs& lhs, const PublicInputs& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector PublicInputs::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline PublicInputs PublicInputs::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::PublicInputs& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::PublicInputs serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::PublicInputs obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const QuotientDirective& lhs, const QuotientDirective& rhs) +{ + if (!(lhs.a == rhs.a)) { + return false; + } + if (!(lhs.b == rhs.b)) { + return false; + } + if (!(lhs.q == rhs.q)) { + return false; + } + if (!(lhs.r == rhs.r)) { + return false; + } + if (!(lhs.predicate == rhs.predicate)) { + return false; + } + return true; +} + +inline std::vector QuotientDirective::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline QuotientDirective QuotientDirective::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::QuotientDirective& obj, + Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.a, serializer); + serde::Serializable::serialize(obj.b, serializer); + serde::Serializable::serialize(obj.q, serializer); + serde::Serializable::serialize(obj.r, serializer); + serde::Serializable::serialize(obj.predicate, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::QuotientDirective serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::QuotientDirective obj; + obj.a = serde::Deserializable::deserialize(deserializer); + obj.b = serde::Deserializable::deserialize(deserializer); + obj.q = serde::Deserializable::deserialize(deserializer); + obj.r = serde::Deserializable::deserialize(deserializer); + obj.predicate = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const RegisterIndex& lhs, const RegisterIndex& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector RegisterIndex::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline RegisterIndex RegisterIndex::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::RegisterIndex& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::RegisterIndex serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::RegisterIndex obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const RegisterOrMemory& lhs, const RegisterOrMemory& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector RegisterOrMemory::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline RegisterOrMemory RegisterOrMemory::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::RegisterOrMemory& obj, + Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::RegisterOrMemory serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::RegisterOrMemory obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const RegisterOrMemory::RegisterIndex& lhs, const RegisterOrMemory::RegisterIndex& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector RegisterOrMemory::RegisterIndex::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline RegisterOrMemory::RegisterIndex RegisterOrMemory::RegisterIndex::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::RegisterOrMemory::RegisterIndex& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::RegisterOrMemory::RegisterIndex serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::RegisterOrMemory::RegisterIndex obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const RegisterOrMemory::HeapArray& lhs, const RegisterOrMemory::HeapArray& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector RegisterOrMemory::HeapArray::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline RegisterOrMemory::HeapArray RegisterOrMemory::HeapArray::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::RegisterOrMemory::HeapArray& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::RegisterOrMemory::HeapArray serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::RegisterOrMemory::HeapArray obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const RegisterOrMemory::HeapVector& lhs, const RegisterOrMemory::HeapVector& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector RegisterOrMemory::HeapVector::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline RegisterOrMemory::HeapVector RegisterOrMemory::HeapVector::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize( + const Circuit::RegisterOrMemory::HeapVector& obj, Serializer& serializer) +{ + serde::Serializable::serialize(obj.value, serializer); +} + +template <> +template +Circuit::RegisterOrMemory::HeapVector serde::Deserializable::deserialize( + Deserializer& deserializer) +{ + Circuit::RegisterOrMemory::HeapVector obj; + obj.value = serde::Deserializable::deserialize(deserializer); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Value& lhs, const Value& rhs) +{ + if (!(lhs.inner == rhs.inner)) { + return false; + } + return true; +} + +inline std::vector Value::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Value Value::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Value& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.inner, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::Value serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::Value obj; + obj.inner = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace Circuit { + +inline bool operator==(const Witness& lhs, const Witness& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Witness::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Witness Witness::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace Circuit + +template <> +template +void serde::Serializable::serialize(const Circuit::Witness& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +Circuit::Witness serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + Circuit::Witness obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} \ No newline at end of file diff --git a/cpp/src/barretenberg/dsl/acir_format/serde/binary.hpp b/cpp/src/barretenberg/dsl/acir_format/serde/binary.hpp new file mode 100644 index 0000000000..840e0de0f7 --- /dev/null +++ b/cpp/src/barretenberg/dsl/acir_format/serde/binary.hpp @@ -0,0 +1,391 @@ +// Copyright (c) Facebook, Inc. and its affiliates +// SPDX-License-Identifier: MIT OR Apache-2.0 + +#pragma once + +#include +#include +#include + +#include "serde.hpp" + +namespace serde { + +template class BinarySerializer { + protected: + std::vector bytes_; + size_t container_depth_budget_; + + public: + BinarySerializer(size_t max_container_depth) + : container_depth_budget_(max_container_depth) + {} + + void serialize_str(const std::string& value); + + void serialize_bool(bool value); + void serialize_unit(); + void serialize_char(char32_t value); + void serialize_f32(float value); + void serialize_f64(double value); + + void serialize_u8(uint8_t value); + void serialize_u16(uint16_t value); + void serialize_u32(uint32_t value); + void serialize_u64(uint64_t value); + void serialize_u128(const uint128_t& value); + + void serialize_i8(int8_t value); + void serialize_i16(int16_t value); + void serialize_i32(int32_t value); + void serialize_i64(int64_t value); + void serialize_i128(const int128_t& value); + void serialize_option_tag(bool value); + + size_t get_buffer_offset(); + void increase_container_depth(); + void decrease_container_depth(); + + std::vector bytes() && { return std::move(bytes_); } +}; + +template class BinaryDeserializer { + size_t pos_; + size_t container_depth_budget_; + + protected: + std::vector bytes_; + uint8_t read_byte(); + + public: + BinaryDeserializer(std::vector bytes, size_t max_container_depth) + : pos_(0) + , container_depth_budget_(max_container_depth) + , bytes_(std::move(bytes)) + {} + + std::string deserialize_str(); + + bool deserialize_bool(); + std::monostate deserialize_unit(); + char32_t deserialize_char(); + float deserialize_f32(); + double deserialize_f64(); + + uint8_t deserialize_u8(); + uint16_t deserialize_u16(); + uint32_t deserialize_u32(); + uint64_t deserialize_u64(); + uint128_t deserialize_u128(); + + int8_t deserialize_i8(); + int16_t deserialize_i16(); + int32_t deserialize_i32(); + int64_t deserialize_i64(); + int128_t deserialize_i128(); + + bool deserialize_option_tag(); + + size_t get_buffer_offset(); + void increase_container_depth(); + void decrease_container_depth(); +}; + +template void BinarySerializer::serialize_str(const std::string& value) +{ + static_cast(this)->serialize_len(value.size()); + for (auto c : value) { + bytes_.push_back(c); + } +} + +template void BinarySerializer::serialize_unit() {} + +template void BinarySerializer::serialize_f32(float) +{ + throw_or_abort("not implemented"); +} + +template void BinarySerializer::serialize_f64(double) +{ + throw_or_abort("not implemented"); +} + +template void BinarySerializer::serialize_char(char32_t) +{ + throw_or_abort("not implemented"); +} + +template void BinarySerializer::serialize_bool(bool value) +{ + bytes_.push_back((uint8_t)value); +} + +template void BinarySerializer::serialize_u8(uint8_t value) +{ + bytes_.push_back(value); +} + +template void BinarySerializer::serialize_u16(uint16_t value) +{ + bytes_.push_back((uint8_t)value); + bytes_.push_back((uint8_t)(value >> 8)); +} + +template void BinarySerializer::serialize_u32(uint32_t value) +{ + bytes_.push_back((uint8_t)value); + bytes_.push_back((uint8_t)(value >> 8)); + bytes_.push_back((uint8_t)(value >> 16)); + bytes_.push_back((uint8_t)(value >> 24)); +} + +template void BinarySerializer::serialize_u64(uint64_t value) +{ + bytes_.push_back((uint8_t)value); + bytes_.push_back((uint8_t)(value >> 8)); + bytes_.push_back((uint8_t)(value >> 16)); + bytes_.push_back((uint8_t)(value >> 24)); + bytes_.push_back((uint8_t)(value >> 32)); + bytes_.push_back((uint8_t)(value >> 40)); + bytes_.push_back((uint8_t)(value >> 48)); + bytes_.push_back((uint8_t)(value >> 56)); +} + +template void BinarySerializer::serialize_u128(const uint128_t& value) +{ + serialize_u64(value.low); + serialize_u64(value.high); +} + +template void BinarySerializer::serialize_i8(int8_t value) +{ + serialize_u8((uint8_t)value); +} + +template void BinarySerializer::serialize_i16(int16_t value) +{ + serialize_u16((uint16_t)value); +} + +template void BinarySerializer::serialize_i32(int32_t value) +{ + serialize_u32((uint32_t)value); +} + +template void BinarySerializer::serialize_i64(int64_t value) +{ + serialize_u64((uint64_t)value); +} + +template void BinarySerializer::serialize_i128(const int128_t& value) +{ + serialize_u64(value.low); + serialize_i64(value.high); +} + +template void BinarySerializer::serialize_option_tag(bool value) +{ + serialize_bool(value); +} + +template size_t BinarySerializer::get_buffer_offset() +{ + return bytes_.size(); +} + +template void BinarySerializer::increase_container_depth() +{ + if (container_depth_budget_ == 0) { + throw_or_abort("Too many nested containers"); + } + container_depth_budget_--; +} + +template void BinarySerializer::decrease_container_depth() +{ + container_depth_budget_++; +} + +template uint8_t BinaryDeserializer::read_byte() +{ + if (pos_ >= bytes_.size()) { + throw_or_abort("Input is not large enough"); + } + return bytes_.at(pos_++); +} + +inline bool is_valid_utf8(const std::string& input) +{ + uint8_t trailing_digits = 0; + for (char byte : input) { + if (trailing_digits == 0) { + // Start new codepoint. + if (byte >> 7 == 0) { + // ASCII character + } else if (byte >> 5 == 0b110) { + // Expecting a 2-byte codepoint + trailing_digits = 1; + } else if (byte >> 4 == 0b1110) { + // Expecting a 3-byte codepoint + trailing_digits = 2; + } else if (byte >> 3 == 0b11110) { + // Expecting a 4-byte codepoint + trailing_digits = 3; + } else { + return false; + } + } else { + // Process "trailing digit". + if (byte >> 6 != 0b10) { + return false; + } + trailing_digits -= 1; + } + } + return trailing_digits == 0; +} + +template std::string BinaryDeserializer::deserialize_str() +{ + auto len = static_cast(this)->deserialize_len(); + std::string result; + result.reserve(len); + for (size_t i = 0; i < len; i++) { + result.push_back(read_byte()); + } + if (!is_valid_utf8(result)) { + throw_or_abort("Invalid UTF8 string: " + result); + } + return result; +} + +template std::monostate BinaryDeserializer::deserialize_unit() +{ + return {}; +} + +template float BinaryDeserializer::deserialize_f32() +{ + throw_or_abort("not implemented"); +} + +template double BinaryDeserializer::deserialize_f64() +{ + throw_or_abort("not implemented"); +} + +template char32_t BinaryDeserializer::deserialize_char() +{ + throw_or_abort("not implemented"); +} + +template bool BinaryDeserializer::deserialize_bool() +{ + switch (read_byte()) { + case 0: + return false; + case 1: + return true; + default: + throw_or_abort("Invalid boolean value"); + } +} + +template uint8_t BinaryDeserializer::deserialize_u8() +{ + return read_byte(); +} + +template uint16_t BinaryDeserializer::deserialize_u16() +{ + uint16_t val = 0; + val |= (uint16_t)read_byte(); + val |= (uint16_t)read_byte() << 8; + return val; +} + +template uint32_t BinaryDeserializer::deserialize_u32() +{ + uint32_t val = 0; + val |= (uint32_t)read_byte(); + val |= (uint32_t)read_byte() << 8; + val |= (uint32_t)read_byte() << 16; + val |= (uint32_t)read_byte() << 24; + return val; +} + +template uint64_t BinaryDeserializer::deserialize_u64() +{ + uint64_t val = 0; + val |= (uint64_t)read_byte(); + val |= (uint64_t)read_byte() << 8; + val |= (uint64_t)read_byte() << 16; + val |= (uint64_t)read_byte() << 24; + val |= (uint64_t)read_byte() << 32; + val |= (uint64_t)read_byte() << 40; + val |= (uint64_t)read_byte() << 48; + val |= (uint64_t)read_byte() << 56; + return val; +} + +template uint128_t BinaryDeserializer::deserialize_u128() +{ + uint128_t result; + result.low = deserialize_u64(); + result.high = deserialize_u64(); + return result; +} + +template int8_t BinaryDeserializer::deserialize_i8() +{ + return (int8_t)deserialize_u8(); +} + +template int16_t BinaryDeserializer::deserialize_i16() +{ + return (int16_t)deserialize_u16(); +} + +template int32_t BinaryDeserializer::deserialize_i32() +{ + return (int32_t)deserialize_u32(); +} + +template int64_t BinaryDeserializer::deserialize_i64() +{ + return (int64_t)deserialize_u64(); +} + +template int128_t BinaryDeserializer::deserialize_i128() +{ + int128_t result; + result.low = deserialize_u64(); + result.high = deserialize_i64(); + return result; +} + +template bool BinaryDeserializer::deserialize_option_tag() +{ + return deserialize_bool(); +} + +template size_t BinaryDeserializer::get_buffer_offset() +{ + return pos_; +} + +template void BinaryDeserializer::increase_container_depth() +{ + if (container_depth_budget_ == 0) { + throw_or_abort("Too many nested containers"); + } + container_depth_budget_--; +} + +template void BinaryDeserializer::decrease_container_depth() +{ + container_depth_budget_++; +} + +} // end of namespace serde \ No newline at end of file diff --git a/cpp/src/barretenberg/dsl/acir_format/serde/bincode.hpp b/cpp/src/barretenberg/dsl/acir_format/serde/bincode.hpp new file mode 100644 index 0000000000..60c773b7c2 --- /dev/null +++ b/cpp/src/barretenberg/dsl/acir_format/serde/bincode.hpp @@ -0,0 +1,104 @@ +// Copyright (c) Facebook, Inc. and its affiliates +// SPDX-License-Identifier: MIT OR Apache-2.0 + +#pragma once + +#include +#include + +#include "binary.hpp" +#include "serde.hpp" + +// Maximum length supported in practice (e.g. Java). +constexpr size_t BINCODE_MAX_LENGTH = (1ull << 31) - 1; + +namespace serde { + +class BincodeSerializer : public BinarySerializer { + using Parent = BinarySerializer; + + public: + BincodeSerializer() + : Parent(SIZE_MAX) + {} + + void serialize_f32(float value); + void serialize_f64(double value); + void serialize_len(size_t value); + void serialize_variant_index(uint32_t value); + + static constexpr bool enforce_strict_map_ordering = false; +}; + +class BincodeDeserializer : public BinaryDeserializer { + using Parent = BinaryDeserializer; + + public: + BincodeDeserializer(std::vector bytes) + : Parent(std::move(bytes), SIZE_MAX) + {} + + float deserialize_f32(); + double deserialize_f64(); + size_t deserialize_len(); + uint32_t deserialize_variant_index(); + + static constexpr bool enforce_strict_map_ordering = false; +}; + +// Native floats and doubles must be IEEE-754 values of the expected size. +static_assert(std::numeric_limits::is_iec559); +static_assert(std::numeric_limits::is_iec559); +static_assert(sizeof(float) == sizeof(uint32_t)); +static_assert(sizeof(double) == sizeof(uint64_t)); + +inline void BincodeSerializer::serialize_f32(float value) +{ + Parent::serialize_u32(*reinterpret_cast(&value)); +} + +inline void BincodeSerializer::serialize_f64(double value) +{ + Parent::serialize_u64(*reinterpret_cast(&value)); +} + +inline void BincodeSerializer::serialize_len(size_t value) +{ + if (value > BINCODE_MAX_LENGTH) { + throw_or_abort("Length is too large"); + } + Parent::serialize_u64((uint64_t)value); +} + +inline void BincodeSerializer::serialize_variant_index(uint32_t value) +{ + Parent::serialize_u32((uint32_t)value); +} + +inline float BincodeDeserializer::deserialize_f32() +{ + auto value = Parent::deserialize_u32(); + return *reinterpret_cast(&value); +} + +inline double BincodeDeserializer::deserialize_f64() +{ + auto value = Parent::deserialize_u64(); + return *reinterpret_cast(&value); +} + +inline size_t BincodeDeserializer::deserialize_len() +{ + auto value = (size_t)Parent::deserialize_u64(); + if (value > BINCODE_MAX_LENGTH) { + throw_or_abort("Length is too large"); + } + return (size_t)value; +} + +inline uint32_t BincodeDeserializer::deserialize_variant_index() +{ + return Parent::deserialize_u32(); +} + +} // end of namespace serde \ No newline at end of file diff --git a/cpp/src/barretenberg/dsl/acir_format/serde/index.hpp b/cpp/src/barretenberg/dsl/acir_format/serde/index.hpp new file mode 100644 index 0000000000..82716cef88 --- /dev/null +++ b/cpp/src/barretenberg/dsl/acir_format/serde/index.hpp @@ -0,0 +1,21 @@ +#pragma once + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wsign-conversion" +#pragma clang diagnostic ignored "-Wshorten-64-to-32" +#pragma clang diagnostic ignored "-Wunused-parameter" +#include "acir.hpp" +#include "witness_map.hpp" +#pragma clang diagnostic pop +#else +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wignored-qualifiers" +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#include "acir.hpp" +#include "witness_map.hpp" +#pragma GCC diagnostic pop +#endif \ No newline at end of file diff --git a/cpp/src/barretenberg/dsl/acir_format/serde/serde.hpp b/cpp/src/barretenberg/dsl/acir_format/serde/serde.hpp new file mode 100644 index 0000000000..ffa381edfc --- /dev/null +++ b/cpp/src/barretenberg/dsl/acir_format/serde/serde.hpp @@ -0,0 +1,598 @@ +// Copyright (c) Facebook, Inc. and its affiliates +// SPDX-License-Identifier: MIT OR Apache-2.0 + +#pragma once + +#include "barretenberg/common/throw_or_abort.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace serde { + +class serialization_error : public std::invalid_argument { + public: + explicit serialization_error(const std::string& what_arg) + : std::invalid_argument(what_arg) + {} + explicit serialization_error(const char* what_arg) + : std::invalid_argument(what_arg) + {} +}; + +class deserialization_error : public std::invalid_argument { + public: + explicit deserialization_error(const std::string& what_arg) + : std::invalid_argument(what_arg) + {} + explicit deserialization_error(const char* what_arg) + : std::invalid_argument(what_arg) + {} +}; + +// Basic implementation for 128-bit unsigned integers. +struct uint128_t { + uint64_t high; + uint64_t low; + + friend bool operator==(const uint128_t&, const uint128_t&); +}; + +inline bool operator==(const uint128_t& lhs, const uint128_t& rhs) +{ + return lhs.high == rhs.high && lhs.low == rhs.low; +} + +// 128-bit signed integers. +struct int128_t { + int64_t high; + uint64_t low; + + friend bool operator==(const int128_t&, const int128_t&); +}; + +inline bool operator==(const int128_t& lhs, const int128_t& rhs) +{ + return lhs.high == rhs.high && lhs.low == rhs.low; +} + +// A copyable unique_ptr with value semantics. +// Freely inspired by the following discussion: +// https://codereview.stackexchange.com/questions/103744/deepptr-a-deep-copying-unique-ptr-wrapper-in-c +template class value_ptr { + public: + value_ptr() + : ptr_(nullptr) + {} + + value_ptr(const T& value) + : ptr_(new T{ value }) + {} + + value_ptr(const value_ptr& other) + : ptr_(nullptr) + { + if (other) { + ptr_ = std::unique_ptr{ new T{ *other } }; + } + } + + value_ptr& operator=(const value_ptr& other) + { + value_ptr temp{ other }; + std::swap(ptr_, temp.ptr_); + return *this; + } + + value_ptr(value_ptr&& other) = default; + + value_ptr& operator=(value_ptr&& other) = default; + + T& operator*() { return *ptr_; } + + const T& operator*() const { return *ptr_; } + + T* const operator->() { return ptr_.operator->(); } + + const T* const operator->() const { return ptr_.operator->(); } + + const T* const get() const { return ptr_.get(); } + + operator bool() const { return (bool)ptr_; } + + template friend bool operator==(const value_ptr&, const value_ptr&); + + private: + std::unique_ptr ptr_; +}; + +template bool operator==(const value_ptr& lhs, const value_ptr& rhs) +{ + return *lhs == *rhs; +} + +// Trait to enable serialization of values of type T. +// This is similar to the `serde::Serialize` trait in Rust. +template struct Serializable { + template static void serialize(const T& value, Serializer& serializer); +}; + +// Trait to enable deserialization of values of type T. +// This is similar to the `serde::Deserialize` trait in Rust. +template struct Deserializable { + template static T deserialize(Deserializer& deserializer); +}; + +// --- Implementation of Serializable for base types --- + +// string +template <> struct Serializable { + template static void serialize(const std::string& value, Serializer& serializer) + { + serializer.serialize_str(value); + } +}; + +// unit +template <> struct Serializable { + template static void serialize(const std::monostate&, Serializer& serializer) + { + serializer.serialize_unit(); + } +}; + +// bool +template <> struct Serializable { + template static void serialize(const bool& value, Serializer& serializer) + { + serializer.serialize_bool(value); + } +}; + +// UTF-8 char +template <> struct Serializable { + template static void serialize(const char32_t& value, Serializer& serializer) + { + serializer.serialize_char(value); + } +}; + +// f32 +template <> struct Serializable { + template static void serialize(const float& value, Serializer& serializer) + { + serializer.serialize_f32(value); + } +}; + +// f64 +template <> struct Serializable { + template static void serialize(const double& value, Serializer& serializer) + { + serializer.serialize_f64(value); + } +}; + +// u8 +template <> struct Serializable { + template static void serialize(const uint8_t& value, Serializer& serializer) + { + serializer.serialize_u8(value); + } +}; + +// u16 +template <> struct Serializable { + template static void serialize(const uint16_t& value, Serializer& serializer) + { + serializer.serialize_u16(value); + } +}; + +// u32 +template <> struct Serializable { + template static void serialize(const uint32_t& value, Serializer& serializer) + { + serializer.serialize_u32(value); + } +}; + +// u64 +template <> struct Serializable { + template static void serialize(const uint64_t& value, Serializer& serializer) + { + serializer.serialize_u64(value); + } +}; + +// u128 +template <> struct Serializable { + template static void serialize(const uint128_t& value, Serializer& serializer) + { + serializer.serialize_u128(value); + } +}; + +// i8 +template <> struct Serializable { + template static void serialize(const int8_t& value, Serializer& serializer) + { + serializer.serialize_i8(value); + } +}; + +// i16 +template <> struct Serializable { + template static void serialize(const int16_t& value, Serializer& serializer) + { + serializer.serialize_i16(value); + } +}; + +// i32 +template <> struct Serializable { + template static void serialize(const int32_t& value, Serializer& serializer) + { + serializer.serialize_i32(value); + } +}; + +// i64 +template <> struct Serializable { + template static void serialize(const int64_t& value, Serializer& serializer) + { + serializer.serialize_i64(value); + } +}; + +// i128 +template <> struct Serializable { + template static void serialize(const int128_t& value, Serializer& serializer) + { + serializer.serialize_i128(value); + } +}; + +// --- Derivation of Serializable for composite types --- + +// Value pointers (non-nullable) +template struct Serializable> { + template static void serialize(const value_ptr& value, Serializer& serializer) + { + Serializable::serialize(*value, serializer); + } +}; + +// Options +template struct Serializable> { + template static void serialize(const std::optional& option, Serializer& serializer) + { + if (option.has_value()) { + serializer.serialize_option_tag(true); + Serializable::serialize(option.value(), serializer); + } else { + serializer.serialize_option_tag(false); + } + } +}; + +// Vectors (sequences) +template struct Serializable> { + template static void serialize(const std::vector& value, Serializer& serializer) + { + serializer.serialize_len(value.size()); + for (const T& item : value) { + Serializable::serialize(item, serializer); + } + } +}; + +// Fixed-size arrays +template struct Serializable> { + template static void serialize(const std::array& value, Serializer& serializer) + { + for (const T& item : value) { + Serializable::serialize(item, serializer); + } + } +}; + +// Maps +template struct Serializable> { + template static void serialize(const std::map& value, Serializer& serializer) + { + serializer.serialize_len(value.size()); + std::vector offsets; + for (const auto& item : value) { + if constexpr (Serializer::enforce_strict_map_ordering) { + offsets.push_back(serializer.get_buffer_offset()); + } + Serializable::serialize(item.first, serializer); + Serializable::serialize(item.second, serializer); + } + if constexpr (Serializer::enforce_strict_map_ordering) { + serializer.sort_last_entries(std::move(offsets)); + } + } +}; + +// Tuples +template struct Serializable> { + template static void serialize(const std::tuple& value, Serializer& serializer) + { + // Visit each of the type components. + std::apply([&serializer](Types const&... args) { (Serializable::serialize(args, serializer), ...); }, + value); + } +}; + +// Enums +template struct Serializable> { + template static void serialize(const std::variant& value, Serializer& serializer) + { + // Write the variant index. + serializer.serialize_variant_index(value.index()); + // Visit the inner type. + std::visit( + [&serializer](const auto& arg) { + using T = typename std::decay::type; + Serializable::serialize(arg, serializer); + }, + value); + } +}; + +// --- Implementation of Deserializable for base types --- + +// string +template <> struct Deserializable { + template static std::string deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_str(); + } +}; + +// unit +template <> struct Deserializable { + template static std::monostate deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_unit(); + } +}; + +// bool +template <> struct Deserializable { + template static bool deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_bool(); + } +}; + +// f32 +template <> struct Deserializable { + template static float deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_f32(); + } +}; + +// f64 +template <> struct Deserializable { + template static double deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_f64(); + } +}; + +// UTF-8 char +template <> struct Deserializable { + template static char32_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_char(); + } +}; + +// u8 +template <> struct Deserializable { + template static uint8_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_u8(); + } +}; + +// u16 +template <> struct Deserializable { + template static uint16_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_u16(); + } +}; + +// u32 +template <> struct Deserializable { + template static uint32_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_u32(); + } +}; + +// u64 +template <> struct Deserializable { + template static uint64_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_u64(); + } +}; + +// u128 +template <> struct Deserializable { + template static uint128_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_u128(); + } +}; + +// i8 +template <> struct Deserializable { + template static int8_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_i8(); + } +}; + +// i16 +template <> struct Deserializable { + template static int16_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_i16(); + } +}; + +// i32 +template <> struct Deserializable { + template static int32_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_i32(); + } +}; + +// i64 +template <> struct Deserializable { + template static int64_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_i64(); + } +}; + +// i128 +template <> struct Deserializable { + template static int128_t deserialize(Deserializer& deserializer) + { + return deserializer.deserialize_i128(); + } +}; + +// --- Derivation of Deserializable for composite types --- + +// Value pointers +template struct Deserializable> { + template static value_ptr deserialize(Deserializer& deserializer) + { + return value_ptr(Deserializable::deserialize(deserializer)); + } +}; + +// Options +template struct Deserializable> { + template static std::optional deserialize(Deserializer& deserializer) + { + auto tag = deserializer.deserialize_option_tag(); + if (!tag) { + return {}; + } else { + return { Deserializable::deserialize(deserializer) }; + } + } +}; + +// Vectors +template struct Deserializable> { + template static std::vector deserialize(Deserializer& deserializer) + { + std::vector result; + size_t len = deserializer.deserialize_len(); + for (size_t i = 0; i < len; i++) { + result.push_back(Deserializable::deserialize(deserializer)); + } + return result; + } +}; + +// Maps +template struct Deserializable> { + template static std::map deserialize(Deserializer& deserializer) + { + std::map result; + size_t len = deserializer.deserialize_len(); + std::optional> previous_key_slice; + for (size_t i = 0; i < len; i++) { + if constexpr (Deserializer::enforce_strict_map_ordering) { + auto start = deserializer.get_buffer_offset(); + auto key = Deserializable::deserialize(deserializer); + auto end = deserializer.get_buffer_offset(); + if (previous_key_slice.has_value()) { + deserializer.check_that_key_slices_are_increasing(previous_key_slice.value(), { start, end }); + } + previous_key_slice = { start, end }; + auto value = Deserializable::deserialize(deserializer); + result.insert({ key, value }); + } else { + auto key = Deserializable::deserialize(deserializer); + auto value = Deserializable::deserialize(deserializer); + result.insert({ key, value }); + } + } + return result; + } +}; + +// Fixed-size arrays +template struct Deserializable> { + template static std::array deserialize(Deserializer& deserializer) + { + std::array result; + for (T& item : result) { + item = Deserializable::deserialize(deserializer); + } + return result; + } +}; + +// Tuples +template struct Deserializable> { + template static std::tuple deserialize(Deserializer& deserializer) + { + // Visit each of the type components. We use the constructor of `std::tuple` so + // that the evaluation order of arguments is specified by the C++ standard. + return std::tuple{ Deserializable::deserialize(deserializer)... }; + } +}; + +// Enums +template struct Deserializable> { + template static std::variant deserialize(Deserializer& deserializer) + { + // A "case" is analog to a particular branch in switch-case over the + // index. Given the variant type `T` known statically, we create a + // closure that will deserialize a value `T` and return it as a variant. + using Case = std::function(Deserializer&)>; + auto make_case = [](auto tag) -> Case { + // Obtain the type `T` encoded in the type of `tag == + // std::common_type{}`. + using T = typename decltype(tag)::type; + auto f = [](Deserializer& de) { return std::variant(Deserializable::deserialize(de)); }; + return f; + }; + + // The static array of all the cases for this variant. + static const std::array cases = { make_case(std::common_type{})... }; + + // Read the variant index and execute the corresponding case. + auto index = deserializer.deserialize_variant_index(); + if (index > cases.size()) { + throw_or_abort("Unknown variant index for enum"); + } + return cases.at(index)(deserializer); + } +}; + +} // end of namespace serde \ No newline at end of file diff --git a/cpp/src/barretenberg/dsl/acir_format/serde/witness_map.hpp b/cpp/src/barretenberg/dsl/acir_format/serde/witness_map.hpp new file mode 100644 index 0000000000..de4523e702 --- /dev/null +++ b/cpp/src/barretenberg/dsl/acir_format/serde/witness_map.hpp @@ -0,0 +1,123 @@ +#pragma once + +#include "bincode.hpp" +#include "serde.hpp" + +namespace WitnessMap { + +struct Witness { + uint32_t value; + + friend bool operator==(const Witness&, const Witness&); + bool operator<(Witness const& rhs) const { return value < rhs.value; } + std::vector bincodeSerialize() const; + static Witness bincodeDeserialize(std::vector); +}; + +struct WitnessMap { + std::map value; + + friend bool operator==(const WitnessMap&, const WitnessMap&); + std::vector bincodeSerialize() const; + static WitnessMap bincodeDeserialize(std::vector); +}; + +} // end of namespace WitnessMap + +namespace WitnessMap { + +inline bool operator==(const Witness& lhs, const Witness& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector Witness::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline Witness Witness::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace WitnessMap + +template <> +template +void serde::Serializable::serialize(const WitnessMap::Witness& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +WitnessMap::Witness serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + WitnessMap::Witness obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} + +namespace WitnessMap { + +inline bool operator==(const WitnessMap& lhs, const WitnessMap& rhs) +{ + if (!(lhs.value == rhs.value)) { + return false; + } + return true; +} + +inline std::vector WitnessMap::bincodeSerialize() const +{ + auto serializer = serde::BincodeSerializer(); + serde::Serializable::serialize(*this, serializer); + return std::move(serializer).bytes(); +} + +inline WitnessMap WitnessMap::bincodeDeserialize(std::vector input) +{ + auto deserializer = serde::BincodeDeserializer(input); + auto value = serde::Deserializable::deserialize(deserializer); + if (deserializer.get_buffer_offset() < input.size()) { + throw_or_abort("Some input bytes were not read"); + } + return value; +} + +} // end of namespace WitnessMap + +template <> +template +void serde::Serializable::serialize(const WitnessMap::WitnessMap& obj, Serializer& serializer) +{ + serializer.increase_container_depth(); + serde::Serializable::serialize(obj.value, serializer); + serializer.decrease_container_depth(); +} + +template <> +template +WitnessMap::WitnessMap serde::Deserializable::deserialize(Deserializer& deserializer) +{ + deserializer.increase_container_depth(); + WitnessMap::WitnessMap obj; + obj.value = serde::Deserializable::deserialize(deserializer); + deserializer.decrease_container_depth(); + return obj; +} \ No newline at end of file diff --git a/cpp/src/barretenberg/dsl/acir_proofs/CMakeLists.txt b/cpp/src/barretenberg/dsl/acir_proofs/CMakeLists.txt deleted file mode 100644 index 9bdf62b9b7..0000000000 --- a/cpp/src/barretenberg/dsl/acir_proofs/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -barretenberg_module( - acir_proofs - acir_format - plonk -) diff --git a/cpp/src/barretenberg/dsl/acir_proofs/acir_composer.cpp b/cpp/src/barretenberg/dsl/acir_proofs/acir_composer.cpp index e43906fc4f..159b8f3b45 100644 --- a/cpp/src/barretenberg/dsl/acir_proofs/acir_composer.cpp +++ b/cpp/src/barretenberg/dsl/acir_proofs/acir_composer.cpp @@ -77,6 +77,7 @@ std::vector AcirComposer::create_proof( if (!proving_key_) { vinfo("computing proving key..."); proving_key_ = composer_.compute_proving_key(builder_); + vinfo("done."); } // We are done with the constraint system at this point, and we need the memory slab back. @@ -101,7 +102,9 @@ std::vector AcirComposer::create_proof( std::shared_ptr AcirComposer::init_verification_key() { vinfo("computing verification key..."); - return verification_key_ = composer_.compute_verification_key(builder_); + verification_key_ = composer_.compute_verification_key(builder_); + vinfo("done."); + return verification_key_; } void AcirComposer::load_verification_key(std::shared_ptr const& crs_factory, @@ -117,6 +120,7 @@ bool AcirComposer::verify_proof(std::vector const& proof, bool is_recur if (!verification_key_) { vinfo("computing verification key..."); verification_key_ = composer_.compute_verification_key(builder_); + vinfo("done."); } // Hack. Shouldn't need to do this. 2144 is size with no public inputs. diff --git a/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp b/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp index dd755b305f..0827e4797a 100644 --- a/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp +++ b/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp @@ -1,4 +1,5 @@ #include "c_bind.hpp" +#include "../acir_format/acir_to_constraint_buf.hpp" #include "acir_composer.hpp" #include "barretenberg/common/mem.hpp" #include "barretenberg/common/net.hpp" @@ -10,13 +11,9 @@ #include #include -WASM_EXPORT void acir_get_circuit_sizes(uint8_t const* constraint_system_buf, - uint32_t* exact, - uint32_t* total, - uint32_t* subgroup) +WASM_EXPORT void acir_get_circuit_sizes(uint8_t const* acir_vec, uint32_t* exact, uint32_t* total, uint32_t* subgroup) { - auto constraint_system = from_buffer(constraint_system_buf); - free_mem_slab_raw((void*)constraint_system_buf); + auto constraint_system = acir_format::circuit_buf_to_acir_format(from_buffer>(acir_vec)); auto composer = acir_format::create_circuit(constraint_system, 1 << 19); *exact = htonl((uint32_t)composer.get_num_gates()); *total = htonl((uint32_t)composer.get_total_circuit_size()); @@ -33,30 +30,23 @@ WASM_EXPORT void acir_delete_acir_composer(in_ptr acir_composer_ptr) delete reinterpret_cast(*acir_composer_ptr); } -WASM_EXPORT void acir_init_proving_key(in_ptr acir_composer_ptr, uint8_t const* constraint_system_buf) +WASM_EXPORT void acir_init_proving_key(in_ptr acir_composer_ptr, uint8_t const* acir_vec) { auto acir_composer = reinterpret_cast(*acir_composer_ptr); - auto constraint_system = from_buffer(constraint_system_buf); - - // The binder would normally free the the constraint_system_buf, but we need the memory now. - free_mem_slab_raw((void*)constraint_system_buf); + auto constraint_system = acir_format::circuit_buf_to_acir_format(from_buffer>(acir_vec)); acir_composer->init_proving_key(barretenberg::srs::get_crs_factory(), constraint_system); } WASM_EXPORT void acir_create_proof(in_ptr acir_composer_ptr, - uint8_t const* constraint_system_buf, - uint8_t const* witness_buf, + uint8_t const* acir_vec, + uint8_t const* witness_vec, bool const* is_recursive, uint8_t** out) { auto acir_composer = reinterpret_cast(*acir_composer_ptr); - auto constraint_system = from_buffer(constraint_system_buf); - auto witness = from_buffer>>(witness_buf); - - // The binder would normally free the the constraint_system_buf, but we need the memory now. - free_mem_slab_raw((void*)constraint_system_buf); - free_mem_slab_raw((void*)witness_buf); + auto constraint_system = acir_format::circuit_buf_to_acir_format(from_buffer>(acir_vec)); + auto witness = acir_format::witness_buf_to_witness_data(from_buffer>(witness_vec)); auto proof_data = acir_composer->create_proof(barretenberg::srs::get_crs_factory(), constraint_system, witness, *is_recursive); diff --git a/ts/bin-test/target/main.json b/ts/bin-test/target/main.json index 3883d10a30..e0c75229a3 100644 --- a/ts/bin-test/target/main.json +++ b/ts/bin-test/target/main.json @@ -1 +1 @@ -{"backend":"acvm-backend-barretenberg","abi":{"parameters":[{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}},"visibility":"private"},{"name":"proof","type":{"kind":"array","length":94,"type":{"kind":"field"}},"visibility":"private"},{"name":"public_inputs","type":{"kind":"array","length":1,"type":{"kind":"field"}},"visibility":"private"},{"name":"key_hash","type":{"kind":"field"},"visibility":"private"},{"name":"input_aggregation_object","type":{"kind":"array","length":16,"type":{"kind":"field"}},"visibility":"private"},{"name":"proof_b","type":{"kind":"array","length":94,"type":{"kind":"field"}},"visibility":"private"}],"param_witnesses":{"input_aggregation_object":[211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226],"key_hash":[210],"proof":[115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208],"proof_b":[227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320],"public_inputs":[209],"verification_key":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114]},"return_type":{"kind":"array","length":16,"type":{"kind":"field"}},"return_witnesses":[337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352]},"bytecode":"H4sIAAAAAAAA/+3WU6/dWQDG4fWObbNj2+7YMx17pmPbtm3Xtm1bX6G2zefk9KZJb5qT9KLpSp6dfbWzk/f3X3uXkkdKKbuVklu4ldu4nTu4k7u4m3u4l/u4nwd4kIeoWTb8bMErZO37LdmKrdmGbdmO7dmBHdmJndmFXSu/d9mdPdiTvdibfdiX/difAziQgziYQziUahzG4RzBkRzF0RzDsRzH8ZzAiZzEyZzCqZzG6ZzBmZzF2ZzDuZzH+VzAhVzExVxCdS7lMi7nCq7kKq7mGq7lOq7nBm7kJm6mBnYrdit2K3Yrdit2K3Yrdit2K3Yrdit2K3Yrdit2KzV5mIoGHuUxHucJnuQpnuYZnuU5nucFXuQlXl67Y8VnvsprvM4bvMlbvM07vMt7vM8HfMhHfMwnfMpnfM4XfMlXfM03fMt3fM8P/MhP/Mwv/Mpv/M4f/Mlf/M0//Mt//E8talOHutSjPg1oSCMa04SmNKM5LWhJK1rThra0oz0d6EgnOtOFrnSjOz3oSS9604e+9KM/AxjIIAYzhKEMYzgjGMkoRjOmVD5DYxlXqnyix+gxeoweo8foMXqMHqPH6DF6jB6jx+gxekyNUvWz+U7YtO6E8UxgIpOYzBSmMo3pzGAms5jNHOYyj/ksYCGLWMwSlrKM5axgJatYXZlPvERD0VA0FA1FQ9FQNBQNRUPRUDQUDUVD0VAqfg81FA1FQ9FQNBQNRUPRUDQUDUVD0VA0FA1FQ6mGhqKhaCgaioaioWgoGoqGoqFoKBqKhqKhaCgaioaioWgoGoqGoqFoKBqKhqKhaCgaioaioWgo1cs6d0JVn+mN/t9gvWcN6fQg96wIAAA=","proving_key":[],"verification_key":[]} \ No newline at end of file +{"backend":"acvm-backend-barretenberg","abi":{"parameters":[{"name":"verification_key","type":{"kind":"array","length":114,"type":{"kind":"field"}},"visibility":"private"},{"name":"proof","type":{"kind":"array","length":94,"type":{"kind":"field"}},"visibility":"private"},{"name":"public_inputs","type":{"kind":"array","length":1,"type":{"kind":"field"}},"visibility":"private"},{"name":"key_hash","type":{"kind":"field"},"visibility":"private"},{"name":"input_aggregation_object","type":{"kind":"array","length":16,"type":{"kind":"field"}},"visibility":"private"},{"name":"proof_b","type":{"kind":"array","length":94,"type":{"kind":"field"}},"visibility":"private"}],"param_witnesses":{"input_aggregation_object":[211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226],"key_hash":[210],"proof":[115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208],"proof_b":[227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320],"public_inputs":[209],"verification_key":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114]},"return_type":{"kind":"array","length":16,"type":{"kind":"field"}},"return_witnesses":[337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352]},"bytecode":"H4sIAAAAAAAA/+3V05ObbRjA4WytrW3bdrdr79bWZ6Ofbdu2jdq2+y/UtvmkuXZmp8c96ME+M7+5cieZzJtJ5r2nxEUixSKxEx5G4kNTC80XI7HXoxZnCZZkKZZmGZZlOZZnBcazIiuxMquwKquxOmuwJmuxNuuwLuuxPhuwIRuxMZuwKZuxOVuwJVuxNduwLduxPTuwIzuxM7uwK7uxO3uwJ3uxN/uwL/uxPwdwIAcxgYOZyCQmM4WpTGM6M5jJLGYzh7nMYz6HcCiHcThHcCRHcTTHcCzHcTwncCIncTKn8AbeyJt4M2/hrbyNt/MO3sm7eDfv4b28j/dzaqHrjJ4HzA/yIT7MR/goH+PjfIJP8ik+zWf4LJ/j83yBL/IlvsxX+Cpf4+t8g2/yLb7Nd/gu3+P7/IAf8iN+zE/4KT/j5/yCX/Irfs1v+C2/4/f8gT/yJ/7MX/grf+Pv/IN/8i/+zX/4L//j/5zG6ZzBmZzF2ZzDuZzH+VzAhVzExVzCpVzG5VzBlVzF1VzDtVzH9dzAjdzEzYzuoejZYt7KK4siegaHdySGkkLJoZRQaigtlB7KCGWGskLZoZxQbigvlB9XtPiKFl/MBBYtvpjX2+LbZt7OHdzJXdzNPdzLfdzPAzzIQzzMIzzKYzzOEzzJUzzNMzzLczzPCyzoEqM3oKhxLMbiLMGSLMXSLMOyLMfyrMB4VmQlVmYVVmU1VmcN1mQt1mYd1mU91mcDNmQjNmYTNmUzNmcLtmQrtmYbtmU7tmcHdmQndmYXdmU3dmcP9mQv9mYf9mU/9ucADuQgJhT8/pHYuXrxxRVefNEnEpnEZKYwlWlMZwYzmcVs5jCXecwv+KO4jiFhHhoaFhoeGhEaGRoVGh0aExobGhcaH5oQmhiaFJpc8C2v4eddBhwvtmjWDgAA","proving_key":null,"verification_key":null,"gates":505505} \ No newline at end of file diff --git a/ts/bin-test/target/witness.tr b/ts/bin-test/target/witness.tr index 2bbbfa6508..82e8cf3ff5 100644 Binary files a/ts/bin-test/target/witness.tr and b/ts/bin-test/target/witness.tr differ diff --git a/ts/src/main.ts b/ts/src/main.ts index 40f64a68dc..a62afc048a 100755 --- a/ts/src/main.ts +++ b/ts/src/main.ts @@ -3,7 +3,6 @@ import { Crs, BarretenbergApiAsync, newBarretenbergApiAsync, RawBuffer } from '. import createDebug from 'debug'; import { readFileSync, writeFileSync } from 'fs'; import { gunzipSync } from 'zlib'; -import { numToUInt32BE } from './serialize/serialize.js'; import { Command } from 'commander'; createDebug.log = console.error.bind(console); @@ -39,13 +38,14 @@ async function getGates(jsonPath: string, api: BarretenbergApiAsync) { function getWitness(witnessPath: string) { const data = readFileSync(witnessPath); - return Buffer.concat([numToUInt32BE(data.length / 32), data]); + const decompressed = gunzipSync(data); + return decompressed; } async function computeCircuitSize(jsonPath: string, api: BarretenbergApiAsync) { debug(`computing circuit size...`); const bytecode = getBytecode(jsonPath); - const [exact, total, subgroup] = await api.acirGetCircuitSizes(new RawBuffer(bytecode)); + const [exact, total, subgroup] = await api.acirGetCircuitSizes(bytecode); return { exact, total, subgroup }; } @@ -94,7 +94,7 @@ export async function proveAndVerify(jsonPath: string, witnessPath: string, crsP debug(`creating proof...`); const bytecode = getBytecode(jsonPath); const witness = getWitness(witnessPath); - const proof = await api.acirCreateProof(acirComposer, new RawBuffer(bytecode), new RawBuffer(witness), isRecursive); + const proof = await api.acirCreateProof(acirComposer, bytecode, witness, isRecursive); debug(`verifying...`); const verified = await api.acirVerifyProof(acirComposer, proof, isRecursive); @@ -117,7 +117,7 @@ export async function prove( debug(`creating proof...`); const bytecode = getBytecode(jsonPath); const witness = getWitness(witnessPath); - const proof = await api.acirCreateProof(acirComposer, new RawBuffer(bytecode), new RawBuffer(witness), isRecursive); + const proof = await api.acirCreateProof(acirComposer, bytecode, witness, isRecursive); debug(`done.`); writeFileSync(outputPath, proof); @@ -169,7 +169,7 @@ export async function writeVk(jsonPath: string, crsPath: string, outputPath: str try { debug('initing proving key...'); const bytecode = getBytecode(jsonPath); - await api.acirInitProvingKey(acirComposer, new RawBuffer(bytecode)); + await api.acirInitProvingKey(acirComposer, bytecode); debug('initing verification key...'); const vk = await api.acirGetVerificationKey(acirComposer);