@aztec/bb-prover 0.0.1-commit.b655e406 → 0.0.1-commit.b8a057fa

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 (108) hide show
  1. package/dest/avm_proving_tests/avm_proving_tester.d.ts +18 -13
  2. package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
  3. package/dest/avm_proving_tests/avm_proving_tester.js +192 -111
  4. package/dest/bb/bb_js_backend.d.ts +196 -0
  5. package/dest/bb/bb_js_backend.d.ts.map +1 -0
  6. package/dest/bb/bb_js_backend.js +379 -0
  7. package/dest/bb/bb_js_debug.d.ts +52 -0
  8. package/dest/bb/bb_js_debug.d.ts.map +1 -0
  9. package/dest/bb/bb_js_debug.js +176 -0
  10. package/dest/bb/cli.d.ts +1 -1
  11. package/dest/bb/file_names.d.ts +4 -0
  12. package/dest/bb/file_names.d.ts.map +1 -0
  13. package/dest/bb/file_names.js +5 -0
  14. package/dest/bb/index.d.ts +1 -1
  15. package/dest/config.d.ts +17 -1
  16. package/dest/config.d.ts.map +1 -1
  17. package/dest/honk.d.ts +1 -1
  18. package/dest/index.d.ts +3 -2
  19. package/dest/index.d.ts.map +1 -1
  20. package/dest/index.js +2 -1
  21. package/dest/instrumentation.d.ts +1 -1
  22. package/dest/instrumentation.d.ts.map +1 -1
  23. package/dest/instrumentation.js +21 -43
  24. package/dest/prover/client/bb_private_kernel_prover.d.ts +31 -9
  25. package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -1
  26. package/dest/prover/client/bb_private_kernel_prover.js +107 -14
  27. package/dest/prover/client/bundle.d.ts +6 -0
  28. package/dest/prover/client/bundle.d.ts.map +1 -0
  29. package/dest/prover/client/bundle.js +7 -0
  30. package/dest/prover/client/lazy.d.ts +6 -0
  31. package/dest/prover/client/lazy.d.ts.map +1 -0
  32. package/dest/prover/client/lazy.js +7 -0
  33. package/dest/prover/index.d.ts +1 -1
  34. package/dest/prover/proof_utils.d.ts +11 -1
  35. package/dest/prover/proof_utils.d.ts.map +1 -1
  36. package/dest/prover/proof_utils.js +25 -2
  37. package/dest/prover/server/bb_prover.d.ts +9 -22
  38. package/dest/prover/server/bb_prover.d.ts.map +1 -1
  39. package/dest/prover/server/bb_prover.js +613 -113
  40. package/dest/test/delay_values.d.ts +1 -1
  41. package/dest/test/delay_values.d.ts.map +1 -1
  42. package/dest/test/delay_values.js +29 -27
  43. package/dest/test/index.d.ts +2 -1
  44. package/dest/test/index.d.ts.map +1 -1
  45. package/dest/test/index.js +1 -0
  46. package/dest/test/test_circuit_prover.d.ts +5 -5
  47. package/dest/test/test_circuit_prover.d.ts.map +1 -1
  48. package/dest/test/test_circuit_prover.js +462 -59
  49. package/dest/test/test_verifier.d.ts +3 -1
  50. package/dest/test/test_verifier.d.ts.map +1 -1
  51. package/dest/test/test_verifier.js +15 -0
  52. package/dest/verification_key/verification_key_data.d.ts +1 -8
  53. package/dest/verification_key/verification_key_data.d.ts.map +1 -1
  54. package/dest/verification_key/verification_key_data.js +2 -21
  55. package/dest/verifier/batch_chonk_verifier.d.ts +56 -0
  56. package/dest/verifier/batch_chonk_verifier.d.ts.map +1 -0
  57. package/dest/verifier/batch_chonk_verifier.js +384 -0
  58. package/dest/verifier/bb_verifier.d.ts +4 -1
  59. package/dest/verifier/bb_verifier.d.ts.map +1 -1
  60. package/dest/verifier/bb_verifier.js +137 -48
  61. package/dest/verifier/index.d.ts +2 -1
  62. package/dest/verifier/index.d.ts.map +1 -1
  63. package/dest/verifier/index.js +1 -0
  64. package/dest/verifier/queued_chonk_verifier.d.ts +2 -3
  65. package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -1
  66. package/dest/verifier/queued_chonk_verifier.js +15 -45
  67. package/package.json +26 -23
  68. package/src/avm_proving_tests/avm_proving_tester.ts +99 -140
  69. package/src/bb/bb_js_backend.ts +435 -0
  70. package/src/bb/bb_js_debug.ts +227 -0
  71. package/src/bb/file_names.ts +6 -0
  72. package/src/config.ts +16 -0
  73. package/src/index.ts +2 -1
  74. package/src/instrumentation.ts +20 -43
  75. package/src/prover/client/bb_private_kernel_prover.ts +281 -23
  76. package/src/prover/client/bundle.ts +10 -0
  77. package/src/prover/client/lazy.ts +10 -0
  78. package/src/prover/proof_utils.ts +42 -2
  79. package/src/prover/server/bb_prover.ts +132 -162
  80. package/src/test/delay_values.ts +31 -27
  81. package/src/test/index.ts +1 -0
  82. package/src/test/test_circuit_prover.ts +11 -16
  83. package/src/test/test_verifier.ts +8 -0
  84. package/src/verification_key/verification_key_data.ts +2 -27
  85. package/src/verifier/batch_chonk_verifier.ts +415 -0
  86. package/src/verifier/bb_verifier.ts +69 -80
  87. package/src/verifier/index.ts +1 -0
  88. package/src/verifier/queued_chonk_verifier.ts +15 -47
  89. package/dest/bb/execute.d.ts +0 -107
  90. package/dest/bb/execute.d.ts.map +0 -1
  91. package/dest/bb/execute.js +0 -672
  92. package/dest/prover/client/native/bb_native_private_kernel_prover.d.ts +0 -23
  93. package/dest/prover/client/native/bb_native_private_kernel_prover.d.ts.map +0 -1
  94. package/dest/prover/client/native/bb_native_private_kernel_prover.js +0 -66
  95. package/dest/prover/client/wasm/bb_wasm_private_kernel_prover.d.ts +0 -15
  96. package/dest/prover/client/wasm/bb_wasm_private_kernel_prover.d.ts.map +0 -1
  97. package/dest/prover/client/wasm/bb_wasm_private_kernel_prover.js +0 -46
  98. package/dest/prover/client/wasm/bundle.d.ts +0 -6
  99. package/dest/prover/client/wasm/bundle.d.ts.map +0 -1
  100. package/dest/prover/client/wasm/bundle.js +0 -8
  101. package/dest/prover/client/wasm/lazy.d.ts +0 -6
  102. package/dest/prover/client/wasm/lazy.d.ts.map +0 -1
  103. package/dest/prover/client/wasm/lazy.js +0 -8
  104. package/src/bb/execute.ts +0 -709
  105. package/src/prover/client/native/bb_native_private_kernel_prover.ts +0 -105
  106. package/src/prover/client/wasm/bb_wasm_private_kernel_prover.ts +0 -58
  107. package/src/prover/client/wasm/bundle.ts +0 -11
  108. package/src/prover/client/wasm/lazy.ts +0 -11
