Created
August 11, 2023 19:46
-
-
Save critesjosh/4aa36e87a0cc3f09feaf1febb4d11348 to your computer and use it in GitHub Desktop.
the full script for the instructive page here: https://noir-lang.org/typescript
This file contains hidden or 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
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(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@infinitywarp I recommend trying this new guide: https://noir-lang.org/dev/noir_js/getting_started/tiny_noir_app