@aztec/prover-client 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.76.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 (136) hide show
  1. package/dest/bin/get-proof-inputs.d.ts +2 -0
  2. package/dest/bin/get-proof-inputs.d.ts.map +1 -0
  3. package/dest/bin/get-proof-inputs.js +16 -18
  4. package/dest/block_builder/index.d.ts +6 -0
  5. package/dest/block_builder/index.d.ts.map +1 -0
  6. package/dest/block_builder/index.js +1 -0
  7. package/dest/block_builder/light.d.ts +31 -0
  8. package/dest/block_builder/light.d.ts.map +1 -0
  9. package/dest/block_builder/light.js +13 -23
  10. package/dest/config.d.ts +17 -0
  11. package/dest/config.d.ts.map +1 -0
  12. package/dest/config.js +11 -9
  13. package/dest/index.d.ts +4 -0
  14. package/dest/index.d.ts.map +1 -0
  15. package/dest/index.js +1 -0
  16. package/dest/mocks/fixtures.d.ts +19 -0
  17. package/dest/mocks/fixtures.d.ts.map +1 -0
  18. package/dest/mocks/fixtures.js +26 -28
  19. package/dest/mocks/test_context.d.ts +49 -0
  20. package/dest/mocks/test_context.d.ts.map +1 -0
  21. package/dest/mocks/test_context.js +46 -72
  22. package/dest/orchestrator/block-building-helpers.d.ts +50 -0
  23. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -0
  24. package/dest/orchestrator/block-building-helpers.js +81 -99
  25. package/dest/orchestrator/block-proving-state.d.ts +71 -0
  26. package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
  27. package/dest/orchestrator/block-proving-state.js +74 -99
  28. package/dest/orchestrator/epoch-proving-state.d.ts +56 -0
  29. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
  30. package/dest/orchestrator/epoch-proving-state.js +41 -57
  31. package/dest/orchestrator/index.d.ts +2 -0
  32. package/dest/orchestrator/index.d.ts.map +1 -0
  33. package/dest/orchestrator/index.js +1 -0
  34. package/dest/orchestrator/orchestrator.d.ts +108 -0
  35. package/dest/orchestrator/orchestrator.d.ts.map +1 -0
  36. package/dest/orchestrator/orchestrator.js +654 -650
  37. package/dest/orchestrator/orchestrator_metrics.d.ts +8 -0
  38. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -0
  39. package/dest/orchestrator/orchestrator_metrics.js +3 -4
  40. package/dest/orchestrator/tx-proving-state.d.ts +31 -0
  41. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -0
  42. package/dest/orchestrator/tx-proving-state.js +52 -53
  43. package/dest/prover-client/factory.d.ts +6 -0
  44. package/dest/prover-client/factory.d.ts.map +1 -0
  45. package/dest/prover-client/factory.js +1 -0
  46. package/dest/prover-client/index.d.ts +3 -0
  47. package/dest/prover-client/index.d.ts.map +1 -0
  48. package/dest/prover-client/index.js +1 -0
  49. package/dest/prover-client/prover-client.d.ts +42 -0
  50. package/dest/prover-client/prover-client.d.ts.map +1 -0
  51. package/dest/prover-client/prover-client.js +25 -30
  52. package/dest/prover-client/server-epoch-prover.d.ts +25 -0
  53. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
  54. package/dest/prover-client/server-epoch-prover.js +4 -4
  55. package/dest/proving_broker/broker_prover_facade.d.ts +39 -0
  56. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
  57. package/dest/proving_broker/broker_prover_facade.js +59 -70
  58. package/dest/proving_broker/config.d.ts +61 -0
  59. package/dest/proving_broker/config.d.ts.map +1 -0
  60. package/dest/proving_broker/config.js +37 -22
  61. package/dest/proving_broker/factory.d.ts +5 -0
  62. package/dest/proving_broker/factory.d.ts.map +1 -0
  63. package/dest/proving_broker/factory.js +2 -1
  64. package/dest/proving_broker/fixtures.d.ts +5 -0
  65. package/dest/proving_broker/fixtures.d.ts.map +1 -0
  66. package/dest/proving_broker/fixtures.js +1 -0
  67. package/dest/proving_broker/index.d.ts +10 -0
  68. package/dest/proving_broker/index.d.ts.map +1 -0
  69. package/dest/proving_broker/index.js +1 -0
  70. package/dest/proving_broker/proof_store/factory.d.ts +6 -0
  71. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
  72. package/dest/proving_broker/proof_store/factory.js +12 -9
  73. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +13 -0
  74. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
  75. package/dest/proving_broker/proof_store/gcs_proof_store.js +7 -11
  76. package/dest/proving_broker/proof_store/index.d.ts +4 -0
  77. package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
  78. package/dest/proving_broker/proof_store/index.js +1 -0
  79. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +14 -0
  80. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
  81. package/dest/proving_broker/proof_store/inline_proof_store.js +7 -11
  82. package/dest/proving_broker/proof_store/proof_store.d.ts +35 -0
  83. package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
  84. package/dest/proving_broker/proof_store/proof_store.js +2 -3
  85. package/dest/proving_broker/proving_agent.d.ts +45 -0
  86. package/dest/proving_broker/proving_agent.d.ts.map +1 -0
  87. package/dest/proving_broker/proving_agent.js +124 -120
  88. package/dest/proving_broker/proving_agent_instrumentation.d.ts +8 -0
  89. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -0
  90. package/dest/proving_broker/proving_agent_instrumentation.js +3 -3
  91. package/dest/proving_broker/proving_broker.d.ts +72 -0
  92. package/dest/proving_broker/proving_broker.d.ts.map +1 -0
  93. package/dest/proving_broker/proving_broker.js +449 -491
  94. package/dest/proving_broker/proving_broker_database/memory.d.ts +16 -0
  95. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
  96. package/dest/proving_broker/proving_broker_database/memory.js +13 -19
  97. package/dest/proving_broker/proving_broker_database/persisted.d.ts +21 -0
  98. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
  99. package/dest/proving_broker/proving_broker_database/persisted.js +21 -41
  100. package/dest/proving_broker/proving_broker_database.d.ts +39 -0
  101. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
  102. package/dest/proving_broker/proving_broker_database.js +2 -3
  103. package/dest/proving_broker/proving_broker_instrumentation.d.ts +25 -0
  104. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -0
  105. package/dest/proving_broker/proving_broker_instrumentation.js +21 -28
  106. package/dest/proving_broker/proving_job_controller.d.ts +31 -0
  107. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -0
  108. package/dest/proving_broker/proving_job_controller.js +62 -81
  109. package/dest/proving_broker/rpc.d.ts +26 -0
  110. package/dest/proving_broker/rpc.d.ts.map +1 -0
  111. package/dest/proving_broker/rpc.js +36 -26
  112. package/dest/test/mock_prover.d.ts +35 -0
  113. package/dest/test/mock_prover.d.ts.map +1 -0
  114. package/dest/test/mock_prover.js +13 -11
  115. package/package.json +12 -13
  116. package/src/index.ts +1 -1
  117. package/src/mocks/test_context.ts +23 -22
  118. package/src/orchestrator/block-building-helpers.ts +1 -38
  119. package/src/orchestrator/block-proving-state.ts +15 -15
  120. package/src/orchestrator/epoch-proving-state.ts +7 -10
  121. package/src/orchestrator/orchestrator.ts +36 -39
  122. package/src/orchestrator/tx-proving-state.ts +13 -13
  123. package/src/proving_broker/rpc.ts +24 -4
  124. package/src/test/mock_prover.ts +7 -1
  125. package/dest/prover-agent/index.js +0 -3
  126. package/dest/prover-agent/memory-proving-queue.js +0 -249
  127. package/dest/prover-agent/prover-agent.js +0 -201
  128. package/dest/prover-agent/proving-error.js +0 -8
  129. package/dest/prover-agent/queue_metrics.js +0 -24
  130. package/dest/prover-agent/rpc.js +0 -20
  131. package/src/prover-agent/index.ts +0 -3
  132. package/src/prover-agent/memory-proving-queue.ts +0 -416
  133. package/src/prover-agent/prover-agent.ts +0 -248
  134. package/src/prover-agent/proving-error.ts +0 -9
  135. package/src/prover-agent/queue_metrics.ts +0 -29
  136. package/src/prover-agent/rpc.ts +0 -22
