@aztec/pxe 0.37.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dest/config/index.d.ts +17 -2
  2. package/dest/config/index.d.ts.map +1 -1
  3. package/dest/config/index.js +1 -1
  4. package/dest/index.d.ts +1 -0
  5. package/dest/index.d.ts.map +1 -1
  6. package/dest/index.js +3 -1
  7. package/dest/kernel_oracle/index.d.ts +1 -1
  8. package/dest/kernel_oracle/index.d.ts.map +1 -1
  9. package/dest/kernel_oracle/index.js +2 -2
  10. package/dest/kernel_prover/bb_prover/bb_native_proof_creator.d.ts +95 -0
  11. package/dest/kernel_prover/bb_prover/bb_native_proof_creator.d.ts.map +1 -0
  12. package/dest/kernel_prover/bb_prover/bb_native_proof_creator.js +437 -0
  13. package/dest/kernel_prover/{proof_creator.d.ts → interface/proof_creator.d.ts} +16 -35
  14. package/dest/kernel_prover/interface/proof_creator.d.ts.map +1 -0
  15. package/dest/kernel_prover/interface/proof_creator.js +2 -0
  16. package/dest/kernel_prover/kernel_prover.d.ts +4 -4
  17. package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
  18. package/dest/kernel_prover/kernel_prover.js +10 -37
  19. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_hints.d.ts +1 -1
  20. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_hints.d.ts.map +1 -1
  21. package/dest/kernel_prover/private_inputs_builders/build_private_kernel_tail_hints.js +4 -33
  22. package/dest/kernel_prover/proving_data_oracle.d.ts +1 -1
  23. package/dest/kernel_prover/proving_data_oracle.d.ts.map +1 -1
  24. package/dest/kernel_prover/test/test_circuit_prover.d.ts +16 -0
  25. package/dest/kernel_prover/test/test_circuit_prover.d.ts.map +1 -0
  26. package/dest/kernel_prover/test/test_circuit_prover.js +67 -0
  27. package/dest/pxe_service/create_pxe_service.d.ts +3 -1
  28. package/dest/pxe_service/create_pxe_service.d.ts.map +1 -1
  29. package/dest/pxe_service/create_pxe_service.js +16 -3
  30. package/dest/pxe_service/pxe_service.d.ts +3 -2
  31. package/dest/pxe_service/pxe_service.d.ts.map +1 -1
  32. package/dest/pxe_service/pxe_service.js +11 -56
  33. package/dest/simulator_oracle/index.d.ts +3 -3
  34. package/dest/simulator_oracle/index.d.ts.map +1 -1
  35. package/dest/simulator_oracle/index.js +3 -3
  36. package/package.json +14 -12
  37. package/src/config/index.ts +19 -2
  38. package/src/index.ts +3 -0
  39. package/src/kernel_oracle/index.ts +1 -1
  40. package/src/kernel_prover/bb_prover/bb_native_proof_creator.ts +713 -0
  41. package/src/kernel_prover/interface/proof_creator.ts +79 -0
  42. package/src/kernel_prover/kernel_prover.ts +19 -48
  43. package/src/kernel_prover/private_inputs_builders/build_private_kernel_tail_hints.ts +5 -40
  44. package/src/kernel_prover/proving_data_oracle.ts +1 -1
  45. package/src/kernel_prover/test/test_circuit_prover.ts +96 -0
  46. package/src/pxe_service/create_pxe_service.ts +17 -1
  47. package/src/pxe_service/pxe_service.ts +17 -66
  48. package/src/simulator_oracle/index.ts +4 -7
  49. package/dest/kernel_prover/proof_creator.d.ts.map +0 -1
  50. package/dest/kernel_prover/proof_creator.js +0 -68
  51. package/src/kernel_prover/proof_creator.ts +0 -157
