@aztec/bb-prover 0.0.1-commit.993d240 → 0.0.1-commit.9a89641

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.
@@ -9,22 +9,31 @@ import {
9
9
  convertPrivateKernelInit2OutputsFromWitnessMapWithAbi,
10
10
  convertPrivateKernelInit3InputsToWitnessMapWithAbi,
11
11
  convertPrivateKernelInit3OutputsFromWitnessMapWithAbi,
12
+ convertPrivateKernelInit4InputsToWitnessMapWithAbi,
13
+ convertPrivateKernelInit4OutputsFromWitnessMapWithAbi,
14
+ convertPrivateKernelInit5InputsToWitnessMapWithAbi,
15
+ convertPrivateKernelInit5OutputsFromWitnessMapWithAbi,
12
16
  convertPrivateKernelInitInputsToWitnessMapWithAbi,
13
17
  convertPrivateKernelInitOutputsFromWitnessMapWithAbi,
14
18
  convertPrivateKernelInner2InputsToWitnessMapWithAbi,
15
19
  convertPrivateKernelInner2OutputsFromWitnessMapWithAbi,
16
20
  convertPrivateKernelInner3InputsToWitnessMapWithAbi,
17
21
  convertPrivateKernelInner3OutputsFromWitnessMapWithAbi,
22
+ convertPrivateKernelInner4InputsToWitnessMapWithAbi,
23
+ convertPrivateKernelInner4OutputsFromWitnessMapWithAbi,
24
+ convertPrivateKernelInner5InputsToWitnessMapWithAbi,
25
+ convertPrivateKernelInner5OutputsFromWitnessMapWithAbi,
18
26
  convertPrivateKernelInnerInputsToWitnessMapWithAbi,
19
27
  convertPrivateKernelInnerOutputsFromWitnessMapWithAbi,
20
28
  convertPrivateKernelResetInputsToWitnessMapWithAbi,
21
29
  convertPrivateKernelResetOutputsFromWitnessMapWithAbi,
30
+ convertPrivateKernelResetTailInputsToWitnessMapWithAbi,
31
+ convertPrivateKernelResetTailToPublicInputsToWitnessMapWithAbi,
22
32
  convertPrivateKernelTailForPublicOutputsFromWitnessMapWithAbi,
23
- convertPrivateKernelTailInputsToWitnessMapWithAbi,
24
33
  convertPrivateKernelTailOutputsFromWitnessMapWithAbi,
25
- convertPrivateKernelTailToPublicInputsToWitnessMapWithAbi,
26
34
  foreignCallHandler,
27
35
  getPrivateKernelResetArtifactName,
36
+ getPrivateKernelResetTailArtifactName,
28
37
  updateResetCircuitSampleInputs,
29
38
  } from '@aztec/noir-protocol-circuits-types/client';
30
39
  import {
@@ -42,13 +51,17 @@ import type {
42
51
  PrivateKernelCircuitPublicInputs,
43
52
  PrivateKernelInit2CircuitPrivateInputs,
44
53
  PrivateKernelInit3CircuitPrivateInputs,
54
+ PrivateKernelInit4CircuitPrivateInputs,
55
+ PrivateKernelInit5CircuitPrivateInputs,
45
56
  PrivateKernelInitCircuitPrivateInputs,
46
57
  PrivateKernelInner2CircuitPrivateInputs,
47
58
  PrivateKernelInner3CircuitPrivateInputs,
59
+ PrivateKernelInner4CircuitPrivateInputs,
60
+ PrivateKernelInner5CircuitPrivateInputs,
48
61
  PrivateKernelInnerCircuitPrivateInputs,
49
62
  PrivateKernelResetCircuitPrivateInputs,
63
+ PrivateKernelResetTailCircuitPrivateInputs,
50
64
  PrivateKernelSimulateOutput,
51
- PrivateKernelTailCircuitPrivateInputs,
52
65
  PrivateKernelTailCircuitPublicInputs,
53
66
  } from '@aztec/stdlib/kernel';
54
67
  import type { NoirCompiledCircuitWithName } from '@aztec/stdlib/noir';
@@ -135,6 +148,50 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
135
148
  );
136
149
  }
137
150
 
