@aztec/prover-client 0.65.1 → 0.66.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 (144) hide show
  1. package/dest/block_builder/index.d.ts +6 -0
  2. package/dest/block_builder/index.d.ts.map +1 -0
  3. package/dest/block_builder/index.js +2 -0
  4. package/dest/block_builder/light.d.ts +32 -0
  5. package/dest/block_builder/light.d.ts.map +1 -0
  6. package/dest/block_builder/light.js +71 -0
  7. package/dest/config.d.ts +4 -10
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +8 -7
  10. package/dest/index.d.ts +2 -2
  11. package/dest/index.d.ts.map +1 -1
  12. package/dest/index.js +3 -3
  13. package/dest/mocks/fixtures.d.ts +1 -2
  14. package/dest/mocks/fixtures.d.ts.map +1 -1
  15. package/dest/mocks/fixtures.js +3 -7
  16. package/dest/mocks/test_context.d.ts +28 -10
  17. package/dest/mocks/test_context.d.ts.map +1 -1
  18. package/dest/mocks/test_context.js +59 -21
  19. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  20. package/dest/orchestrator/block-building-helpers.js +10 -18
  21. package/dest/orchestrator/block-proving-state.js +2 -2
  22. package/dest/orchestrator/epoch-proving-state.d.ts +5 -6
  23. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  24. package/dest/orchestrator/epoch-proving-state.js +10 -12
  25. package/dest/orchestrator/orchestrator.d.ts +8 -6
  26. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  27. package/dest/orchestrator/orchestrator.js +83 -72
  28. package/dest/orchestrator/tx-proving-state.d.ts +0 -1
  29. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  30. package/dest/orchestrator/tx-proving-state.js +2 -34
  31. package/dest/prover-agent/memory-proving-queue.d.ts +10 -8
  32. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  33. package/dest/prover-agent/memory-proving-queue.js +35 -35
  34. package/dest/prover-agent/prover-agent.d.ts +1 -0
  35. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  36. package/dest/prover-agent/prover-agent.js +12 -9
  37. package/dest/prover-client/factory.d.ts +6 -0
  38. package/dest/prover-client/factory.d.ts.map +1 -0
  39. package/dest/prover-client/factory.js +6 -0
  40. package/dest/prover-client/index.d.ts +3 -0
  41. package/dest/prover-client/index.d.ts.map +1 -0
  42. package/dest/prover-client/index.js +3 -0
  43. package/dest/prover-client/prover-client.d.ts +41 -0
  44. package/dest/prover-client/prover-client.d.ts.map +1 -0
  45. package/dest/prover-client/prover-client.js +107 -0
  46. package/dest/proving_broker/caching_broker_facade.d.ts +30 -0
  47. package/dest/proving_broker/caching_broker_facade.d.ts.map +1 -0
  48. package/dest/proving_broker/caching_broker_facade.js +150 -0
  49. package/dest/proving_broker/factory.d.ts +5 -0
  50. package/dest/proving_broker/factory.d.ts.map +1 -0
  51. package/dest/proving_broker/factory.js +17 -0
  52. package/dest/proving_broker/index.d.ts +9 -0
  53. package/dest/proving_broker/index.d.ts.map +1 -0
  54. package/dest/proving_broker/index.js +9 -0
  55. package/dest/proving_broker/proof_store.d.ts +46 -0
  56. package/dest/proving_broker/proof_store.d.ts.map +1 -0
  57. package/dest/proving_broker/proof_store.js +37 -0
  58. package/dest/proving_broker/prover_cache/memory.d.ts +9 -0
  59. package/dest/proving_broker/prover_cache/memory.d.ts.map +1 -0
  60. package/dest/proving_broker/prover_cache/memory.js +16 -0
  61. package/dest/proving_broker/proving_agent.d.ts +16 -6
  62. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  63. package/dest/proving_broker/proving_agent.js +59 -20
  64. package/dest/proving_broker/proving_agent_instrumentation.d.ts +8 -0
  65. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -0
  66. package/dest/proving_broker/proving_agent_instrumentation.js +16 -0
  67. package/dest/proving_broker/proving_broker.d.ts +22 -16
  68. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  69. package/dest/proving_broker/proving_broker.js +79 -25
  70. package/dest/proving_broker/proving_broker_database/memory.d.ts +14 -0
  71. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
  72. package/dest/proving_broker/proving_broker_database/memory.js +35 -0
  73. package/dest/proving_broker/proving_broker_database/persisted.d.ts +17 -0
  74. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
  75. package/dest/proving_broker/proving_broker_database/persisted.js +43 -0
  76. package/dest/proving_broker/{proving_job_database.d.ts → proving_broker_database.d.ts} +8 -8
  77. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
  78. package/dest/proving_broker/proving_broker_database.js +2 -0
  79. package/dest/proving_broker/proving_broker_instrumentation.d.ts +25 -0
  80. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -0
  81. package/dest/proving_broker/proving_broker_instrumentation.js +91 -0
  82. package/dest/proving_broker/proving_job_controller.d.ts +13 -8
  83. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  84. package/dest/proving_broker/proving_job_controller.js +43 -43
  85. package/dest/proving_broker/rpc.d.ts +11 -0
  86. package/dest/proving_broker/rpc.d.ts.map +1 -0
  87. package/dest/proving_broker/rpc.js +44 -0
  88. package/dest/test/mock_prover.d.ts +16 -2
  89. package/dest/test/mock_prover.d.ts.map +1 -1
  90. package/dest/test/mock_prover.js +37 -1
  91. package/package.json +17 -14
  92. package/src/block_builder/index.ts +6 -0
  93. package/src/block_builder/light.ts +117 -0
  94. package/src/config.ts +17 -16
  95. package/src/index.ts +2 -2
  96. package/src/mocks/fixtures.ts +2 -14
  97. package/src/mocks/test_context.ts +81 -25
  98. package/src/orchestrator/block-building-helpers.ts +22 -33
  99. package/src/orchestrator/block-proving-state.ts +1 -1
  100. package/src/orchestrator/epoch-proving-state.ts +10 -13
  101. package/src/orchestrator/orchestrator.ts +97 -77
  102. package/src/orchestrator/tx-proving-state.ts +1 -56
  103. package/src/prover-agent/memory-proving-queue.ts +43 -44
  104. package/src/prover-agent/prover-agent.ts +16 -20
  105. package/src/prover-client/factory.ts +15 -0
  106. package/src/prover-client/index.ts +2 -0
  107. package/src/prover-client/prover-client.ts +172 -0
  108. package/src/proving_broker/caching_broker_facade.ts +312 -0
  109. package/src/proving_broker/factory.ts +25 -0
  110. package/src/proving_broker/index.ts +8 -0
  111. package/src/proving_broker/proof_store.ts +106 -0
  112. package/src/proving_broker/prover_cache/memory.ts +20 -0
  113. package/src/proving_broker/proving_agent.ts +90 -20
  114. package/src/proving_broker/proving_agent_instrumentation.ts +21 -0
  115. package/src/proving_broker/proving_broker.ts +143 -67
  116. package/src/proving_broker/proving_broker_database/memory.ts +43 -0
  117. package/src/proving_broker/proving_broker_database/persisted.ts +60 -0
  118. package/src/proving_broker/{proving_job_database.ts → proving_broker_database.ts} +7 -12
  119. package/src/proving_broker/proving_broker_instrumentation.ts +130 -0
  120. package/src/proving_broker/proving_job_controller.ts +54 -46
  121. package/src/proving_broker/rpc.ts +64 -0
  122. package/src/test/mock_prover.ts +52 -0
  123. package/dest/proving_broker/proving_broker_interface.d.ts +0 -61
  124. package/dest/proving_broker/proving_broker_interface.d.ts.map +0 -1
  125. package/dest/proving_broker/proving_broker_interface.js +0 -2
  126. package/dest/proving_broker/proving_job_database/memory.d.ts +0 -14
  127. package/dest/proving_broker/proving_job_database/memory.d.ts.map +0 -1
  128. package/dest/proving_broker/proving_job_database/memory.js +0 -35
  129. package/dest/proving_broker/proving_job_database/persisted.d.ts +0 -15
  130. package/dest/proving_broker/proving_job_database/persisted.d.ts.map +0 -1
  131. package/dest/proving_broker/proving_job_database/persisted.js +0 -35
  132. package/dest/proving_broker/proving_job_database.d.ts.map +0 -1
  133. package/dest/proving_broker/proving_job_database.js +0 -2
  134. package/dest/tx-prover/factory.d.ts +0 -5
  135. package/dest/tx-prover/factory.d.ts.map +0 -1
  136. package/dest/tx-prover/factory.js +0 -6
  137. package/dest/tx-prover/tx-prover.d.ts +0 -38
  138. package/dest/tx-prover/tx-prover.d.ts.map +0 -1
  139. package/dest/tx-prover/tx-prover.js +0 -93
  140. package/src/proving_broker/proving_broker_interface.ts +0 -74
  141. package/src/proving_broker/proving_job_database/memory.ts +0 -43
  142. package/src/proving_broker/proving_job_database/persisted.ts +0 -45
  143. package/src/tx-prover/factory.ts +0 -9
  144. package/src/tx-prover/tx-prover.ts +0 -130
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  type ProofAndVerificationKey,
3
3
  type ProvingJob,
