@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,3 @@
1
+ export * from './test_circuit_prover.js';
2
+ export * from './test_verifier.js';
3
+ export * from './delay_values.js';
@@ -0,0 +1,424 @@
1
+ import type { WitnessMap } from '@aztec/noir-types';
2
+
3
+ import {
4
+ AVM_V2_PROOF_LENGTH_IN_FIELDS,
5
+ NESTED_RECURSIVE_PROOF_LENGTH,
6
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
7
+ RECURSIVE_PROOF_LENGTH,
8
+ } from '@aztec-labs/constants';
9
+ import { createLogger } from '@aztec-labs/foundation/log';
10
+ import { sleep } from '@aztec-labs/foundation/sleep';
11
+ import { Timer } from '@aztec-labs/foundation/timer';
12
+ import {
13
+ type ServerProtocolArtifact,
14
+ convertBlockMergeRollupOutputsFromWitnessMap,
15
+ convertBlockMergeRollupPrivateInputsToWitnessMap,
16
+ convertBlockRootNoTxsRollupOutputsFromWitnessMap,
17
+ convertBlockRootNoTxsRollupPrivateInputsToWitnessMap,
18
+ convertBlockRootRollupOutputsFromWitnessMap,
19
+ convertBlockRootRollupPrivateInputsToWitnessMap,
20
+ convertBlockRootSingleTxRollupOutputsFromWitnessMap,
21
+ convertBlockRootSingleTxRollupPrivateInputsToWitnessMap,
22
+ convertCheckpointMergeRollupOutputsFromWitnessMap,
23
+ convertCheckpointMergeRollupPrivateInputsToWitnessMap,
24
+ convertCheckpointPaddingRollupOutputsFromWitnessMap,
25
+ convertCheckpointPaddingRollupPrivateInputsToWitnessMap,
26
+ convertCheckpointRootRollupOutputsFromWitnessMap,
27
+ convertCheckpointRootRollupPrivateInputsToWitnessMap,
28
+ convertCheckpointRootSingleBlockRollupOutputsFromWitnessMap,
29
+ convertCheckpointRootSingleBlockRollupPrivateInputsToWitnessMap,
30
+ convertInboxParityOutputsFromWitnessMap,
31
+ convertInboxParityPrivateInputsToWitnessMap,
32
+ convertPrivateTxBaseRollupOutputsFromWitnessMap,
33
+ convertPrivateTxBaseRollupPrivateInputsToWitnessMap,
34
+ convertPublicTxBaseRollupOutputsFromWitnessMap,
35
+ convertPublicTxBaseRollupPrivateInputsToWitnessMap,
36
+ convertRootRollupOutputsFromWitnessMap,
37
+ convertRootRollupPrivateInputsToWitnessMap,
38
+ convertTxMergeRollupOutputsFromWitnessMap,
39
+ convertTxMergeRollupPrivateInputsToWitnessMap,
40
+ foreignCallHandler,
41
+ getSimulatedServerCircuitArtifact,
42
+ inboxParityArtifactForSize,
43
+ } from '@aztec-labs/noir-protocol-circuits-types/server';
44
+ import { ProtocolCircuitVks } from '@aztec-labs/noir-protocol-circuits-types/server/vks';
45
+ import { mapProtocolArtifactNameToCircuitName } from '@aztec-labs/noir-protocol-circuits-types/types';
46
+ import {
47
+ type CircuitSimulator,
48
+ WASMSimulatorWithBlobs,
49
+ emitCircuitSimulationStats,
50
+ } from '@aztec-labs/simulator/server';
51
+ import type { AvmCircuitInputs } from '@aztec-labs/stdlib/avm';
52
+ import {
53
+ type PublicInputsAndRecursiveProof,
54
+ type ServerCircuitProver,
55
+ makePublicInputsAndRecursiveProof,
56
+ } from '@aztec-labs/stdlib/interfaces/server';
57
+ import type { InboxParityPrivateInputs, ParityPublicInputs } from '@aztec-labs/stdlib/parity';
58
+ import {
59
+ type Proof,
60
+ ProvingRequestType,
61
+ RecursiveProof,
62
+ makeEmptyRecursiveProof,
63
+ makeRecursiveProof,
64
+ } from '@aztec-labs/stdlib/proofs';
65
+ import {
66
+ type BlockMergeRollupPrivateInputs,
67
+ type BlockRollupPublicInputs,
68
+ type BlockRootNoTxsRollupPrivateInputs,
69
+ type BlockRootRollupPrivateInputs,
70
+ type BlockRootSingleTxRollupPrivateInputs,
71
+ type CheckpointMergeRollupPrivateInputs,
72
+ type CheckpointPaddingRollupPrivateInputs,
73
+ type CheckpointRollupPublicInputs,
74
+ type CheckpointRootRollupPrivateInputs,
75
+ type CheckpointRootSingleBlockRollupPrivateInputs,
76
+ type PrivateTxBaseRollupPrivateInputs,
77
+ type PublicChonkVerifierPrivateInputs,
78
+ PublicChonkVerifierPublicInputs,
79
+ type PublicTxBaseRollupPrivateInputs,
80
+ type RootRollupPrivateInputs,
81
+ type RootRollupPublicInputs,
82
+ type TxMergeRollupPrivateInputs,
83
+ type TxRollupPublicInputs,
84
+ } from '@aztec-labs/stdlib/rollup';
85
+ import { type TelemetryClient, getTelemetryClient, trackSpan } from '@aztec-labs/telemetry-client';
86
+
87
+ import { ProverInstrumentation } from '../instrumentation.js';
88
+ import { PROOF_DELAY_MS, WITGEN_DELAY_MS } from './delay_values.js';
89
+
90
+ type TestDelay =
91
+ | {
92
+ proverTestDelayType: 'fixed';
93
+ proverTestDelayMs?: number;
94
+ }
95
+ | {
96
+ proverTestDelayType: 'realistic';
97
+ proverTestDelayFactor?: number;
98
+ };
99
+
100
+ /**
101
+ * A class for use in testing situations (e2e, unit test, etc) and temporarily for assembling a block in the sequencer.
102
+ * Simulates circuits using the most efficient method and performs no proving.
103
+ */
104
+ export class TestCircuitProver implements ServerCircuitProver {
105
+ private wasmSimulator = new WASMSimulatorWithBlobs();
106
+ private instrumentation: ProverInstrumentation;
107
+ private logger = createLogger('bb-prover:test-prover');
108
+
109
+ constructor(
110
+ private simulator?: CircuitSimulator,
111
+ private opts: TestDelay = { proverTestDelayType: 'fixed', proverTestDelayMs: 0 },
112
+ telemetry: TelemetryClient = getTelemetryClient(),
113
+ ) {
114
+ this.instrumentation = new ProverInstrumentation(telemetry, 'TestCircuitProver');
115
+ }
116
+
117
+ get tracer() {
118
+ return this.instrumentation.tracer;
119
+ }
120
+
121
+ /**
122
+ * Simulates the base parity circuit from its inputs.
123
+ * @param inputs - Inputs to the circuit.
124
+ * @returns The public inputs of the parity circuit.
125
+ */
126
+ @trackSpan('TestCircuitProver.getInboxParityProof')
127
+ public getInboxParityProof(
128
+ inputs: InboxParityPrivateInputs,
129
+ ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
130
+ return this.applyDelay(ProvingRequestType.INBOX_PARITY, () =>
131
+ this.simulate(
132
+ inputs,
133
+ inboxParityArtifactForSize(inputs.size),
134
+ RECURSIVE_PROOF_LENGTH,
135
+ convertInboxParityPrivateInputsToWitnessMap,
136
+ outputs => convertInboxParityOutputsFromWitnessMap(outputs, inputs.size),
137
+ ),
138
+ );
139
+ }
140
+
141
+ public getPublicChonkVerifierProof(
142
+ inputs: PublicChonkVerifierPrivateInputs,
143
+ ): Promise<
144
+ PublicInputsAndRecursiveProof<PublicChonkVerifierPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
145
+ > {
146
+ return this.applyDelay(ProvingRequestType.PUBLIC_CHONK_VERIFIER, () =>
147
+ makePublicInputsAndRecursiveProof(
148
+ new PublicChonkVerifierPublicInputs(inputs.hidingKernelProofData.publicInputs, inputs.proverId),
149
+ makeEmptyRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH),
150
+ ProtocolCircuitVks.PublicChonkVerifier,
151
+ ),
152
+ );
153
+ }
154
+
155
+ @trackSpan('TestCircuitProver.getPrivateTxBaseRollupProof')
156
+ public getPrivateTxBaseRollupProof(
157
+ inputs: PrivateTxBaseRollupPrivateInputs,
158
+ ): Promise<PublicInputsAndRecursiveProof<TxRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>> {
159
+ return this.applyDelay(ProvingRequestType.PRIVATE_TX_BASE_ROLLUP, () =>
160
+ this.simulate(
161
+ inputs,
162
+ 'PrivateTxBaseRollupArtifact',
163
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
164
+ convertPrivateTxBaseRollupPrivateInputsToWitnessMap,
165
+ convertPrivateTxBaseRollupOutputsFromWitnessMap,
166
+ ),
167
+ );
168
+ }
169
+
170
+ @trackSpan('TestCircuitProver.getPublicTxBaseRollupProof')
171
+ public getPublicTxBaseRollupProof(
172
+ inputs: PublicTxBaseRollupPrivateInputs,
173
+ ): Promise<PublicInputsAndRecursiveProof<TxRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>> {
174
+ return this.applyDelay(ProvingRequestType.PUBLIC_TX_BASE_ROLLUP, () =>
175
+ this.simulate(
176
+ inputs,
177
+ 'PublicTxBaseRollupArtifact',
178
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
179
+ convertPublicTxBaseRollupPrivateInputsToWitnessMap,
180
+ convertPublicTxBaseRollupOutputsFromWitnessMap,
181
+ ),
182
+ );
183
+ }
184
+
185
+ /**
186
+ * Simulates the merge rollup circuit from its inputs.
187
+ * @param input - Inputs to the circuit.
188
+ * @returns The public inputs as outputs of the simulation.
189
+ */
190
+ @trackSpan('TestCircuitProver.getTxMergeRollupProof')
191
+ public getTxMergeRollupProof(
192
+ input: TxMergeRollupPrivateInputs,
193
+ ): Promise<PublicInputsAndRecursiveProof<TxRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>> {
194
+ return this.applyDelay(ProvingRequestType.TX_MERGE_ROLLUP, () =>
195
+ this.simulate(
196
+ input,
197
+ 'TxMergeRollupArtifact',
198
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
199
+ convertTxMergeRollupPrivateInputsToWitnessMap,
200
+ convertTxMergeRollupOutputsFromWitnessMap,
201
+ ),
202
+ );
203
+ }
204
+
205
+ @trackSpan('TestCircuitProver.getBlockRootNoTxsRollupProof')
206
+ public getBlockRootNoTxsRollupProof(
207
+ input: BlockRootNoTxsRollupPrivateInputs,
208
+ ): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>> {
209
+ return this.applyDelay(ProvingRequestType.BLOCK_ROOT_NO_TXS_ROLLUP, () =>
210
+ this.simulate(
211
+ input,
212
+ 'BlockRootNoTxsRollupArtifact',
213
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
214
+ convertBlockRootNoTxsRollupPrivateInputsToWitnessMap,
215
+ convertBlockRootNoTxsRollupOutputsFromWitnessMap,
216
+ ),
217
+ );
218
+ }
219
+
220
+ @trackSpan('TestCircuitProver.getBlockRootRollupProof')
221
+ public getBlockRootRollupProof(
222
+ input: BlockRootRollupPrivateInputs,
223
+ ): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>> {
224
+ return this.applyDelay(ProvingRequestType.BLOCK_ROOT_ROLLUP, () =>
225
+ this.simulate(
226
+ input,
227
+ 'BlockRootRollupArtifact',
228
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
229
+ convertBlockRootRollupPrivateInputsToWitnessMap,
230
+ convertBlockRootRollupOutputsFromWitnessMap,
231
+ ),
232
+ );
233
+ }
234
+
235
+ @trackSpan('TestCircuitProver.getBlockRootSingleTxRollupProof')
236
+ public async getBlockRootSingleTxRollupProof(
237
+ input: BlockRootSingleTxRollupPrivateInputs,
238
+ ): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>> {
239
+ return await this.applyDelay(ProvingRequestType.BLOCK_ROOT_SINGLE_TX_ROLLUP, () =>
240
+ this.simulate(
241
+ input,
242
+ 'BlockRootSingleTxRollupArtifact',
243
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
244
+ convertBlockRootSingleTxRollupPrivateInputsToWitnessMap,
245
+ convertBlockRootSingleTxRollupOutputsFromWitnessMap,
246
+ ),
247
+ );
248
+ }
249
+
250
+ @trackSpan('TestCircuitProver.getBlockMergeRollupProof')
251
+ public getBlockMergeRollupProof(
252
+ input: BlockMergeRollupPrivateInputs,
253
+ ): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>> {
254
+ return this.applyDelay(ProvingRequestType.BLOCK_MERGE_ROLLUP, () =>
255
+ this.simulate(
256
+ input,
257
+ 'BlockMergeRollupArtifact',
258
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
259
+ convertBlockMergeRollupPrivateInputsToWitnessMap,
260
+ convertBlockMergeRollupOutputsFromWitnessMap,
261
+ ),
262
+ );
263
+ }
264
+
265
+ @trackSpan('TestCircuitProver.getCheckpointRootRollupProof')
266
+ public getCheckpointRootRollupProof(
267
+ input: CheckpointRootRollupPrivateInputs,
268
+ ): Promise<
269
+ PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
270
+ > {
271
+ return this.applyDelay(ProvingRequestType.CHECKPOINT_ROOT_ROLLUP, () =>
272
+ this.simulate(
273
+ input,
274
+ 'CheckpointRootRollupArtifact',
275
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
276
+ convertCheckpointRootRollupPrivateInputsToWitnessMap,
277
+ convertCheckpointRootRollupOutputsFromWitnessMap,
278
+ ),
279
+ );
280
+ }
281
+
282
+ @trackSpan('TestCircuitProver.getCheckpointRootSingleBlockRollupProof')
283
+ public getCheckpointRootSingleBlockRollupProof(
284
+ input: CheckpointRootSingleBlockRollupPrivateInputs,
285
+ ): Promise<
286
+ PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
287
+ > {
288
+ return this.applyDelay(ProvingRequestType.CHECKPOINT_ROOT_SINGLE_BLOCK_ROLLUP, () =>
289
+ this.simulate(
290
+ input,
291
+ 'CheckpointRootSingleBlockRollupArtifact',
292
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
293
+ convertCheckpointRootSingleBlockRollupPrivateInputsToWitnessMap,
294
+ convertCheckpointRootSingleBlockRollupOutputsFromWitnessMap,
295
+ ),
296
+ );
297
+ }
298
+
299
+ @trackSpan('TestCircuitProver.getCheckpointPaddingRollupProof')
300
+ public getCheckpointPaddingRollupProof(
301
+ input: CheckpointPaddingRollupPrivateInputs,
302
+ ): Promise<
303
+ PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
304
+ > {
305
+ return this.applyDelay(ProvingRequestType.CHECKPOINT_PADDING_ROLLUP, () =>
306
+ this.simulate(
307
+ input,
308
+ 'CheckpointPaddingRollupArtifact',
309
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
310
+ convertCheckpointPaddingRollupPrivateInputsToWitnessMap,
311
+ convertCheckpointPaddingRollupOutputsFromWitnessMap,
312
+ ),
313
+ );
314
+ }
315
+
316
+ @trackSpan('TestCircuitProver.getCheckpointMergeRollupProof')
317
+ public getCheckpointMergeRollupProof(
318
+ input: CheckpointMergeRollupPrivateInputs,
319
+ ): Promise<
320
+ PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
321
+ > {
322
+ return this.applyDelay(ProvingRequestType.CHECKPOINT_MERGE_ROLLUP, () =>
323
+ this.simulate(
324
+ input,
325
+ 'CheckpointMergeRollupArtifact',
326
+ NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
327
+ convertCheckpointMergeRollupPrivateInputsToWitnessMap,
328
+ convertCheckpointMergeRollupOutputsFromWitnessMap,
329
+ ),
330
+ );
331
+ }
332
+
333
+ /**
334
+ * Simulates the root rollup circuit from its inputs.
335
+ * @param input - Inputs to the circuit.
336
+ * @returns The public inputs as outputs of the simulation.
337
+ */
338
+ @trackSpan('TestCircuitProver.getRootRollupProof')
339
+ public getRootRollupProof(
340
+ input: RootRollupPrivateInputs,
341
+ ): Promise<PublicInputsAndRecursiveProof<RootRollupPublicInputs>> {
342
+ return this.applyDelay(ProvingRequestType.ROOT_ROLLUP, () =>
343
+ this.simulate(
344
+ input,
345
+ 'RootRollupArtifact',
346
+ NESTED_RECURSIVE_PROOF_LENGTH,
347
+ convertRootRollupPrivateInputsToWitnessMap,
348
+ convertRootRollupOutputsFromWitnessMap,
349
+ ),
350
+ );
351
+ }
352
+
353
+ public getAvmProof(_inputs: AvmCircuitInputs): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS>> {
354
+ // We can't simulate the AVM because we don't have enough context to do so (e.g., DBs).
355
+ // We just return an empty proof.
356
+ this.logger.debug('Skipping AVM simulation in TestCircuitProver.');
357
+ return this.applyDelay(ProvingRequestType.PUBLIC_VM, () => makeEmptyRecursiveProof(AVM_V2_PROOF_LENGTH_IN_FIELDS));
358
+ }
359
+
360
+ private async applyDelay<F extends () => any>(type: ProvingRequestType, fn: F): Promise<Awaited<ReturnType<F>>> {
361
+ const timer = new Timer();
362
+ const res = await fn();
363
+ const duration = timer.ms();
364
+ if (this.opts.proverTestDelayType === 'fixed') {
365
+ await sleep(Math.max(0, (this.opts.proverTestDelayMs ?? 0) - duration));
366
+ } else if (this.opts.proverTestDelayType === 'realistic') {
367
+ const delay = WITGEN_DELAY_MS[type] + PROOF_DELAY_MS[type];
368
+ await sleep(Math.max(0, delay * (this.opts.proverTestDelayFactor ?? 1) - duration));
369
+ }
370
+
371
+ return res;
372
+ }
373
+
374
+ // Not implemented for test circuits
375
+ public verifyProof(_1: ServerProtocolArtifact, _2: Proof): Promise<void> {
376
+ return Promise.reject(new Error('Method not implemented.'));
377
+ }
378
+
379
+ private async simulate<
380
+ PROOF_LENGTH extends number,
381
+ CircuitInputType extends { toBuffer: () => Buffer },
382
+ CircuitOutputType extends { toBuffer: () => Buffer },
383
+ >(
384
+ input: CircuitInputType,
385
+ artifactName: ServerProtocolArtifact,
386
+ proofLength: PROOF_LENGTH,
387
+ convertInput: (input: CircuitInputType, simulated?: boolean) => WitnessMap,
388
+ convertOutput: (outputWitness: WitnessMap, simulated?: boolean) => CircuitOutputType,
389
+ ) {
390
+ const timer = new Timer();
391
+ const witnessMap = convertInput(input, true /* simulated */);
392
+ const circuitName = mapProtocolArtifactNameToCircuitName(artifactName);
393
+
394
+ let witness: WitnessMap;
395
+ if (
396
+ ['CheckpointRootRollupArtifact', 'CheckpointRootSingleBlockRollupArtifact'].includes(artifactName) ||
397
+ this.simulator == undefined
398
+ ) {
399
+ // TODO(#10323): Native ACVM simulator does not support foreign call handler so we use the wasm simulator
400
+ // when simulating checkpoint root rollup circuits or when the native ACVM simulator is not provided.
401
+ witness = (
402
+ await this.wasmSimulator.executeProtocolCircuit(
403
+ witnessMap,
404
+ getSimulatedServerCircuitArtifact(artifactName),
405
+ foreignCallHandler,
406
+ )
407
+ ).witness;
408
+ } else {
409
+ witness = (
410
+ await this.simulator.executeProtocolCircuit(
411
+ witnessMap,
412
+ getSimulatedServerCircuitArtifact(artifactName),
413
+ undefined, // Native ACM simulator does not support foreign call handler
414
+ )
415
+ ).witness;
416
+ }
417
+
418
+ const result = convertOutput(witness, true /* simulated */);
419
+
420
+ this.instrumentation.recordDuration('simulationDuration', circuitName, timer);
421
+ emitCircuitSimulationStats(circuitName, timer.ms(), input.toBuffer().length, result.toBuffer().length, this.logger);
422
+ return makePublicInputsAndRecursiveProof(result, makeRecursiveProof(proofLength), ProtocolCircuitVks[artifactName]);
423
+ }
424
+ }
@@ -0,0 +1,20 @@
1
+ import type { ClientProtocolCircuitVerifier, IVCProofVerificationResult } from '@aztec-labs/stdlib/interfaces/server';
2
+ import type { Tx } from '@aztec-labs/stdlib/tx';
3
+
4
+ export class TestCircuitVerifier implements ClientProtocolCircuitVerifier {
5
+ constructor(private verificationDelayMs?: number) {}
6
+ verifyProof(_tx: Tx): Promise<IVCProofVerificationResult> {
7
+ if (this.verificationDelayMs !== undefined && this.verificationDelayMs > 0) {
8
+ return new Promise(resolve => {
9
+ setTimeout(() => {
10
+ resolve({ valid: true, durationMs: this.verificationDelayMs!, totalDurationMs: this.verificationDelayMs! });
11
+ }, this.verificationDelayMs);
12
+ });
13
+ }
14
+ return Promise.resolve({ valid: true, durationMs: 0, totalDurationMs: 0 });
15
+ }
16
+
17
+ public stop(): Promise<void> {
18
+ return Promise.resolve();
19
+ }
20
+ }
@@ -0,0 +1,24 @@
1
+ import { Fr } from '@aztec-labs/foundation/curves/bn254';
2
+ import { BufferReader } from '@aztec-labs/foundation/serialize';
3
+ import { VerificationKeyAsFields, VerificationKeyData } from '@aztec-labs/stdlib/vks';
4
+ import { promises as fs } from 'fs';
5
+ import * as path from 'path';
6
+
7
+ import { VK_FILENAME } from '../bb/file_names.js';
8
+
9
+ /**
10
+ * Reads the verification key data stored at the specified location and parses into a VerificationKeyData
11
+ * @param vkDirectoryPath - The directory containing the verification key data files
12
+ * @returns The verification key data
13
+ */
14
+ export async function extractVkData(vkDirectoryPath: string): Promise<VerificationKeyData> {
15
+ const rawBinary = await fs.readFile(path.join(vkDirectoryPath, VK_FILENAME));
16
+
17
+ // Convert binary to field elements (32 bytes per field)
18
+ const numFields = rawBinary.length / Fr.SIZE_IN_BYTES;
19
+ const reader = BufferReader.asReader(rawBinary);
20
+ const fields = reader.readArray(numFields, Fr);
21
+
22
+ const vkAsFields = await VerificationKeyAsFields.fromKey(fields);
23
+ return new VerificationKeyData(vkAsFields, rawBinary);
24
+ }