151
+ public async generateInit4Output(
152
+ inputs: PrivateKernelInit4CircuitPrivateInputs,
153
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
154
+ return await this.generateCircuitOutput(
155
+ inputs,
156
+ 'PrivateKernelInit4Artifact',
157
+ convertPrivateKernelInit4InputsToWitnessMapWithAbi,
158
+ convertPrivateKernelInit4OutputsFromWitnessMapWithAbi,
159
+ );
160
+ }
161
+
162
+ public async simulateInit4(
163
+ inputs: PrivateKernelInit4CircuitPrivateInputs,
164
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
165
+ return await this.simulateCircuitOutput(
166
+ inputs,
167
+ 'PrivateKernelInit4Artifact',
168
+ convertPrivateKernelInit4InputsToWitnessMapWithAbi,
169
+ convertPrivateKernelInit4OutputsFromWitnessMapWithAbi,
170
+ );
171
+ }
172
+
173
+ public async generateInit5Output(
174
+ inputs: PrivateKernelInit5CircuitPrivateInputs,
175
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
176
+ return await this.generateCircuitOutput(
177
+ inputs,
178
+ 'PrivateKernelInit5Artifact',
179
+ convertPrivateKernelInit5InputsToWitnessMapWithAbi,
180
+ convertPrivateKernelInit5OutputsFromWitnessMapWithAbi,
181
+ );
182
+ }
183
+
184
+ public async simulateInit5(
185
+ inputs: PrivateKernelInit5CircuitPrivateInputs,
186
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
187
+ return await this.simulateCircuitOutput(
188
+ inputs,
189
+ 'PrivateKernelInit5Artifact',
190
+ convertPrivateKernelInit5InputsToWitnessMapWithAbi,
191
+ convertPrivateKernelInit5OutputsFromWitnessMapWithAbi,
192
+ );
193
+ }
194
+
138
195
  public async generateInnerOutput(
139
196
  inputs: PrivateKernelInnerCircuitPrivateInputs,
140
197
  ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
@@ -201,6 +258,50 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
201
258
  );
202
259
  }
203
260
 
261
+ public async generateInner4Output(
262
+ inputs: PrivateKernelInner4CircuitPrivateInputs,
263
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
264
+ return await this.generateCircuitOutput(
265
+ inputs,
266
+ 'PrivateKernelInner4Artifact',
267
+ convertPrivateKernelInner4InputsToWitnessMapWithAbi,
268
+ convertPrivateKernelInner4OutputsFromWitnessMapWithAbi,
269
+ );
270
+ }
271
+
272
+ public async simulateInner4(
273
+ inputs: PrivateKernelInner4CircuitPrivateInputs,
274
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
275
+ return await this.simulateCircuitOutput(
276
+ inputs,
277
+ 'PrivateKernelInner4Artifact',
278
+ convertPrivateKernelInner4InputsToWitnessMapWithAbi,
279
+ convertPrivateKernelInner4OutputsFromWitnessMapWithAbi,
280
+ );
281
+ }
282
+
283
+ public async generateInner5Output(
284
+ inputs: PrivateKernelInner5CircuitPrivateInputs,
285
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
286
+ return await this.generateCircuitOutput(
287
+ inputs,
288
+ 'PrivateKernelInner5Artifact',
289
+ convertPrivateKernelInner5InputsToWitnessMapWithAbi,
290
+ convertPrivateKernelInner5OutputsFromWitnessMapWithAbi,
291
+ );
292
+ }
293
+
294
+ public async simulateInner5(
295
+ inputs: PrivateKernelInner5CircuitPrivateInputs,
296
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
297
+ return await this.simulateCircuitOutput(
298
+ inputs,
299
+ 'PrivateKernelInner5Artifact',
300
+ convertPrivateKernelInner5InputsToWitnessMapWithAbi,
301
+ convertPrivateKernelInner5OutputsFromWitnessMapWithAbi,
302
+ );
303
+ }
304
+
204
305
  public async generateResetOutput(
205
306
  inputs: PrivateKernelResetCircuitPrivateInputs,
206
307
  ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
@@ -228,40 +329,42 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
228
329
  );
229
330
  }
230
331
 
231
- public async generateTailOutput(
232
- inputs: PrivateKernelTailCircuitPrivateInputs,
332
+ public async generateResetTailOutput(
333
+ inputs: PrivateKernelResetTailCircuitPrivateInputs,
233
334
  ): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
335
+ const artifactName = getPrivateKernelResetTailArtifactName(inputs.dimensions, inputs.isForPublic());
234
336
  if (!inputs.isForPublic()) {
235
337
  return await this.generateCircuitOutput(
236
338
  inputs,
237
- 'PrivateKernelTailArtifact',
238
- convertPrivateKernelTailInputsToWitnessMapWithAbi,
339
+ artifactName,
340
+ convertPrivateKernelResetTailInputsToWitnessMapWithAbi,
239
341
  convertPrivateKernelTailOutputsFromWitnessMapWithAbi,
240
342
  );
241
343
  }
242
344
  return await this.generateCircuitOutput(
243
345
  inputs,
244
- 'PrivateKernelTailToPublicArtifact',
245
- convertPrivateKernelTailToPublicInputsToWitnessMapWithAbi,
346
+ artifactName,
347
+ convertPrivateKernelResetTailToPublicInputsToWitnessMapWithAbi,
246
348
  convertPrivateKernelTailForPublicOutputsFromWitnessMapWithAbi,
247
349
  );
248
350
  }
