@aztec-labs/bb-prover 6.0.0-nightly.20260829

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 (101) hide show
  1. package/dest/avm_proving_tests/avm_proving_tester.d.ts +27 -0
  2. package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -0
  3. package/dest/avm_proving_tests/avm_proving_tester.js +236 -0
  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 +385 -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 +12 -0
  11. package/dest/bb/cli.d.ts.map +1 -0
  12. package/dest/bb/cli.js +19 -0
  13. package/dest/bb/file_names.d.ts +4 -0
  14. package/dest/bb/file_names.d.ts.map +1 -0
  15. package/dest/bb/file_names.js +5 -0
  16. package/dest/bb/index.d.ts +3 -0
  17. package/dest/bb/index.d.ts.map +1 -0
  18. package/dest/bb/index.js +16 -0
  19. package/dest/config.d.ts +31 -0
  20. package/dest/config.d.ts.map +1 -0
  21. package/dest/config.js +1 -0
  22. package/dest/honk.d.ts +13 -0
  23. package/dest/honk.d.ts.map +1 -0
  24. package/dest/honk.js +20 -0
  25. package/dest/index.d.ts +10 -0
  26. package/dest/index.d.ts.map +1 -0
  27. package/dest/index.js +8 -0
  28. package/dest/instrumentation.d.ts +47 -0
  29. package/dest/instrumentation.d.ts.map +1 -0
  30. package/dest/instrumentation.js +76 -0
  31. package/dest/prover/client/bb_private_kernel_prover.d.ts +54 -0
  32. package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -0
  33. package/dest/prover/client/bb_private_kernel_prover.js +205 -0
  34. package/dest/prover/client/bundle.d.ts +6 -0
  35. package/dest/prover/client/bundle.d.ts.map +1 -0
  36. package/dest/prover/client/bundle.js +7 -0
  37. package/dest/prover/client/lazy.d.ts +6 -0
  38. package/dest/prover/client/lazy.d.ts.map +1 -0
  39. package/dest/prover/client/lazy.js +7 -0
  40. package/dest/prover/index.d.ts +3 -0
  41. package/dest/prover/index.d.ts.map +1 -0
  42. package/dest/prover/index.js +2 -0
  43. package/dest/prover/proof_utils.d.ts +29 -0
  44. package/dest/prover/proof_utils.d.ts.map +1 -0
  45. package/dest/prover/proof_utils.js +95 -0
  46. package/dest/prover/server/bb_prover.d.ts +88 -0
  47. package/dest/prover/server/bb_prover.d.ts.map +1 -0
  48. package/dest/prover/server/bb_prover.js +823 -0
  49. package/dest/test/delay_values.d.ts +4 -0
  50. package/dest/test/delay_values.d.ts.map +1 -0
  51. package/dest/test/delay_values.js +37 -0
  52. package/dest/test/index.d.ts +4 -0
  53. package/dest/test/index.d.ts.map +1 -0
  54. package/dest/test/index.js +3 -0
  55. package/dest/test/test_circuit_prover.d.ts +64 -0
  56. package/dest/test/test_circuit_prover.d.ts.map +1 -0
  57. package/dest/test/test_circuit_prover.js +576 -0
  58. package/dest/test/test_verifier.d.ts +9 -0
  59. package/dest/test/test_verifier.d.ts.map +1 -0
  60. package/dest/test/test_verifier.js +27 -0
  61. package/dest/verification_key/verification_key_data.d.ts +8 -0
  62. package/dest/verification_key/verification_key_data.d.ts.map +1 -0
  63. package/dest/verification_key/verification_key_data.js +19 -0
  64. package/dest/verifier/batch_chonk_verifier.d.ts +57 -0
  65. package/dest/verifier/batch_chonk_verifier.d.ts.map +1 -0
  66. package/dest/verifier/batch_chonk_verifier.js +389 -0
  67. package/dest/verifier/bb_verifier.d.ts +21 -0
  68. package/dest/verifier/bb_verifier.d.ts.map +1 -0
  69. package/dest/verifier/bb_verifier.js +193 -0
  70. package/dest/verifier/index.d.ts +4 -0
  71. package/dest/verifier/index.d.ts.map +1 -0
  72. package/dest/verifier/index.js +3 -0
  73. package/dest/verifier/queued_chonk_verifier.d.ts +26 -0
  74. package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -0
  75. package/dest/verifier/queued_chonk_verifier.js +102 -0
  76. package/package.json +113 -0
  77. package/src/avm_proving_tests/avm_proving_tester.ts +235 -0
  78. package/src/bb/bb_js_backend.ts +442 -0
  79. package/src/bb/bb_js_debug.ts +227 -0
  80. package/src/bb/cli.ts +31 -0
  81. package/src/bb/file_names.ts +6 -0
  82. package/src/bb/index.ts +22 -0
  83. package/src/config.ts +31 -0
  84. package/src/honk.ts +35 -0
  85. package/src/index.ts +10 -0
  86. package/src/instrumentation.ts +119 -0
  87. package/src/prover/client/bb_private_kernel_prover.ts +531 -0
  88. package/src/prover/client/bundle.ts +10 -0
  89. package/src/prover/client/lazy.ts +10 -0
  90. package/src/prover/index.ts +2 -0
  91. package/src/prover/proof_utils.ts +154 -0
  92. package/src/prover/server/bb_prover.ts +658 -0
  93. package/src/test/delay_values.ts +41 -0
  94. package/src/test/index.ts +3 -0
  95. package/src/test/test_circuit_prover.ts +424 -0
  96. package/src/test/test_verifier.ts +20 -0
  97. package/src/verification_key/verification_key_data.ts +24 -0
  98. package/src/verifier/batch_chonk_verifier.ts +420 -0
  99. package/src/verifier/bb_verifier.ts +130 -0
  100. package/src/verifier/index.ts +3 -0
  101. package/src/verifier/queued_chonk_verifier.ts +108 -0
