Skip to content

Commit

Permalink
feat!: make noir_wasm the default compiler (#3090)
Browse files Browse the repository at this point in the history
In #2737 noir_wasm was added back for contract compilation but kept as a
secondary option to Nargo because at the time noir_wasm did not output
debug info. This PR switches the default to noir_wasm because it now
supports everything we need for contract compilation

# 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.
- [x] I have reviewed my diff in github, line by line and removed
unexpected formatting changes, testing logs, or commented-out code.
- [x] 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).
  • Loading branch information
alexghr authored Nov 3, 2023
1 parent fb4f7af commit ca52a3e
Show file tree
Hide file tree
Showing 18 changed files with 62 additions and 344 deletions.
13 changes: 0 additions & 13 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -373,17 +373,6 @@ jobs:
name: "Build and test"
command: build l1-contracts

noir-contracts-build:
machine:
image: ubuntu-2204:2023.07.2
resource_class: large
steps:
- *checkout
- *setup_env
- run:
name: Build
command: build noir-contracts-build | add_timestamps

yarn-project-base:
machine:
image: ubuntu-2204:2023.07.2
Expand Down Expand Up @@ -1237,7 +1226,6 @@ workflows:
<<: *defaults

- l1-contracts: *defaults
- noir-contracts-build: *defaults

- mainnet-fork: *defaults
- deploy-mainnet-fork:
Expand All @@ -1254,7 +1242,6 @@ workflows:
- yarn-project:
requires:
- yarn-project-base
- noir-contracts-build
<<: *defaults
- yarn-project-formatting:
requires:
Expand Down
14 changes: 1 addition & 13 deletions build_manifest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,17 +83,6 @@ circuits-x86_64-linux-clang-assert:
l1-contracts:
buildDir: l1-contracts

# We should move the noir source code to the top of the repo.
# It's currently under yarn-project which looks very circular, but it isn't.
# We're specific with our rebuild patterns as we depend on aztec.nr, but it doesn't have its own build.
noir-contracts-build:
buildDir: yarn-project
projectDir: yarn-project/noir-contracts
rebuildPatterns:
- ^yarn-project/noir-contracts/
- ^yarn-project/noir-compiler/src/noir-version.json
- ^yarn-project/aztec-nr/

yarn-project-base:
buildDir: yarn-project
projectDir: yarn-project/yarn-project-base
Expand All @@ -107,11 +96,10 @@ yarn-project-base:
yarn-project:
buildDir: yarn-project
rebuildPatterns:
- ^yarn-project/.*\.(ts|tsx|js|cjs|mjs|json|html|md|sh)$
- ^yarn-project/.*\.(ts|tsx|js|cjs|mjs|json|html|md|sh|nr|toml)$
- ^yarn-project/Dockerfile
dependencies:
- yarn-project-base
- noir-contracts-build

aztec-sandbox:
buildDir: yarn-project
Expand Down
19 changes: 7 additions & 12 deletions yarn-project/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
# This base dockerfile adds all the remaining source files, performs artifact generation, and builds the project.
# See yarn-project-base/Dockerfile for deeper insight into why things are how they are.
FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/noir-contracts-build as noir
FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/yarn-project-base as builder

RUN apk add bash perl

# Copy in the entire workspace.
COPY . .

# Generate Noir contract TypeScript artifacts.
COPY --from=noir /usr/src/yarn-project/noir-contracts/target /usr/src/yarn-project/noir-contracts/target
# Run yarn build to have the json artifacts available for the types generator, generate types, build again.
RUN apk add perl
RUN cd /usr/src/yarn-project/noir-contracts && yarn build && ./scripts/types_all.sh && yarn build
# Cleanup to reduce final image size.
RUN rm -rf noir-contracts/target

# Build the entire project.
RUN yarn tsc -b
RUN yarn workspace @aztec/foundation build && \
yarn workspace @aztec/noir-compiler build && \
yarn workspace @aztec/noir-contracts noir:build:all && \
yarn tsc -b