249
351
 
250
- public async simulateTail(
251
- inputs: PrivateKernelTailCircuitPrivateInputs,
352
+ public async simulateResetTail(
353
+ inputs: PrivateKernelResetTailCircuitPrivateInputs,
252
354
  ): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
355
+ const artifactName = getPrivateKernelResetTailArtifactName(inputs.dimensions, inputs.isForPublic());
253
356
  if (!inputs.isForPublic()) {
254
357
  return await this.simulateCircuitOutput(
255
358
  inputs,
256
- 'PrivateKernelTailArtifact',
257
- convertPrivateKernelTailInputsToWitnessMapWithAbi,
359
+ artifactName,
360
+ convertPrivateKernelResetTailInputsToWitnessMapWithAbi,
258
361
  convertPrivateKernelTailOutputsFromWitnessMapWithAbi,
259
362
  );
260
363
  }
261
364
  return await this.simulateCircuitOutput(
262
365
  inputs,
263
- 'PrivateKernelTailToPublicArtifact',
264
- convertPrivateKernelTailToPublicInputsToWitnessMapWithAbi,
366
+ artifactName,
367
+ convertPrivateKernelResetTailToPublicInputsToWitnessMapWithAbi,
265
368
  convertPrivateKernelTailForPublicOutputsFromWitnessMapWithAbi,
266
369
  );
267
370
  }
@@ -384,6 +487,7 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
384
487
  executionSteps.map(step => ungzip(step.bytecode)),
385
488
  barretenberg,
386
489
  executionSteps.map(step => step.functionName),
490
+ executionSteps.map(step => step.kind),
387
491
  );
388
492
 
389
493
  // Use compressed prove path to get both proof fields and compressed proof bytes
@@ -410,13 +514,17 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
410
514
  return proofWithPubInputs;
411
515
  }
412
516
 