@@ -1,95 +1,44 @@
1
- import type { LogFn, LogLevel, Logger } from '@aztec/foundation/log';
1
+ import type { AvmStat } from '@aztec/bb.js';
2
+ import { createLogger } from '@aztec/foundation/log';
2
3
  import { Timer } from '@aztec/foundation/timer';
3
4
  import {
5
+ type MeasuredSimulatorFactory,
4
6
  PublicTxSimulationTester,
5
7
  SimpleContractDataSource,
6
8
  type TestEnqueuedCall,
7
9
  type TestExecutorMetrics,
8
10
  type TestPrivateInsertions,
9
11
  } from '@aztec/simulator/public/fixtures';
12
+ import { AvmSimulatorPool, MeasuredPublicTxSimulator } from '@aztec/simulator/server';
10
13
  import type { PublicTxResult } from '@aztec/simulator/server';
11
- import { type AvmCircuitInputs, AvmCircuitPublicInputs } from '@aztec/stdlib/avm';
14
+ import { AvmCircuitInputs, AvmCircuitPublicInputs, PublicSimulatorConfig } from '@aztec/stdlib/avm';
12
15
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
16
+ import type { Gas } from '@aztec/stdlib/gas';
13
17
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
14
18
  import type { GlobalVariables } from '@aztec/stdlib/tx';