@@ -0,0 +1,531 @@
1
+ import { AztecClientBackend, type BackendOptions, Barretenberg } from '@aztec/bb.js';
2
+ import { serializeWitness } from '@aztec/noir-noirc_abi';
3
+ import type { Abi, WitnessMap } from '@aztec/noir-types';
4
+
5
+ import { type LogLevel, type Logger, createLogger } from '@aztec-labs/foundation/log';
6
+ import { Timer } from '@aztec-labs/foundation/timer';
7
+ import {
8
+ convertHidingKernelPublicInputsToWitnessMapWithAbi,
9
+ convertHidingKernelToRollupInputsToWitnessMapWithAbi,
10
+ convertPrivateKernelInit2InputsToWitnessMapWithAbi,
11
+ convertPrivateKernelInit2OutputsFromWitnessMapWithAbi,
12
+ convertPrivateKernelInit3InputsToWitnessMapWithAbi,
13
+ convertPrivateKernelInit3OutputsFromWitnessMapWithAbi,
14
+ convertPrivateKernelInit4InputsToWitnessMapWithAbi,
15
+ convertPrivateKernelInit4OutputsFromWitnessMapWithAbi,
16
+ convertPrivateKernelInit5InputsToWitnessMapWithAbi,
17
+ convertPrivateKernelInit5OutputsFromWitnessMapWithAbi,
18
+ convertPrivateKernelInitInputsToWitnessMapWithAbi,
19
+ convertPrivateKernelInitOutputsFromWitnessMapWithAbi,
20
+ convertPrivateKernelInner2InputsToWitnessMapWithAbi,
21
+ convertPrivateKernelInner2OutputsFromWitnessMapWithAbi,
22
+ convertPrivateKernelInner3InputsToWitnessMapWithAbi,
23
+ convertPrivateKernelInner3OutputsFromWitnessMapWithAbi,
24
+ convertPrivateKernelInner4InputsToWitnessMapWithAbi,
25
+ convertPrivateKernelInner4OutputsFromWitnessMapWithAbi,
26
+ convertPrivateKernelInner5InputsToWitnessMapWithAbi,
27
+ convertPrivateKernelInner5OutputsFromWitnessMapWithAbi,
28
+ convertPrivateKernelInnerInputsToWitnessMapWithAbi,
29
+ convertPrivateKernelInnerOutputsFromWitnessMapWithAbi,
30
+ convertPrivateKernelResetInputsToWitnessMapWithAbi,
31
+ convertPrivateKernelResetOutputsFromWitnessMapWithAbi,
32
+ convertPrivateKernelResetTailInputsToWitnessMapWithAbi,
33
+ convertPrivateKernelResetTailToPublicInputsToWitnessMapWithAbi,
34
+ convertPrivateKernelTailForPublicOutputsFromWitnessMapWithAbi,
35
+ convertPrivateKernelTailOutputsFromWitnessMapWithAbi,
36
+ foreignCallHandler,
37
+ getPrivateKernelResetArtifactName,
38
+ getPrivateKernelResetTailArtifactName,
39
+ updateResetCircuitSampleInputs,
40
+ } from '@aztec-labs/noir-protocol-circuits-types/client';
41
+ import {
42
+ type ArtifactProvider,
43
+ type ClientProtocolArtifact,
44
+ mapProtocolArtifactNameToCircuitName,
45
+ } from '@aztec-labs/noir-protocol-circuits-types/types';
46
+ import type { CircuitSimulator } from '@aztec-labs/simulator/client';
47
+ import type { PrivateKernelProver } from '@aztec-labs/stdlib/interfaces/client';
48
+ import type {
49
+ HidingKernelToPublicPrivateInputs,
50
+ HidingKernelToRollupPrivateInputs,
51
+ PrivateExecutionStep,
52
+ PrivateKernelCircuitPublicInputs,
53
+ PrivateKernelInit2CircuitPrivateInputs,
54
+ PrivateKernelInit3CircuitPrivateInputs,
55
+ PrivateKernelInit4CircuitPrivateInputs,
56
+ PrivateKernelInit5CircuitPrivateInputs,
57
+ PrivateKernelInitCircuitPrivateInputs,
58
+ PrivateKernelInner2CircuitPrivateInputs,
59
+ PrivateKernelInner3CircuitPrivateInputs,
60
+ PrivateKernelInner4CircuitPrivateInputs,
61
+ PrivateKernelInner5CircuitPrivateInputs,
62
+ PrivateKernelInnerCircuitPrivateInputs,
63
+ PrivateKernelResetCircuitPrivateInputs,
64
+ PrivateKernelResetTailCircuitPrivateInputs,
65
+ PrivateKernelSimulateOutput,
66
+ PrivateKernelTailCircuitPublicInputs,
67
+ } from '@aztec-labs/stdlib/kernel';
68
+ import type { NoirCompiledCircuitWithName } from '@aztec-labs/stdlib/noir';
69
+ import { ChonkProofWithPublicInputs } from '@aztec-labs/stdlib/proofs';
70
+ import type { CircuitSimulationStats, CircuitWitnessGenerationStats } from '@aztec-labs/stdlib/stats';
71
+ import { ungzip } from 'pako';
72
+
73
+ export type BBPrivateKernelProverOptions = Omit<BackendOptions, 'logger'> & { logger?: Logger };
74
+ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
75
+ private log: Logger;
76
+
77
+ constructor(
78
+ protected artifactProvider: ArtifactProvider,
79
+ protected simulator: CircuitSimulator,
80
+ protected options: BBPrivateKernelProverOptions = {},
81
+ ) {
82
+ this.log = options.logger || createLogger('bb-prover:private-kernel');
83
+ }
84
+
85
+ public async generateInitOutput(
86
+ inputs: PrivateKernelInitCircuitPrivateInputs,
87
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
88
+ return await this.generateCircuitOutput(
89
+ inputs,
90
+ 'PrivateKernelInitArtifact',
91
+ convertPrivateKernelInitInputsToWitnessMapWithAbi,
92
+ convertPrivateKernelInitOutputsFromWitnessMapWithAbi,
93
+ );
94
+ }
95
+
96
+ public async simulateInit(
97
+ inputs: PrivateKernelInitCircuitPrivateInputs,
98
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
99
+ return await this.simulateCircuitOutput(
100
+ inputs,
101
+ 'PrivateKernelInitArtifact',
102
+ convertPrivateKernelInitInputsToWitnessMapWithAbi,
103
+ convertPrivateKernelInitOutputsFromWitnessMapWithAbi,
104
+ );
105
+ }
106
+
107
+ public async generateInit2Output(
108
+ inputs: PrivateKernelInit2CircuitPrivateInputs,
109
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
110
+ return await this.generateCircuitOutput(
111
+ inputs,
112
+ 'PrivateKernelInit2Artifact',
113
+ convertPrivateKernelInit2InputsToWitnessMapWithAbi,
114
+ convertPrivateKernelInit2OutputsFromWitnessMapWithAbi,
115
+ );
116
+ }
117
+
118
+ public async simulateInit2(
119
+ inputs: PrivateKernelInit2CircuitPrivateInputs,
120
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
121
+ return await this.simulateCircuitOutput(
122
+ inputs,
123
+ 'PrivateKernelInit2Artifact',
124
+ convertPrivateKernelInit2InputsToWitnessMapWithAbi,
125
+ convertPrivateKernelInit2OutputsFromWitnessMapWithAbi,
126
+ );
127
+ }
128
+
129
+ public async generateInit3Output(
130
+ inputs: PrivateKernelInit3CircuitPrivateInputs,
131
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
132
+ return await this.generateCircuitOutput(
133
+ inputs,
134
+ 'PrivateKernelInit3Artifact',
135
+ convertPrivateKernelInit3InputsToWitnessMapWithAbi,
136
+ convertPrivateKernelInit3OutputsFromWitnessMapWithAbi,
137
+ );
138
+ }
139
+
140
+ public async simulateInit3(
141
+ inputs: PrivateKernelInit3CircuitPrivateInputs,
142
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
143
+ return await this.simulateCircuitOutput(
144
+ inputs,
145
+ 'PrivateKernelInit3Artifact',
146
+ convertPrivateKernelInit3InputsToWitnessMapWithAbi,
147
+ convertPrivateKernelInit3OutputsFromWitnessMapWithAbi,
148
+ );
149
+ }
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
+
195
+ public async generateInnerOutput(
196
+ inputs: PrivateKernelInnerCircuitPrivateInputs,
197
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
198
+ return await this.generateCircuitOutput(
199
+ inputs,
200
+ 'PrivateKernelInnerArtifact',
201
+ convertPrivateKernelInnerInputsToWitnessMapWithAbi,
202
+ convertPrivateKernelInnerOutputsFromWitnessMapWithAbi,
203
+ );
204
+ }
205
+
206
+ public async simulateInner(
207
+ inputs: PrivateKernelInnerCircuitPrivateInputs,
208
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
209
+ return await this.simulateCircuitOutput(
210
+ inputs,
211
+ 'PrivateKernelInnerArtifact',
212
+ convertPrivateKernelInnerInputsToWitnessMapWithAbi,
213
+ convertPrivateKernelInnerOutputsFromWitnessMapWithAbi,
214
+ );
215
+ }
216
+
217
+ public async generateInner2Output(
218
+ inputs: PrivateKernelInner2CircuitPrivateInputs,
219
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
220
+ return await this.generateCircuitOutput(
221
+ inputs,
222
+ 'PrivateKernelInner2Artifact',
223
+ convertPrivateKernelInner2InputsToWitnessMapWithAbi,
224
+ convertPrivateKernelInner2OutputsFromWitnessMapWithAbi,
225
+ );
226
+ }
227
+
228
+ public async simulateInner2(
229
+ inputs: PrivateKernelInner2CircuitPrivateInputs,
230
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
231
+ return await this.simulateCircuitOutput(
232
+ inputs,
233
+ 'PrivateKernelInner2Artifact',
234
+ convertPrivateKernelInner2InputsToWitnessMapWithAbi,
235
+ convertPrivateKernelInner2OutputsFromWitnessMapWithAbi,
236
+ );
237
+ }
238
+
239
+ public async generateInner3Output(
240
+ inputs: PrivateKernelInner3CircuitPrivateInputs,
241
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
242
+ return await this.generateCircuitOutput(
243
+ inputs,
244
+ 'PrivateKernelInner3Artifact',
245
+ convertPrivateKernelInner3InputsToWitnessMapWithAbi,
246
+ convertPrivateKernelInner3OutputsFromWitnessMapWithAbi,
247
+ );
248
+ }
249
+
250
+ public async simulateInner3(
251
+ inputs: PrivateKernelInner3CircuitPrivateInputs,
252
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
253
+ return await this.simulateCircuitOutput(
254
+ inputs,
255
+ 'PrivateKernelInner3Artifact',
256
+ convertPrivateKernelInner3InputsToWitnessMapWithAbi,
257
+ convertPrivateKernelInner3OutputsFromWitnessMapWithAbi,
258
+ );
259
+ }
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
+
305
+ public async generateResetOutput(
306
+ inputs: PrivateKernelResetCircuitPrivateInputs,
307
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
308
+ const variantInputs = inputs.trimToSizes();
309
+ const artifactName = getPrivateKernelResetArtifactName(inputs.dimensions);
310
+ return await this.generateCircuitOutput(
311
+ variantInputs,
312
+ artifactName,
313
+ convertPrivateKernelResetInputsToWitnessMapWithAbi,
314
+ convertPrivateKernelResetOutputsFromWitnessMapWithAbi,
315
+ );
316
+ }
317
+
318
+ public async simulateReset(
319
+ inputs: PrivateKernelResetCircuitPrivateInputs,
320
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>> {
321
+ updateResetCircuitSampleInputs(inputs);
322
+ const variantInputs = inputs.trimToSizes();
323
+ const artifactName = getPrivateKernelResetArtifactName(inputs.dimensions);
324
+ return await this.simulateCircuitOutput(
325
+ variantInputs,
326
+ artifactName,
327
+ convertPrivateKernelResetInputsToWitnessMapWithAbi,
328
+ convertPrivateKernelResetOutputsFromWitnessMapWithAbi,
329
+ );
330
+ }
331
+
332
+ public async generateResetTailOutput(
333
+ inputs: PrivateKernelResetTailCircuitPrivateInputs,
334
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
335
+ const artifactName = getPrivateKernelResetTailArtifactName(inputs.dimensions, inputs.isForPublic());
336
+ if (!inputs.isForPublic()) {
337
+ return await this.generateCircuitOutput(
338
+ inputs,
339
+ artifactName,
340
+ convertPrivateKernelResetTailInputsToWitnessMapWithAbi,
341
+ convertPrivateKernelTailOutputsFromWitnessMapWithAbi,
342
+ );
343
+ }
344
+ return await this.generateCircuitOutput(
345
+ inputs,
346
+ artifactName,
347
+ convertPrivateKernelResetTailToPublicInputsToWitnessMapWithAbi,
348
+ convertPrivateKernelTailForPublicOutputsFromWitnessMapWithAbi,
349
+ );
350
+ }
351
+
352
+ public async simulateResetTail(
353
+ inputs: PrivateKernelResetTailCircuitPrivateInputs,
354
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
355
+ const artifactName = getPrivateKernelResetTailArtifactName(inputs.dimensions, inputs.isForPublic());
356
+ if (!inputs.isForPublic()) {
357
+ return await this.simulateCircuitOutput(
358
+ inputs,
359
+ artifactName,
360
+ convertPrivateKernelResetTailInputsToWitnessMapWithAbi,
361
+ convertPrivateKernelTailOutputsFromWitnessMapWithAbi,
362
+ );
363
+ }
364
+ return await this.simulateCircuitOutput(
365
+ inputs,
366
+ artifactName,
367
+ convertPrivateKernelResetTailToPublicInputsToWitnessMapWithAbi,
368
+ convertPrivateKernelTailForPublicOutputsFromWitnessMapWithAbi,
369
+ );
370
+ }
371
+
372
+ public async generateHidingToRollupOutput(
373
+ inputs: HidingKernelToRollupPrivateInputs,
374
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
375
+ return await this.generateCircuitOutput(
376
+ inputs,
377
+ 'HidingKernelToRollup',
378
+ convertHidingKernelToRollupInputsToWitnessMapWithAbi,
379
+ convertPrivateKernelTailOutputsFromWitnessMapWithAbi,
380
+ );
381
+ }
382
+
383
+ public async generateHidingToPublicOutput(
384
+ inputs: HidingKernelToPublicPrivateInputs,
385
+ ): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
386
+ return await this.generateCircuitOutput(
387
+ inputs,
388
+ 'HidingKernelToPublic',
389
+ convertHidingKernelPublicInputsToWitnessMapWithAbi,
390
+ convertPrivateKernelTailForPublicOutputsFromWitnessMapWithAbi,
391
+ );
392
+ }
393
+
394
+ public async simulateCircuitOutput<
395
+ I extends { toBuffer: () => Buffer },
396
+ O extends PrivateKernelCircuitPublicInputs | PrivateKernelTailCircuitPublicInputs,
397
+ >(
398
+ inputs: I,
399
+ circuitType: ClientProtocolArtifact,
400
+ convertInputs: (inputs: I, abi: Abi) => WitnessMap,
401
+ convertOutputs: (outputs: WitnessMap, abi: Abi) => O,
402
+ ): Promise<PrivateKernelSimulateOutput<O>> {
403
+ const compiledCircuit: NoirCompiledCircuitWithName =
404
+ await this.artifactProvider.getSimulatedClientCircuitArtifactByName(circuitType);
405
+
406
+ const witnessMap = convertInputs(inputs, compiledCircuit.abi);
407
+
408
+ const outputWitness = await this.simulator
409
+ .executeProtocolCircuit(witnessMap, compiledCircuit, foreignCallHandler)
410
+ .catch((err: Error) => {
411
+ this.log.debug(`Failed to simulate ${circuitType}`, {
412
+ circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
413
+ error: err,
414
+ });
415
+ throw err;
416
+ });
417
+ const output = convertOutputs(outputWitness.witness, compiledCircuit.abi);
418
+
419
+ this.log.debug(`Simulated ${circuitType}`, {
420
+ eventName: 'circuit-simulation',
421
+ circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
422
+ duration: outputWitness.duration,
423
+ inputSize: inputs.toBuffer().length,
424
+ outputSize: output.toBuffer().length,
425
+ } satisfies CircuitSimulationStats);
426
+
427
+ return this.makeEmptyKernelSimulateOutput<O>(output, circuitType);
428
+ }
429
+
430
+ public async generateCircuitOutput<
431
+ I extends { toBuffer: () => Buffer },
432
+ O extends PrivateKernelCircuitPublicInputs | PrivateKernelTailCircuitPublicInputs,
433
+ >(
434
+ inputs: I,
435
+ circuitType: ClientProtocolArtifact,
436
+ convertInputs: (inputs: I, abi: Abi) => WitnessMap,
437
+ convertOutputs: (outputs: WitnessMap, abi: Abi) => O,
438
+ ): Promise<PrivateKernelSimulateOutput<O>> {
439
+ this.log.debug(`Generating witness for ${circuitType}`);
440
+ const compiledCircuit: NoirCompiledCircuitWithName =
441
+ await this.artifactProvider.getClientCircuitArtifactByName(circuitType);
442
+
443
+ const witnessMap = convertInputs(inputs, compiledCircuit.abi);
444
+ const outputWitness = await this.simulator.executeProtocolCircuit(witnessMap, compiledCircuit, foreignCallHandler);
445
+ const output = convertOutputs(outputWitness.witness, compiledCircuit.abi);
446
+
447
+ this.log.debug(`Generated witness for ${circuitType}`, {
448
+ eventName: 'circuit-witness-generation',
449
+ circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
450
+ duration: outputWitness.duration,
451
+ inputSize: inputs.toBuffer().length,
452
+ outputSize: output.toBuffer().length,
453
+ } satisfies CircuitWitnessGenerationStats);
454
+
455
+ const verificationKey = await this.artifactProvider.getCircuitVkByName(circuitType);
456
+ const bytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
457
+
458
+ const kernelOutput: PrivateKernelSimulateOutput<O> = {
459
+ publicInputs: output,
460
+ verificationKey,
461
+ outputWitness: outputWitness.witness,
462
+ bytecode,
463
+ };
464
+ return kernelOutput;
465
+ }
466
+
467
+ public async makeEmptyKernelSimulateOutput<
468
+ PublicInputsType extends PrivateKernelTailCircuitPublicInputs | PrivateKernelCircuitPublicInputs,
469
+ >(publicInputs: PublicInputsType, circuitType: ClientProtocolArtifact) {
470
+ const kernelProofOutput: PrivateKernelSimulateOutput<PublicInputsType> = {
471
+ publicInputs,
472
+ verificationKey: await this.artifactProvider.getCircuitVkByName(circuitType),
473
+ outputWitness: new Map(),
474
+ bytecode: Buffer.from([]),
475
+ };
476
+ return kernelProofOutput;
477
+ }
478
+
479
+ public async createChonkProof(executionSteps: PrivateExecutionStep[]): Promise<ChonkProofWithPublicInputs> {
480
+ const timer = new Timer();
481
+ this.log.info(`Generating ClientIVC proof...`);
482
+ const barretenberg = await Barretenberg.initSingleton({
483
+ ...this.options,
484
+ logger: this.options.logger?.verbose,
485
+ });
486
+ const backend = new AztecClientBackend(
487
+ executionSteps.map(step => ungzip(step.bytecode)),
488
+ barretenberg,
489
+ executionSteps.map(step => step.functionName),
490
+ executionSteps.map(step => step.kind),
491
+ );
492
+
493
+ // Use compressed prove path to get both proof fields and compressed proof bytes
494
+ const result = await backend.prove(
495
+ executionSteps.map(step => ungzip(serializeWitness(step.witness))),
496
+ executionSteps.map(step => step.vk),
497
+ { compress: true },
498
+ );
499
+ this.log.info(`Generated ClientIVC proof`, {
500
+ eventName: 'client-ivc-proof-generation',
501
+ duration: timer.ms(),
502
+ proofSize: result.proofFields.length,
503
+ compressedSize: result.compressedProof?.length,
504
+ });
505
+
506
+ // Create ChonkProofWithPublicInputs from the flat field elements
507
+ const proofWithPubInputs = ChonkProofWithPublicInputs.fromBufferArray(result.proofFields);
508
+
509
+ // Attach compressed proof bytes to the ChonkProof (without public inputs).
510
+ // The compressed bytes are for the full proof WITH public inputs from bb;
511
+ // when deserializing, the decompressor will strip them to match CHONK_PROOF_LENGTH.
512
+ proofWithPubInputs.compressedProof = result.compressedProof ? Buffer.from(result.compressedProof) : undefined;
513
+
514
+ return proofWithPubInputs;
515
+ }
516
+
517
+ public async computeGateCountForCircuit(
518
+ _bytecode: Buffer,
519
+ _circuitName: string,
520
+ _circuitKind: PrivateExecutionStep['kind'],
521
+ ): Promise<number> {
522
+ // Note we do not pass the vk to the backend. This is unneeded for gate counts.
523
+ const barretenberg = await Barretenberg.initSingleton({
524
+ ...this.options,
525
+ logger: this.options.logger?.[(process.env.LOG_LEVEL as LogLevel) || 'verbose'],
526
+ });
527
+ const backend = new AztecClientBackend([ungzip(_bytecode)], barretenberg, [_circuitName], [_circuitKind]);
528
+ const gateCount = await backend.gates();
529
+ return gateCount[0];
530
+ }
531
+ }
@@ -0,0 +1,10 @@
1
+ import { BundleArtifactProvider } from '@aztec-labs/noir-protocol-circuits-types/client/bundle';
2
+ import type { CircuitSimulator } from '@aztec-labs/simulator/client';
3
+
4
+ import { BBPrivateKernelProver, type BBPrivateKernelProverOptions } from './bb_private_kernel_prover.js';
5
+
6
+ export class BBBundlePrivateKernelProver extends BBPrivateKernelProver {
7
+ constructor(simulator: CircuitSimulator, options: BBPrivateKernelProverOptions = {}) {
8
+ super(new BundleArtifactProvider(), simulator, options);
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ import { LazyArtifactProvider } from '@aztec-labs/noir-protocol-circuits-types/client/lazy';
2
+ import type { CircuitSimulator } from '@aztec-labs/simulator/client';
3
+
4
+ import { BBPrivateKernelProver, type BBPrivateKernelProverOptions } from './bb_private_kernel_prover.js';
5
+
6
+ export class BBLazyPrivateKernelProver extends BBPrivateKernelProver {
7
+ constructor(simulator: CircuitSimulator, options: BBPrivateKernelProverOptions = {}) {
8
+ super(new LazyArtifactProvider(), simulator, options);
9
+ }
10
+ }
@@ -0,0 +1,2 @@
1
+ export * from './server/bb_prover.js';
2
+ export * from './proof_utils.js';