-
-
Save critesjosh/4aa36e87a0cc3f09feaf1febb4d11348 to your computer and use it in GitHub Desktop.
import circuit from '../target/test.json' assert { type: 'json' }; | |
import { decompressSync } from 'fflate'; | |
import { Crs, newBarretenbergApiAsync, RawBuffer } from '@aztec/bb.js/dest/node/index.js'; | |
import { ethers } from 'ethers'; // I'm lazy so I'm using ethers to pad my input | |
import { executeCircuit, compressWitness } from '@noir-lang/acvm_js'; | |
async function main() { | |
const acirBuffer = Buffer.from(circuit.bytecode, 'base64'); | |
const acirBufferUncompressed = decompressSync(acirBuffer); | |
const api = await newBarretenbergApiAsync(4); | |
const [exact, circuitSize, subgroup] = await api.acirGetCircuitSizes(acirBufferUncompressed); | |
const subgroupSize = Math.pow(2, Math.ceil(Math.log2(circuitSize))); | |
const crs = await Crs.new(subgroupSize + 1); | |
await api.commonInitSlabAllocator(subgroupSize); | |
await api.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data())); | |
const acirComposer = await api.acirNewAcirComposer(subgroupSize); | |
async function generateWitness(input: any, acirBuffer: Buffer): Promise<Uint8Array> { | |
const initialWitness = new Map<number, string>(); | |
initialWitness.set(1, ethers.utils.hexZeroPad(`0x${input.x.toString(16)}`, 32)); | |
initialWitness.set(2, ethers.utils.hexZeroPad(`0x${input.y.toString(16)}`, 32)); | |
// initialWitness.set(3, ethers.utils.hexZeroPad(`0x${input.z.toString(16)}`, 32)); | |
const witnessMap = await executeCircuit(acirBuffer, initialWitness, () => { | |
throw Error('unexpected oracle'); | |
}); | |
const witnessBuff = compressWitness(witnessMap); | |
return witnessBuff; | |
} | |
async function generateProof(witness: Uint8Array) { | |
const proof = await api.acirCreateProof( | |
acirComposer, | |
acirBufferUncompressed, | |
decompressSync(witness), | |
false, | |
); | |
return proof; | |
} | |
async function verifyProof(proof: Uint8Array) { | |
await api.acirInitProvingKey(acirComposer, acirBufferUncompressed); | |
const verified = await api.acirVerifyProof(acirComposer, proof, false); | |
return verified; | |
} | |
const input = { x: 3, y: 4 }; | |
const witness = await generateWitness(input, acirBuffer); | |
console.log('Witness generated!'); | |
const proof = await generateProof(witness); | |
console.log('Proof generated!'); | |
await verifyProof(proof); | |
console.log('Proof verified!'); | |
api.destroy(); | |
} | |
main(); |
I keep getting this error, from inside the node_modules after setting up tsconfig and package.json as provided in the tutorial here: https://noir-lang.org/typescript
`npx tsc index.ts
index.ts:1:21 - error TS2732: Cannot find module './target/MyCircuit.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.
1 import circuit from "./target/MyCircuit.json" assert { type: "json" };
~~~~~~~~~~~~~~~~~~~~~~~~~
index.ts:1:47 - error TS2821: Import assertions are only supported when the '--module' option is set to 'esnext' or 'nodenext'.
1 import circuit from "./target/MyCircuit.json" assert { type: "json" };
~~~~~~~~~~~~~~~~~~~~~~~
node_modules/@aztec/bb.js/dest/node/barretenberg_wasm/barretenberg_wasm.d.ts:1:23 - error TS1452: 'resolution-mode' assertions are only supported when moduleResolution
is node16
or nodenext
.
1 ///
~~~~
node_modules/@aztec/bb.js/dest/node/types/node/point.d.ts:1:23 - error TS1452: 'resolution-mode' assertions are only supported when moduleResolution
is node16
or nodenext
.
1 ///
~~~~
Found 4 errors in 3 files.
Errors Files
2 index.ts:1
1 node_modules/@aztec/bb.js/dest/node/barretenberg_wasm/barretenberg_wasm.d.ts:1
1 node_modules/@aztec/bb.js/dest/node/types/node/point.d.ts:1
`
tsconfig: https://gist.github.com/critesjosh/6f3ba19fdc9298b24e90ba4f736247dc
package.json:
{ "name": "mycircuit", "version": "1.0.0", "type": "module", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@types/node": "^20.8.6", "typescript": "^5.2.2" }, "dependencies": { "@aztec/bb.js": "^0.3.6", "@noir-lang/acvm_js": "git+https://[email protected]/noir-lang/acvm-simulator-wasm.git#b9d9ca9dfc5140839f23998d9466307215607c42", "ethers": "^5.7.2", "fflate": "^0.8.1" } }
@infinitywarp I recommend trying this new guide: https://noir-lang.org/dev/noir_js/getting_started/tiny_noir_app
Yes, noir will cover all of the constraints defined in the circuit during the proof generation process. I don't think the pedersen hash calculation requires generating constrains, you only really care about constraining the result, no?