413
- public async computeGateCountForCircuit(_bytecode: Buffer, _circuitName: string): Promise<number> {
517
+ public async computeGateCountForCircuit(
518
+ _bytecode: Buffer,
519
+ _circuitName: string,
520
+ _circuitKind: PrivateExecutionStep['kind'],
521
+ ): Promise<number> {
414
522
  // Note we do not pass the vk to the backend. This is unneeded for gate counts.
415
523
  const barretenberg = await Barretenberg.initSingleton({
416
524
  ...this.options,
417
525
  logger: this.options.logger?.[(process.env.LOG_LEVEL as LogLevel) || 'verbose'],
418
526
  });
419
- const backend = new AztecClientBackend([ungzip(_bytecode)], barretenberg, [_circuitName]);
527
+ const backend = new AztecClientBackend([ungzip(_bytecode)], barretenberg, [_circuitName], [_circuitKind]);
420
528
  const gateCount = await backend.gates();
421
529
  return gateCount[0];
422
530
  }
@@ -1,5 +1,5 @@
1
1
  import {
2
- AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED,
2
+ AVM_V2_PROOF_LENGTH_IN_FIELDS,
3
3
  NESTED_RECURSIVE_PROOF_LENGTH,
4
4
  NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
5
5
  PAIRING_POINTS_SIZE,
@@ -177,9 +177,7 @@ export class BBNativeRollupProver implements ServerCircuitProver {
177
177
  @trackSpan('BBNativeRollupProver.getAvmProof', inputs => ({
178
178
  [Attributes.APP_CIRCUIT_NAME]: inputs.hints.tx.hash,
179
179
  }))
180
- public async getAvmProof(
181
- inputs: AvmCircuitInputs,
182
- ): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>> {
180
+ public async getAvmProof(inputs: AvmCircuitInputs): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS>> {
183
181
  const proof = await this.createAvmProof(inputs);
184
182
  await this.verifyAvmProof(proof.binaryProof, inputs.publicInputs);
185
183
  return proof;
@@ -499,7 +497,9 @@ export class BBNativeRollupProver implements ServerCircuitProver {
499
497
  getUltraHonkFlavorForCircuit(circuitType),
500
498
  );
501
499
  } catch (error) {
502
- throw new ProvingError(`Failed to generate proof for ${circuitType}: ${error}`);
500
+ // Preserve retryability of the underlying failure (e.g. a transient bb startup error).
501
+ const retry = error instanceof ProvingError && error.retry;
502
+ throw new ProvingError(`Failed to generate proof for ${circuitType}: ${error}`, error, retry);
503
503
  }
504
504
 
505
505
  return {
@@ -508,9 +508,7 @@ export class BBNativeRollupProver implements ServerCircuitProver {
508
508
  };
509
509
  }
510
510
 
511
- private async createAvmProof(
512
- input: AvmCircuitInputs,
513
- ): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>> {
511
+ private async createAvmProof(input: AvmCircuitInputs): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS>> {
514
512
  logger.info(`Proving avm-circuit for TX ${input.hints.tx.hash}...`);
515
513
 
516
514
  const inputsBuffer = input.serializeWithMessagePack();
@@ -520,20 +518,14 @@ export class BBNativeRollupProver implements ServerCircuitProver {
520
518
  // Convert Uint8Array[] (32-byte field elements) to Fr[]
521
519
  const proofFields = proofFieldArrays.map(f => Fr.fromBuffer(Buffer.from(f)));
522
520
 
523
- // Pad to fixed size (during development the proof length may vary)
524
- if (proofFields.length > AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED) {
525
- throw new Error(
526
- `Proof has ${proofFields.length} fields, expected no more than ${AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED}.`,
527
- );
521
+ if (proofFields.length !== AVM_V2_PROOF_LENGTH_IN_FIELDS) {
522
+ throw new Error(`Proof has ${proofFields.length} fields, expected exactly ${AVM_V2_PROOF_LENGTH_IN_FIELDS}.`);
528
523
  }
529
- const proofFieldsPadded = proofFields.concat(
530
- Array(AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED - proofFields.length).fill(new Fr(0)),
531
- );
532
524
 
533
525
  // Build the binary proof from the raw field data
534
526
  const rawProofBuffer = Buffer.concat(proofFieldArrays.map(f => Buffer.from(f)));
535
527
  const binaryProof = new Proof(rawProofBuffer, /*numPublicInputs=*/ 0);
536
- const avmProof = new RecursiveProof(proofFieldsPadded, binaryProof, true, AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED);
528
+ const avmProof = new RecursiveProof(proofFields, binaryProof, true, AVM_V2_PROOF_LENGTH_IN_FIELDS);
537
529
 
538
530
  const circuitType = 'avm-circuit' as const;
539
531
  const appCircuitName = 'unknown' as const;
@@ -645,7 +637,9 @@ export class BBNativeRollupProver implements ServerCircuitProver {
645
637
  flavor,
646
638
  ));
647
639
  } catch (error) {
648
- throw new ProvingError(`Failed to verify proof for ${circuitType}: ${error}`);
640
+ // Preserve retryability of the underlying failure (e.g. a transient bb startup error).
641
+ const retry = error instanceof ProvingError && error.retry;
642
+ throw new ProvingError(`Failed to verify proof for ${circuitType}: ${error}`, error, retry);
649
643
  }
650
644
 
651
645
  if (!verified) {
@@ -1,5 +1,5 @@
1
1
  import {
2
- AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED,
2
+ AVM_V2_PROOF_LENGTH_IN_FIELDS,
3
3
  NESTED_RECURSIVE_PROOF_LENGTH,
4
4
  NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
5
5
  RECURSIVE_PROOF_LENGTH,
@@ -402,13 +402,11 @@ export class TestCircuitProver implements ServerCircuitProver {
402
402
  );
403
403
  }
404
404
 
405
- public getAvmProof(_inputs: AvmCircuitInputs): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>> {
405
+ public getAvmProof(_inputs: AvmCircuitInputs): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS>> {
406
406
  // We can't simulate the AVM because we don't have enough context to do so (e.g., DBs).
407
407
  // We just return an empty proof.
408
408
  this.logger.debug('Skipping AVM simulation in TestCircuitProver.');
409
- return this.applyDelay(ProvingRequestType.PUBLIC_VM, () =>
410
- makeEmptyRecursiveProof(AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED),
411
- );
409
+ return this.applyDelay(ProvingRequestType.PUBLIC_VM, () => makeEmptyRecursiveProof(AVM_V2_PROOF_LENGTH_IN_FIELDS));
412
410
  }
413
411
 
414
412
  private async applyDelay<F extends () => any>(type: ProvingRequestType, fn: F): Promise<Awaited<ReturnType<F>>> {