4
+ type ProvingJobInputsMap,
4
5
  type ProvingJobSource,
5
- type ProvingRequest,
6
6
  type ProvingRequestResultFor,
7
7
  ProvingRequestType,
8
8
  type PublicInputsAndRecursiveProof,
@@ -35,13 +35,13 @@ import { AbortError, TimeoutError } from '@aztec/foundation/error';
35
35
  import { createDebugLogger } from '@aztec/foundation/log';
36
36
  import { type PromiseWithResolvers, RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
37
37
  import { PriorityMemoryQueue } from '@aztec/foundation/queue';
38
- import { serializeToBuffer } from '@aztec/foundation/serialize';
39
38
  import { type TelemetryClient } from '@aztec/telemetry-client';
40
39
 
40
+ import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store.js';
41
41
  import { ProvingQueueMetrics } from './queue_metrics.js';
42
42
 
43
- type ProvingJobWithResolvers<T extends ProvingRequest = ProvingRequest> = ProvingJob<T> &
44
- PromiseWithResolvers<ProvingRequestResultFor<T['type']>> & {
43
+ type ProvingJobWithResolvers<T extends ProvingRequestType = ProvingRequestType> = ProvingJob &
44
+ PromiseWithResolvers<ProvingRequestResultFor<T>> & {
45
45
  signal?: AbortSignal;
46
46
  epochNumber?: number;
47
47
  attempts: number;
@@ -62,9 +62,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
62
62
  (a, b) => (a.epochNumber ?? 0) - (b.epochNumber ?? 0),
63
63
  );
64
64
  private jobsInProgress = new Map<string, ProvingJobWithResolvers>();
65
-
66
65
  private runningPromise: RunningPromise;
67
-
68
66
  private metrics: ProvingQueueMetrics;
69
67
 
70
68
  constructor(
@@ -75,6 +73,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
75
73
  pollingIntervalMs = 1000,
76
74
  private generateId = defaultIdGenerator,
77
75
  private timeSource = defaultTimeSource,
76
+ private proofStore: ProofStore = new InlineProofStore(),
78
77
  ) {
79
78
  this.metrics = new ProvingQueueMetrics(client, 'MemoryProvingQueue');
80
79
  this.runningPromise = new RunningPromise(this.poll, pollingIntervalMs);
@@ -100,7 +99,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
100
99
  this.log.info('Proving queue stopped');
101
100
  }
102
101
 
103
- public async getProvingJob({ timeoutSec = 1 } = {}): Promise<ProvingJob<ProvingRequest> | undefined> {
102
+ public async getProvingJob({ timeoutSec = 1 } = {}): Promise<ProvingJob | undefined> {
104
103
  if (!this.runningPromise.isRunning()) {
105
104
  throw new Error('Proving queue is not running. Start the queue before getting jobs.');
106
105
  }
@@ -119,7 +118,8 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
119
118
  this.jobsInProgress.set(job.id, job);
120
119
  return {
121
120
  id: job.id,
122
- request: job.request,
121
+ type: job.type,
122
+ inputsUri: job.inputsUri,
123
123
  };
124
124
  } catch (err) {
125
125
  if (err instanceof TimeoutError) {
@@ -167,20 +167,18 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
167
167
  }
168
168
 
169
169
  // every job should be retried with the exception of the public VM since its in development and can fail
170
- if (job.attempts < MAX_RETRIES && job.request.type !== ProvingRequestType.PUBLIC_VM) {
170
+ if (job.attempts < MAX_RETRIES && job.type !== ProvingRequestType.PUBLIC_VM) {
171
171
  job.attempts++;
172
172
  this.log.warn(
173
- `Job id=${job.id} type=${ProvingRequestType[job.request.type]} failed with error: ${reason}. Retry ${
173
+ `Job id=${job.id} type=${ProvingRequestType[job.type]} failed with error: ${reason}. Retry ${
174
174
  job.attempts
175
175
  }/${MAX_RETRIES}`,
176
176
  );
177
177
  this.queue.put(job);
178
178
  } else {
179
179
  const logFn =
180
- job.request.type === ProvingRequestType.PUBLIC_VM && !process.env.AVM_PROVING_STRICT
181
- ? this.log.warn
182
- : this.log.error;
183
- logFn(`Job id=${job.id} type=${ProvingRequestType[job.request.type]} failed with error: ${reason}`);
180
+ job.type === ProvingRequestType.PUBLIC_VM && !process.env.AVM_PROVING_STRICT ? this.log.warn : this.log.error;
181
+ logFn(`Job id=${job.id} type=${ProvingRequestType[job.type]} failed with error: ${reason}`);
184
182
  job.reject(new Error(reason));
185
183
  }
186
184
  return Promise.resolve();
@@ -214,7 +212,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
214
212
  }
215
213
 
216
214
  if (job.heartbeat + this.jobTimeoutMs < now) {
217
- this.log.warn(`Job ${job.id} type=${ProvingRequestType[job.request.type]} has timed out`);
215
+ this.log.warn(`Job ${job.id} type=${ProvingRequestType[job.type]} has timed out`);
218
216
 
219
217
  this.jobsInProgress.delete(job.id);
220
218
  job.heartbeat = 0;
@@ -223,19 +221,23 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
223
221
  }
224
222
  };
225
223
 
226
- private enqueue<T extends ProvingRequest>(
227
- request: T,
224
+ private async enqueue<T extends ProvingRequestType>(
225
+ type: T,
226
+ inputs: ProvingJobInputsMap[T],
228
227
  signal?: AbortSignal,
229
228
  epochNumber?: number,
230
- ): Promise<ProvingRequestResultFor<T['type']>['result']> {
229
+ ): Promise<ProvingRequestResultFor<T>['result']> {
231
230
  if (!this.runningPromise.isRunning()) {
232
231
  return Promise.reject(new Error('Proving queue is not running.'));
233
232
  }
234
233
 
235
- const { promise, resolve, reject } = promiseWithResolvers<ProvingRequestResultFor<T['type']>>();
234
+ const { promise, resolve, reject } = promiseWithResolvers<ProvingRequestResultFor<T>>();
235
+ const id = this.generateId();
236
+ const inputsUri = await this.proofStore.saveProofInput(id, type, inputs);
236
237
  const item: ProvingJobWithResolvers<T> = {
237
- id: this.generateId(),
238
- request,
238
+ id,
239
+ type,
240
+ inputsUri,
239
241
  signal,
240
242
  promise,
241
243
  resolve,
@@ -250,16 +252,13 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
250
252
  }
251
253
 
252
254
  this.log.debug(
253
- `Adding id=${item.id} type=${ProvingRequestType[request.type]} proving job to queue depth=${this.queue.length()}`,
255
+ `Adding id=${item.id} type=${ProvingRequestType[type]} proving job to queue depth=${this.queue.length()}`,
254
256
  );
255
- // TODO (alexg) remove the `any`
256
- if (!this.queue.put(item as any)) {
257
+
258
+ if (!this.queue.put(item as ProvingJobWithResolvers<any>)) {
257
259
  throw new Error();
258
260
  }
259
261
 
260
- const byteSize = serializeToBuffer(item.request.inputs).length;
261
- this.metrics.recordNewJob(item.request.type, byteSize);
262
-
263
262
  return promise.then(({ result }) => result);
264
263
  }
265
264
 
@@ -268,7 +267,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
268
267
  signal?: AbortSignal,
269
268
  epochNumber?: number,
270
269
  ): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs>> {
271
- return this.enqueue({ type: ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs }, signal, epochNumber);
270
+ return this.enqueue(ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs, signal, epochNumber);
272
271
  }
273
272
 
274
273
  getTubeProof(
@@ -276,7 +275,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
276
275
  signal?: AbortSignal,
277
276
  epochNumber?: number,
278
277
  ): Promise<ProofAndVerificationKey<typeof RECURSIVE_PROOF_LENGTH>> {
279
- return this.enqueue({ type: ProvingRequestType.TUBE_PROOF, inputs }, signal, epochNumber);
278
+ return this.enqueue(ProvingRequestType.TUBE_PROOF, inputs, signal, epochNumber);
280
279
  }
281
280
 
282
281
  /**
@@ -288,7 +287,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
288
287
  signal?: AbortSignal,
289
288
  epochNumber?: number,
290
289
  ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
291
- return this.enqueue({ type: ProvingRequestType.BASE_PARITY, inputs }, signal, epochNumber);
290
+ return this.enqueue(ProvingRequestType.BASE_PARITY, inputs, signal, epochNumber);
292
291
  }
293
292
 
294
293
  /**
@@ -300,7 +299,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
300
299
  signal?: AbortSignal,
301
300
  epochNumber?: number,
302
301
  ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof NESTED_RECURSIVE_PROOF_LENGTH>> {
303
- return this.enqueue({ type: ProvingRequestType.ROOT_PARITY, inputs }, signal, epochNumber);
302
+ return this.enqueue(ProvingRequestType.ROOT_PARITY, inputs, signal, epochNumber);
304
303
  }
305
304
 
306
305
  getPrivateBaseRollupProof(
@@ -308,7 +307,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
308
307
  signal?: AbortSignal,
309
308
  epochNumber?: number,
310
309
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs>> {
311
- return this.enqueue({ type: ProvingRequestType.PRIVATE_BASE_ROLLUP, inputs }, signal, epochNumber);
310
+ return this.enqueue(ProvingRequestType.PRIVATE_BASE_ROLLUP, inputs, signal, epochNumber);
312
311
  }
313
312
 
314
313
  getPublicBaseRollupProof(
@@ -316,7 +315,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
316
315
  signal?: AbortSignal,
317
316
  epochNumber?: number,
318
317
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs>> {
319
- return this.enqueue({ type: ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs }, signal, epochNumber);
318
+ return this.enqueue(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs, signal, epochNumber);
320
319
  }
321
320
 
322
321
  /**
@@ -324,11 +323,11 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
324
323
  * @param input - Input to the circuit.
325
324
  */
326
325
  getMergeRollupProof(
327
- input: MergeRollupInputs,
326
+ inputs: MergeRollupInputs,
328
327
  signal?: AbortSignal,
329
328
  epochNumber?: number,
330
329
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs>> {
331
- return this.enqueue({ type: ProvingRequestType.MERGE_ROLLUP, inputs: input }, signal, epochNumber);
330
+ return this.enqueue(ProvingRequestType.MERGE_ROLLUP, inputs, signal, epochNumber);
332
331
  }
333
332
 
334
333
  /**
@@ -336,19 +335,19 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
336
335
  * @param input - Input to the circuit.
337
336
  */
338
337
  getBlockRootRollupProof(
339
- input: BlockRootRollupInputs,
338
+ inputs: BlockRootRollupInputs,
340
339
  signal?: AbortSignal,
341
340
  epochNumber?: number,
342
341
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
343
- return this.enqueue({ type: ProvingRequestType.BLOCK_ROOT_ROLLUP, inputs: input }, signal, epochNumber);
342
+ return this.enqueue(ProvingRequestType.BLOCK_ROOT_ROLLUP, inputs, signal, epochNumber);
344
343
  }
345
344
 
346
345
  getEmptyBlockRootRollupProof(
347
- input: EmptyBlockRootRollupInputs,
346
+ inputs: EmptyBlockRootRollupInputs,
348
347
  signal?: AbortSignal,
349
348
  epochNumber?: number,
350
349
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
351
- return this.enqueue({ type: ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, inputs: input }, signal, epochNumber);
350
+ return this.enqueue(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, inputs, signal, epochNumber);
352
351
  }
353
352
 
354
353
  /**
@@ -356,11 +355,11 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
356
355
  * @param input - Input to the circuit.
357
356
  */
358
357
  getBlockMergeRollupProof(
359
- input: BlockMergeRollupInputs,
358
+ inputs: BlockMergeRollupInputs,
360
359
  signal?: AbortSignal,
361
360
  epochNumber?: number,
362
361
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
363
- return this.enqueue({ type: ProvingRequestType.BLOCK_MERGE_ROLLUP, inputs: input }, signal, epochNumber);
362
+ return this.enqueue(ProvingRequestType.BLOCK_MERGE_ROLLUP, inputs, signal, epochNumber);
364
363
  }
365
364
 
366
365
  /**
@@ -368,11 +367,11 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
368
367
  * @param input - Input to the circuit.
369
368
  */
370
369
  getRootRollupProof(
371
- input: RootRollupInputs,
370
+ inputs: RootRollupInputs,
372
371
  signal?: AbortSignal,
373
372
  epochNumber?: number,
374
373
  ): Promise<PublicInputsAndRecursiveProof<RootRollupPublicInputs>> {
375
- return this.enqueue({ type: ProvingRequestType.ROOT_ROLLUP, inputs: input }, signal, epochNumber);
374
+ return this.enqueue(ProvingRequestType.ROOT_ROLLUP, inputs, signal, epochNumber);
376
375
  }
377
376
 
378
377
  /**
@@ -383,7 +382,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
383
382
  signal?: AbortSignal,
384
383
  epochNumber?: number,
385
384
  ): Promise<ProofAndVerificationKey<typeof AVM_PROOF_LENGTH_IN_FIELDS>> {
386
- return this.enqueue({ type: ProvingRequestType.PUBLIC_VM, inputs }, signal, epochNumber);
385
+ return this.enqueue(ProvingRequestType.PUBLIC_VM, inputs, signal, epochNumber);
387
386
  }
388
387
 
389
388
  /**
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  type ProverAgentApi,
3
3
  type ProvingJob,
4
+ type ProvingJobInputs,
5
+ type ProvingJobResultsMap,
4
6
  type ProvingJobSource,
5
- type ProvingRequest,
6
- type ProvingRequestResultFor,
7
7
  ProvingRequestType,
8
8
  type ServerCircuitProver,
9
9
  makeProvingRequestResult,
@@ -12,6 +12,8 @@ import { createDebugLogger } from '@aztec/foundation/log';
12
12
  import { RunningPromise } from '@aztec/foundation/running-promise';
13
13
  import { elapsed } from '@aztec/foundation/timer';
14
14
 
15
+ import { InlineProofStore } from '../proving_broker/proof_store.js';
16
+
15
17
  const PRINT_THRESHOLD_NS = 6e10; // 60 seconds
16
18
 
17
19
  /**
@@ -27,6 +29,7 @@ export class ProverAgent implements ProverAgentApi {
27
29
  }
28
30
  >();
29
31
  private runningPromise?: RunningPromise;
32
+ private proofInputsDatabase = new InlineProofStore();
30
33
 
31
34
  constructor(
32
35
  /** The prover implementation to defer jobs to */
@@ -101,12 +104,12 @@ export class ProverAgent implements ProverAgentApi {
101
104
  const promise = this.work(jobSource, job).finally(() => this.inFlightPromises.delete(job.id));
102
105
  this.inFlightPromises.set(job.id, {
103
106
  id: job.id,
104
- type: job.request.type,
107
+ type: job.type,
105
108
  promise,
106
109
  });
107
110
  } catch (err) {
108
111
  this.log.warn(
109
- `Error processing job! type=${ProvingRequestType[job.request.type]}: ${err}. ${(err as Error).stack}`,
112
+ `Error processing job! type=${ProvingRequestType[job.type]}: ${err}. ${(err as Error).stack}`,
110
113
  );
111
114
  }
112
115
  } catch (err) {
@@ -130,28 +133,24 @@ export class ProverAgent implements ProverAgentApi {
130
133
  this.log.info('Agent stopped');
131
134
  }
132
135
 
133
- private async work<TRequest extends ProvingRequest>(
134
- jobSource: ProvingJobSource,
135
- job: ProvingJob<TRequest>,
136
- ): Promise<void> {
136
+ private async work(jobSource: ProvingJobSource, job: ProvingJob): Promise<void> {
137
137
  try {
138
- this.log.debug(`Picked up proving job id=${job.id} type=${ProvingRequestType[job.request.type]}`);
139
- const type: TRequest['type'] = job.request.type;
140
- const [time, result] = await elapsed(this.getProof(job.request));
138
+ this.log.debug(`Picked up proving job id=${job.id} type=${ProvingRequestType[job.type]}`);
139
+ const type = job.type;
140
+ const inputs = await this.proofInputsDatabase.getProofInput(job.inputsUri);
141
+ const [time, result] = await elapsed(this.getProof(inputs));
141
142
  if (this.#isRunning()) {
142
143
  this.log.verbose(`Processed proving job id=${job.id} type=${ProvingRequestType[type]} duration=${time}ms`);
143
144
  await jobSource.resolveProvingJob(job.id, makeProvingRequestResult(type, result));
144
145
  } else {
145
146
  this.log.verbose(
146
- `Dropping proving job id=${job.id} type=${
147
- ProvingRequestType[job.request.type]
148
- } duration=${time}ms: agent stopped`,
147
+ `Dropping proving job id=${job.id} type=${ProvingRequestType[job.type]} duration=${time}ms: agent stopped`,
149
148
  );
150
149
  }
151
150
  } catch (err) {
152
- const type = ProvingRequestType[job.request.type];
151
+ const type = ProvingRequestType[job.type];
153
152
  if (this.#isRunning()) {
154
- if (job.request.type === ProvingRequestType.PUBLIC_VM && !process.env.AVM_PROVING_STRICT) {
153
+ if (job.type === ProvingRequestType.PUBLIC_VM && !process.env.AVM_PROVING_STRICT) {
155
154
  this.log.warn(`Expected error processing VM proving job id=${job.id} type=${type}: ${err}`);
156
155
  } else {
157
156
  this.log.error(`Error processing proving job id=${job.id} type=${type}: ${err}`, err);
@@ -164,10 +163,7 @@ export class ProverAgent implements ProverAgentApi {
164
163
  }
165
164
  }
166
165
 
167
- private getProof<TRequest extends ProvingRequest>(
168
- request: TRequest,
169
- ): Promise<ProvingRequestResultFor<TRequest['type']>['result']>;
170
- private getProof(request: ProvingRequest): Promise<ProvingRequestResultFor<typeof type>['result']> {
166
+ private getProof(request: ProvingJobInputs): Promise<ProvingJobResultsMap[ProvingRequestType]> {
171
167
  const { type, inputs } = request;
172
168
  switch (type) {
173
169
  case ProvingRequestType.PUBLIC_VM: {
@@ -0,0 +1,15 @@
1
+ import { type ForkMerkleTreeOperations, type ProvingJobBroker } from '@aztec/circuit-types';
2
+ import { type TelemetryClient } from '@aztec/telemetry-client';
3
+ import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
4
+
5
+ import { type ProverClientConfig } from '../config.js';
6
+ import { ProverClient } from './prover-client.js';
7
+
8
+ export function createProverClient(
9
+ config: ProverClientConfig,
10
+ worldState: ForkMerkleTreeOperations,
11
+ broker: ProvingJobBroker,
12
+ telemetry: TelemetryClient = new NoopTelemetryClient(),
13
+ ) {
14
+ return ProverClient.new(config, worldState, broker, telemetry);
15
+ }
@@ -0,0 +1,2 @@
1
+ export * from './factory.js';
2
+ export * from './prover-client.js';
@@ -0,0 +1,172 @@
1
+ import { type ACVMConfig, type BBConfig, BBNativeRollupProver, TestCircuitProver } from '@aztec/bb-prover';
2
+ import {
3
+ type ActualProverConfig,
4
+ type EpochProver,
5
+ type EpochProverManager,
6
+ type ForkMerkleTreeOperations,
7
+ type ProverCache,
8
+ type ProvingJobBroker,
9
+ type ProvingJobConsumer,
10
+ type ProvingJobProducer,
11
+ type ServerCircuitProver,
12
+ } from '@aztec/circuit-types/interfaces';
13
+ import { Fr } from '@aztec/circuits.js';
14
+ import { times } from '@aztec/foundation/collection';
15
+ import { createDebugLogger } from '@aztec/foundation/log';
16
+ import { NativeACVMSimulator } from '@aztec/simulator';
17
+ import { type TelemetryClient } from '@aztec/telemetry-client';
18
+
19
+ import { join } from 'path';
20
+
21
+ import { type ProverClientConfig } from '../config.js';
22
+ import { ProvingOrchestrator } from '../orchestrator/orchestrator.js';
23
+ import { CachingBrokerFacade } from '../proving_broker/caching_broker_facade.js';
24
+ import { InlineProofStore } from '../proving_broker/proof_store.js';
25
+ import { InMemoryProverCache } from '../proving_broker/prover_cache/memory.js';
26
+ import { ProvingAgent } from '../proving_broker/proving_agent.js';
27
+
28
+ /** Manages proving of epochs by orchestrating the proving of individual blocks relying on a pool of prover agents. */
29
+ export class ProverClient implements EpochProverManager {
30
+ private running = false;
31
+ private agents: ProvingAgent[] = [];
32
+
33
+ private cacheDir?: string;
34
+
35
+ private constructor(
36
+ private config: ProverClientConfig,
37
+ private worldState: ForkMerkleTreeOperations,
38
+ private telemetry: TelemetryClient,
39
+ private orchestratorClient: ProvingJobProducer,
40
+ private agentClient?: ProvingJobConsumer,
41
+ private log = createDebugLogger('aztec:prover-client:tx-prover'),
42
+ ) {
43
+ // TODO(palla/prover-node): Cache the paddingTx here, and not in each proving orchestrator,
44
+ // so it can be reused across multiple ones and not recomputed every time.
45
+ this.cacheDir = this.config.cacheDir ? join(this.config.cacheDir, `tx_prover_${this.config.proverId}`) : undefined;
46
+ }
47
+
48
+ public createEpochProver(cache: ProverCache = new InMemoryProverCache()): EpochProver {
49
+ return new ProvingOrchestrator(
50
+ this.worldState,
51
+ new CachingBrokerFacade(this.orchestratorClient, cache),
52
+ this.telemetry,
53
+ this.config.proverId,
54
+ );
55
+ }
56
+
57
+ public getProverId(): Fr {
58
+ return this.config.proverId ?? Fr.ZERO;
59
+ }
60
+
61
+ async updateProverConfig(config: Partial<ProverClientConfig>): Promise<void> {
62
+ const newConfig = { ...this.config, ...config };
63
+
64
+ if (
65
+ newConfig.realProofs !== this.config.realProofs ||
66
+ newConfig.proverAgentCount !== this.config.proverAgentCount
67
+ ) {
68
+ await this.stopAgents();
69
+ await this.createAndStartAgents();
70
+ }
71
+
72
+ if (!this.config.realProofs && newConfig.realProofs) {
73
+ // TODO(palla/prover-node): Reset padding tx here once we cache it at this class
74
+ }
75
+
76
+ this.config = newConfig;
77
+ }
78
+
79
+ /**
80
+ * Starts the prover instance
81
+ */
82
+ public async start(): Promise<void> {
83
+ if (this.running) {
84
+ return Promise.resolve();
85
+ }
86
+
87
+ this.running = true;
88
+ await this.createAndStartAgents();
89
+ }
90
+
91
+ /**
92
+ * Stops the prover instance
93
+ */
94
+ public async stop() {
95
+ if (!this.running) {
96
+ return;
97
+ }
98
+ this.running = false;
99
+ await this.stopAgents();
100
+ }
101
+
102
+ /**
103
+ * Creates a new prover client and starts it
104
+ * @param config - The prover configuration.
105
+ * @param worldState - An instance of the world state
106
+ * @returns An instance of the prover, constructed and started.
107
+ */
108
+ public static async new(
109
+ config: ProverClientConfig,
110
+ worldState: ForkMerkleTreeOperations,
111
+ broker: ProvingJobBroker,
112
+ telemetry: TelemetryClient,
113
+ ) {
114
+ const prover = new ProverClient(config, worldState, telemetry, broker, broker);
115
+ await prover.start();
116
+ return prover;
117
+ }
118
+
119
+ public getProvingJobSource(): ProvingJobConsumer {
120
+ if (!this.agentClient) {
121
+ throw new Error('Agent client not provided');
122
+ }
123
+
124
+ return this.agentClient;
125
+ }
126
+
127
+ private async createAndStartAgents(): Promise<void> {
128
+ if (this.agents.length > 0) {
129
+ throw new Error('Agents already started');
130
+ }
131
+
132
+ if (!this.agentClient) {
133
+ throw new Error('Agent client not provided');
134
+ }
135
+
136
+ const proofStore = new InlineProofStore();
137
+ const prover = await buildServerCircuitProver(this.config, this.telemetry);
138
+ this.agents = times(
139
+ this.config.proverAgentCount,
140
+ () =>
141
+ new ProvingAgent(
142
+ this.agentClient!,
143
+ proofStore,
144
+ prover,
145
+ this.telemetry,
146
+ [],
147
+ this.config.proverAgentPollIntervalMs,
148
+ ),
149
+ );
150
+
151
+ await Promise.all(this.agents.map(agent => agent.start()));
152
+ }
153
+
154
+ private async stopAgents() {
155
+ await Promise.all(this.agents.map(agent => agent.stop()));
156
+ }
157
+ }
158
+
159
+ export function buildServerCircuitProver(
160
+ config: ActualProverConfig & ACVMConfig & BBConfig,
161
+ telemetry: TelemetryClient,
162
+ ): Promise<ServerCircuitProver> {
163
+ if (config.realProofs) {
164
+ return BBNativeRollupProver.new(config, telemetry);
165
+ }
166
+
167
+ const simulationProvider = config.acvmBinaryPath
168
+ ? new NativeACVMSimulator(config.acvmWorkingDirectory, config.acvmBinaryPath)
169
+ : undefined;
170
+
171
+ return Promise.resolve(new TestCircuitProver(telemetry, simulationProvider, config));
172
+ }