From 4eb9ae4a7f227d94ea45cd31e0a65176f284cf78 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Thu, 17 Aug 2023 22:57:16 +0000 Subject: [PATCH 01/13] add rebuild pattern --- build_manifest.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build_manifest.json b/build_manifest.json index c3ac0c9dd8ca..0dd59db0ef14 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -64,6 +64,15 @@ "barretenberg-wasm-linux-clang" ] }, + "bb-bin-tests": { + "buildDir": "circuits/cpp/barretenberg/ts", + "rebuildPatterns": [ + "^circuits/cpp/barretenberg/ts/" + ], + "dependencies": [ + "barretenberg-wasm-linux-clang" + ] + }, "barretenberg-acir-tests": { "buildDir": "circuits/cpp/barretenberg/acir_tests", "rebuildPatterns": [ From a5f659752cc885024884e1194c47af74cec48e39 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Thu, 17 Aug 2023 22:58:55 +0000 Subject: [PATCH 02/13] check if rebuild-path works --- circuits/cpp/barretenberg/ts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circuits/cpp/barretenberg/ts/package.json b/circuits/cpp/barretenberg/ts/package.json index b5a7f3cfe119..a5566957ab65 100644 --- a/circuits/cpp/barretenberg/ts/package.json +++ b/circuits/cpp/barretenberg/ts/package.json @@ -10,7 +10,7 @@ "tsconfig": "./tsconfig.json" }, "main": "./dest/index.js", - "bin": "./dest/main.js", + "bin": "./dest/node/main.js", "files": [ "src/", "dest/", From 5f7e692ef6ddf0096d88d8c22c772e98e694f4de Mon Sep 17 00:00:00 2001 From: kevaundray Date: Fri, 18 Aug 2023 00:11:43 +0100 Subject: [PATCH 03/13] Update query_manifest --- build-system/scripts/query_manifest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build-system/scripts/query_manifest b/build-system/scripts/query_manifest index b4e8fe8c49b3..3d6ff71f1db4 100755 --- a/build-system/scripts/query_manifest +++ b/build-system/scripts/query_manifest @@ -4,6 +4,8 @@ set -e CMD=$1 REPO=$2 +echo "Finding rebuild patterns for $REPO" + MANIFEST=$ROOT_PATH/build_manifest.json if [ $(jq "has(\"$REPO\")" $MANIFEST) == "false" ]; then @@ -52,4 +54,4 @@ case "$CMD" in if [ "$(git ls-tree HEAD $DIR | awk '{print $2}')" = "commit" ]; then git ls-tree HEAD $DIR | awk '{print $4}' fi -esac \ No newline at end of file +esac From 2b3839e521df2e9d452c3fdfd01f60057b29157f Mon Sep 17 00:00:00 2001 From: kevaundray Date: Thu, 17 Aug 2023 23:26:40 +0000 Subject: [PATCH 04/13] update $REPO:wq --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7d83ab35e400..0aac3554eddc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -238,7 +238,7 @@ jobs: - *setup_env - run: name: "Test" - command: cond_spot_run_test_script ./scripts/bin-test.sh barretenberg-x86_64-linux-clang-assert + command: cond_spot_run_test_script ./scripts/bin-test.sh bb-bin-tests barretenberg-benchmark-aggregator: docker: From 08a75b16757c54a0dfe1fdc82a28d0af157a9d91 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Fri, 18 Aug 2023 00:27:52 +0100 Subject: [PATCH 05/13] revert change made to query_manifest --- build-system/scripts/query_manifest | 2 -- 1 file changed, 2 deletions(-) diff --git a/build-system/scripts/query_manifest b/build-system/scripts/query_manifest index 3d6ff71f1db4..f968f8fb57ca 100755 --- a/build-system/scripts/query_manifest +++ b/build-system/scripts/query_manifest @@ -4,8 +4,6 @@ set -e CMD=$1 REPO=$2 -echo "Finding rebuild patterns for $REPO" - MANIFEST=$ROOT_PATH/build_manifest.json if [ $(jq "has(\"$REPO\")" $MANIFEST) == "false" ]; then From 7fe05644e9b3cc17b82f4aa08843c7f7aa05396f Mon Sep 17 00:00:00 2001 From: kevaundray Date: Thu, 17 Aug 2023 23:35:41 +0000 Subject: [PATCH 06/13] update lock file --- circuits/cpp/barretenberg/ts/yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circuits/cpp/barretenberg/ts/yarn.lock b/circuits/cpp/barretenberg/ts/yarn.lock index f9a4a3eb538e..bdf5d2e63f60 100644 --- a/circuits/cpp/barretenberg/ts/yarn.lock +++ b/circuits/cpp/barretenberg/ts/yarn.lock @@ -48,7 +48,7 @@ __metadata: webpack-cli: ^5.1.1 webpack-dev-server: ^4.15.0 bin: - bb.js: ./dest/main.js + bb.js: ./dest/node/main.js languageName: unknown linkType: soft From e42b1c7942d0b993df445067dafa73b28c89cdb7 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Thu, 17 Aug 2023 23:56:26 +0000 Subject: [PATCH 07/13] change buildDir --- build_manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_manifest.json b/build_manifest.json index 0dd59db0ef14..2c7811d8a21c 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -65,7 +65,7 @@ ] }, "bb-bin-tests": { - "buildDir": "circuits/cpp/barretenberg/ts", + "buildDir": "circuits/cpp/barretenberg/cpp", "rebuildPatterns": [ "^circuits/cpp/barretenberg/ts/" ], From 94af62e70b95880bcc1582a1d4488c246800185a Mon Sep 17 00:00:00 2001 From: Maddiaa0 <47148561+Maddiaa0@users.noreply.github.com> Date: Fri, 18 Aug 2023 11:16:21 +0000 Subject: [PATCH 08/13] smol diff --- circuits/cpp/barretenberg/ts/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/circuits/cpp/barretenberg/ts/README.md b/circuits/cpp/barretenberg/ts/README.md index fd6e8ff17511..eee071b87873 100644 --- a/circuits/cpp/barretenberg/ts/README.md +++ b/circuits/cpp/barretenberg/ts/README.md @@ -118,3 +118,4 @@ To run the tests run `yarn test`. To run a continuous "stress test" run `yarn simple_test` to do 10 full pk/proof/vk iterations. To run the same test in the browser run `yarn serve`, navigate to appropriate URL and open the console. + From db79369e8b8074f28fea17a8941d1a941b02f518 Mon Sep 17 00:00:00 2001 From: Maddiaa0 <47148561+Maddiaa0@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:30:30 +0000 Subject: [PATCH 09/13] fix: test to see if we are meant to use existing image as repo name on test script --- .circleci/config.yml | 9 +++++++-- build_manifest.json | 9 --------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0aac3554eddc..eb9e9b3b270c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -238,7 +238,7 @@ jobs: - *setup_env - run: name: "Test" - command: cond_spot_run_test_script ./scripts/bin-test.sh bb-bin-tests + command: cond_spot_run_test_script ./scripts/bin-test.sh bb.js barretenberg-benchmark-aggregator: docker: @@ -1174,6 +1174,11 @@ bb_test: &bb_test requires: - barretenberg-x86_64-linux-clang-assert <<: *defaults +bb_js_test: &bb_js_test + requires: + - barretenberg-x86_64-linux-clang-assert + - bb-js + <<: *defaults circuits-wasm-test: &circuits-wasm-test requires: - circuits-wasm-linux-clang-assert @@ -1200,7 +1205,7 @@ workflows: - barretenberg-stdlib-recursion-turbo-tests: *bb_test - barretenberg-stdlib-recursion-ultra-tests: *bb_test - barretenberg-join-split-tests: *bb_test - - bb-bin-tests: *bb_test + - bb-bin-tests: *bb_js_test - barretenberg-benchmark-aggregator: requires: - barretenberg-tests diff --git a/build_manifest.json b/build_manifest.json index 2c7811d8a21c..c3ac0c9dd8ca 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -64,15 +64,6 @@ "barretenberg-wasm-linux-clang" ] }, - "bb-bin-tests": { - "buildDir": "circuits/cpp/barretenberg/cpp", - "rebuildPatterns": [ - "^circuits/cpp/barretenberg/ts/" - ], - "dependencies": [ - "barretenberg-wasm-linux-clang" - ] - }, "barretenberg-acir-tests": { "buildDir": "circuits/cpp/barretenberg/acir_tests", "rebuildPatterns": [ From 9ebf842371eadfe6c98c5ef5972cdf6288eeb538 Mon Sep 17 00:00:00 2001 From: Maddiaa0 <47148561+Maddiaa0@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:36:32 +0000 Subject: [PATCH 10/13] fix: move bb js test into dockerfile --- .circleci/config.yml | 2 +- circuits/cpp/barretenberg/ts/Dockerfile | 5 +++++ circuits/cpp/barretenberg/ts/bb.js-dev | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index eb9e9b3b270c..564d37a49f54 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -238,7 +238,7 @@ jobs: - *setup_env - run: name: "Test" - command: cond_spot_run_test_script ./scripts/bin-test.sh bb.js + command: cond_spot_run_test_script ../scripts/bin-test.sh bb.js barretenberg-benchmark-aggregator: docker: diff --git a/circuits/cpp/barretenberg/ts/Dockerfile b/circuits/cpp/barretenberg/ts/Dockerfile index 1a94506a443a..14f47a9ea566 100644 --- a/circuits/cpp/barretenberg/ts/Dockerfile +++ b/circuits/cpp/barretenberg/ts/Dockerfile @@ -13,4 +13,9 @@ RUN yarn --immutable COPY . . ENV DOCKER_ENV=true RUN yarn formatting && yarn build:ts:browser && yarn build:ts:node + +# Run bb.js binary tests +WORKDIR /usr/src/barretenberg/ts/bin-test +RUN ./bin-test.sh + CMD ["yarn", "test"] diff --git a/circuits/cpp/barretenberg/ts/bb.js-dev b/circuits/cpp/barretenberg/ts/bb.js-dev index 1f93688795df..2a937ae1e52e 100755 --- a/circuits/cpp/barretenberg/ts/bb.js-dev +++ b/circuits/cpp/barretenberg/ts/bb.js-dev @@ -3,4 +3,4 @@ # Now you can run bb.js-dev anywhere to execute latest code, no 'yarn build' required. SCRIPT_PATH=$(dirname $(realpath $0)) export TS_NODE_PROJECT="$SCRIPT_PATH/tsconfig.node.json" -npx nodemon --ext '.ts' --watch 'src/**/*.ts' --exec "ts-node -r tsconfig-paths/register" $SCRIPT_PATH/src/main.ts $@ +npx -y nodemon --ext '.ts' --watch 'src/**/*.ts' --exec "ts-node -r tsconfig-paths/register" $SCRIPT_PATH/src/main.ts $@ From a26113ef513bf7db6dc3dc043909f6d0125a5979 Mon Sep 17 00:00:00 2001 From: Maddiaa0 <47148561+Maddiaa0@users.noreply.github.com> Date: Fri, 18 Aug 2023 16:11:37 +0000 Subject: [PATCH 11/13] fix: remove old subrepo step --- circuits/cpp/barretenberg/ts/bb.js-dev | 6 ------ circuits/cpp/barretenberg/ts/bin-test/bin-test.sh | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100755 circuits/cpp/barretenberg/ts/bb.js-dev diff --git a/circuits/cpp/barretenberg/ts/bb.js-dev b/circuits/cpp/barretenberg/ts/bb.js-dev deleted file mode 100755 index 2a937ae1e52e..000000000000 --- a/circuits/cpp/barretenberg/ts/bb.js-dev +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -# Add a symlink to this somewhere in your path. -# Now you can run bb.js-dev anywhere to execute latest code, no 'yarn build' required. -SCRIPT_PATH=$(dirname $(realpath $0)) -export TS_NODE_PROJECT="$SCRIPT_PATH/tsconfig.node.json" -npx -y nodemon --ext '.ts' --watch 'src/**/*.ts' --exec "ts-node -r tsconfig-paths/register" $SCRIPT_PATH/src/main.ts $@ diff --git a/circuits/cpp/barretenberg/ts/bin-test/bin-test.sh b/circuits/cpp/barretenberg/ts/bin-test/bin-test.sh index 146f30e1b0ac..49c0ee1bda55 100755 --- a/circuits/cpp/barretenberg/ts/bin-test/bin-test.sh +++ b/circuits/cpp/barretenberg/ts/bin-test/bin-test.sh @@ -2,7 +2,7 @@ set -eu bb() { - ../bb.js-dev -v "$@" + ../dest/node/main.js -v "$@" } bb gates From 807a0033eb3e48b7cf3a973f0e8ba66f9416496f Mon Sep 17 00:00:00 2001 From: Maddiaa0 <47148561+Maddiaa0@users.noreply.github.com> Date: Fri, 18 Aug 2023 16:18:18 +0000 Subject: [PATCH 12/13] fix: remove standalone bb bin test --- .circleci/config.yml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 564d37a49f54..2a7130521354 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -229,17 +229,6 @@ jobs: command: cond_spot_run_tests barretenberg-x86_64-linux-clang-assert 3 join_split_example_proofs_join_split_tests --gtest_filter=-*full_proof* - *save_logs - bb-bin-tests: - docker: - - image: aztecprotocol/alpine-build-image - resource_class: small - steps: - - *checkout - - *setup_env - - run: - name: "Test" - command: cond_spot_run_test_script ../scripts/bin-test.sh bb.js - barretenberg-benchmark-aggregator: docker: - image: aztecprotocol/alpine-build-image @@ -1174,11 +1163,6 @@ bb_test: &bb_test requires: - barretenberg-x86_64-linux-clang-assert <<: *defaults -bb_js_test: &bb_js_test - requires: - - barretenberg-x86_64-linux-clang-assert - - bb-js - <<: *defaults circuits-wasm-test: &circuits-wasm-test requires: - circuits-wasm-linux-clang-assert @@ -1205,7 +1189,6 @@ workflows: - barretenberg-stdlib-recursion-turbo-tests: *bb_test - barretenberg-stdlib-recursion-ultra-tests: *bb_test - barretenberg-join-split-tests: *bb_test - - bb-bin-tests: *bb_js_test - barretenberg-benchmark-aggregator: requires: - barretenberg-tests From 0a3651c941db66193763b267a8c21e7228118b73 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Fri, 18 Aug 2023 18:42:45 +0000 Subject: [PATCH 13/13] add target folder --- .../barretenberg/ts/bin-test/target/main.json | 1 + .../barretenberg/ts/bin-test/target/witness.tr | Bin 0 -> 8258 bytes 2 files changed, 1 insertion(+) create mode 100644 circuits/cpp/barretenberg/ts/bin-test/target/main.json create mode 100644 circuits/cpp/barretenberg/ts/bin-test/target/witness.tr diff --git a/circuits/cpp/barretenberg/ts/bin-test/target/main.json b/circuits/cpp/barretenberg/ts/bin-test/target/main.json new file mode 100644 index 000000000000..776e0007598b --- /dev/null +++ b/circuits/cpp/barretenberg/ts/bin-test/target/main.json @@ -0,0 +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/+3YY4xkaRhA4e6xp8e2bavHtj2ztjG2bdu2bWttjm3P9uyp9OnNZP/uJrOb9E2enNxblU5V3qrvVn8dg4OCYgaFH9HtB5aHgqIgKqL5eIyg8OfHQmzEQVzEQ3wkQEKEIBESIwmSIhmSIwVSIhVSIw3SIh3SIwMyIhMyIwuyIhuyIwdyIhdyIw/yIh/yowAKohAKowiKohiKowRKohRKowzKohzKowJCURGVUBlVUBXVUB01UBO1UBt1UBf1UB8N0BCN0BhN0BTN0Bwt0BKt0Bpt0Bbt0B4d0BEv4EW8hJfxCl7Fa3gdb+BNvIW38Q7exXt431lGd5btnOuH+Agf4xN8ik7ojC7oim7ojh7oiV7ojT7oi37ojwEYiEEYjCEYimEYjhEYiVEYjTEYi3EYjwmYiEmYjCmYimmYjhmYiVmYjTmYi3mYjwVYiEVYjCVYimVYjhVYiVVYjTVYi3VYjw3YiE3YjC3Yim3Yjh3YiV3YjT3Yi33YjwM4iEM4jCM4imM4jhM4iVPOIYqzCByfeS3w/Qrx2hf4El/ha3yDb/EdvscP+BE/4Wf8gl/xG3737wW+qxGzPo0zOItzOI8LuIhLuIwruIpruI4buIlbuI07uIt7uI8HeIhHeIwn+ANheBoU/gaDEQVREQ3RESOw1iAWYiMO4iIe4iMBEiIEiZAYSZAUyZAcKZASqZAaaZAW6ZAeGZARmZAZWZAV2ZAdOZATuZAbeZAX+ZAfBVAQhVAYRVAUxVAcJVASpVAaZVAW5VAeFRAaHD7jwHr47Foa5vzDnHmYswpzboHGsDFtLBvbxrFxbTwb3yawCW2ITWQT2yQ2qU1mk9sUNqVNZVPbNDatTWfT2ww2o81kM9ssNqvNZrPbHDanzWVz2zw2r81n89sCtqAtZAvbIraoLWaL2xK2pC1lS9sytqwtZ8vbCjbUVrSVbGVbxVa11Wx1W8PWtLVsbVvH1rX1bH3bwDa0jWxj28Q2tc1sc9vCtrStbGvbxra17Wx728F2tC/YF+1L9mX7in3VvmZft2/YN+1b9m37jn3Xvmfftx888zoDx4eef2Q/tp/YT20n29l2sV1tN9vd9rA9bS/b2/axfW0/298OsAPtIDvYDrFD7TA73I6wI+0oO9qOsWPtODveTrAT7SQ72U6xU+00O93OsDPtLDvbzrFz7Tw73y6wC+0iu9gusUvtMrvcrrAr7Sq72q6xa+06u95usBvtJrvZbrFb7Ta73e6wO+0uu9vusXvtPrvfHrAH7SF72B6xR+0xe9yesCftKfvsb4/A+ef2rx8gFXlGJVRGFVRFNVRHDdRELdRGHdRFPdRHg8gbX+SNz4bayBtfeP9rN77Tnp+xZ+05e95esBftJXvZXrFX7TV73d6wN+0te9vesXftPXvfPrAP7SP72D6xEf+ARHhqAwtQoME2io1qo9noNoaNaWPZ2DaOjWvj2fg2gU1oQ2wim9gmsUltMpvcprApbSqb2qaxaW06m95msBltJpvZZrFZbTab3eawOW0um9vmsXltPpvfFrAFbSFb2BaxRW0xW9yWsCVtKVvalrFlbTlb3lawoRHzDwo//n7jC372xhe4UMlWtlVsVVvNVrc1bE1by9a2dWxdW8/Wtw0iPii+joacN0JjNEFTNENztEBLtEJrtEFbtEN7dAgOf8N+7iN374L+/7t3kbt1z2e3LrBQBBaJf7ojF7kD93x24CKOf2td/ROKWJ6DKhkAAA==","proving_key":null,"verification_key":null,"gates":505505} \ No newline at end of file diff --git a/circuits/cpp/barretenberg/ts/bin-test/target/witness.tr b/circuits/cpp/barretenberg/ts/bin-test/target/witness.tr new file mode 100644 index 0000000000000000000000000000000000000000..82e8cf3ff57ff728998a3c03148be7a7c94acc09 GIT binary patch literal 8258 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