From b3ee3d979172c9d4eae3f9090d0fbbc05fc5a613 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Fri, 18 Aug 2023 21:14:56 +0100 Subject: [PATCH] chore: Add rebuild pattern for bb-bin-tests to rebuild when ts folder is changed and add target folder for bb-bin-test (#1640) Please provide a paragraph or two giving a summary of the change, including relevant motivation and context. # Checklist: Remove the checklist to signal you've completed it. Enable auto-merge if the PR is ready to merge. - [ ] If the pull request requires a cryptography review (e.g. cryptographic algorithm implementations) I have added the 'crypto' tag. - [ ] I have reviewed my diff in github, line by line and removed unexpected formatting changes, testing logs, or commented-out code. - [ ] Every change is related to the PR description. - [ ] I have [linked](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) this pull request to relevant issues (if any exist). --------- Co-authored-by: Maddiaa0 <47148561+Maddiaa0@users.noreply.github.com> --- .circleci/config.yml | 12 ------------ build-system/scripts/query_manifest | 2 +- circuits/cpp/barretenberg/ts/Dockerfile | 5 +++++ circuits/cpp/barretenberg/ts/README.md | 1 + circuits/cpp/barretenberg/ts/bb.js-dev | 6 ------ .../cpp/barretenberg/ts/bin-test/bin-test.sh | 2 +- .../barretenberg/ts/bin-test/target/main.json | 1 + .../barretenberg/ts/bin-test/target/witness.tr | Bin 0 -> 8258 bytes 8 files changed, 9 insertions(+), 20 deletions(-) delete mode 100755 circuits/cpp/barretenberg/ts/bb.js-dev 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/.circleci/config.yml b/.circleci/config.yml index e64f5d7df92..82b41376504 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 barretenberg-x86_64-linux-clang-assert - barretenberg-benchmark-aggregator: docker: - image: aztecprotocol/alpine-build-image @@ -1211,7 +1200,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_test - barretenberg-benchmark-aggregator: requires: - barretenberg-tests diff --git a/build-system/scripts/query_manifest b/build-system/scripts/query_manifest index b4e8fe8c49b..f968f8fb57c 100755 --- a/build-system/scripts/query_manifest +++ b/build-system/scripts/query_manifest @@ -52,4 +52,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 diff --git a/circuits/cpp/barretenberg/ts/Dockerfile b/circuits/cpp/barretenberg/ts/Dockerfile index 1a94506a443..14f47a9ea56 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/README.md b/circuits/cpp/barretenberg/ts/README.md index fd6e8ff1751..eee071b8787 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. + diff --git a/circuits/cpp/barretenberg/ts/bb.js-dev b/circuits/cpp/barretenberg/ts/bb.js-dev deleted file mode 100755 index 1f93688795d..00000000000 --- 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 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 146f30e1b0a..49c0ee1bda5 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 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 00000000000..776e0007598 --- /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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