@@ -1,416 +0,0 @@
1
- import {
2
- type ProofAndVerificationKey,
3
- type ProvingJob,
4
- type ProvingJobInputsMap,
5
- type ProvingJobSource,
6
- type ProvingRequestResultFor,
7
- ProvingRequestType,
8
- type PublicInputsAndRecursiveProof,
9
- type ServerCircuitProver,
10
- } from '@aztec/circuit-types';
11
- import type {
12
- AVM_PROOF_LENGTH_IN_FIELDS,
13
- AvmCircuitInputs,
14
- BaseParityInputs,
15
- NESTED_RECURSIVE_PROOF_LENGTH,
16
- NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
17
- ParityPublicInputs,
18
- RECURSIVE_PROOF_LENGTH,
19
- RootParityInputs,
20
- TUBE_PROOF_LENGTH,
21
- } from '@aztec/circuits.js';
22
- import {
23
- type BaseOrMergeRollupPublicInputs,
24
- type BlockMergeRollupInputs,
25
- type BlockRootOrBlockMergePublicInputs,
26
- type BlockRootRollupInputs,
27
- type EmptyBlockRootRollupInputs,
28
- type MergeRollupInputs,
29
- type PrivateBaseRollupInputs,
30
- type PublicBaseRollupInputs,
31
- type RootRollupInputs,
32
- type RootRollupPublicInputs,
33
- type SingleTxBlockRootRollupInputs,
34
- type TubeInputs,
35
- } from '@aztec/circuits.js/rollup';
36
- import { randomBytes } from '@aztec/foundation/crypto';
37
- import { AbortError, TimeoutError } from '@aztec/foundation/error';
38
- import { createLogger } from '@aztec/foundation/log';
39
- import { type PromiseWithResolvers, RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
40
- import { PriorityMemoryQueue } from '@aztec/foundation/queue';
41
- import { type TelemetryClient, type Tracer, trackSpan } from '@aztec/telemetry-client';
42
-
43
- import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store/index.js';
44
- import { ProvingQueueMetrics } from './queue_metrics.js';
45
-
46
- type ProvingJobWithResolvers<T extends ProvingRequestType = ProvingRequestType> = ProvingJob &
47
- PromiseWithResolvers<ProvingRequestResultFor<T>> & {
48
- signal?: AbortSignal;
49
- epochNumber?: number;
50
- attempts: number;
51
- heartbeat: number;
52
- };
53
-
54
- const MAX_RETRIES = 3;
55
-
56
- const defaultIdGenerator = () => randomBytes(4).toString('hex');
57
- const defaultTimeSource = () => Date.now();
58
- /**
59
- * A helper class that sits in between services that need proofs created and agents that can create them.
60
- * The queue accumulates jobs and provides them to agents prioritized by block number.
61
- */
62
- export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource {
63
- private log = createLogger('prover-client:prover-pool:queue');
64
- private queue = new PriorityMemoryQueue<ProvingJobWithResolvers>(
65
- (a, b) => (a.epochNumber ?? 0) - (b.epochNumber ?? 0),
66
- );
67
- private jobsInProgress = new Map<string, ProvingJobWithResolvers>();
68
- private runningPromise: RunningPromise;
69
- private metrics: ProvingQueueMetrics;
70
-
71
- public readonly tracer: Tracer;
72
-
73
- constructor(
74
- client: TelemetryClient,
75
- /** Timeout the job if an agent doesn't report back in this time */
76
- private jobTimeoutMs = 60 * 1000,
77
- /** How often to check for timed out jobs */
78
- pollingIntervalMs = 1000,
79
- private generateId = defaultIdGenerator,
80
- private timeSource = defaultTimeSource,
81
- private proofStore: ProofStore = new InlineProofStore(),
82
- ) {
83
- this.tracer = client.getTracer('MemoryProvingQueue');
84
- this.metrics = new ProvingQueueMetrics(client, 'MemoryProvingQueue');
85
- this.runningPromise = new RunningPromise(this.poll.bind(this), this.log, pollingIntervalMs);
86
- }
87
-
88
- public start() {
89
- if (this.runningPromise.isRunning()) {
90
- this.log.warn('Proving queue is already running');
91
- return;
92
- }
93
-
94
- this.runningPromise.start();
95
- this.log.info('Proving queue started');
96
- }
97
-
98
- public async stop() {
99
- if (!this.runningPromise.isRunning()) {
100
- this.log.warn('Proving queue is already stopped');
101
- return;
102
- }
103
-
104
- await this.runningPromise.stop();
105
- this.log.info('Proving queue stopped');
106
- }
107
-
108
- public async getProvingJob({ timeoutSec = 1 } = {}): Promise<ProvingJob | undefined> {
109
- if (!this.runningPromise.isRunning()) {
110
- throw new Error('Proving queue is not running. Start the queue before getting jobs.');
111
- }
112
-
113
- try {
114
- const job = await this.queue.get(timeoutSec);
115
- if (!job) {
116
- return undefined;
117
- }
118
-
119
- if (job.signal?.aborted) {
120
- return undefined;
121
- }
122
-
123
- job.heartbeat = this.timeSource();
124
- this.jobsInProgress.set(job.id, job);
125
- return {
126
- id: job.id,
127
- type: job.type,
128
- inputsUri: job.inputsUri,
129
- epochNumber: job.epochNumber,
130
- };
131
- } catch (err) {
132
- if (err instanceof TimeoutError) {
133
- return undefined;
134
- }
135
-
136
- throw err;
137
- }
138
- }
139
-
140
- resolveProvingJob<T extends ProvingRequestType>(jobId: string, result: ProvingRequestResultFor<T>): Promise<void> {
141
- if (!this.runningPromise.isRunning()) {
142
- throw new Error('Proving queue is not running.');
143
- }
144
-
145
- const job = this.jobsInProgress.get(jobId);
146
- if (!job) {
147
- this.log.warn(`Job id=${jobId} not found. Can't resolve`);
148
- return Promise.resolve();
149
- }
150
-
151
- this.jobsInProgress.delete(jobId);
152
- if (!job.signal?.aborted) {
153
- job.resolve(result);
154
- }
155
-
156
- return Promise.resolve();
157
- }
158
-
159
- rejectProvingJob(jobId: string, reason: string): Promise<void> {
160
- if (!this.runningPromise.isRunning()) {
161
- throw new Error('Proving queue is not running.');
162
- }
163
-
164
- const job = this.jobsInProgress.get(jobId);
165
- if (!job) {
166
- this.log.warn(`Job id=${jobId} not found. Can't reject`);
167
- return Promise.resolve();
168
- }
169
-
170
- this.jobsInProgress.delete(jobId);
171
-
172
- if (job.signal?.aborted) {
173
- return Promise.resolve();
174
- }
175
-
176
- // every job should be retried with the exception of the public VM since its in development and can fail
177
- if (job.attempts < MAX_RETRIES && job.type !== ProvingRequestType.PUBLIC_VM) {
178
- job.attempts++;
179
- this.log.warn(
180
- `Job id=${job.id} type=${ProvingRequestType[job.type]} failed with error: ${reason}. Retry ${
181
- job.attempts
182
- }/${MAX_RETRIES}`,
183
- );
184
- this.queue.put(job);
185
- } else {
186
- const logFn =
187
- job.type === ProvingRequestType.PUBLIC_VM && !process.env.AVM_PROVING_STRICT ? this.log.warn : this.log.error;
188
- logFn(`Job id=${job.id} type=${ProvingRequestType[job.type]} failed with error: ${reason}`);
189
- job.reject(new Error(reason));
190
- }
191
- return Promise.resolve();
192
- }
193
-
194
- public heartbeat(jobId: string): Promise<void> {
195
- if (!this.runningPromise.isRunning()) {
196
- throw new Error('Proving queue is not running.');
197
- }
198
-
199
- const job = this.jobsInProgress.get(jobId);
200
- if (job) {
201
- job.heartbeat = this.timeSource();
202
- }
203
-
204
- return Promise.resolve();
205
- }
206
-
207
- public isJobRunning(jobId: string): boolean {
208
- return this.jobsInProgress.has(jobId);
209
- }
210
-
211
- @trackSpan('MemoryProvingQueue.poll')
212
- private poll() {
213
- const now = this.timeSource();
214
- this.metrics.recordQueueSize(this.queue.length());
215
-
216
- for (const job of this.jobsInProgress.values()) {
217
- if (job.signal?.aborted) {
218
- this.jobsInProgress.delete(job.id);
219
- continue;
220
- }
221
-
222
- if (job.heartbeat + this.jobTimeoutMs < now) {
223
- this.log.warn(`Job ${job.id} type=${ProvingRequestType[job.type]} has timed out`);
224
-
225
- this.jobsInProgress.delete(job.id);
226
- job.heartbeat = 0;
227
- this.queue.put(job);
228
- }
229
- }
230
- }
231
-
232
- private async enqueue<T extends ProvingRequestType>(
233
- type: T,
234
- inputs: ProvingJobInputsMap[T],
235
- signal?: AbortSignal,
236
- epochNumber?: number,
237
- ): Promise<ProvingRequestResultFor<T>['result']> {
238
- if (!this.runningPromise.isRunning()) {
239
- return Promise.reject(new Error('Proving queue is not running.'));
240
- }
241
-
242
- const { promise, resolve, reject } = promiseWithResolvers<ProvingRequestResultFor<T>>();
243
- const id = this.generateId();
244
- const inputsUri = await this.proofStore.saveProofInput(id, type, inputs);
245
- const item: ProvingJobWithResolvers<T> = {
246
- id,
247
- type,
248
- inputsUri,
249
- signal,
250
- promise,
251
- resolve,
252
- reject,
253
- attempts: 1,
254
- heartbeat: 0,
255
- epochNumber: epochNumber ?? 0,
256
- };
257
-
258
- if (signal) {
259
- signal.addEventListener('abort', () => reject(new AbortError('Operation has been aborted')));
260
- }
261
-
262
- this.log.debug(
263
- `Adding id=${item.id} type=${ProvingRequestType[type]} proving job to queue depth=${this.queue.length()}`,
264
- );
265
-
266
- if (!this.queue.put(item as ProvingJobWithResolvers<any>)) {
267
- throw new Error();
268
- }
269
-
270
- return promise.then(({ result }) => result);
271
- }
272
-
273
- getTubeProof(
274
- inputs: TubeInputs,
275
- signal?: AbortSignal,
276
- epochNumber?: number,
277
- ): Promise<ProofAndVerificationKey<typeof TUBE_PROOF_LENGTH>> {
278
- return this.enqueue(ProvingRequestType.TUBE_PROOF, inputs, signal, epochNumber);
279
- }
280
-
281
- /**
282
- * Creates a proof for the given input.
283
- * @param input - Input to the circuit.
284
- */
285
- getBaseParityProof(
286
- inputs: BaseParityInputs,
287
- signal?: AbortSignal,
288
- epochNumber?: number,
289
- ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
290
- return this.enqueue(ProvingRequestType.BASE_PARITY, inputs, signal, epochNumber);
291
- }
292
-
293
- /**
294
- * Creates a proof for the given input.
295
- * @param input - Input to the circuit.
296
- */
297
- getRootParityProof(
298
- inputs: RootParityInputs,
299
- signal?: AbortSignal,
300
- epochNumber?: number,
301
- ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof NESTED_RECURSIVE_PROOF_LENGTH>> {
302
- return this.enqueue(ProvingRequestType.ROOT_PARITY, inputs, signal, epochNumber);
303
- }
304
-
305
- getPrivateBaseRollupProof(
306
- inputs: PrivateBaseRollupInputs,
307
- signal?: AbortSignal,
308
- epochNumber?: number,
309
- ): Promise<
310
- PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
311
- > {
312
- return this.enqueue(ProvingRequestType.PRIVATE_BASE_ROLLUP, inputs, signal, epochNumber);
313
- }
314
-
315
- getPublicBaseRollupProof(
316
- inputs: PublicBaseRollupInputs,
317
- signal?: AbortSignal,
318
- epochNumber?: number,
319
- ): Promise<
320
- PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
321
- > {
322
- return this.enqueue(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs, signal, epochNumber);
323
- }
324
-
325
- /**
326
- * Creates a proof for the given input.
327
- * @param input - Input to the circuit.
328
- */
329
- getMergeRollupProof(
330
- inputs: MergeRollupInputs,
331
- signal?: AbortSignal,
332
- epochNumber?: number,
333
- ): Promise<
334
- PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
335
- > {
336
- return this.enqueue(ProvingRequestType.MERGE_ROLLUP, inputs, signal, epochNumber);
337
- }
338
-
339
- /**
340
- * Creates a proof for the given input.
341
- * @param input - Input to the circuit.
342
- */
343
- getBlockRootRollupProof(
344
- inputs: BlockRootRollupInputs,
345
- signal?: AbortSignal,
346
- epochNumber?: number,
347
- ): Promise<
348
- PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
349
- > {
350
- return this.enqueue(ProvingRequestType.BLOCK_ROOT_ROLLUP, inputs, signal, epochNumber);
351
- }
352
-
353
- getSingleTxBlockRootRollupProof(
354
- inputs: SingleTxBlockRootRollupInputs,
355
- signal?: AbortSignal,
356
- epochNumber?: number,
357
- ): Promise<
358
- PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
359
- > {
360
- return this.enqueue(ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP, inputs, signal, epochNumber);
361
- }
362
-
363
- getEmptyBlockRootRollupProof(
364
- inputs: EmptyBlockRootRollupInputs,
365
- signal?: AbortSignal,
366
- epochNumber?: number,
367
- ): Promise<
368
- PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
369
- > {
370
- return this.enqueue(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, inputs, signal, epochNumber);
371
- }
372
-
373
- /**
374
- * Creates a proof for the given input.
375
- * @param input - Input to the circuit.
376
- */
377
- getBlockMergeRollupProof(
378
- inputs: BlockMergeRollupInputs,
379
- signal?: AbortSignal,
380
- epochNumber?: number,
381
- ): Promise<
382
- PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
383
- > {
384
- return this.enqueue(ProvingRequestType.BLOCK_MERGE_ROLLUP, inputs, signal, epochNumber);
385
- }
386
-
387
- /**
388
- * Creates a proof for the given input.
389
- * @param input - Input to the circuit.
390
- */
391
- getRootRollupProof(
392
- inputs: RootRollupInputs,
393
- signal?: AbortSignal,
394
- epochNumber?: number,
395
- ): Promise<PublicInputsAndRecursiveProof<RootRollupPublicInputs>> {
396
- return this.enqueue(ProvingRequestType.ROOT_ROLLUP, inputs, signal, epochNumber);
397
- }
398
-
399
- /**
400
- * Creates an AVM proof.
401
- */
402
- getAvmProof(
403
- inputs: AvmCircuitInputs,
404
- signal?: AbortSignal,
405
- epochNumber?: number,
406
- ): Promise<ProofAndVerificationKey<typeof AVM_PROOF_LENGTH_IN_FIELDS>> {
407
- return this.enqueue(ProvingRequestType.PUBLIC_VM, inputs, signal, epochNumber);
408
- }
409
-
410
- /**
411
- * Verifies a circuit proof
412
- */
413
- verifyProof(): Promise<void> {
414
- return Promise.reject('not implemented');
415
- }
416
- }
@@ -1,248 +0,0 @@
1
- import {
2
- type ProverAgentApi,
3
- type ProvingJob,
4
- type ProvingJobInputs,
5
- type ProvingJobResultsMap,
6
- type ProvingJobSource,
7
- ProvingRequestType,
8
- type ServerCircuitProver,
9
- makeProvingRequestResult,
10
- } from '@aztec/circuit-types';
11
- import { createLogger } from '@aztec/foundation/log';
12
- import { RunningPromise } from '@aztec/foundation/running-promise';
13
- import { elapsed } from '@aztec/foundation/timer';
14
- import {
15
- Attributes,
16
- type TelemetryClient,
17
- type Traceable,
18
- type Tracer,
19
- getTelemetryClient,
20
- trackSpan,
21
- } from '@aztec/telemetry-client';
22
-
23
- import { InlineProofStore } from '../proving_broker/proof_store/index.js';
24
-
25
- const PRINT_THRESHOLD_NS = 6e10; // 60 seconds
26
-
27
- type InFlightPromise = {
28
- id: string;
29
- type: ProvingRequestType;
30
- promise: Promise<any>;
31
- };
32
-
33
- /**
34
- * A helper class that encapsulates a circuit prover and connects it to a job source.
35
- */
36
- export class ProverAgent implements ProverAgentApi, Traceable {
37
- private inFlightPromises = new Map<string, InFlightPromise>();
38
- private runningPromise?: RunningPromise;
39
- private proofInputsDatabase = new InlineProofStore();
40
-
41
- public readonly tracer: Tracer;
42
-
43
- constructor(
44
- /** The prover implementation to defer jobs to */
45
- private circuitProver: ServerCircuitProver,
46
- /** How many proving jobs this agent can handle in parallel */
47
- private maxConcurrency = 1,
48
- /** How long to wait between jobs */
49
- private pollIntervalMs = 100,
50
- /** Telemetry client */
51
- telemetry: TelemetryClient = getTelemetryClient(),
52
- /** Logger */
53
- private log = createLogger('prover-client:prover-agent'),
54
- ) {
55
- this.tracer = telemetry.getTracer('ProverAgent');
56
- }
57
-
58
- setMaxConcurrency(maxConcurrency: number): Promise<void> {
59
- if (maxConcurrency < 1) {
60
- throw new Error('Concurrency must be at least 1');
61
- }
62
- this.maxConcurrency = maxConcurrency;
63
- return Promise.resolve();
64
- }
65
-
66
- setCircuitProver(circuitProver: ServerCircuitProver): void {
67
- this.circuitProver = circuitProver;
68
- }
69
-
70
- isRunning() {
71
- return Promise.resolve(this.#isRunning());
72
- }
73
-
74
- #isRunning() {
75
- return this.runningPromise?.isRunning() ?? false;
76
- }
77
-
78
- getCurrentJobs(): Promise<{ id: string; type: string }[]> {
79
- return Promise.resolve(
80
- Array.from(this.inFlightPromises.values()).map(({ id, type }) => ({ id, type: ProvingRequestType[type] })),
81
- );
82
- }
83
-
84
- start(jobSource: ProvingJobSource): void {
85
- if (this.runningPromise) {
86
- throw new Error('Agent is already running');
87
- }
88
-
89
- let lastPrint = process.hrtime.bigint();
90
-
91
- this.runningPromise = new RunningPromise(
92
- async () => {
93
- for (const jobId of this.inFlightPromises.keys()) {
94
- await jobSource.heartbeat(jobId);
95
- }
96
-
97
- const now = process.hrtime.bigint();
98
-
99
- if (now - lastPrint >= PRINT_THRESHOLD_NS) {
100
- // only log if we're actually doing work
101
- if (this.inFlightPromises.size > 0) {
102
- const jobs = Array.from(this.inFlightPromises.values())
103
- .map(job => `id=${job.id},type=${ProvingRequestType[job.type]}`)
104
- .join(' ');
105
- this.log.info(`Agent is running with ${this.inFlightPromises.size} in-flight jobs: ${jobs}`);
106
- }
107
- lastPrint = now;
108
- }
109
-
110
- while (this.inFlightPromises.size < this.maxConcurrency) {
111
- try {
112
- const job = await jobSource.getProvingJob();
113
- if (!job) {
114
- // job source is fully drained, sleep for a bit and try again
115
- return;
116
- }
117
-
118
- try {
119
- const promise = this.work(jobSource, job).finally(() => this.inFlightPromises.delete(job.id));
120
- this.inFlightPromises.set(job.id, {
121
- id: job.id,
122
- type: job.type,
123
- promise,
124
- });
125
- } catch (err) {
126
- this.log.warn(
127
- `Error processing job! type=${ProvingRequestType[job.type]}: ${err}. ${(err as Error).stack}`,
128
- );
129
- }
130
- } catch (err) {
131
- this.log.error(`Error fetching job`, err);
132
- }
133
- }
134
- },
135
- this.log,
136
- this.pollIntervalMs,
137
- );
138
-
139
- this.runningPromise.start();
140
- this.log.info(`Agent started with concurrency=${this.maxConcurrency}`);
141
- }
142
-
143
- async stop(): Promise<void> {
144
- if (!this.runningPromise?.isRunning()) {
145
- return;
146
- }
147
-
148
- await this.runningPromise.stop();
149
- this.runningPromise = undefined;
150
-
151
- this.log.info('Agent stopped');
152
- }
153
-
154
- @trackSpan('ProverAgent.work', (_jobSoure, job) => ({
155
- [Attributes.PROVING_JOB_ID]: job.id,
156
- [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[job.type],
157
- }))
158
- private async work(jobSource: ProvingJobSource, job: ProvingJob): Promise<void> {
159
- try {
160
- this.log.debug(`Picked up proving job ${job.id} ${ProvingRequestType[job.type]}`, {
161
- jobId: job.id,
162
- jobType: ProvingRequestType[job.type],
163
- });
164
- const type = job.type;
165
- const inputs = await this.proofInputsDatabase.getProofInput(job.inputsUri);
166
- const [time, result] = await elapsed(this.getProof(inputs));
167
- if (this.#isRunning()) {
168
- this.log.verbose(`Processed proving job id=${job.id} type=${ProvingRequestType[type]} duration=${time}ms`);
169
- await jobSource.resolveProvingJob(job.id, makeProvingRequestResult(type, result));
170
- } else {
171
- this.log.verbose(
172
- `Dropping proving job id=${job.id} type=${ProvingRequestType[job.type]} duration=${time}ms: agent stopped`,
173
- );
174
- }
175
- } catch (err) {
176
- const type = ProvingRequestType[job.type];
177
- if (this.#isRunning()) {
178
- if (job.type === ProvingRequestType.PUBLIC_VM && !process.env.AVM_PROVING_STRICT) {
179
- this.log.warn(`Expected error processing VM proving job id=${job.id} type=${type}: ${err}`);
180
- } else {
181
- this.log.error(`Error processing proving job id=${job.id} type=${type}: ${err}`, err);
182
- }
183
- const reason = (err as any)?.message ?? String(err);
184
- await jobSource.rejectProvingJob(job.id, reason);
185
- } else {
186
- this.log.verbose(`Dropping proving job id=${job.id} type=${type}: agent stopped: ${(err as any).stack || err}`);
187
- }
188
- }
189
- }
190
-
191
- private getProof(request: ProvingJobInputs): Promise<ProvingJobResultsMap[ProvingRequestType]> {
192
- const { type, inputs } = request;
193
- switch (type) {
194
- case ProvingRequestType.PUBLIC_VM: {
195
- return this.circuitProver.getAvmProof(inputs);
196
- }
197
-
198
- case ProvingRequestType.PRIVATE_BASE_ROLLUP: {
199
- return this.circuitProver.getPrivateBaseRollupProof(inputs);
200
- }
201
-
202
- case ProvingRequestType.PUBLIC_BASE_ROLLUP: {
203
- return this.circuitProver.getPublicBaseRollupProof(inputs);
204
- }
205
-
206
- case ProvingRequestType.MERGE_ROLLUP: {
207
- return this.circuitProver.getMergeRollupProof(inputs);
208
- }
209
-
210
- case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: {
211
- return this.circuitProver.getEmptyBlockRootRollupProof(inputs);
212
- }
213
-
214
- case ProvingRequestType.BLOCK_ROOT_ROLLUP: {
215
- return this.circuitProver.getBlockRootRollupProof(inputs);
216
- }
217
-
218
- case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP: {
219
- return this.circuitProver.getSingleTxBlockRootRollupProof(inputs);
220
- }
221
-
222
- case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
223
- return this.circuitProver.getBlockMergeRollupProof(inputs);
224
- }
225
-
226
- case ProvingRequestType.ROOT_ROLLUP: {
227
- return this.circuitProver.getRootRollupProof(inputs);
228
- }
229
-
230
- case ProvingRequestType.BASE_PARITY: {
231
- return this.circuitProver.getBaseParityProof(inputs);
232
- }
233
-
234
- case ProvingRequestType.ROOT_PARITY: {
235
- return this.circuitProver.getRootParityProof(inputs);
236
- }
237
-
238
- case ProvingRequestType.TUBE_PROOF: {
239
- return this.circuitProver.getTubeProof(inputs);
240
- }
241
-
242
- default: {
243
- const _exhaustive: never = type;
244
- return Promise.reject(new Error(`Invalid proof request type: ${type}`));
245
- }
246
- }
247
- }
248
- }
@@ -1,9 +0,0 @@
1
- export class ProvingError extends Error {
2
- override toString() {
3
- return this.message;
4
- }
5
-
6
- static fromString(message: string) {
7
- return new ProvingError(message);
8
- }
9
- }
@@ -1,29 +0,0 @@
1
- import { ProvingRequestType } from '@aztec/circuit-types';
2
- import { Attributes, type Gauge, type Histogram, Metrics, type TelemetryClient } from '@aztec/telemetry-client';
3
-
4
- export class ProvingQueueMetrics {
5
- private jobSize: Histogram;
6
- private queueSize: Gauge;
7
-
8
- constructor(client: TelemetryClient, name = 'ProvingQueueMetrics') {
9
- const meter = client.getMeter(name);
10
- this.jobSize = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_SIZE, {
11
- description: 'Size of proving job',
12
- unit: 'by',
13
- });
14
-
15
- this.queueSize = meter.createGauge(Metrics.PROVING_QUEUE_SIZE, {
16
- description: 'Size of proving queue',
17
- });
18
- }
19
-
20
- recordNewJob(type: ProvingRequestType, size: number) {
21
- this.jobSize.record(size, {
22
- [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[type],
23
- });
24
- }
25
-
26
- recordQueueSize(size: number) {
27
- this.queueSize.record(size);
28
- }
29
- }