@aztec/prover-client 0.67.1 → 0.68.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.
- package/dest/block_builder/light.d.ts +4 -3
- package/dest/block_builder/light.d.ts.map +1 -1
- package/dest/block_builder/light.js +23 -16
- package/dest/index.d.ts +0 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -2
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +3 -3
- package/dest/mocks/test_context.d.ts +3 -2
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +22 -11
- package/dest/orchestrator/block-building-helpers.d.ts +8 -2
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +20 -7
- package/dest/orchestrator/block-proving-state.d.ts +8 -5
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +16 -7
- package/dest/orchestrator/epoch-proving-state.d.ts +3 -2
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +3 -3
- package/dest/orchestrator/orchestrator.d.ts +10 -7
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +94 -56
- package/dest/orchestrator/tx-proving-state.d.ts +2 -1
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +3 -2
- package/dest/prover-agent/memory-proving-queue.d.ts +4 -2
- package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
- package/dest/prover-agent/memory-proving-queue.js +240 -224
- package/dest/prover-agent/prover-agent.d.ts +11 -2
- package/dest/prover-agent/prover-agent.d.ts.map +1 -1
- package/dest/prover-agent/prover-agent.js +186 -159
- package/dest/prover-client/prover-client.d.ts +2 -3
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +4 -7
- package/dest/proving_broker/{caching_broker_facade.d.ts → broker_prover_facade.d.ts} +6 -9
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
- package/dest/proving_broker/broker_prover_facade.js +107 -0
- package/dest/proving_broker/proving_agent.d.ts +4 -3
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +73 -64
- package/dest/proving_broker/proving_broker.d.ts +4 -3
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +403 -324
- package/dest/proving_broker/proving_job_controller.d.ts +2 -1
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +15 -14
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +1 -2
- package/dest/test/mock_prover.d.ts +6 -6
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +3 -6
- package/package.json +16 -15
- package/src/block_builder/light.ts +23 -16
- package/src/index.ts +0 -1
- package/src/mocks/fixtures.ts +2 -2
- package/src/mocks/test_context.ts +31 -16
- package/src/orchestrator/block-building-helpers.ts +34 -18
- package/src/orchestrator/block-proving-state.ts +18 -8
- package/src/orchestrator/epoch-proving-state.ts +1 -4
- package/src/orchestrator/orchestrator.ts +113 -62
- package/src/orchestrator/tx-proving-state.ts +6 -4
- package/src/prover-agent/memory-proving-queue.ts +21 -15
- package/src/prover-agent/prover-agent.ts +65 -46
- package/src/prover-client/prover-client.ts +3 -10
- package/src/proving_broker/{caching_broker_facade.ts → broker_prover_facade.ts} +46 -83
- package/src/proving_broker/proving_agent.ts +72 -76
- package/src/proving_broker/proving_broker.ts +114 -36
- package/src/proving_broker/proving_job_controller.ts +13 -12
- package/src/proving_broker/rpc.ts +0 -1
- package/src/test/mock_prover.ts +17 -14
- package/dest/proving_broker/caching_broker_facade.d.ts.map +0 -1
- package/dest/proving_broker/caching_broker_facade.js +0 -153
- package/dest/proving_broker/prover_cache/memory.d.ts +0 -9
- package/dest/proving_broker/prover_cache/memory.d.ts.map +0 -1
- package/dest/proving_broker/prover_cache/memory.js +0 -16
- package/src/proving_broker/prover_cache/memory.ts +0 -20
|
@@ -14,7 +14,7 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
14
14
|
import { type PromiseWithResolvers, RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
|
|
15
15
|
import { PriorityMemoryQueue } from '@aztec/foundation/queue';
|
|
16
16
|
import { Timer } from '@aztec/foundation/timer';
|
|
17
|
-
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
17
|
+
import { type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client';
|
|
18
18
|
|
|
19
19
|
import assert from 'assert';
|
|
20
20
|
|
|
@@ -41,7 +41,7 @@ type EnqueuedProvingJob = Pick<ProvingJob, 'id' | 'epochNumber'>;
|
|
|
41
41
|
* A broker that manages proof requests and distributes them to workers based on their priority.
|
|
42
42
|
* It takes a backend that is responsible for storing and retrieving proof requests and results.
|
|
43
43
|
*/
|
|
44
|
-
export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
44
|
+
export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Traceable {
|
|
45
45
|
private queues: ProvingQueues = {
|
|
46
46
|
[ProvingRequestType.PUBLIC_VM]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
|
|
47
47
|
[ProvingRequestType.TUBE_PROOF]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
|
|
@@ -87,6 +87,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
87
87
|
private maxRetries: number;
|
|
88
88
|
|
|
89
89
|
private instrumentation: ProvingBrokerInstrumentation;
|
|
90
|
+
public readonly tracer: Tracer;
|
|
90
91
|
|
|
91
92
|
private maxParallelCleanUps: number;
|
|
92
93
|
|
|
@@ -115,8 +116,9 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
115
116
|
}: ProofRequestBrokerConfig = {},
|
|
116
117
|
private logger = createLogger('prover-client:proving-broker'),
|
|
117
118
|
) {
|
|
119
|
+
this.tracer = client.getTracer('ProvingBroker');
|
|
118
120
|
this.instrumentation = new ProvingBrokerInstrumentation(client);
|
|
119
|
-
this.cleanupPromise = new RunningPromise(this.cleanupPass, timeoutIntervalMs);
|
|
121
|
+
this.cleanupPromise = new RunningPromise(this.cleanupPass.bind(this), this.logger, timeoutIntervalMs);
|
|
120
122
|
this.jobTimeoutMs = jobTimeoutMs;
|
|
121
123
|
this.maxRetries = maxRetries;
|
|
122
124
|
this.maxEpochsToKeepResultsFor = maxEpochsToKeepResultsFor;
|
|
@@ -141,7 +143,10 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
141
143
|
|
|
142
144
|
public start(): Promise<void> {
|
|
143
145
|
for (const [item, result] of this.database.allProvingJobs()) {
|
|
144
|
-
this.logger.info(`Restoring proving job id=${item.id} settled=${!!result}
|
|
146
|
+
this.logger.info(`Restoring proving job id=${item.id} settled=${!!result}`, {
|
|
147
|
+
provingJobId: item.id,
|
|
148
|
+
status: result ? result.status : 'pending',
|
|
149
|
+
});
|
|
145
150
|
|
|
146
151
|
this.jobsCache.set(item.id, item);
|
|
147
152
|
this.promises.set(item.id, promiseWithResolvers());
|
|
@@ -150,7 +155,6 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
150
155
|
this.promises.get(item.id)!.resolve(result);
|
|
151
156
|
this.resultsCache.set(item.id, result);
|
|
152
157
|
} else {
|
|
153
|
-
this.logger.debug(`Re-enqueuing proving job id=${item.id}`);
|
|
154
158
|
this.enqueueJobInternal(item);
|
|
155
159
|
}
|
|
156
160
|
}
|
|
@@ -171,37 +175,66 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
171
175
|
if (this.jobsCache.has(job.id)) {
|
|
172
176
|
const existing = this.jobsCache.get(job.id);
|
|
173
177
|
assert.deepStrictEqual(job, existing, 'Duplicate proving job ID');
|
|
178
|
+
this.logger.debug(`Duplicate proving job id=${job.id} epochNumber=${job.epochNumber}. Ignoring`, {
|
|
179
|
+
provingJobId: job.id,
|
|
180
|
+
});
|
|
174
181
|
return;
|
|
175
182
|
}
|
|
176
183
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
184
|
+
if (this.isJobStale(job)) {
|
|
185
|
+
this.logger.warn(`Tried enqueueing stale proving job id=${job.id} epochNumber=${job.epochNumber}`, {
|
|
186
|
+
provingJobId: job.id,
|
|
187
|
+
});
|
|
188
|
+
throw new Error(`Epoch too old: job epoch ${job.epochNumber}, current epoch: ${this.epochHeight}`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
this.logger.info(`New proving job id=${job.id} epochNumber=${job.epochNumber}`, { provingJobId: job.id });
|
|
192
|
+
try {
|
|
193
|
+
// do this first so it acts as a "lock". If this job is enqueued again while we're saving it the if at the top will catch it.
|
|
194
|
+
this.jobsCache.set(job.id, job);
|
|
195
|
+
await this.database.addProvingJob(job);
|
|
196
|
+
this.enqueueJobInternal(job);
|
|
197
|
+
} catch (err) {
|
|
198
|
+
this.logger.error(`Failed to save proving job id=${job.id}: ${err}`, err, { provingJobId: job.id });
|
|
199
|
+
this.jobsCache.delete(job.id);
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
180
202
|
}
|
|
181
203
|
|
|
182
204
|
public waitForJobToSettle(id: ProvingJobId): Promise<ProvingJobSettledResult> {
|
|
183
205
|
const promiseWithResolvers = this.promises.get(id);
|
|
184
206
|
if (!promiseWithResolvers) {
|
|
207
|
+
this.logger.warn(`Job id=${id} not found`, { provingJobId: id });
|
|
185
208
|
return Promise.resolve({ status: 'rejected', reason: `Job ${id} not found` });
|
|
186
209
|
}
|
|
187
210
|
return promiseWithResolvers.promise;
|
|
188
211
|
}
|
|
189
212
|
|
|
190
213
|
public async cancelProvingJob(id: ProvingJobId): Promise<void> {
|
|
214
|
+
if (!this.jobsCache.has(id)) {
|
|
215
|
+
this.logger.warn(`Can't cancel a job that doesn't exist id=${id}`, { provingJobId: id });
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
191
219
|
// notify listeners of the cancellation
|
|
192
220
|
if (!this.resultsCache.has(id)) {
|
|
193
|
-
this.logger.info(`Cancelling job id=${id}
|
|
221
|
+
this.logger.info(`Cancelling job id=${id}`, { provingJobId: id });
|
|
194
222
|
await this.reportProvingJobError(id, 'Aborted', false);
|
|
195
223
|
}
|
|
196
224
|
}
|
|
197
225
|
|
|
198
|
-
|
|
226
|
+
private async cleanUpProvingJobState(id: ProvingJobId): Promise<void> {
|
|
227
|
+
if (!this.jobsCache.has(id)) {
|
|
228
|
+
this.logger.warn(`Can't clean up a job that doesn't exist id=${id}`, { provingJobId: id });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
199
232
|
if (!this.resultsCache.has(id)) {
|
|
200
|
-
this.logger.warn(`Can't cleanup busy proving job: id=${id}
|
|
233
|
+
this.logger.warn(`Can't cleanup busy proving job: id=${id}`, { provingJobId: id });
|
|
201
234
|
return;
|
|
202
235
|
}
|
|
203
236
|
|
|
204
|
-
this.logger.debug(`Cleaning up state for job id=${id}
|
|
237
|
+
this.logger.debug(`Cleaning up state for job id=${id}`, { provingJobId: id });
|
|
205
238
|
await this.database.deleteProvingJobAndResult(id);
|
|
206
239
|
this.jobsCache.delete(id);
|
|
207
240
|
this.promises.delete(id);
|
|
@@ -219,7 +252,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
219
252
|
const item = this.jobsCache.get(id);
|
|
220
253
|
|
|
221
254
|
if (!item) {
|
|
222
|
-
this.logger.warn(`Proving job id=${id} not found
|
|
255
|
+
this.logger.warn(`Proving job id=${id} not found`, { provingJobId: id });
|
|
223
256
|
return Promise.resolve({ status: 'not-found' });
|
|
224
257
|
}
|
|
225
258
|
|
|
@@ -272,45 +305,68 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
272
305
|
const retries = this.retries.get(id) ?? 0;
|
|
273
306
|
|
|
274
307
|
if (!item) {
|
|
275
|
-
this.logger.warn(`
|
|
308
|
+
this.logger.warn(`Can't set error on unknown proving job id=${id} err=${err}`, { provingJoId: id });
|
|
276
309
|
return;
|
|
277
310
|
}
|
|
278
311
|
|
|
279
312
|
if (!info) {
|
|
280
|
-
this.logger.warn(`Proving job id=${id} type=${ProvingRequestType[item.type]} not in the in-progress set
|
|
313
|
+
this.logger.warn(`Proving job id=${id} type=${ProvingRequestType[item.type]} not in the in-progress set`, {
|
|
314
|
+
provingJobId: id,
|
|
315
|
+
});
|
|
281
316
|
} else {
|
|
282
317
|
this.inProgress.delete(id);
|
|
283
318
|
}
|
|
284
319
|
|
|
285
320
|
if (this.resultsCache.has(id)) {
|
|
286
|
-
this.logger.warn(`Proving job id=${id}
|
|
321
|
+
this.logger.warn(`Proving job id=${id} is already settled, ignoring err=${err}`, {
|
|
322
|
+
provingJobId: id,
|
|
323
|
+
});
|
|
287
324
|
return;
|
|
288
325
|
}
|
|
289
326
|
|
|
290
327
|
if (retry && retries + 1 < this.maxRetries && !this.isJobStale(item)) {
|
|
291
|
-
this.logger.info(
|
|
328
|
+
this.logger.info(
|
|
329
|
+
`Retrying proving job id=${id} type=${ProvingRequestType[item.type]} retry=${retries + 1} err=${err}`,
|
|
330
|
+
{
|
|
331
|
+
provingJobId: id,
|
|
332
|
+
},
|
|
333
|
+
);
|
|
292
334
|
this.retries.set(id, retries + 1);
|
|
293
335
|
this.enqueueJobInternal(item);
|
|
294
336
|
this.instrumentation.incRetriedJobs(item.type);
|
|
295
337
|
return;
|
|
296
338
|
}
|
|
297
339
|
|
|
298
|
-
this.logger.
|
|
340
|
+
this.logger.info(
|
|
299
341
|
`Marking proving job as failed id=${id} type=${ProvingRequestType[item.type]} totalAttempts=${
|
|
300
342
|
retries + 1
|
|
301
343
|
} err=${err}`,
|
|
344
|
+
{
|
|
345
|
+
provingJobId: id,
|
|
346
|
+
},
|
|
302
347
|
);
|
|
303
348
|
|
|
304
|
-
|
|
305
|
-
|
|
349
|
+
// save the result to the cache and notify clients of the job status
|
|
350
|
+
// this should work even if our database breaks because the result is cached in memory
|
|
306
351
|
const result: ProvingJobSettledResult = { status: 'rejected', reason: String(err) };
|
|
307
352
|
this.resultsCache.set(id, result);
|
|
308
353
|
this.promises.get(id)!.resolve(result);
|
|
354
|
+
|
|
309
355
|
this.instrumentation.incRejectedJobs(item.type);
|
|
310
356
|
if (info) {
|
|
311
357
|
const duration = this.msTimeSource() - info.startedAt;
|
|
312
358
|
this.instrumentation.recordJobDuration(item.type, duration);
|
|
313
359
|
}
|
|
360
|
+
|
|
361
|
+
try {
|
|
362
|
+
await this.database.setProvingJobError(id, err);
|
|
363
|
+
} catch (saveErr) {
|
|
364
|
+
this.logger.error(`Failed to save proving job error status id=${id} jobErr=${err}`, saveErr, {
|
|
365
|
+
provingJobId: id,
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
throw saveErr;
|
|
369
|
+
}
|
|
314
370
|
}
|
|
315
371
|
|
|
316
372
|
reportProvingJobProgress(
|
|
@@ -320,12 +376,12 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
320
376
|
): Promise<{ job: ProvingJob; time: number } | undefined> {
|
|
321
377
|
const job = this.jobsCache.get(id);
|
|
322
378
|
if (!job) {
|
|
323
|
-
this.logger.warn(`Proving job id=${id} does not exist
|
|
379
|
+
this.logger.warn(`Proving job id=${id} does not exist`, { provingJobId: id });
|
|
324
380
|
return filter ? this.getProvingJob(filter) : Promise.resolve(undefined);
|
|
325
381
|
}
|
|
326
382
|
|
|
327
383
|
if (this.resultsCache.has(id)) {
|
|
328
|
-
this.logger.warn(`Proving job id=${id} has already been completed
|
|
384
|
+
this.logger.warn(`Proving job id=${id} has already been completed`, { provingJobId: id });
|
|
329
385
|
return filter ? this.getProvingJob(filter) : Promise.resolve(undefined);
|
|
330
386
|
}
|
|
331
387
|
|
|
@@ -334,6 +390,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
334
390
|
if (!metadata) {
|
|
335
391
|
this.logger.warn(
|
|
336
392
|
`Proving job id=${id} type=${ProvingRequestType[job.type]} not found in the in-progress cache, adding it`,
|
|
393
|
+
{ provingJobId: id },
|
|
337
394
|
);
|
|
338
395
|
// the queue will still contain the item at this point!
|
|
339
396
|
// we need to be careful when popping off the queue to make sure we're not sending
|
|
@@ -346,11 +403,12 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
346
403
|
return Promise.resolve(undefined);
|
|
347
404
|
} else if (startedAt <= metadata.startedAt) {
|
|
348
405
|
if (startedAt < metadata.startedAt) {
|
|
349
|
-
this.logger.
|
|
406
|
+
this.logger.info(
|
|
350
407
|
`Proving job id=${id} type=${ProvingRequestType[job.type]} startedAt=${startedAt} older agent has taken job`,
|
|
408
|
+
{ provingJobId: id },
|
|
351
409
|
);
|
|
352
410
|
} else {
|
|
353
|
-
this.logger.debug(`Proving job id=${id} type=${ProvingRequestType[job.type]} heartbeat
|
|
411
|
+
this.logger.debug(`Proving job id=${id} type=${ProvingRequestType[job.type]} heartbeat`, { provingJobId: id });
|
|
354
412
|
}
|
|
355
413
|
metadata.startedAt = startedAt;
|
|
356
414
|
metadata.lastUpdatedAt = now;
|
|
@@ -360,6 +418,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
360
418
|
`Proving job id=${id} type=${
|
|
361
419
|
ProvingRequestType[job.type]
|
|
362
420
|
} already being worked on by another agent. Sending new one`,
|
|
421
|
+
{ provingJobId: id },
|
|
363
422
|
);
|
|
364
423
|
return this.getProvingJob(filter);
|
|
365
424
|
} else {
|
|
@@ -372,37 +431,57 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
372
431
|
const item = this.jobsCache.get(id);
|
|
373
432
|
const retries = this.retries.get(id) ?? 0;
|
|
374
433
|
if (!item) {
|
|
375
|
-
this.logger.warn(`Proving job id=${id} not found
|
|
434
|
+
this.logger.warn(`Proving job id=${id} not found`, { provingJobId: id });
|
|
376
435
|
return;
|
|
377
436
|
}
|
|
378
437
|
|
|
379
438
|
if (!info) {
|
|
380
|
-
this.logger.warn(`Proving job id=${id} type=${ProvingRequestType[item.type]} not in the in-progress set
|
|
439
|
+
this.logger.warn(`Proving job id=${id} type=${ProvingRequestType[item.type]} not in the in-progress set`, {
|
|
440
|
+
provingJobId: id,
|
|
441
|
+
});
|
|
381
442
|
} else {
|
|
382
443
|
this.inProgress.delete(id);
|
|
383
444
|
}
|
|
384
445
|
|
|
385
446
|
if (this.resultsCache.has(id)) {
|
|
386
|
-
this.logger.warn(`Proving job id=${id} already settled, ignoring result
|
|
447
|
+
this.logger.warn(`Proving job id=${id} already settled, ignoring result`, { provingJobId: id });
|
|
387
448
|
return;
|
|
388
449
|
}
|
|
389
450
|
|
|
390
|
-
this.logger.
|
|
451
|
+
this.logger.info(
|
|
391
452
|
`Proving job complete id=${id} type=${ProvingRequestType[item.type]} totalAttempts=${retries + 1}`,
|
|
453
|
+
{ provingJobId: id },
|
|
392
454
|
);
|
|
393
455
|
|
|
394
|
-
|
|
395
|
-
|
|
456
|
+
// save result to our local cache and notify clients
|
|
457
|
+
// if save to database fails, that's ok because we have the result in memory
|
|
458
|
+
// if the broker crashes and needs the result again, we're covered because we can just recompute it
|
|
396
459
|
const result: ProvingJobSettledResult = { status: 'fulfilled', value };
|
|
397
460
|
this.resultsCache.set(id, result);
|
|
398
461
|
this.promises.get(id)!.resolve(result);
|
|
462
|
+
|
|
399
463
|
this.instrumentation.incResolvedJobs(item.type);
|
|
464
|
+
if (info) {
|
|
465
|
+
const duration = this.msTimeSource() - info.startedAt;
|
|
466
|
+
this.instrumentation.recordJobDuration(item.type, duration);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
try {
|
|
470
|
+
await this.database.setProvingJobResult(id, value);
|
|
471
|
+
} catch (saveErr) {
|
|
472
|
+
this.logger.error(`Failed to save proving job result id=${id}`, saveErr, {
|
|
473
|
+
provingJobId: id,
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
throw saveErr;
|
|
477
|
+
}
|
|
400
478
|
}
|
|
401
479
|
|
|
402
|
-
|
|
480
|
+
@trackSpan('ProvingBroker.cleanupPass')
|
|
481
|
+
private async cleanupPass() {
|
|
403
482
|
await this.cleanupStaleJobs();
|
|
404
483
|
await this.reEnqueueExpiredJobs();
|
|
405
|
-
}
|
|
484
|
+
}
|
|
406
485
|
|
|
407
486
|
private async cleanupStaleJobs() {
|
|
408
487
|
const jobIds = Array.from(this.jobsCache.keys());
|
|
@@ -416,7 +495,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
416
495
|
}
|
|
417
496
|
|
|
418
497
|
if (jobsToClean.length > 0) {
|
|
419
|
-
this.logger.info(`Cleaning up
|
|
498
|
+
this.logger.info(`Cleaning up jobs=${jobsToClean.length}`);
|
|
420
499
|
await asyncPool(this.maxParallelCleanUps, jobsToClean, async jobId => {
|
|
421
500
|
await this.cleanUpProvingJobState(jobId);
|
|
422
501
|
});
|
|
@@ -428,7 +507,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
428
507
|
for (const [id, metadata] of inProgressEntries) {
|
|
429
508
|
const item = this.jobsCache.get(id);
|
|
430
509
|
if (!item) {
|
|
431
|
-
this.logger.warn(`Proving job id=${id} not found. Removing it from the queue
|
|
510
|
+
this.logger.warn(`Proving job id=${id} not found. Removing it from the queue.`, { provingJobId: id });
|
|
432
511
|
this.inProgress.delete(id);
|
|
433
512
|
continue;
|
|
434
513
|
}
|
|
@@ -440,7 +519,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
440
519
|
// the job has timed out and it's also old, just cancel and move on
|
|
441
520
|
await this.cancelProvingJob(item.id);
|
|
442
521
|
} else {
|
|
443
|
-
this.logger.warn(`Proving job id=${id} timed out. Adding it back to the queue
|
|
522
|
+
this.logger.warn(`Proving job id=${id} timed out. Adding it back to the queue.`, { provingJobId: id });
|
|
444
523
|
this.inProgress.delete(id);
|
|
445
524
|
this.enqueueJobInternal(item);
|
|
446
525
|
this.instrumentation.incTimedOutJobs(item.type);
|
|
@@ -459,7 +538,6 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer {
|
|
|
459
538
|
});
|
|
460
539
|
this.enqueuedAt.set(job.id, new Timer());
|
|
461
540
|
this.epochHeight = Math.max(this.epochHeight, job.epochNumber);
|
|
462
|
-
this.logger.debug(`Enqueued new proving job id=${job.id}`);
|
|
463
541
|
}
|
|
464
542
|
|
|
465
543
|
private isJobStale(job: ProvingJob) {
|
|
@@ -30,6 +30,7 @@ export class ProvingJobController {
|
|
|
30
30
|
constructor(
|
|
31
31
|
private jobId: ProvingJobId,
|
|
32
32
|
private inputs: ProvingJobInputs,
|
|
33
|
+
private epochNumber: number,
|
|
33
34
|
private startedAt: number,
|
|
34
35
|
private circuitProver: ServerCircuitProver,
|
|
35
36
|
private onComplete: ProvingJobCompletionCallback,
|
|
@@ -100,51 +101,51 @@ export class ProvingJobController {
|
|
|
100
101
|
const signal = this.abortController.signal;
|
|
101
102
|
switch (type) {
|
|
102
103
|
case ProvingRequestType.PUBLIC_VM: {
|
|
103
|
-
return await this.circuitProver.getAvmProof(inputs, signal);
|
|
104
|
+
return await this.circuitProver.getAvmProof(inputs, signal, this.epochNumber);
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
case ProvingRequestType.PRIVATE_BASE_ROLLUP: {
|
|
107
|
-
return await this.circuitProver.getPrivateBaseRollupProof(inputs, signal);
|
|
108
|
+
return await this.circuitProver.getPrivateBaseRollupProof(inputs, signal, this.epochNumber);
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
case ProvingRequestType.PUBLIC_BASE_ROLLUP: {
|
|
111
|
-
return await this.circuitProver.getPublicBaseRollupProof(inputs, signal);
|
|
112
|
+
return await this.circuitProver.getPublicBaseRollupProof(inputs, signal, this.epochNumber);
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
case ProvingRequestType.MERGE_ROLLUP: {
|
|
115
|
-
return await this.circuitProver.getMergeRollupProof(inputs, signal);
|
|
116
|
+
return await this.circuitProver.getMergeRollupProof(inputs, signal, this.epochNumber);
|
|
116
117
|
}
|
|
117
118
|
|
|
118
119
|
case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: {
|
|
119
|
-
return await this.circuitProver.getEmptyBlockRootRollupProof(inputs, signal);
|
|
120
|
+
return await this.circuitProver.getEmptyBlockRootRollupProof(inputs, signal, this.epochNumber);
|
|
120
121
|
}
|
|
121
122
|
|
|
122
123
|
case ProvingRequestType.BLOCK_ROOT_ROLLUP: {
|
|
123
|
-
return await this.circuitProver.getBlockRootRollupProof(inputs, signal);
|
|
124
|
+
return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber);
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
|
|
127
|
-
return await this.circuitProver.getBlockMergeRollupProof(inputs, signal);
|
|
128
|
+
return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber);
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
case ProvingRequestType.ROOT_ROLLUP: {
|
|
131
|
-
return await this.circuitProver.getRootRollupProof(inputs, signal);
|
|
132
|
+
return await this.circuitProver.getRootRollupProof(inputs, signal, this.epochNumber);
|
|
132
133
|
}
|
|
133
134
|
|
|
134
135
|
case ProvingRequestType.BASE_PARITY: {
|
|
135
|
-
return await this.circuitProver.getBaseParityProof(inputs, signal);
|
|
136
|
+
return await this.circuitProver.getBaseParityProof(inputs, signal, this.epochNumber);
|
|
136
137
|
}
|
|
137
138
|
|
|
138
139
|
case ProvingRequestType.ROOT_PARITY: {
|
|
139
|
-
return await this.circuitProver.getRootParityProof(inputs, signal);
|
|
140
|
+
return await this.circuitProver.getRootParityProof(inputs, signal, this.epochNumber);
|
|
140
141
|
}
|
|
141
142
|
|
|
142
143
|
case ProvingRequestType.PRIVATE_KERNEL_EMPTY: {
|
|
143
|
-
return await this.circuitProver.getEmptyPrivateKernelProof(inputs, signal);
|
|
144
|
+
return await this.circuitProver.getEmptyPrivateKernelProof(inputs, signal, this.epochNumber);
|
|
144
145
|
}
|
|
145
146
|
|
|
146
147
|
case ProvingRequestType.TUBE_PROOF: {
|
|
147
|
-
return await this.circuitProver.getTubeProof(inputs, signal);
|
|
148
|
+
return await this.circuitProver.getTubeProof(inputs, signal, this.epochNumber);
|
|
148
149
|
}
|
|
149
150
|
|
|
150
151
|
default: {
|
|
@@ -28,7 +28,6 @@ const GetProvingJobResponse = z.object({
|
|
|
28
28
|
export const ProvingJobProducerSchema: ApiSchemaFor<ProvingJobProducer> = {
|
|
29
29
|
enqueueProvingJob: z.function().args(ProvingJob).returns(z.void()),
|
|
30
30
|
getProvingJobStatus: z.function().args(ProvingJobId).returns(ProvingJobStatus),
|
|
31
|
-
cleanUpProvingJobState: z.function().args(ProvingJobId).returns(z.void()),
|
|
32
31
|
cancelProvingJob: z.function().args(ProvingJobId).returns(z.void()),
|
|
33
32
|
waitForJobToSettle: z.function().args(ProvingJobId).returns(ProvingJobSettledResult),
|
|
34
33
|
};
|
package/src/test/mock_prover.ts
CHANGED
|
@@ -14,27 +14,29 @@ import {
|
|
|
14
14
|
AVM_PROOF_LENGTH_IN_FIELDS,
|
|
15
15
|
AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS,
|
|
16
16
|
type AvmCircuitInputs,
|
|
17
|
-
type BaseOrMergeRollupPublicInputs,
|
|
18
17
|
type BaseParityInputs,
|
|
19
|
-
type BlockMergeRollupInputs,
|
|
20
|
-
type BlockRootOrBlockMergePublicInputs,
|
|
21
|
-
type BlockRootRollupInputs,
|
|
22
|
-
type EmptyBlockRootRollupInputs,
|
|
23
18
|
type KernelCircuitPublicInputs,
|
|
24
|
-
type MergeRollupInputs,
|
|
25
19
|
NESTED_RECURSIVE_PROOF_LENGTH,
|
|
26
|
-
type PrivateBaseRollupInputs,
|
|
27
20
|
type PrivateKernelEmptyInputData,
|
|
28
|
-
type PublicBaseRollupInputs,
|
|
29
21
|
RECURSIVE_PROOF_LENGTH,
|
|
30
22
|
type RootParityInputs,
|
|
31
|
-
type RootRollupInputs,
|
|
32
|
-
type RootRollupPublicInputs,
|
|
33
23
|
TUBE_PROOF_LENGTH,
|
|
34
24
|
VerificationKeyData,
|
|
35
25
|
makeEmptyRecursiveProof,
|
|
36
26
|
makeRecursiveProof,
|
|
37
27
|
} from '@aztec/circuits.js';
|
|
28
|
+
import {
|
|
29
|
+
type BaseOrMergeRollupPublicInputs,
|
|
30
|
+
type BlockMergeRollupInputs,
|
|
31
|
+
type BlockRootOrBlockMergePublicInputs,
|
|
32
|
+
type BlockRootRollupInputs,
|
|
33
|
+
type EmptyBlockRootRollupInputs,
|
|
34
|
+
type MergeRollupInputs,
|
|
35
|
+
type PrivateBaseRollupInputs,
|
|
36
|
+
type PublicBaseRollupInputs,
|
|
37
|
+
type RootRollupInputs,
|
|
38
|
+
type RootRollupPublicInputs,
|
|
39
|
+
} from '@aztec/circuits.js/rollup';
|
|
38
40
|
import {
|
|
39
41
|
makeBaseOrMergeRollupPublicInputs,
|
|
40
42
|
makeBlockRootOrBlockMergeRollupPublicInputs,
|
|
@@ -58,8 +60,12 @@ export class TestBroker implements ProvingJobProducer {
|
|
|
58
60
|
agentCount: number,
|
|
59
61
|
prover: ServerCircuitProver,
|
|
60
62
|
private proofStore: ProofStore = new InlineProofStore(),
|
|
63
|
+
agentPollInterval = 100,
|
|
61
64
|
) {
|
|
62
|
-
this.agents = times(
|
|
65
|
+
this.agents = times(
|
|
66
|
+
agentCount,
|
|
67
|
+
() => new ProvingAgent(this.broker, proofStore, prover, new NoopTelemetryClient(), undefined, agentPollInterval),
|
|
68
|
+
);
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
public async start() {
|
|
@@ -82,9 +88,6 @@ export class TestBroker implements ProvingJobProducer {
|
|
|
82
88
|
getProvingJobStatus(id: ProvingJobId): Promise<ProvingJobStatus> {
|
|
83
89
|
return this.broker.getProvingJobStatus(id);
|
|
84
90
|
}
|
|
85
|
-
cleanUpProvingJobState(id: ProvingJobId): Promise<void> {
|
|
86
|
-
return this.broker.cleanUpProvingJobState(id);
|
|
87
|
-
}
|
|
88
91
|
cancelProvingJob(id: string): Promise<void> {
|
|
89
92
|
return this.broker.cancelProvingJob(id);
|
|
90
93
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"caching_broker_facade.d.ts","sourceRoot":"","sources":["../../src/proving_broker/caching_broker_facade.ts"],"names":[],"mappings":"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"}
|