feat: noir_wasm compilation of noir programs#3272
Conversation
This reverts commit 452b858.
| { | ||
| auto add_tuples_helper = [&]<std::size_t... I>(std::index_sequence<I...>) | ||
| { | ||
| auto add_tuples_helper = [&]<std::size_t... I>(std::index_sequence<I...>) { |
There was a problem hiding this comment.
must have an auto formatter on, can revert
|
we may not actually use this for protocol circuits, due to wasm overhead of using noir_wasm vs nargo - TBD |
Benchmark resultsMetrics with a significant change:
Detailed resultsAll benchmarks are run on txs on the This benchmark source data is available in JSON format on S3 here. Values are compared against data from master at commit L2 block published to L1Each column represents the number of txs on an L2 block published to L1.
L2 chain processingEach column represents the number of blocks on the L2 chain where each block has 16 txs.
Circuits statsStats on running time and I/O sizes collected for every circuit run across all benchmarks.
MiscellaneousTransaction sizes based on how many contracts are deployed in the tx.
|
| artifact: NoirCompilationResult, | ||
| ): artifact is NoirContractCompilationArtifacts { | ||
| return (artifact as NoirContractCompilationArtifacts).contract !== undefined; | ||
| } |
There was a problem hiding this comment.
first time trying to do type matching in typescript, so this may not be best way
There was a problem hiding this comment.
The best way is a discriminated union, but if the relationship doesn't have a tag field made for discriminated union this can be the best you can do
|
whoa failing due to some dependency cycles on CI now... |
| interface options { | ||
| // eslint-disable-next-line jsdoc/require-jsdoc | ||
| outdir: string; | ||
| // eslint-disable-next-line jsdoc/require-jsdoc | ||
| typescript: string | undefined; | ||
| // eslint-disable-next-line jsdoc/require-jsdoc | ||
| interface: string | undefined; | ||
| // eslint-disable-next-line jsdoc/require-jsdoc | ||
| compiler: string | undefined; | ||
| } |
There was a problem hiding this comment.
I think the convention is to use pascal case for interface names. Potentially we could simplify the lint rules too
| interface options { | |
| // eslint-disable-next-line jsdoc/require-jsdoc | |
| outdir: string; | |
| // eslint-disable-next-line jsdoc/require-jsdoc | |
| typescript: string | undefined; | |
| // eslint-disable-next-line jsdoc/require-jsdoc | |
| interface: string | undefined; | |
| // eslint-disable-next-line jsdoc/require-jsdoc | |
| compiler: string | undefined; | |
| } | |
| interface Options { | |
| /* eslint-disable jsdoc/require-jsdoc */ | |
| outdir: string; | |
| typescript: string | undefined; | |
| interface: string | undefined; | |
| compiler: string | undefined; | |
| /* eslint-enable jsdoc/require-jsdoc */ | |
| } |
| initializeResolver(this.#resolveFile); | ||
|
|
||
| try { | ||
| const isContract: boolean = true; // this.#package.getType() === 'contract'; |
There was a problem hiding this comment.
WDYT about removing the commented out code at the end? I like the explicit name for the parameter (here and in compileProgram), makes it clear what we're passing.
There was a problem hiding this comment.
oops yeah will remove!
| if (type.kind !== 'struct') { | ||
| return result; | ||
| } | ||
| if (type.kind !== 'struct') {return result;} |
There was a problem hiding this comment.
I think Prettier won't like this if statement on one line with braces.
There was a problem hiding this comment.
yeah weird, i think this was from yarn formatting:fix... will take a look
| const contract = _result as ContractArtifact; | ||
| if (contract.name) { |
There was a problem hiding this comment.
I think this (and the if statement after it) could use the helper method isNoirContractCompilationArtifacts from noir_artifacts.ts
There was a problem hiding this comment.
ahh i just tried, the types are actually slightly different... got bogged down converting ContractArtifact | ProgramArtifact type into NoirContractCompilationArtifacts | NoirProgramCompilationArtifacts
| const circuits = [ | ||
| 'private_kernel_init', | ||
| 'private_kernel_inner', | ||
| 'private_kernel_ordering', | ||
| 'public_kernel_private_previous', | ||
| 'public_kernel_public_previous', | ||
| 'rollup_base', | ||
| 'rollup_merge', | ||
| 'rollup_root', | ||
| ]; | ||
|
|
||
| const main = async () => { | ||
| for (const circuit of circuits) { | ||
| const rawData = await fs.readFile(`./src/target/${circuit}.json`, 'utf-8'); | ||
| const abiObj: NoirCompiledCircuit = JSON.parse(rawData); | ||
| const generatedInterface = generateTsInterface(abiObj.abi); | ||
| await fs.writeFile(`./src/types/${circuit}_types.ts`, generatedInterface); | ||
| } | ||
| }; | ||
|
|
||
| try { | ||
| await main(); | ||
| } catch (err: unknown) { | ||
| log(`Error generating types ${err}`); | ||
| process.exit(1); | ||
| } |
There was a problem hiding this comment.
I might be missing something, looks like this script was moved from noir-protocol-circuits to noir-compiler. Does it not need to execute these steps anymore?
There was a problem hiding this comment.
Oh is it because the circuits are compiled with noir-compiler which will generate TS as part of the pipeline
There was a problem hiding this comment.
ah yes it was moved that way, but we have not moved to noir-wasm for compiling protocol circuits (will see how compile times change, may stick with nargo if CI slows down).
so the "loop" and call logic remains in noir-protocol-circuits, so that the types are generated regardless of if we use noir-wasm or nargo (and we can remove it, if we switch to noir-wasm)
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-packages: 0.16.0</summary> ## [0.16.0](aztec-packages-v0.15.1...aztec-packages-v0.16.0) (2023-11-27) ### ⚠ BREAKING CHANGES * deprecate circuits/cpp ([#3421](#3421)) * call stack validation optimisation. ([#3387](#3387)) ### Features * Base rollup in noir ([#3257](#3257)) ([4a1e9c3](4a1e9c3)) * Call stack validation optimisation. ([#3387](#3387)) ([d06d5db](d06d5db)) * Goblin proof construction ([#3332](#3332)) ([6a7ebb6](6a7ebb6)) * More logs relevant for debugging failures of 2 pixies test ([#3370](#3370)) ([683a0f3](683a0f3)) * Noir subrepo. ([#3369](#3369)) ([d94d88b](d94d88b)) * Noir_wasm compilation of noir programs ([#3272](#3272)) ([f9981d5](f9981d5)) * Rollback public state changes on failure ([#3393](#3393)) ([0e276fb](0e276fb)) ### Bug Fixes * **docs:** Doc explaining noir debug_log ([#3322](#3322)) ([eed023d](eed023d)) * Naming inconsistency in private kernel ([#3384](#3384)) ([4743486](4743486)) * Race condition in `PXE.getTxReceipt(...)` ([#3411](#3411)) ([9557a66](9557a66)) ### Miscellaneous * Deprecate circuits/cpp ([#3421](#3421)) ([4973cfb](4973cfb)) * Deterministically deduplicate `cached_partial_non_native_field_multiplication` across wasm32 and native compilations ([#3425](#3425)) ([5524933](5524933)) * **docs:** Common patterns and anti patterns in aztec.nr ([#3413](#3413)) ([65bd855](65bd855)) * Fix and reenable e2e quick start ([#3403](#3403)) ([112740e](112740e)), closes [#3356](#3356) * Fix intermittent failures for block-building e2e test ([#3404](#3404)) ([e76e2d4](e76e2d4)), closes [#3358](#3358) * Formatted `noir-contracts` and `aztec-nr` ([a73c4aa](a73c4aa)) * Initial clone of noir to subrepo ([#3409](#3409)) ([8f1cb83](8f1cb83)) * **noir-contracts:** Remove redundant return value of 1 ([#3415](#3415)) ([2001d47](2001d47)), closes [#2615](#2615) * Plumbs noir subrepo into yarn-project. ([#3420](#3420)) ([63173c4](63173c4)) * Remove pxe / node /p2p-bootstrap docker images ([#3396](#3396)) ([c236143](c236143)) * Skip artifacts for prettier ([#3399](#3399)) ([98d9e04](98d9e04)) * Update path to acir artifacts ([#3426](#3426)) ([f56f88d](f56f88d)) </details> <details><summary>barretenberg.js: 0.16.0</summary> ## [0.16.0](barretenberg.js-v0.15.1...barretenberg.js-v0.16.0) (2023-11-27) ### Miscellaneous * Plumbs noir subrepo into yarn-project. ([#3420](#3420)) ([63173c4](63173c4)) </details> <details><summary>barretenberg: 0.16.0</summary> ## [0.16.0](barretenberg-v0.15.1...barretenberg-v0.16.0) (2023-11-27) ### Features * Goblin proof construction ([#3332](#3332)) ([6a7ebb6](6a7ebb6)) * Noir subrepo. ([#3369](#3369)) ([d94d88b](d94d88b)) ### Miscellaneous * Deterministically deduplicate `cached_partial_non_native_field_multiplication` across wasm32 and native compilations ([#3425](#3425)) ([5524933](5524933)) * Plumbs noir subrepo into yarn-project. ([#3420](#3420)) ([63173c4](63173c4)) * Update path to acir artifacts ([#3426](#3426)) ([f56f88d](f56f88d)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-packages: 0.16.0</summary> ## [0.16.0](AztecProtocol/aztec-packages@aztec-packages-v0.15.1...aztec-packages-v0.16.0) (2023-11-27) ### ⚠ BREAKING CHANGES * deprecate circuits/cpp ([#3421](AztecProtocol/aztec-packages#3421)) * call stack validation optimisation. ([#3387](AztecProtocol/aztec-packages#3387)) ### Features * Base rollup in noir ([#3257](AztecProtocol/aztec-packages#3257)) ([4a1e9c3](AztecProtocol/aztec-packages@4a1e9c3)) * Call stack validation optimisation. ([#3387](AztecProtocol/aztec-packages#3387)) ([d06d5db](AztecProtocol/aztec-packages@d06d5db)) * Goblin proof construction ([#3332](AztecProtocol/aztec-packages#3332)) ([6a7ebb6](AztecProtocol/aztec-packages@6a7ebb6)) * More logs relevant for debugging failures of 2 pixies test ([#3370](AztecProtocol/aztec-packages#3370)) ([683a0f3](AztecProtocol/aztec-packages@683a0f3)) * Noir subrepo. ([#3369](AztecProtocol/aztec-packages#3369)) ([d94d88b](AztecProtocol/aztec-packages@d94d88b)) * Noir_wasm compilation of noir programs ([#3272](AztecProtocol/aztec-packages#3272)) ([f9981d5](AztecProtocol/aztec-packages@f9981d5)) * Rollback public state changes on failure ([#3393](AztecProtocol/aztec-packages#3393)) ([0e276fb](AztecProtocol/aztec-packages@0e276fb)) ### Bug Fixes * **docs:** Doc explaining noir debug_log ([#3322](AztecProtocol/aztec-packages#3322)) ([eed023d](AztecProtocol/aztec-packages@eed023d)) * Naming inconsistency in private kernel ([#3384](AztecProtocol/aztec-packages#3384)) ([4743486](AztecProtocol/aztec-packages@4743486)) * Race condition in `PXE.getTxReceipt(...)` ([#3411](AztecProtocol/aztec-packages#3411)) ([9557a66](AztecProtocol/aztec-packages@9557a66)) ### Miscellaneous * Deprecate circuits/cpp ([#3421](AztecProtocol/aztec-packages#3421)) ([4973cfb](AztecProtocol/aztec-packages@4973cfb)) * Deterministically deduplicate `cached_partial_non_native_field_multiplication` across wasm32 and native compilations ([#3425](AztecProtocol/aztec-packages#3425)) ([5524933](AztecProtocol/aztec-packages@5524933)) * **docs:** Common patterns and anti patterns in aztec.nr ([#3413](AztecProtocol/aztec-packages#3413)) ([65bd855](AztecProtocol/aztec-packages@65bd855)) * Fix and reenable e2e quick start ([#3403](AztecProtocol/aztec-packages#3403)) ([112740e](AztecProtocol/aztec-packages@112740e)), closes [#3356](AztecProtocol/aztec-packages#3356) * Fix intermittent failures for block-building e2e test ([#3404](AztecProtocol/aztec-packages#3404)) ([e76e2d4](AztecProtocol/aztec-packages@e76e2d4)), closes [#3358](AztecProtocol/aztec-packages#3358) * Formatted `noir-contracts` and `aztec-nr` ([a73c4aa](AztecProtocol/aztec-packages@a73c4aa)) * Initial clone of noir to subrepo ([#3409](AztecProtocol/aztec-packages#3409)) ([8f1cb83](AztecProtocol/aztec-packages@8f1cb83)) * **noir-contracts:** Remove redundant return value of 1 ([#3415](AztecProtocol/aztec-packages#3415)) ([2001d47](AztecProtocol/aztec-packages@2001d47)), closes [#2615](AztecProtocol/aztec-packages#2615) * Plumbs noir subrepo into yarn-project. ([#3420](AztecProtocol/aztec-packages#3420)) ([63173c4](AztecProtocol/aztec-packages@63173c4)) * Remove pxe / node /p2p-bootstrap docker images ([#3396](AztecProtocol/aztec-packages#3396)) ([c236143](AztecProtocol/aztec-packages@c236143)) * Skip artifacts for prettier ([#3399](AztecProtocol/aztec-packages#3399)) ([98d9e04](AztecProtocol/aztec-packages@98d9e04)) * Update path to acir artifacts ([#3426](AztecProtocol/aztec-packages#3426)) ([f56f88d](AztecProtocol/aztec-packages@f56f88d)) </details> <details><summary>barretenberg.js: 0.16.0</summary> ## [0.16.0](AztecProtocol/aztec-packages@barretenberg.js-v0.15.1...barretenberg.js-v0.16.0) (2023-11-27) ### Miscellaneous * Plumbs noir subrepo into yarn-project. ([#3420](AztecProtocol/aztec-packages#3420)) ([63173c4](AztecProtocol/aztec-packages@63173c4)) </details> <details><summary>barretenberg: 0.16.0</summary> ## [0.16.0](AztecProtocol/aztec-packages@barretenberg-v0.15.1...barretenberg-v0.16.0) (2023-11-27) ### Features * Goblin proof construction ([#3332](AztecProtocol/aztec-packages#3332)) ([6a7ebb6](AztecProtocol/aztec-packages@6a7ebb6)) * Noir subrepo. ([#3369](AztecProtocol/aztec-packages#3369)) ([d94d88b](AztecProtocol/aztec-packages@d94d88b)) ### Miscellaneous * Deterministically deduplicate `cached_partial_non_native_field_multiplication` across wasm32 and native compilations ([#3425](AztecProtocol/aztec-packages#3425)) ([5524933](AztecProtocol/aztec-packages@5524933)) * Plumbs noir subrepo into yarn-project. ([#3420](AztecProtocol/aztec-packages#3420)) ([63173c4](AztecProtocol/aztec-packages@63173c4)) * Update path to acir artifacts ([#3426](AztecProtocol/aztec-packages#3426)) ([f56f88d](AztecProtocol/aztec-packages@f56f88d)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Was starting #3273 and ran into an issue - the noir_wasm CLI is configured for compiling azec.nr smart contracts only, so needs update to support
binpackage type.