# Build aztec.js web artifact
RUN cd /usr/src/yarn-project/aztec.js && yarn build:web
Expand All @@ -37,4 +32,4 @@ RUN cp /usr/src/circuits/cpp/build-wasm/bin/aztec3-circuits.wasm /usr/src/yarn-p

WORKDIR /usr/src/yarn-project

ENTRYPOINT ["yarn"]
ENTRYPOINT ["yarn"]
6 changes: 3 additions & 3 deletions yarn-project/aztec-sandbox/src/bin/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { createAztecNodeRpcServer } from '@aztec/aztec-node';
import { deployInitialSandboxAccounts } from '@aztec/aztec.js';
import { createDebugLogger } from '@aztec/foundation/log';
import { fileURLToPath } from '@aztec/foundation/url';
import { NoirVersion } from '@aztec/noir-compiler/noir-version';
import { NoirWasmVersion } from '@aztec/noir-compiler/noir-version';
import { createPXERpcServer } from '@aztec/pxe';

import { readFileSync } from 'fs';
Expand Down Expand Up @@ -52,7 +52,7 @@ async function main() {
const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../package.json');
const version = JSON.parse(readFileSync(packageJsonPath).toString()).version;

logger.info(`Setting up Aztec Sandbox v${version} (nargo ${NoirVersion.tag}), please stand by...`);
logger.info(`Setting up Aztec Sandbox v${version} (noir v${NoirWasmVersion}), please stand by...`);

const { pxe, node, stop, accounts } = await createAndInitialiseSandbox();

Expand Down Expand Up @@ -85,7 +85,7 @@ async function main() {
logger.info(
`${splash}\n${github}\n\n`
.concat(...accountStrings)
.concat(`Aztec Sandbox v${version} (nargo ${NoirVersion.tag}) is now ready for use!`),
.concat(`Aztec Sandbox v${version} (noir v${NoirWasmVersion}) is now ready for use!`),
);
}

Expand Down
12 changes: 5 additions & 7 deletions yarn-project/bootstrap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,14 @@ set -eu
yarn install --immutable

# Build the necessary dependencies for Aztec.nr contracts typegen.
for DIR in foundation noir-compiler; do
echo "Building $DIR..."
cd $DIR
yarn build
cd ..
for package in "@aztec/foundation" "@aztec/noir-compiler"; do
echo "Building $package"
yarn workspace $package build
done

# Run remake bindings before building Aztec.nr contracts or l1 contracts as they depend on files created by it.
yarn --cwd circuits.js remake-bindings
yarn --cwd circuits.js remake-constants
yarn workspace @aztec/circuits.js remake-bindings
yarn workspace @aztec/circuits.js remake-constants

(cd noir-contracts && ./bootstrap.sh)
(cd boxes && ./bootstrap.sh)
Expand Down
6 changes: 4 additions & 2 deletions yarn-project/noir-compiler/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@
"dependencies": {
"@aztec/foundation": "workspace:^",
"@ltd/j-toml": "^1.38.0",
"@noir-lang/noir_wasm": "0.18.0-3919619.aztec",
"@noir-lang/source-resolver": "0.18.0-3919619.aztec",
"@noir-lang/noir_wasm": "0.18.0-6ca33a2.aztec",
"@noir-lang/source-resolver": "0.18.0-6ca33a2.aztec",
"base64-js": "^1.5.1",
"commander": "^9.0.0",
"fs-extra": "^11.1.1",
Expand All @@ -59,6 +59,7 @@
"lodash.upperfirst": "^4.3.1",
"memfs": "^4.6.0",
"pako": "^2.1.0",
"semver": "^7.5.4",
"tslib": "^2.4.0",
"unzipit": "^1.4.3"
},
Expand All @@ -74,6 +75,7 @@
"@types/lodash.upperfirst": "^4.3.7",
"@types/node": "^18.7.23",
"@types/pako": "^2.0.0",
"@types/semver": "^7.5.4",
"jest": "^29.5.0",
"ts-jest": "^29.1.0",
"ts-node": "^10.9.1",
Expand Down
192 changes: 2 additions & 190 deletions yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -3,197 +3,10 @@
exports[`noir-compiler using nargo compiles the test contract 1`] = `
[
{
"debug": {
"debugSymbols": [
"eJyrVsrJT04syczPK1ayqlYyULKKrlYqLkjMA/GKSxKLSpSsDE0MdZRS81KALFOzWh2ltMycVCC7VgdDpbEJVKGZOVydsSkWhUaGZlCVRiaWCKW1sbW1AA1jLOg=",
"eJyrVsrJT04syczPK1ayqq6tBQAz9wY7",
],
"fileMap": {
"1": {
"path": "/home/ubuntu/host/aztec-packages/yarn-project/noir-compiler/src/fixtures/test_contract/src/main.nr",
"source": "contract TestContract {
use dep::test::module::foo;
fn constructor(param: Field, pub_param: pub Field) -> pub [Field; 2] {
[foo::bar(param), param + pub_param]
}
open fn openFunction() -> pub Field {
42
}
}
",
},
"3": {
"path": "std/hash.nr",
"source": "mod poseidon;
#[foreign(sha256)]
pub fn sha256<N>(_input : [u8; N]) -> [u8; 32] {}
#[foreign(blake2s)]
pub fn blake2s<N>(_input : [u8; N]) -> [u8; 32] {}
pub fn pedersen<N>(input : [Field; N]) -> [Field; 2] {
pedersen_with_separator(input, 0)
}
#[foreign(pedersen)]
pub fn pedersen_with_separator<N>(_input : [Field; N], _separator : u32) -> [Field; 2] {}
pub fn pedersen_hash<N>(input : [Field; N]) -> Field {
pedersen_hash_with_separator(input, 0)
}
#[foreign(pedersen_hash)]
pub fn pedersen_hash_with_separator<N>(_input : [Field; N], _separator : u32) -> Field {}
#[foreign(hash_to_field_128_security)]
pub fn hash_to_field<N>(_input : [Field; N]) -> Field {}
#[foreign(keccak256)]
pub fn keccak256<N>(_input : [u8; N], _message_size: u32) -> [u8; 32] {}
// mimc-p/p implementation
// constants are (publicly generated) random numbers, for instance using keccak as a ROM.
// You must use constants generated for the native field
// Rounds number should be ~ log(p)/log(exp)
// For 254 bit primes, exponent 7 and 91 rounds seems to be recommended
fn mimc<N>(x: Field, k: Field, constants: [Field; N], exp : Field) -> Field {
//round 0
let mut t = x + k;
let mut h = t.pow_32(exp);
//next rounds
for i in 1 .. constants.len() {
t = h + k + constants[i];
h = t.pow_32(exp);
};
h + k
}
global MIMC_BN254_ROUNDS = 91;
//mimc implementation with hardcoded parameters for BN254 curve.
pub fn mimc_bn254<N>(array: [Field; N]) -> Field {
//mimc parameters
let exponent = 7;
//generated from seed "mimc" using keccak256
let constants: [Field; MIMC_BN254_ROUNDS] = [
0,
20888961410941983456478427210666206549300505294776164667214940546594746570981,
15265126113435022738560151911929040668591755459209400716467504685752745317193,
8334177627492981984476504167502758309043212251641796197711684499645635709656,
1374324219480165500871639364801692115397519265181803854177629327624133579404,
11442588683664344394633565859260176446561886575962616332903193988751292992472,
2558901189096558760448896669327086721003508630712968559048179091037845349145,
11189978595292752354820141775598510151189959177917284797737745690127318076389,
3262966573163560839685415914157855077211340576201936620532175028036746741754,
17029914891543225301403832095880481731551830725367286980611178737703889171730,
4614037031668406927330683909387957156531244689520944789503628527855167665518,
19647356996769918391113967168615123299113119185942498194367262335168397100658,
5040699236106090655289931820723926657076483236860546282406111821875672148900,
2632385916954580941368956176626336146806721642583847728103570779270161510514,
17691411851977575435597871505860208507285462834710151833948561098560743654671,
11482807709115676646560379017491661435505951727793345550942389701970904563183,
8360838254132998143349158726141014535383109403565779450210746881879715734773,
12663821244032248511491386323242575231591777785787269938928497649288048289525,
3067001377342968891237590775929219083706800062321980129409398033259904188058,
8536471869378957766675292398190944925664113548202769136103887479787957959589,
19825444354178182240559170937204690272111734703605805530888940813160705385792,
16703465144013840124940690347975638755097486902749048533167980887413919317592,
13061236261277650370863439564453267964462486225679643020432589226741411380501,
10864774797625152707517901967943775867717907803542223029967000416969007792571,
10035653564014594269791753415727486340557376923045841607746250017541686319774,
3446968588058668564420958894889124905706353937375068998436129414772610003289,
4653317306466493184743870159523234588955994456998076243468148492375236846006,
8486711143589723036499933521576871883500223198263343024003617825616410932026,
250710584458582618659378487568129931785810765264752039738223488321597070280,
2104159799604932521291371026105311735948154964200596636974609406977292675173,
16313562605837709339799839901240652934758303521543693857533755376563489378839,
6032365105133504724925793806318578936233045029919447519826248813478479197288,
14025118133847866722315446277964222215118620050302054655768867040006542798474,
7400123822125662712777833064081316757896757785777291653271747396958201309118,
1744432620323851751204287974553233986555641872755053103823939564833813704825,
8316378125659383262515151597439205374263247719876250938893842106722210729522,
6739722627047123650704294650168547689199576889424317598327664349670094847386,
21211457866117465531949733809706514799713333930924902519246949506964470524162,
13718112532745211817410303291774369209520657938741992779396229864894885156527,
5264534817993325015357427094323255342713527811596856940387954546330728068658,
18884137497114307927425084003812022333609937761793387700010402412840002189451,
5148596049900083984813839872929010525572543381981952060869301611018636120248,
19799686398774806587970184652860783461860993790013219899147141137827718662674,
19240878651604412704364448729659032944342952609050243268894572835672205984837,
10546185249390392695582524554167530669949955276893453512788278945742408153192,
5507959600969845538113649209272736011390582494851145043668969080335346810411,
18177751737739153338153217698774510185696788019377850245260475034576050820091,
19603444733183990109492724100282114612026332366576932662794133334264283907557,
10548274686824425401349248282213580046351514091431715597441736281987273193140,
1823201861560942974198127384034483127920205835821334101215923769688644479957,
11867589662193422187545516240823411225342068709600734253659804646934346124945,
18718569356736340558616379408444812528964066420519677106145092918482774343613,
10530777752259630125564678480897857853807637120039176813174150229243735996839,
20486583726592018813337145844457018474256372770211860618687961310422228379031,
12690713110714036569415168795200156516217175005650145422920562694422306200486,
17386427286863519095301372413760745749282643730629659997153085139065756667205,
2216432659854733047132347621569505613620980842043977268828076165669557467682,
6309765381643925252238633914530877025934201680691496500372265330505506717193,
20806323192073945401862788605803131761175139076694468214027227878952047793390,
4037040458505567977365391535756875199663510397600316887746139396052445718861,
19948974083684238245321361840704327952464170097132407924861169241740046562673,
845322671528508199439318170916419179535949348988022948153107378280175750024,
16222384601744433420585982239113457177459602187868460608565289920306145389382,
10232118865851112229330353999139005145127746617219324244541194256766741433339,
6699067738555349409504843460654299019000594109597429103342076743347235369120,
6220784880752427143725783746407285094967584864656399181815603544365010379208,
6129250029437675212264306655559561251995722990149771051304736001195288083309,
10773245783118750721454994239248013870822765715268323522295722350908043393604,
4490242021765793917495398271905043433053432245571325177153467194570741607167,
19596995117319480189066041930051006586888908165330319666010398892494684778526,
837850695495734270707668553360118467905109360511302468085569220634750561083,
11803922811376367215191737026157445294481406304781326649717082177394185903907,
10201298324909697255105265958780781450978049256931478989759448189112393506592,
13564695482314888817576351063608519127702411536552857463682060761575100923924,
9262808208636973454201420823766139682381973240743541030659775288508921362724,
173271062536305557219323722062711383294158572562695717740068656098441040230,
18120430890549410286417591505529104700901943324772175772035648111937818237369,
20484495168135072493552514219686101965206843697794133766912991150184337935627,
19155651295705203459475805213866664350848604323501251939850063308319753686505,
11971299749478202793661982361798418342615500543489781306376058267926437157297,
18285310723116790056148596536349375622245669010373674803854111592441823052978,
7069216248902547653615508023941692395371990416048967468982099270925308100727,
6465151453746412132599596984628739550147379072443683076388208843341824127379,
16143532858389170960690347742477978826830511669766530042104134302796355145785,
19362583304414853660976404410208489566967618125972377176980367224623492419647,
1702213613534733786921602839210290505213503664731919006932367875629005980493,
10781825404476535814285389902565833897646945212027592373510689209734812292327,
4212716923652881254737947578600828255798948993302968210248673545442808456151,
7594017890037021425366623750593200398174488805473151513558919864633711506220,
18979889247746272055963929241596362599320706910852082477600815822482192194401,
13602139229813231349386885113156901793661719180900395818909719758150455500533,
];
let mut r = 0;
for elem in array {
let h = mimc(elem, r, constants, exponent);
r = r + elem + h;
}
r
}
",
},
"35": {
"path": "/home/ubuntu/host/aztec-packages/yarn-project/noir-compiler/src/fixtures/test_lib/src/module/foo.nr",
"source": "fn bar(param: Field) -> Field {
dep::std::hash::pedersen([param])[0]
}",
},
},
},
"events": [],
"functions": [
{
"bytecode": "H4sIAAAAAAAA/61RQQ7DMAij6bL3QIAGbvvKoqX/f8G0TqVSem4tWTYXC9kZABLsmDY+Q4/7G37e+IAz5tBXKF4DTTdmpSGLcRHptXRiemPxZoqibTEyUtNPMeZuYtWbV3QS7rSq8xph+b6/cOz28GnY4N9pHjr+AWqna3ugAQAA",
"bytecode": "H4sIAAAAAAAA/62QUQqEMAxEY7ew10maxCZ/e5Ut1vufQFRsoX7rQJiZnyG8CAABLk3HfZv3vrX8gbt6/zXHZ6Lpxa0wbDHOIjWnSkx/TF5MUbTMRkZquiRjriaWvXhGJ+FKqzqvbSy+9xeOXHsOA/+TaRwY7+UbOCacAQAA",
"functionType": "secret",
"isInternal": false,
"name": "constructor",
Expand Down Expand Up @@ -382,11 +195,10 @@ export class TestContractContract extends ContractBase {
exports[`noir-compiler using wasm binary compiles the test contract 1`] = `
[
{
"debug": undefined,
"events": [],
"functions": [
{
"bytecode": "H4sIAAAAAAAA/61RQQ7DMAij6bL3QIAGbvvKoqX/f8G0TqVSem4tWTYXC9kZABLsmDY+Q4/7G37e+IAz5tBXKF4DTTdmpSGLcRHptXRiemPxZoqibTEyUtNPMeZuYtWbV3QS7rSq8xph+b6/cOz28GnY4N9pHjr+AWqna3ugAQAA",
"bytecode": "H4sIAAAAAAAA/62QUQqEMAxEY7ew10maxCZ/e5Ut1vufQFRsoX7rQJiZnyG8CAABLk3HfZv3vrX8gbt6/zXHZ6Lpxa0wbDHOIjWnSkx/TF5MUbTMRkZquiRjriaWvXhGJ+FKqzqvbSy+9xeOXHsOA/+TaRwY7+UbOCacAQAA",
"functionType": "secret",
"isInternal": false,
"name": "constructor",
Expand Down
Loading

0 comments on commit ca52a3e

Please sign in to comment.