@@ -0,0 +1,437 @@
1
+ import { Fr, Proof, makeEmptyProof, } from '@aztec/circuits.js';
2
+ import { siloNoteHash } from '@aztec/circuits.js/hash';
3
+ import { randomBytes, sha256 } from '@aztec/foundation/crypto';
4
+ import { createDebugLogger } from '@aztec/foundation/log';
5
+ import { Timer } from '@aztec/foundation/timer';
6
+ import { ClientCircuitArtifacts, convertPrivateKernelInitInputsToWitnessMap, convertPrivateKernelInitOutputsFromWitnessMap, convertPrivateKernelInnerInputsToWitnessMap, convertPrivateKernelInnerOutputsFromWitnessMap, convertPrivateKernelTailForPublicOutputsFromWitnessMap, convertPrivateKernelTailOutputsFromWitnessMap, executeTail, executeTailForPublic, } from '@aztec/noir-protocol-circuits-types';
7
+ import { WASMSimulator } from '@aztec/simulator';
8
+ import { serializeWitness } from '@noir-lang/noirc_abi';
9
+ import * as proc from 'child_process';
10
+ import * as fs from 'fs/promises';
11
+ /**
12
+ * Temporary implementation of ProofCreator using the native bb binary.
13
+ * Will be replaced by the WASM equivalent once ready
14
+ */
15
+ const VK_FILENAME = 'vk';
16
+ const VK_FIELDS_FILENAME = 'vk_fields.json';
17
+ const PROOF_FILENAME = 'proof';
18
+ //const PROOF_FIELDS_FILENAME = 'proof_fields.json';
19
+ //const AGGREGATION_OBJECT_SIZE = 16;
20
+ const CIRCUIT_SIZE_INDEX = 3;
21
+ const CIRCUIT_PUBLIC_INPUTS_INDEX = 4;
22
+ const CIRCUIT_RECURSIVE_INDEX = 5;
23
+ var BB_RESULT;
24
+ (function (BB_RESULT) {
25
+ BB_RESULT[BB_RESULT["SUCCESS"] = 0] = "SUCCESS";
26
+ BB_RESULT[BB_RESULT["FAILURE"] = 1] = "FAILURE";
27
+ BB_RESULT[BB_RESULT["ALREADY_PRESENT"] = 2] = "ALREADY_PRESENT";
28
+ })(BB_RESULT || (BB_RESULT = {}));
29
+ /**
30
+ * Invokes the Barretenberg binary with the provided command and args
31
+ * @param pathToBB - The path to the BB binary
32
+ * @param command - The command to execute
33
+ * @param args - The arguments to pass
34
+ * @param logger - A log function
35
+ * @param resultParser - An optional handler for detecting success or failure
36
+ * @returns The completed partial witness outputted from the circuit
37
+ */
38
+ function executeBB(pathToBB, command, args, logger, resultParser = (code) => code === 0) {
39
+ return new Promise((resolve, reject) => {
40
+ // spawn the bb process
41
+ const bb = proc.spawn(pathToBB, [command, ...args]);
42
+ bb.stdout.on('data', data => {
43
+ const message = data.toString('utf-8').replace(/\n$/, '');
44
+ logger(message);
45
+ });
46
+ bb.stderr.on('data', data => {
47
+ const message = data.toString('utf-8').replace(/\n$/, '');
48
+ logger(message);
49
+ });
50
+ bb.on('close', (code) => {
51
+ if (resultParser(code)) {
52
+ resolve(BB_RESULT.SUCCESS);
53
+ }
54
+ else {
55
+ reject();
56
+ }
57
+ });
58
+ }).catch(_ => BB_RESULT.FAILURE);
59
+ }
60
+ /**
61
+ * Used for generating proofs of noir circuits.
62
+ * It is assumed that the working directory is a temporary and/or random directory used solely for generating this proof.
63
+ * @param pathToBB - The full path to the bb binary
64
+ * @param workingDirectory - A working directory for use by bb
65
+ * @param circuitName - An identifier for the circuit
66
+ * @param bytecode - The compiled circuit bytecode
67
+ * @param inputWitnessFile - The circuit input witness
68
+ * @param log - A logging function
69
+ * @returns An object containing a result indication, the location of the proof and the duration taken
70
+ */
71
+ export async function generateProof(pathToBB, workingDirectory, circuitName, bytecode, inputWitnessFile, log) {
72
+ // Check that the working directory exists
73
+ try {
74
+ await fs.access(workingDirectory);
75
+ }
76
+ catch (error) {
77
+ return { status: BB_RESULT.FAILURE, reason: `Working directory ${workingDirectory} does not exist` };
78
+ }
79
+ // The bytecode is written to e.g. /workingDirectory/BaseParityArtifact-bytecode
80
+ const bytecodePath = `${workingDirectory}/${circuitName}-bytecode`;
81
+ // The proof is written to e.g. /workingDirectory/proof
82
+ const outputPath = `${workingDirectory}`;
83
+ const binaryPresent = await fs
84
+ .access(pathToBB, fs.constants.R_OK)
85
+ .then(_ => true)
86
+ .catch(_ => false);
87
+ if (!binaryPresent) {
88
+ return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
89
+ }
90
+ try {
91
+ // Write the bytecode to the working directory
92
+ await fs.writeFile(bytecodePath, bytecode);
93
+ const args = ['-o', outputPath, '-b', bytecodePath, '-w', inputWitnessFile, '-v'];
94
+ const timer = new Timer();
95
+ const logFunction = (message) => {
96
+ log(`${circuitName} BB out - ${message}`);
97
+ };
98
+ const result = await executeBB(pathToBB, 'prove_output_all', args, logFunction);
99
+ const duration = timer.ms();
100
+ // cleanup the bytecode
101
+ await fs.rm(bytecodePath, { force: true });
102
+ if (result == BB_RESULT.SUCCESS) {
103
+ return {
104
+ status: BB_RESULT.SUCCESS,
105
+ duration,
106
+ proofPath: `${outputPath}`,
107
+ pkPath: undefined,
108
+ vkPath: `${outputPath}`,
109
+ };
110
+ }
111
+ // Not a great error message here but it is difficult to decipher what comes from bb
112
+ return { status: BB_RESULT.FAILURE, reason: `Failed to generate proof` };
113
+ }
114
+ catch (error) {
115
+ return { status: BB_RESULT.FAILURE, reason: `${error}` };
116
+ }
117
+ }
118
+ /**
119
+ * Used for verifying proofs of noir circuits
120
+ * @param pathToBB - The full path to the bb binary
121
+ * @param proofFullPath - The full path to the proof to be verified
122
+ * @param verificationKeyPath - The full path to the circuit verification key
123
+ * @param log - A logging function
124
+ * @returns An object containing a result indication and duration taken
125
+ */
126
+ async function verifyProof(pathToBB, proofFullPath, verificationKeyPath, log) {
127
+ const binaryPresent = await fs
128
+ .access(pathToBB, fs.constants.R_OK)
129
+ .then(_ => true)
130
+ .catch(_ => false);
131
+ if (!binaryPresent) {
132
+ return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
133
+ }
134
+ try {
135
+ const args = ['-p', proofFullPath, '-k', verificationKeyPath];
136
+ const timer = new Timer();
137
+ const result = await executeBB(pathToBB, 'verify', args, log);
138
+ const duration = timer.ms();
139
+ if (result == BB_RESULT.SUCCESS) {
140
+ return { status: BB_RESULT.SUCCESS, duration };
141
+ }
142
+ // Not a great error message here but it is difficult to decipher what comes from bb
143
+ return { status: BB_RESULT.FAILURE, reason: `Failed to verify proof` };
144
+ }
145
+ catch (error) {
146
+ return { status: BB_RESULT.FAILURE, reason: `${error}` };
147
+ }
148
+ }
149
+ const bytecodeHashFilename = 'bytecode_hash';
150
+ const bytecodeFilename = 'bytecode';
151
+ /**
152
+ * Used for generating either a proving or verification key, will exit early if the key already exists
153
+ * It assumes the provided working directory is one where the caller wishes to maintain a permanent set of keys
154
+ * It is not considered a temporary directory
155
+ * @param pathToBB - The full path to the bb binary
156
+ * @param workingDirectory - The directory into which the key should be created
157
+ * @param circuitName - An identifier for the circuit
158
+ * @param compiledCircuit - The compiled circuit
159
+ * @param key - The type of key, either 'pk' or 'vk'
160
+ * @param log - A logging function
161
+ * @param force - Force the key to be regenerated even if it already exists
162
+ * @returns An instance of BBResult
163
+ */
164
+ export async function generateKeyForNoirCircuit(pathToBB, workingDirectory, circuitName, compiledCircuit, key, log, force = false) {
165
+ const bytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
166
+ // The key generation is written to e.g. /workingDirectory/pk/BaseParityArtifact/pk
167
+ // The bytecode hash file is also written here as /workingDirectory/pk/BaseParityArtifact/bytecode-hash
168
+ // The bytecode is written to e.g. /workingDirectory/pk/BaseParityArtifact/bytecode
169
+ // The bytecode is removed after the key is generated, leaving just the hash file
170
+ const circuitOutputDirectory = `${workingDirectory}/${key}/${circuitName}`;
171
+ const bytecodeHashPath = `${circuitOutputDirectory}/${bytecodeHashFilename}`;
172
+ const bytecodePath = `${circuitOutputDirectory}/${bytecodeFilename}`;
173
+ const bytecodeHash = sha256(bytecode);
174
+ const outputPath = `${circuitOutputDirectory}`;
175
+ // ensure the directory exists
176
+ await fs.mkdir(circuitOutputDirectory, { recursive: true });
177
+ // Generate the key if we have been told to, or there is no bytecode hash
178
+ let mustRegenerate = force ||
179
+ (await fs
180
+ .access(bytecodeHashPath, fs.constants.R_OK)
181
+ .then(_ => false)
182
+ .catch(_ => true));
183
+ if (!mustRegenerate) {
184
+ // Check to see if the bytecode hash has changed from the stored value
185
+ const data = await fs.readFile(bytecodeHashPath).catch(_ => Buffer.alloc(0));
186
+ mustRegenerate = data.length == 0 || !data.equals(bytecodeHash);
187
+ }
188
+ if (!mustRegenerate) {
189
+ // No need to generate, early out
190
+ return {
191
+ status: BB_RESULT.ALREADY_PRESENT,
192
+ duration: 0,
193
+ pkPath: key === 'pk' ? outputPath : undefined,
194
+ vkPath: key === 'vk' ? outputPath : undefined,
195
+ proofPath: undefined,
196
+ };
197
+ }
198
+ // Check we have access to bb
199
+ const binaryPresent = await fs
200
+ .access(pathToBB, fs.constants.R_OK)
201
+ .then(_ => true)
202
+ .catch(_ => false);
203
+ if (!binaryPresent) {
204
+ return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
205
+ }
206
+ // We are now going to generate the key
207
+ try {
208
+ // Write the bytecode to the working directory
209
+ await fs.writeFile(bytecodePath, bytecode);
210
+ // args are the output path and the input bytecode path
211
+ const args = ['-o', outputPath, '-b', bytecodePath];
212
+ const timer = new Timer();
213
+ let result = await executeBB(pathToBB, `write_${key}`, args, log);
214
+ // If we succeeded and the type of key if verification, have bb write the 'fields' version too
215
+ if (result == BB_RESULT.SUCCESS && key === 'vk') {
216
+ const asFieldsArgs = ['-k', `${outputPath}/${VK_FILENAME}`, '-o', `${outputPath}/${VK_FIELDS_FILENAME}`, '-v'];
217
+ result = await executeBB(pathToBB, `vk_as_fields`, asFieldsArgs, log);
218
+ }
219
+ const duration = timer.ms();
220
+ // Cleanup the bytecode file
221
+ await fs.rm(bytecodePath, { force: true });
222
+ if (result == BB_RESULT.SUCCESS) {
223
+ // Store the bytecode hash so we don't need to regenerate at a later time
224
+ await fs.writeFile(bytecodeHashPath, bytecodeHash);
225
+ return {
226
+ status: BB_RESULT.SUCCESS,
227
+ duration,
228
+ pkPath: key === 'pk' ? outputPath : undefined,
229
+ vkPath: key === 'vk' ? outputPath : undefined,
230
+ proofPath: undefined,
231
+ };
232
+ }
233
+ // Not a great error message here but it is difficult to decipher what comes from bb
234
+ return { status: BB_RESULT.FAILURE, reason: `Failed to generate key` };
235
+ }
236
+ catch (error) {
237
+ return { status: BB_RESULT.FAILURE, reason: `${error}` };
238
+ }
239
+ }
240
+ const KernelArtifactMapping = {
241
+ PrivateKernelInitArtifact: {
242
+ convertOutputs: convertPrivateKernelInitOutputsFromWitnessMap,
243
+ },
244
+ PrivateKernelInnerArtifact: {
245
+ convertOutputs: convertPrivateKernelInnerOutputsFromWitnessMap,
246
+ },
247
+ PrivateKernelTailArtifact: {
248
+ convertOutputs: convertPrivateKernelTailOutputsFromWitnessMap,
249
+ },
250
+ PrivateKernelTailToPublicArtifact: {
251
+ convertOutputs: convertPrivateKernelTailForPublicOutputsFromWitnessMap,
252
+ },
253
+ };
254
+ /**
255
+ * This proof creator implementation uses the native bb binary.
256
+ * This is a temporary implementation until we make the WASM version work.
257
+ */
258
+ export class BBNativeProofCreator {
259
+ constructor(bbBinaryPath, bbWorkingDirectory, log = createDebugLogger('aztec:bb-native-prover')) {
260
+ this.bbBinaryPath = bbBinaryPath;
261
+ this.bbWorkingDirectory = bbWorkingDirectory;
262
+ this.log = log;
263
+ this.simulator = new WASMSimulator();
264
+ this.verificationKeys = new Map();
265
+ }
266
+ getSiloedCommitments(publicInputs) {
267
+ const contractAddress = publicInputs.callContext.storageContractAddress;
268
+ return Promise.resolve(publicInputs.newNoteHashes.map(commitment => siloNoteHash(contractAddress, commitment.value)));
269
+ }
270
+ async createProofInit(inputs) {
271
+ const witnessMap = convertPrivateKernelInitInputsToWitnessMap(inputs);
272
+ return await this.createSafeProof(witnessMap, 'PrivateKernelInitArtifact');
273
+ }
274
+ async createProofInner(inputs) {
275
+ const witnessMap = convertPrivateKernelInnerInputsToWitnessMap(inputs);
276
+ return await this.createSafeProof(witnessMap, 'PrivateKernelInnerArtifact');
277
+ }
278
+ async createProofTail(inputs) {
279
+ // if (!inputs.isForPublic()) {
280
+ // const witnessMap = convertPrivateKernelTailInputsToWitnessMap(inputs);
281
+ // return await this.createSafeProof(witnessMap, 'PrivateKernelTailArtifact');
282
+ // }
283
+ if (!inputs.isForPublic()) {
284
+ const result = await executeTail(inputs);
285
+ return {
286
+ publicInputs: result,
287
+ proof: makeEmptyProof(),
288
+ };
289
+ }
290
+ // const witnessMap = convertPrivateKernelTailToPublicInputsToWitnessMap(inputs);
291
+ // return await this.createSafeProof(witnessMap, 'PrivateKernelTailToPublicArtifact');
292
+ const result = await executeTailForPublic(inputs);
293
+ return {
294
+ publicInputs: result,
295
+ proof: makeEmptyProof(),
296
+ };
297
+ }
298
+ async createAppCircuitProof(partialWitness, bytecode) {
299
+ const directory = `${this.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
300
+ await fs.mkdir(directory, { recursive: true });
301
+ this.log.debug(`Created directory: ${directory}`);
302
+ try {
303
+ this.log.debug(`Proving app circuit`);
304
+ const proof = await this.createProof(directory, partialWitness, bytecode, 'App');
305
+ return new Proof(proof);
306
+ }
307
+ finally {
308
+ await fs.rm(directory, { recursive: true, force: true });
309
+ this.log.debug(`Deleted directory: ${directory}`);
310
+ }
311
+ }
312
+ /**
313
+ * Verifies a proof, will generate the verification key if one is not cached internally
314
+ * @param circuitType - The type of circuit whose proof is to be verified
315
+ * @param proof - The proof to be verified
316
+ */
317
+ async verifyProof(circuitType, proof) {
318
+ // Create random directory to be used for temp files
319
+ const bbWorkingDirectory = `${this.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
320
+ await fs.mkdir(bbWorkingDirectory, { recursive: true });
321
+ const proofFileName = `${bbWorkingDirectory}/proof`;
322
+ const verificationKeyPath = `${bbWorkingDirectory}/vk`;
323
+ const verificationKey = await this.getVerificationKeyDataForCircuit(circuitType);
324
+ this.log.debug(`Verifying with key: ${verificationKey.hash.toString()}`);
325
+ await fs.writeFile(proofFileName, proof.buffer);
326
+ await fs.writeFile(verificationKeyPath, verificationKey.keyAsBytes);
327
+ const logFunction = (message) => {
328
+ this.log.debug(`${circuitType} BB out - ${message}`);
329
+ };
330
+ const result = await verifyProof(this.bbBinaryPath, proofFileName, verificationKeyPath, logFunction);
331
+ await fs.rm(bbWorkingDirectory, { recursive: true, force: true });
332
+ if (result.status === BB_RESULT.FAILURE) {
333
+ const errorMessage = `Failed to verify ${circuitType} proof!`;
334
+ throw new Error(errorMessage);
335
+ }
336
+ this.log.info(`Successfully verified ${circuitType} proof in ${result.duration} ms`);
337
+ }
338
+ /**
339
+ * Returns the verification key data for a circuit, will generate and cache it if not cached internally
340
+ * @param circuitType - The type of circuit for which the verification key is required
341
+ * @returns The verification key data
342
+ */
343
+ async getVerificationKeyDataForCircuit(circuitType) {
344
+ let promise = this.verificationKeys.get(circuitType);
345
+ if (!promise) {
346
+ promise = generateKeyForNoirCircuit(this.bbBinaryPath, this.bbWorkingDirectory, circuitType, ClientCircuitArtifacts[circuitType], 'vk', this.log.debug).then(result => {
347
+ if (result.status === BB_RESULT.FAILURE) {
348
+ throw new Error(`Failed to generate verification key for ${circuitType}, ${result.reason}`);
349
+ }
350
+ return this.convertVk(result.vkPath);
351
+ });
352
+ this.verificationKeys.set(circuitType, promise);
353
+ }
354
+ return await promise;
355
+ }
356
+ /**
357
+ * Reads the verification key data stored at the specified location and parses into a VerificationKeyData
358
+ * @param filePath - The directory containing the verification key data files
359
+ * @returns The verification key data
360
+ */
361
+ async convertVk(filePath) {
362
+ const [rawFields, rawBinary] = await Promise.all([
363
+ fs.readFile(`${filePath}/${VK_FIELDS_FILENAME}`, { encoding: 'utf-8' }),
364
+ fs.readFile(`${filePath}/${VK_FILENAME}`),
365
+ ]);
366
+ const fieldsJson = JSON.parse(rawFields);
367
+ const fields = fieldsJson.map(Fr.fromString);
368
+ // The first item is the hash, this is not part of the actual VK
369
+ const vkHash = fields[0];
370
+ const actualVk = fields.slice(1);
371
+ const vk = {
372
+ hash: vkHash,
373
+ keyAsFields: actualVk,
374
+ keyAsBytes: rawBinary,
375
+ numPublicInputs: Number(actualVk[CIRCUIT_PUBLIC_INPUTS_INDEX]),
376
+ circuitSize: Number(actualVk[CIRCUIT_SIZE_INDEX]),
377
+ isRecursive: actualVk[CIRCUIT_RECURSIVE_INDEX] == Fr.ONE,
378
+ };
379
+ return vk;
380
+ }
381
+ /**
382
+ * Ensures our verification key cache includes the key data located at the specified directory
383
+ * @param filePath - The directory containing the verification key data files
384
+ * @param circuitType - The type of circuit to which the verification key corresponds
385
+ */
386
+ async updateVerificationKeyAfterProof(filePath, circuitType) {
387
+ let promise = this.verificationKeys.get(circuitType);
388
+ if (!promise) {
389
+ promise = this.convertVk(filePath);
390
+ this.log.debug(`Updated verification key for circuit: ${circuitType}`);
391
+ this.verificationKeys.set(circuitType, promise);
392
+ }
393
+ await promise;
394
+ }
395
+ async createSafeProof(inputs, circuitType) {
396
+ const directory = `${this.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
397
+ await fs.mkdir(directory, { recursive: true });
398
+ this.log.debug(`Created directory: ${directory}`);
399
+ try {
400
+ return await this.generateWitnessAndCreateProof(inputs, circuitType, directory);
401
+ }
402
+ finally {
403
+ await fs.rm(directory, { recursive: true, force: true });
404
+ this.log.debug(`Deleted directory: ${directory}`);
405
+ }
406
+ }
407
+ async generateWitnessAndCreateProof(inputs, circuitType, directory) {
408
+ this.log.debug(`Generating witness for ${circuitType}`);
409
+ const compiledCircuit = ClientCircuitArtifacts[circuitType];
410
+ const outputWitness = await this.simulator.simulateCircuit(inputs, compiledCircuit);
411
+ this.log.debug(`Generated witness for ${circuitType}`);
412
+ const publicInputs = KernelArtifactMapping[circuitType].convertOutputs(outputWitness);
413
+ const proofBuffer = await this.createProof(directory, outputWitness, Buffer.from(compiledCircuit.bytecode, 'base64'), circuitType);
414
+ const proofOutput = {
415
+ publicInputs,
416
+ proof: new Proof(proofBuffer),
417
+ };
418
+ return proofOutput;
419
+ }
420
+ async createProof(directory, partialWitness, bytecode, circuitType) {
421
+ const compressedBincodedWitness = serializeWitness(partialWitness);
422
+ const inputsWitnessFile = `${directory}/witness.gz`;
423
+ await fs.writeFile(inputsWitnessFile, compressedBincodedWitness);
424
+ this.log.debug(`Written ${inputsWitnessFile}`);
425
+ const provingResult = await generateProof(this.bbBinaryPath, directory, circuitType, bytecode, inputsWitnessFile, this.log.debug);
426
+ if (provingResult.status === BB_RESULT.FAILURE) {
427
+ this.log.error(`Failed to generate proof for ${circuitType}: ${provingResult.reason}`);
428
+ throw new Error(provingResult.reason);
429
+ }
430
+ if (circuitType !== 'App') {
431
+ await this.updateVerificationKeyAfterProof(directory, circuitType);
432
+ }
433
+ const proofFile = `${directory}/${PROOF_FILENAME}`;
434
+ return await fs.readFile(proofFile);
435
+ }
436
+ }
437
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfbmF0aXZlX3Byb29mX2NyZWF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMva2VybmVsX3Byb3Zlci9iYl9wcm92ZXIvYmJfbmF0aXZlX3Byb29mX2NyZWF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEVBQUUsRUFPRixLQUFLLEVBRUwsY0FBYyxHQUNmLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFjLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFDTCxzQkFBc0IsRUFFdEIsMENBQTBDLEVBQzFDLDZDQUE2QyxFQUM3QywyQ0FBMkMsRUFDM0MsOENBQThDLEVBQzlDLHNEQUFzRCxFQUN0RCw2Q0FBNkMsRUFDN0MsV0FBVyxFQUNYLG9CQUFvQixHQUNyQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBa0IsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJbEM7OztHQUdHO0FBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFDNUMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBQy9CLG9EQUFvRDtBQUVwRCxxQ0FBcUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDN0IsTUFBTSwy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
@@ -1,33 +1,21 @@
1
+ /// <reference types="node" resolution-mode="require"/>
1
2
  import { type PrivateCircuitPublicInputs, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, type Proof } from '@aztec/circuits.js';
2
3
  import { type Fr } from '@aztec/foundation/fields';
4
+ import { type ACVMField } from '@aztec/simulator';
3
5
  /**
4
6
  * Represents the output of the proof creation process for init and inner private kernel circuit.
5
7
  * Contains the public inputs required for the init and inner private kernel circuit and the generated proof.
6
8
  */
7
- export interface ProofOutput {
9
+ export type ProofOutput<PublicInputsType> = {
8
10
  /**
9
11
  * The public inputs required for the proof generation process.
10
12
  */
11
- publicInputs: PrivateKernelCircuitPublicInputs;
13
+ publicInputs: PublicInputsType;
12
14
  /**
13
15
  * The zk-SNARK proof for the kernel execution.
14
16
  */
15
17
  proof: Proof;
16
- }
17
- /**
18
- * Represents the output of the proof creation process for final ordering private kernel circuit.
19
- * Contains the public inputs required for the final ordering private kernel circuit and the generated proof.
20
- */
21
- export interface ProofOutputFinal {
22
- /**
23
- * The public inputs required for the proof generation process.
24
- */
25
- publicInputs: PrivateKernelTailCircuitPublicInputs;
26
- /**
27
- * The zk-SNARK proof for the kernel execution.
28
- */
29
- proof: Proof;
30
- }
18
+ };
31
19
  /**
32
20
  * ProofCreator provides functionality to create and validate proofs, and retrieve
33
21
  * siloed commitments necessary for maintaining transaction privacy and security on the network.
@@ -46,35 +34,28 @@ export interface ProofCreator {
46
34
  * @param privateKernelInputsInit - The private data structure for the initial iteration.
47
35
  * @returns A Promise resolving to a ProofOutput object containing public inputs and the kernel proof.
48
36
  */
49
- createProofInit(privateKernelInputsInit: PrivateKernelInitCircuitPrivateInputs): Promise<ProofOutput>;
37
+ createProofInit(privateKernelInputsInit: PrivateKernelInitCircuitPrivateInputs): Promise<ProofOutput<PrivateKernelCircuitPublicInputs>>;
50
38
  /**
51
39
  * Creates a proof output for a given previous kernel data and private call data for an inner iteration.
52
40
  *
53
41
  * @param privateKernelInputsInner - The private input data structure for the inner iteration.
54
42
  * @returns A Promise resolving to a ProofOutput object containing public inputs and the kernel proof.
55
43
  */
56
- createProofInner(privateKernelInputsInner: PrivateKernelInnerCircuitPrivateInputs): Promise<ProofOutput>;
44
+ createProofInner(privateKernelInputsInner: PrivateKernelInnerCircuitPrivateInputs): Promise<ProofOutput<PrivateKernelCircuitPublicInputs>>;
57
45
  /**
58
46
  * Creates a proof output based on the last inner kernel iteration kernel data for the final ordering iteration.
59
47
  *
60
48
  * @param privateKernelInputsTail - The private input data structure for the final ordering iteration.
61
49
  * @returns A Promise resolving to a ProofOutput object containing public inputs and the kernel proof.
62
50
  */
63
- createProofTail(privateKernelInputsTail: PrivateKernelTailCircuitPrivateInputs): Promise<ProofOutputFinal>;
64
- }
65
- /**
66
- * The KernelProofCreator class is responsible for generating siloed commitments and zero-knowledge proofs
67
- * for private kernel circuit. It leverages Barretenberg to perform cryptographic operations and proof creation.
68
- * The class provides methods to compute commitments based on the given public inputs and to generate proofs based on
69
- * signed transaction requests, previous kernel data, private call data, and a flag indicating whether it's the first
70
- * iteration or not.
71
- */
72
- export declare class KernelProofCreator implements ProofCreator {
73
- private log;
74
- constructor(log?: import("@aztec/foundation/log").Logger);
75
- getSiloedCommitments(publicInputs: PrivateCircuitPublicInputs): Promise<Fr[]>;
76
- createProofInit(privateInputs: PrivateKernelInitCircuitPrivateInputs): Promise<ProofOutput>;
77
- createProofInner(privateInputs: PrivateKernelInnerCircuitPrivateInputs): Promise<ProofOutput>;
78
- createProofTail(privateInputs: PrivateKernelTailCircuitPrivateInputs): Promise<ProofOutputFinal>;
51
+ createProofTail(privateKernelInputsTail: PrivateKernelTailCircuitPrivateInputs): Promise<ProofOutput<PrivateKernelTailCircuitPublicInputs>>;
52
+ /**
53
+ * Creates a proof for an app circuit.
54
+ *
55
+ * @param partialWitness - The witness produced via circuit simulation
56
+ * @param bytecode - The circuit bytecode in gzipped bincode format
57
+ * @returns A Promise resolving to a Proof object
58
+ */
59
+ createAppCircuitProof(partialWitness: Map<number, ACVMField>, bytecode: Buffer): Promise<Proof>;
79
60
  }
80
61
  //# sourceMappingURL=proof_creator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof_creator.d.ts","sourceRoot":"","sources":["../../../src/kernel_prover/interface/proof_creator.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACrC,KAAK,qCAAqC,EAC1C,KAAK,sCAAsC,EAC3C,KAAK,qCAAqC,EAC1C,KAAK,oCAAoC,EACzC,KAAK,KAAK,EACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,gBAAgB,IAAI;IAC1C;;OAEG;IACH,YAAY,EAAE,gBAAgB,CAAC;IAC/B;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,oBAAoB,CAAC,YAAY,EAAE,0BAA0B,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAE9E;;;;;OAKG;IACH,eAAe,CACb,uBAAuB,EAAE,qCAAqC,GAC7D,OAAO,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE1D;;;;;OAKG;IACH,gBAAgB,CACd,wBAAwB,EAAE,sCAAsC,GAC/D,OAAO,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE1D;;;;;OAKG;IACH,eAAe,CACb,uBAAuB,EAAE,qCAAqC,GAC7D,OAAO,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAE9D;;;;;;OAMG;IACH,qBAAqB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CACjG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvb2ZfY3JlYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9rZXJuZWxfcHJvdmVyL2ludGVyZmFjZS9wcm9vZl9jcmVhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -1,6 +1,6 @@
1
- import { type TxRequest } from '@aztec/circuits.js';
1
+ import { type PrivateKernelTailCircuitPublicInputs, type TxRequest } from '@aztec/circuits.js';
2
2
  import { type ExecutionResult } from '@aztec/simulator';
3
- import { type ProofCreator, type ProofOutputFinal } from './proof_creator.js';
3
+ import { type ProofCreator, type ProofOutput } from './interface/proof_creator.js';
4
4
  import { type ProvingDataOracle } from './proving_data_oracle.js';
5
5
  /**
6
6
  * The KernelProver class is responsible for generating kernel proofs.
@@ -12,7 +12,7 @@ export declare class KernelProver {
12
12
  private oracle;
13
13
  private proofCreator;
14
14
  private log;
15
- constructor(oracle: ProvingDataOracle, proofCreator?: ProofCreator);
15
+ constructor(oracle: ProvingDataOracle, proofCreator: ProofCreator);
16
16
  /**
17
17
  * Generate a proof for a given transaction request and execution result.
18
18
  * The function iterates through the nested executions in the execution result, creates private call data,
@@ -23,7 +23,7 @@ export declare class KernelProver {
23
23
  * @param executionResult - The execution result object containing nested executions and preimages.
24
24
  * @returns A Promise that resolves to a KernelProverOutput object containing proof, public inputs, and output notes.
25
25
  */
26
- prove(txRequest: TxRequest, executionResult: ExecutionResult): Promise<ProofOutputFinal>;
26
+ prove(txRequest: TxRequest, executionResult: ExecutionResult): Promise<ProofOutput<PrivateKernelTailCircuitPublicInputs>>;
27
27
  private createPrivateCallData;
28
28
  }
29
29
  //# sourceMappingURL=kernel_prover.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kernel_prover.d.ts","sourceRoot":"","sources":["../../src/kernel_prover/kernel_prover.ts"],"names":[],"mappings":"AAAA,OAAO,EAaL,KAAK,SAAS,EAIf,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,KAAK,eAAe,EAAoC,MAAM,kBAAkB,CAAC;AAO1F,OAAO,EAAsB,KAAK,YAAY,EAAoB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACpH,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;GAKG;AACH,qBAAa,YAAY;IAEX,OAAO,CAAC,MAAM;IAAqB,OAAO,CAAC,YAAY;IADnE,OAAO,CAAC,GAAG,CAA4C;gBACnC,MAAM,EAAE,iBAAiB,EAAU,YAAY,GAAE,YAAuC;IAE5G;;;;;;;;;OASG;IACG,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;YA2GhF,qBAAqB;CAoDpC"}
1
+ {"version":3,"file":"kernel_prover.d.ts","sourceRoot":"","sources":["../../src/kernel_prover/kernel_prover.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,KAAK,oCAAoC,EAEzC,KAAK,SAAS,EAIf,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,KAAK,eAAe,EAAiE,MAAM,kBAAkB,CAAC;AAEvH,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAMnF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;GAKG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,MAAM;IAAqB,OAAO,CAAC,YAAY;IAFnE,OAAO,CAAC,GAAG,CAA4C;gBAEnC,MAAM,EAAE,iBAAiB,EAAU,YAAY,EAAE,YAAY;IAEjF;;;;;;;;;OASG;IACG,KAAK,CACT,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;YAmF/C,qBAAqB;CA4CpC"}