15
19
  import { NativeWorldStateService } from '@aztec/world-state';
16
20
 
17
- import fs from 'node:fs/promises';
18
- import { tmpdir } from 'node:os';
19
21
  import path from 'path';
20
22
 
21
- import {
22
- type BBResult,
23
- type BBSuccess,
24
- BB_RESULT,
25
- VK_FILENAME,
26
- generateAvmProof,
27
- verifyAvmProof,
28
- } from '../bb/execute.js';
23
+ import { BBJsFactory } from '../bb/bb_js_backend.js';
29
24
 
30
25
  const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb-avm');
31
26
 
32
- // An InterceptingLogger that records all log messages and forwards them to a wrapped logger.
33
- class InterceptingLogger implements Logger {
34
- public readonly logs: string[] = [];
35
- public level: LogLevel;
36
- public module: string;
37
-
38
- private logger: Logger;
39
-
40
- constructor(logger: Logger) {
41
- this.logger = logger;
42
- this.level = logger.level;
43
- this.module = logger.module;
44
- }
45
-
46
- isLevelEnabled(level: LogLevel): boolean {
47
- return this.logger.isLevelEnabled(level);
48
- }
49
-
50
- createChild(_childModule: string): Logger {
51
- throw new Error('Not implemented');
52
- }
53
-
54
- private intercept(level: LogLevel, msg: string, ...args: any[]) {
55
- this.logs.push(...msg.split('\n'));
56
- // Forward to the wrapped logger
57
- (this.logger[level] as LogFn)(msg, ...args);
58
- }
59
-
60
- // Log methods for each level
61
- silent(msg: string, ...args: any[]) {
62
- this.intercept('silent', msg, ...args);
63
- }
64
- fatal(msg: string, ...args: any[]) {
65
- this.intercept('fatal', msg, ...args);
66
- }
67
- warn(msg: string, ...args: any[]) {
68
- this.intercept('warn', msg, ...args);
69
- }
70
- info(msg: string, ...args: any[]) {
71
- this.intercept('info', msg, ...args);
72
- }
73
- verbose(msg: string, ...args: any[]) {
74
- this.intercept('verbose', msg, ...args);
75
- }
76
- debug(msg: string, ...args: any[]) {
77
- this.intercept('debug', msg, ...args);
78
- }
79
- trace(msg: string, ...args: any[]) {
80
- this.intercept('trace', msg, ...args);
81
- }
82
-
83
- // Error log function can be string or Error
84
- error(err: Error | string, ...args: any[]) {
85
- const msg = typeof err === 'string' ? err : err.message;
86
- this.logs.push(msg);
87
- this.logger.error(msg, err, ...args);
88
- }
89
- }
27
+ // Config with collectHints enabled for proving tests
28
+ const provingConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
29
+ skipFeeEnforcement: false,
30
+ collectCallMetadata: true, // For results.
31
+ collectDebugLogs: false,
32
+ collectHints: true, // Required for proving!
33
+ collectPublicInputs: true, // Required for proving!
34
+ collectStatistics: false,
35
+ });
90
36
 
