-
Notifications
You must be signed in to change notification settings - Fork 185
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: noir_wasm compilation of noir programs #3272
Merged
Merged
Changes from all commits
Commits
Show all changes
42 commits
Select commit
Hold shift + click to select a range
41413c5
stop committing artifacts
dan-aztec b2c5741
undo box artifact changes
dan-aztec 9abd0ff
compile non-contract package types with noir-wasm-compiler.ts
dan-aztec b51c19a
revert "binary" to "bin"
dan-aztec e44955d
bin
dan-aztec fa43b73
revert to nargo for compiler
dan-aztec 27c62b2
use types, still broken
dan-aztec ae7ef52
remove src/target from git
dan-aztec 94d6399
handle non-contract return type
dan-aztec 1473663
generate types
dan-aztec 3a9bd7e
handle program differently from contract
dan-aztec d62887e
handle program and contract separately
dan-aztec cde221e
update test
dan-aztec d26d6ac
stop logging
dan-aztec d1b1d4e
fix type
dan-aztec c34bb69
switch command name to compile
dan-aztec c79086e
readd src/target for testing
dan-aztec d1f1ecb
point outdir to src/target
dan-aztec e655751
single build, and absoltue path to /src/target
dan-aztec 7ebbf5d
merge conflicts
dan-aztec 452b858
checkout origin/master barretenberg?
dan-aztec c635a05
fetch
dan-aztec e2c70da
Revert "checkout origin/master barretenberg?"
dan-aztec eae79ec
revert noir-protocol-circuits changes
dan-aztec cf82db1
origin not local
dan-aztec 1f38e39
revert more protocol circuits changes
dan-aztec 71ba52f
rename to compileNoir
dan-aztec 0911592
Merge branch 'master' into dan/build-artifacts-ci-merge-conflicgt
dan-aztec 955417e
update yarn command to compile
dan-aztec 8efa75a
revert formatting
dan-aztec 47b8c2b
Merge branch 'master' into dan/build-artifacts-ci-merge-conflicgt
dan-aztec af5832f
update compileContract name
dan-aztec eb6f46e
Merge branch 'master' into dan/build-artifacts-ci-merge-conflicgt
dan-aztec d7abdb5
merge conflict
dan-aztec c2659eb
small change to output json data
dan-aztec 857101e
move generateTypescript logic out of noir-protocol-circuits
dan-aztec d3a51cc
write program types to ../types/
dan-aztec 2dde02d
remove formatted deleted code
dan-aztec d2af58d
revert cpp format
dan-aztec d5ada69
revert package.json change
dan-aztec ac66988
formatting
dan-aztec b0be295
formatting
dan-aztec File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
import { ContractArtifact } from '@aztec/foundation/abi'; | ||
import { LogFn } from '@aztec/foundation/log'; | ||
|
||
import { Command } from 'commander'; | ||
import { mkdirSync, writeFileSync } from 'fs'; | ||
import { mkdirpSync } from 'fs-extra'; | ||
import path, { resolve } from 'path'; | ||
|
||
import { | ||
ProgramArtifact, | ||
compileUsingNargo, | ||
compileUsingNoirWasm, | ||
generateNoirContractInterface, | ||
generateTypescriptContractInterface, | ||
generateTypescriptProgramInterface, | ||
} from '../index.js'; | ||
|
||
/** | ||
* CLI options for configuring behavior | ||
*/ | ||
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; | ||
} | ||
/** | ||
* Registers a 'contract' command on the given commander program that compiles an Aztec.nr contract project. | ||
* @param program - Commander program. | ||
* @param log - Optional logging function. | ||
* @returns The program with the command registered. | ||
*/ | ||
export function compileNoir(program: Command, name = 'compile', log: LogFn = () => {}): Command { | ||
return program | ||
.command(name) | ||
.argument('<project-path>', 'Path to the bin or Aztec.nr project to compile') | ||
.option('-o, --outdir <path>', 'Output folder for the binary artifacts, relative to the project path', 'target') | ||
.option('-ts, --typescript <path>', 'Optional output folder for generating typescript wrappers', undefined) | ||
.option('-i, --interface <path>', 'Optional output folder for generating an Aztec.nr contract interface', undefined) | ||
.option('-c --compiler <string>', 'Which compiler to use. Either nargo or wasm. Defaults to nargo', 'wasm') | ||
.description('Compiles the Noir Source in the target project') | ||
|
||
.action(async (projectPath: string, options: Options) => { | ||
const { compiler } = options; | ||
if (typeof projectPath !== 'string') { | ||
throw new Error(`Missing project path argument`); | ||
} | ||
if (compiler !== 'nargo' && compiler !== 'wasm') { | ||
throw new Error(`Invalid compiler: ${compiler}`); | ||
} | ||
|
||
const compile = compiler === 'wasm' ? compileUsingNoirWasm : compileUsingNargo; | ||
log(`Compiling ${projectPath} with ${compiler} backend...`); | ||
const results = await compile(projectPath, { log }); | ||
for (const result of results) { | ||
generateOutput(projectPath, result, options, log); | ||
} | ||
}); | ||
} | ||
|
||
/** | ||
* | ||
* @param contract - output from compiler, to serialize locally. branch based on Contract vs Program | ||
*/ | ||
function generateOutput( | ||
projectPath: string, | ||
_result: ContractArtifact | ProgramArtifact, | ||
options: Options, | ||
log: LogFn, | ||
) { | ||
const contract = _result as ContractArtifact; | ||
if (contract.name) { | ||
return generateContractOutput(projectPath, contract, options, log); | ||
} else { | ||
const program = _result as ProgramArtifact; | ||
if (program.abi) { | ||
return generateProgramOutput(projectPath, program, options, log); | ||
} | ||
} | ||
} | ||
/** | ||
* | ||
* @param program - output from compiler, to serialize locally | ||
*/ | ||
function generateProgramOutput(projectPath: string, program: ProgramArtifact, options: Options, log: LogFn) { | ||
const currentDir = process.cwd(); | ||
const { outdir, typescript, interface: noirInterface } = options; | ||
const artifactPath = resolve(projectPath, outdir, `${program.name ? program.name : 'main'}.json`); | ||
log(`Writing ${program.name} artifact to ${path.relative(currentDir, artifactPath)}`); | ||
mkdirSync(path.dirname(artifactPath), { recursive: true }); | ||
writeFileSync(artifactPath, JSON.stringify(program, null, 2)); | ||
|
||
if (noirInterface) { | ||
log(`noirInterface generation not implemented for programs`); | ||
// not implemented | ||
} | ||
|
||
if (typescript) { | ||
// just need type definitions, since a lib has just one entry point | ||
const tsPath = resolve(projectPath, typescript, `../types/${program.name}_types.ts`); | ||
log(`Writing ${program.name} typescript types to ${path.relative(currentDir, tsPath)}`); | ||
const tsWrapper = generateTypescriptProgramInterface(program.abi); | ||
mkdirpSync(path.dirname(tsPath)); | ||
writeFileSync(tsPath, tsWrapper); | ||
} | ||
} | ||
|
||
/** | ||
* | ||
* @param contract - output from compiler, to serialize locally | ||
*/ | ||
function generateContractOutput(projectPath: string, contract: ContractArtifact, options: Options, log: LogFn) { | ||
const currentDir = process.cwd(); | ||
const { outdir, typescript, interface: noirInterface } = options; | ||
const artifactPath = resolve(projectPath, outdir, `${contract.name}.json`); | ||
log(`Writing ${contract.name} artifact to ${path.relative(currentDir, artifactPath)}`); | ||
mkdirSync(path.dirname(artifactPath), { recursive: true }); | ||
writeFileSync(artifactPath, JSON.stringify(contract, null, 2)); | ||
|
||
if (noirInterface) { | ||
const noirInterfacePath = resolve(projectPath, noirInterface, `${contract.name}_interface.nr`); | ||
log(`Writing ${contract.name} Aztec.nr external interface to ${path.relative(currentDir, noirInterfacePath)}`); | ||
const noirWrapper = generateNoirContractInterface(contract); | ||
mkdirpSync(path.dirname(noirInterfacePath)); | ||
writeFileSync(noirInterfacePath, noirWrapper); | ||
} | ||
|
||
if (typescript) { | ||
const tsPath = resolve(projectPath, typescript, `${contract.name}.ts`); | ||
log(`Writing ${contract.name} typescript interface to ${path.relative(currentDir, tsPath)}`); | ||
let relativeArtifactPath = path.relative(path.dirname(tsPath), artifactPath); | ||
if (relativeArtifactPath === `${contract.name}.json`) { | ||
// relative path edge case, prepending ./ for local import - the above logic just does | ||
// `${contract.name}.json`, which is not a valid import for a file in the same directory | ||
relativeArtifactPath = `./${contract.name}.json`; | ||
} | ||
const tsWrapper = generateTypescriptContractInterface(contract, relativeArtifactPath); | ||
mkdirpSync(path.dirname(tsPath)); | ||
writeFileSync(tsPath, tsWrapper); | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
export { compileContract } from './contract.js'; | ||
export { compileNoir } from './compileNoir.js'; | ||
export { generateNoirInterface } from './noir-interface.js'; | ||
export { generateTypescriptInterface } from './typescript.js'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this (and the if statement after it) could use the helper method
isNoirContractCompilationArtifacts
fromnoir_artifacts.ts
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ahh i just tried, the types are actually slightly different... got bogged down converting
ContractArtifact | ProgramArtifact
type intoNoirContractCompilationArtifacts | NoirProgramCompilationArtifacts