91
37
  export class AvmProvingTester extends PublicTxSimulationTester {
92
- private bbWorkingDirectory: string = '';
38
+ private readonly bbJsFactory = new BBJsFactory(BB_PATH, {
39
+ debugDir: process.env.BB_DEBUG_OUTPUT_DIR,
40
+ logger: createLogger('bb-prover:avm-proving-tester'),
41
+ });
93
42
 
94
43
  constructor(
95
44
  private checkCircuitOnly: boolean,
@@ -97,8 +46,9 @@ export class AvmProvingTester extends PublicTxSimulationTester {
97
46
  merkleTrees: MerkleTreeWriteOperations,
98
47
  globals?: GlobalVariables,
99
48
  metrics?: TestExecutorMetrics,
49
+ simulatorFactory?: MeasuredSimulatorFactory,
100
50
  ) {
101
- super(merkleTrees, contractDataSource, globals, metrics);
51
+ super(merkleTrees, contractDataSource, globals, metrics, simulatorFactory, provingConfig);
102
52
  }
103
53
 
104
54
  static async new(
@@ -109,56 +59,82 @@ export class AvmProvingTester extends PublicTxSimulationTester {
109
59
  ) {
110
60
  const contractDataSource = new SimpleContractDataSource();
111
61
  const merkleTrees = await worldStateService.fork();
112
- return new AvmProvingTester(checkCircuitOnly, contractDataSource, merkleTrees, globals, metrics);
62
+
63
+ const avmSimulator = await AvmSimulatorPool.spawn({ wsdbIpcPath: worldStateService.getIpcPath() });
64
+ const simulatorFactory: MeasuredSimulatorFactory = (mt, cdb, g, m, c) =>
65
+ new MeasuredPublicTxSimulator(avmSimulator, g, cdb, mt.getRevision().forkId, m, c, undefined);
66
+
67
+ const tester = new AvmProvingTester(
68
+ checkCircuitOnly,
69
+ contractDataSource,
70
+ merkleTrees,
71
+ globals,
72
+ metrics,
73
+ simulatorFactory,
74
+ );
75
+ tester.avmSimulator = avmSimulator;
76
+ return tester;
113
77
  }
114
78
 
115
- async prove(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx'): Promise<BBResult> {
116
- // We use a new working directory for each proof.
117
- this.bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
79
+ public override async close(): Promise<void> {
80
+ const results = await Promise.allSettled([super.close(), this.bbJsFactory.destroy()]);
81
+ const errors = results.flatMap(result => (result.status === 'rejected' ? [result.reason] : []));
82
+ if (errors.length > 0) {
83
+ throw new AggregateError(errors, `Failed to close AVM proving tester`);
84
+ }
85
+ }
118
86
 
119
- const interceptingLogger = new InterceptingLogger(this.logger);
87
+ /**
88
+ * Generate an AVM proof (or run check-circuit if configured). Records per-stage timings in the test metrics.
89
+ * Returns the in-memory proof fields on success; throws via jest expect() on failure.
90
+ */
91
+ async prove(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx'): Promise<Uint8Array[]> {
92
+ const inputsBuffer = avmCircuitInputs.serializeWithMessagePack();
120
93
 
121
- // Then we prove.
122
- const proofRes = await generateAvmProof(
123
- BB_PATH,
124
- this.bbWorkingDirectory,
125
- avmCircuitInputs,
126
- interceptingLogger,
127
- this.checkCircuitOnly,
128
- );
129
- if (proofRes.status === BB_RESULT.FAILURE) {
130
- this.logger.error(`Proof generation failed: ${proofRes.reason}`);
94
+ if (this.checkCircuitOnly) {
95
+ await using instance = await this.bbJsFactory.getInstance();
96
+ const { passed, stats } = await instance.checkAvmCircuit(inputsBuffer);
97
+ this.recordProverMetrics(stats, txLabel);
98
+ expect(passed).toBe(true);
99
+ return [];
131
100
  }
132
- expect(proofRes.status).toEqual(BB_RESULT.SUCCESS);
133
101
 
134
- // Parse the logs into a structured format.
135
- const logs = interceptingLogger.logs;
136
- // const traceSizes: { name: string; size: number }[] = [];
137
- // logs.forEach(log => {
138
- // const match = log.match(/\b(\w+): (\d+) \(~2/);
139
- // if (match) {
140
- // traceSizes.push({
141
- // name: match[1],
142
- // size: parseInt(match[2]),
143
- // });
144
- // }
145
- // });
146
- const times: { [key: string]: number } = {};
147
- logs.forEach(log => {
148
- const match = log.match(/\b([\w/]+)_ms: (\d+)/);
149
- if (match) {
150
- times[match[1]] = parseInt(match[2]);
151
- }
152
- });
102
+ await using instance = await this.bbJsFactory.getInstance();
103
+ const { proof, stats } = await instance.generateAvmProof(inputsBuffer);
104
+ this.recordProverMetrics(stats, txLabel);
105
+ return proof;
106
+ }
153
107
 
154
- // Throw if logs did not contain any times.
155
- if (Object.keys(times).length === 0) {
156
- throw new Error('AVM stdout did not contain any proving times in the stats!');
108
+ async verify(proof: Uint8Array[], publicInputs: AvmCircuitPublicInputs): Promise<void> {
109
+ if (this.checkCircuitOnly) {
110
+ // Check-circuit did not generate a proof; nothing to verify.
111
+ return;
157
112
  }
113
+ const piBuffer = publicInputs.serializeWithMessagePack();
114
+ await using instance = await this.bbJsFactory.getInstance();
115
+ const { verified } = await instance.verifyAvmProof(proof, piBuffer);
116
+ expect(verified).toBe(true);
117
+ }
158
118
 
119
+ public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
120
+ const proof = await this.prove(avmCircuitInputs, txLabel);
121
+ await this.verify(proof, avmCircuitInputs.publicInputs);
122
+ }
123
+
124
+ private recordProverMetrics(stats: AvmStat[], txLabel: string) {
125
+ // Build a lookup keyed on the stage name with the `_ms` suffix stripped, matching the legacy
126
+ // stdout-scraped shape. bb::avm2::Stats::time() stores keys with `_ms` appended.
127
+ const times: { [key: string]: number } = {};
128
+ for (const { name, valueMs } of stats) {
129
+ const key = name.endsWith('_ms') ? name.slice(0, -'_ms'.length) : name;
130
+ times[key] = valueMs;
131
+ }
132
+ if (Object.keys(times).length === 0) {
133
+ throw new Error('AVM response did not contain any proving-stage timings!');
134
+ }
159
135
  // Hack to make labels match.
160
136
  const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
161
- // I need to cast because TS doesnt realize metrics is protected not private.
137
+ // Cast because TS doesn't realize `metrics` is protected, not private on the parent class.
162
138
  (this as any).metrics?.recordProverMetrics(txLabelWithCount, {
163
139
  proverSimulationStepMs: times['simulation/all'],
164
140
  proverProvingStepMs: times['proving/all'],
@@ -171,33 +147,6 @@ export class AvmProvingTester extends PublicTxSimulationTester {
171
147
  provingLogDerivativeInverseCommitmentsMs: times['prove/log_derivative_inverse_commitments_round'],
172
148
  provingWireCommitmentsMs: times['prove/wire_commitments_round'],
173
149
  });
174
-
175
- return proofRes as BBSuccess;
176
- }
177
-
178
- async verify(proofRes: BBSuccess, publicInputs: AvmCircuitPublicInputs): Promise<BBResult> {
179
- if (this.checkCircuitOnly) {
180
- // Skip verification if we are only checking the circuit.
181
- // Check-circuit does not generate a proof to verify.
182
- return proofRes;
183
- }
184
-
185
- return await verifyAvmProof(
186
- BB_PATH,
187
- this.bbWorkingDirectory,
188
- proofRes.proofPath!,
189
- publicInputs,
190
- path.join(proofRes.vkDirectoryPath!, VK_FILENAME),
191
- this.logger,
192
- );
193
- }
194
-
195
- public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
196
- const provingRes = await this.prove(avmCircuitInputs, txLabel);
197
- expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
198
-
199
- const verificationRes = await this.verify(provingRes as BBSuccess, avmCircuitInputs.publicInputs);
200
- expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
201
150
  }
202
151
 
203
152
  public async simProveVerify(
@@ -210,7 +159,9 @@ export class AvmProvingTester extends PublicTxSimulationTester {
210
159
  privateInsertions?: TestPrivateInsertions,
211
160
  txLabel: string = 'unlabeledTx',
212
161
  disableRevertCheck: boolean = false,
162
+ gasLimits?: Gas,
213
163
  ): Promise<PublicTxResult> {
164
+ const simTimer = new Timer();
214
165
  const simRes = await this.simulateTx(
215
166
  sender,
216
167
  setupCalls,
@@ -219,7 +170,10 @@ export class AvmProvingTester extends PublicTxSimulationTester {
219
170
  feePayer,
220
171
  privateInsertions,
221
172
  txLabel,
173
+ gasLimits,
222
174
  );
175
+ const simDuration = simTimer.ms();
176
+ this.logger.info(`Simulation took ${simDuration} ms for tx ${txLabel}`);
223
177
 
224
178
  if (!disableRevertCheck) {
225
179
  expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
@@ -227,7 +181,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
227
181
 
228
182
  const opString = this.checkCircuitOnly ? 'Check circuit' : 'Proving and verification';
229
183
 
230
- const avmCircuitInputs = simRes.avmProvingRequest.inputs;
184
+ const avmCircuitInputs = new AvmCircuitInputs(simRes.hints!, simRes.publicInputs!);
231
185
  const timer = new Timer();
232
186
  await this.proveVerify(avmCircuitInputs, txLabel);
233
187
  this.logger.info(`${opString} took ${timer.ms()} ms for tx ${txLabel}`);
@@ -243,6 +197,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
243
197
  teardownCall?: TestEnqueuedCall,
244
198
  feePayer?: AztecAddress,
245
199
  privateInsertions?: TestPrivateInsertions,
200
+ gasLimits?: Gas,
246
201
  ) {
247
202
  return await this.simProveVerify(
248
203
  sender,
@@ -254,6 +209,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
254
209
  privateInsertions,
255
210
  txLabel,
256
211
  true,
212
+ gasLimits,
257
213
  );
258
214
  }
259
215
 
@@ -261,9 +217,10 @@ export class AvmProvingTester extends PublicTxSimulationTester {
261
217
  appCall: TestEnqueuedCall,
262
218
  expectRevert?: boolean,
263
219
  txLabel: string = 'unlabeledTx',
220
+ gasLimits?: Gas,
264
221
  ) {
265
222
  await this.simProveVerify(
266
- /*sender=*/ AztecAddress.fromNumber(42),
223
+ /*sender=*/ AztecAddress.fromNumberUnsafe(42),
267
224
  /*setupCalls=*/ [],
268
225
  [appCall],
269
226
  undefined,
@@ -271,6 +228,8 @@ export class AvmProvingTester extends PublicTxSimulationTester {
271
228
  /*feePayer=*/ undefined,
272
229
  /*privateInsertions=*/ undefined,
273
230
  txLabel,
231
+ /*disableRevertCheck=*/ false,
232
+ gasLimits,
274
233
  );
275
234
  }
276
235
  }