@aztec/prover-client 0.66.0 → 0.67.1-devnet

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 (83) hide show
  1. package/dest/block_builder/light.d.ts +4 -3
  2. package/dest/block_builder/light.d.ts.map +1 -1
  3. package/dest/block_builder/light.js +30 -20
  4. package/dest/index.d.ts +0 -1
  5. package/dest/index.d.ts.map +1 -1
  6. package/dest/index.js +1 -2
  7. package/dest/mocks/fixtures.d.ts +3 -3
  8. package/dest/mocks/fixtures.d.ts.map +1 -1
  9. package/dest/mocks/fixtures.js +2 -2
  10. package/dest/mocks/test_context.d.ts +10 -9
  11. package/dest/mocks/test_context.d.ts.map +1 -1
  12. package/dest/mocks/test_context.js +24 -13
  13. package/dest/orchestrator/block-building-helpers.d.ts +10 -6
  14. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  15. package/dest/orchestrator/block-building-helpers.js +27 -16
  16. package/dest/orchestrator/block-proving-state.d.ts +6 -5
  17. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  18. package/dest/orchestrator/block-proving-state.js +16 -8
  19. package/dest/orchestrator/epoch-proving-state.d.ts +1 -1
  20. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  21. package/dest/orchestrator/epoch-proving-state.js +3 -3
  22. package/dest/orchestrator/orchestrator.d.ts +11 -8
  23. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  24. package/dest/orchestrator/orchestrator.js +94 -58
  25. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  26. package/dest/orchestrator/orchestrator_metrics.js +2 -5
  27. package/dest/prover-agent/memory-proving-queue.d.ts +2 -1
  28. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  29. package/dest/prover-agent/memory-proving-queue.js +241 -224
  30. package/dest/prover-agent/prover-agent.d.ts +11 -2
  31. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  32. package/dest/prover-agent/prover-agent.js +187 -160
  33. package/dest/prover-client/prover-client.d.ts +2 -3
  34. package/dest/prover-client/prover-client.d.ts.map +1 -1
  35. package/dest/prover-client/prover-client.js +6 -9
  36. package/dest/proving_broker/broker_prover_facade.d.ts +26 -0
  37. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
  38. package/dest/proving_broker/broker_prover_facade.js +107 -0
  39. package/dest/proving_broker/proving_agent.d.ts +4 -3
  40. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  41. package/dest/proving_broker/proving_agent.js +74 -65
  42. package/dest/proving_broker/proving_broker.d.ts +27 -7
  43. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  44. package/dest/proving_broker/proving_broker.js +405 -258
  45. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  46. package/dest/proving_broker/proving_broker_database/persisted.js +4 -8
  47. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
  48. package/dest/proving_broker/proving_broker_instrumentation.js +2 -8
  49. package/dest/proving_broker/proving_job_controller.d.ts +2 -1
  50. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  51. package/dest/proving_broker/proving_job_controller.js +15 -14
  52. package/dest/proving_broker/rpc.js +2 -2
  53. package/dest/test/mock_prover.d.ts +6 -6
  54. package/dest/test/mock_prover.d.ts.map +1 -1
  55. package/dest/test/mock_prover.js +5 -5
  56. package/package.json +18 -13
  57. package/src/block_builder/light.ts +31 -22
  58. package/src/index.ts +0 -1
  59. package/src/mocks/fixtures.ts +4 -4
  60. package/src/mocks/test_context.ts +39 -24
  61. package/src/orchestrator/block-building-helpers.ts +33 -20
  62. package/src/orchestrator/block-proving-state.ts +17 -6
  63. package/src/orchestrator/epoch-proving-state.ts +0 -2
  64. package/src/orchestrator/orchestrator.ts +111 -62
  65. package/src/orchestrator/orchestrator_metrics.ts +1 -11
  66. package/src/prover-agent/memory-proving-queue.ts +12 -7
  67. package/src/prover-agent/prover-agent.ts +67 -48
  68. package/src/prover-client/prover-client.ts +5 -12
  69. package/src/proving_broker/{caching_broker_facade.ts → broker_prover_facade.ts} +62 -85
  70. package/src/proving_broker/proving_agent.ts +74 -78
  71. package/src/proving_broker/proving_broker.ts +240 -73
  72. package/src/proving_broker/proving_broker_database/persisted.ts +2 -8
  73. package/src/proving_broker/proving_broker_instrumentation.ts +0 -7
  74. package/src/proving_broker/proving_job_controller.ts +13 -12
  75. package/src/proving_broker/rpc.ts +1 -1
  76. package/src/test/mock_prover.ts +7 -3
  77. package/dest/proving_broker/caching_broker_facade.d.ts +0 -30
  78. package/dest/proving_broker/caching_broker_facade.d.ts.map +0 -1
  79. package/dest/proving_broker/caching_broker_facade.js +0 -150
  80. package/dest/proving_broker/prover_cache/memory.d.ts +0 -9
  81. package/dest/proving_broker/prover_cache/memory.d.ts.map +0 -1
  82. package/dest/proving_broker/prover_cache/memory.js +0 -16
  83. package/src/proving_broker/prover_cache/memory.ts +0 -20
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  type ProofAndVerificationKey,
3
- type ProverCache,
4
3
  type ProvingJobId,
5
4
  type ProvingJobInputsMap,
6
5
  type ProvingJobProducer,
@@ -33,81 +32,53 @@ import {
33
32
  type TubeInputs,
34
33
  } from '@aztec/circuits.js';
35
34
  import { sha256 } from '@aztec/foundation/crypto';
36
- import { createDebugLogger } from '@aztec/foundation/log';
35
+ import { createLogger } from '@aztec/foundation/log';
37
36
  import { retryUntil } from '@aztec/foundation/retry';
37
+ import { truncate } from '@aztec/foundation/string';
38
38
 
39
39
  import { InlineProofStore, type ProofStore } from './proof_store.js';
40
- import { InMemoryProverCache } from './prover_cache/memory.js';
41
40
 
42
41
  // 20 minutes, roughly the length of an Aztec epoch. If a proof isn't ready in this amount of time then we've failed to prove the whole epoch
43
42
  const MAX_WAIT_MS = 1_200_000;
44
43
 
45
- /**
46
- * A facade around a job broker that generates stable job ids and caches results
47
- */
48
- export class CachingBrokerFacade implements ServerCircuitProver {
44
+ export class BrokerCircuitProverFacade implements ServerCircuitProver {
49
45
  constructor(
50
46
  private broker: ProvingJobProducer,
51
- private cache: ProverCache = new InMemoryProverCache(),
52
47
  private proofStore: ProofStore = new InlineProofStore(),
53
48
  private waitTimeoutMs = MAX_WAIT_MS,
54
49
  private pollIntervalMs = 1000,
55
- private log = createDebugLogger('aztec:prover-client:caching-prover-broker'),
50
+ private log = createLogger('prover-client:broker-circuit-prover-facade'),
56
51
  ) {}
57
52
 
58
53
  private async enqueueAndWaitForJob<T extends ProvingRequestType>(
59
54
  id: ProvingJobId,
60
55
  type: T,
61
56
  inputs: ProvingJobInputsMap[T],
57
+ epochNumber = 0,
62
58
  signal?: AbortSignal,
63
59
  ): Promise<ProvingJobResultsMap[T]> {
64
- // first try the cache
65
- let jobEnqueued = false;
66
- try {
67
- const cachedResult = await this.cache.getProvingJobStatus(id);
68
- if (cachedResult.status !== 'not-found') {
69
- this.log.debug(`Found cached result for job=${id}: status=${cachedResult.status}`);
70
- }
60
+ const inputsUri = await this.proofStore.saveProofInput(id, type, inputs);
61
+ await this.broker.enqueueProvingJob({
62
+ id,
63
+ type,
64
+ inputsUri,
65
+ epochNumber,
66
+ });
71
67
 
72
- if (cachedResult.status === 'fulfilled') {
73
- const output = await this.proofStore.getProofOutput(cachedResult.value);
74
- if (output.type === type) {
75
- return output.result as ProvingJobResultsMap[T];
76
- } else {
77
- this.log.warn(`Cached result type mismatch for job=${id}. Expected=${type} but got=${output.type}`);
78
- }
79
- } else if (cachedResult.status === 'rejected') {
80
- // prefer returning a rejected promises so that we don't trigger the catch block below
81
- return Promise.reject(new Error(cachedResult.reason));
82
- } else if (cachedResult.status === 'in-progress' || cachedResult.status === 'in-queue') {
83
- jobEnqueued = true;
84
- } else {
85
- jobEnqueued = false;
86
- }
87
- } catch (err) {
88
- this.log.warn(`Failed to get cached proving job id=${id}: ${err}. Re-running job`);
89
- }
90
-
91
- if (!jobEnqueued) {
92
- try {
93
- const inputsUri = await this.proofStore.saveProofInput(id, type, inputs);
94
- await this.broker.enqueueProvingJob({
95
- id,
96
- type,
97
- inputsUri,
98
- });
99
- await this.cache.setProvingJobStatus(id, { status: 'in-queue' });
100
- } catch (err) {
101
- this.log.error(`Failed to enqueue proving job id=${id}: ${err}`);
102
- await this.cache.setProvingJobStatus(id, { status: 'not-found' });
103
- throw err;
104
- }
105
- }
68
+ this.log.verbose(
69
+ `Sent proving job to broker id=${id} type=${ProvingRequestType[type]} epochNumber=${epochNumber}`,
70
+ {
71
+ provingJobId: id,
72
+ provingJobType: ProvingRequestType[type],
73
+ epochNumber,
74
+ inputsUri: truncate(inputsUri),
75
+ },
76
+ );
106
77
 
107
78
  // notify broker of cancelled job
108
79
  const abortFn = async () => {
109
80
  signal?.removeEventListener('abort', abortFn);
110
- await this.broker.removeAndCancelProvingJob(id);
81
+ await this.broker.cancelProvingJob(id);
111
82
  };
112
83
 
113
84
  signal?.addEventListener('abort', abortFn);
@@ -129,21 +100,15 @@ export class CachingBrokerFacade implements ServerCircuitProver {
129
100
  this.pollIntervalMs / 1000,
130
101
  );
131
102
 
132
- try {
133
- await this.cache.setProvingJobStatus(id, result);
134
- } catch (err) {
135
- this.log.warn(`Failed to cache proving job id=${id} resultStatus=${result.status}: ${err}`);
136
- }
137
-
138
103
  if (result.status === 'fulfilled') {
139
104
  const output = await this.proofStore.getProofOutput(result.value);
140
105
  if (output.type === type) {
141
106
  return output.result as ProvingJobResultsMap[T];
142
107
  } else {
143
- return Promise.reject(new Error(`Unexpected proof type: ${output.type}. Expected: ${type}`));
108
+ throw new Error(`Unexpected proof type: ${output.type}. Expected: ${type}`);
144
109
  }
145
110
  } else {
146
- return Promise.reject(new Error(result.reason));
111
+ throw new Error(result.reason);
147
112
  }
148
113
  } finally {
149
114
  signal?.removeEventListener('abort', abortFn);
@@ -153,12 +118,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
153
118
  getAvmProof(
154
119
  inputs: AvmCircuitInputs,
155
120
  signal?: AbortSignal,
156
- _blockNumber?: number,
121
+ epochNumber?: number,
157
122
  ): Promise<ProofAndVerificationKey<typeof AVM_PROOF_LENGTH_IN_FIELDS>> {
158
123
  return this.enqueueAndWaitForJob(
159
- this.generateId(ProvingRequestType.PUBLIC_VM, inputs),
124
+ this.generateId(ProvingRequestType.PUBLIC_VM, inputs, epochNumber),
160
125
  ProvingRequestType.PUBLIC_VM,
161
126
  inputs,
127
+ epochNumber,
162
128
  signal,
163
129
  );
164
130
  }
@@ -166,12 +132,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
166
132
  getBaseParityProof(
167
133
  inputs: BaseParityInputs,
168
134
  signal?: AbortSignal,
169
- _epochNumber?: number,
135
+ epochNumber?: number,
170
136
  ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
171
137
  return this.enqueueAndWaitForJob(
172
- this.generateId(ProvingRequestType.BASE_PARITY, inputs),
138
+ this.generateId(ProvingRequestType.BASE_PARITY, inputs, epochNumber),
173
139
  ProvingRequestType.BASE_PARITY,
174
140
  inputs,
141
+ epochNumber,
175
142
  signal,
176
143
  );
177
144
  }
@@ -179,12 +146,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
179
146
  getBlockMergeRollupProof(
180
147
  input: BlockMergeRollupInputs,
181
148
  signal?: AbortSignal,
182
- _epochNumber?: number,
149
+ epochNumber?: number,
183
150
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
184
151
  return this.enqueueAndWaitForJob(
185
- this.generateId(ProvingRequestType.BLOCK_MERGE_ROLLUP, input),
152
+ this.generateId(ProvingRequestType.BLOCK_MERGE_ROLLUP, input, epochNumber),
186
153
  ProvingRequestType.BLOCK_MERGE_ROLLUP,
187
154
  input,
155
+ epochNumber,
188
156
  signal,
189
157
  );
190
158
  }
@@ -192,12 +160,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
192
160
  getBlockRootRollupProof(
193
161
  input: BlockRootRollupInputs,
194
162
  signal?: AbortSignal,
195
- _epochNumber?: number,
163
+ epochNumber?: number,
196
164
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
197
165
  return this.enqueueAndWaitForJob(
198
- this.generateId(ProvingRequestType.BLOCK_ROOT_ROLLUP, input),
166
+ this.generateId(ProvingRequestType.BLOCK_ROOT_ROLLUP, input, epochNumber),
199
167
  ProvingRequestType.BLOCK_ROOT_ROLLUP,
200
168
  input,
169
+ epochNumber,
201
170
  signal,
202
171
  );
203
172
  }
@@ -205,12 +174,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
205
174
  getEmptyBlockRootRollupProof(
206
175
  input: EmptyBlockRootRollupInputs,
207
176
  signal?: AbortSignal,
208
- _epochNumber?: number,
177
+ epochNumber?: number,
209
178
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
210
179
  return this.enqueueAndWaitForJob(
211
- this.generateId(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, input),
180
+ this.generateId(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, input, epochNumber),
212
181
  ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP,
213
182
  input,
183
+ epochNumber,
214
184
  signal,
215
185
  );
216
186
  }
@@ -218,12 +188,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
218
188
  getEmptyPrivateKernelProof(
219
189
  inputs: PrivateKernelEmptyInputData,
220
190
  signal?: AbortSignal,
221
- _epochNumber?: number,
191
+ epochNumber?: number,
222
192
  ): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
223
193
  return this.enqueueAndWaitForJob(
224
- this.generateId(ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs),
194
+ this.generateId(ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs, epochNumber),
225
195
  ProvingRequestType.PRIVATE_KERNEL_EMPTY,
226
196
  inputs,
197
+ epochNumber,
227
198
  signal,
228
199
  );
229
200
  }
@@ -231,24 +202,26 @@ export class CachingBrokerFacade implements ServerCircuitProver {
231
202
  getMergeRollupProof(
232
203
  input: MergeRollupInputs,
233
204
  signal?: AbortSignal,
234
- _epochNumber?: number,
205
+ epochNumber?: number,
235
206
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
236
207
  return this.enqueueAndWaitForJob(
237
- this.generateId(ProvingRequestType.MERGE_ROLLUP, input),
208
+ this.generateId(ProvingRequestType.MERGE_ROLLUP, input, epochNumber),
238
209
  ProvingRequestType.MERGE_ROLLUP,
239
210
  input,
211
+ epochNumber,
240
212
  signal,
241
213
  );
242
214
  }
243
215
  getPrivateBaseRollupProof(
244
216
  baseRollupInput: PrivateBaseRollupInputs,
245
217
  signal?: AbortSignal,
246
- _epochNumber?: number,
218
+ epochNumber?: number,
247
219
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
248
220
  return this.enqueueAndWaitForJob(
249
- this.generateId(ProvingRequestType.PRIVATE_BASE_ROLLUP, baseRollupInput),
221
+ this.generateId(ProvingRequestType.PRIVATE_BASE_ROLLUP, baseRollupInput, epochNumber),
250
222
  ProvingRequestType.PRIVATE_BASE_ROLLUP,
251
223
  baseRollupInput,
224
+ epochNumber,
252
225
  signal,
253
226
  );
254
227
  }
@@ -256,12 +229,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
256
229
  getPublicBaseRollupProof(
257
230
  inputs: PublicBaseRollupInputs,
258
231
  signal?: AbortSignal,
259
- _epochNumber?: number,
232
+ epochNumber?: number,
260
233
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
261
234
  return this.enqueueAndWaitForJob(
262
- this.generateId(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs),
235
+ this.generateId(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs, epochNumber),
263
236
  ProvingRequestType.PUBLIC_BASE_ROLLUP,
264
237
  inputs,
238
+ epochNumber,
265
239
  signal,
266
240
  );
267
241
  }
@@ -269,12 +243,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
269
243
  getRootParityProof(
270
244
  inputs: RootParityInputs,
271
245
  signal?: AbortSignal,
272
- _epochNumber?: number,
246
+ epochNumber?: number,
273
247
  ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof NESTED_RECURSIVE_PROOF_LENGTH>> {
274
248
  return this.enqueueAndWaitForJob(
275
- this.generateId(ProvingRequestType.ROOT_PARITY, inputs),
249
+ this.generateId(ProvingRequestType.ROOT_PARITY, inputs, epochNumber),
276
250
  ProvingRequestType.ROOT_PARITY,
277
251
  inputs,
252
+ epochNumber,
278
253
  signal,
279
254
  );
280
255
  }
@@ -282,12 +257,13 @@ export class CachingBrokerFacade implements ServerCircuitProver {
282
257
  getRootRollupProof(
283
258
  input: RootRollupInputs,
284
259
  signal?: AbortSignal,
285
- _epochNumber?: number,
260
+ epochNumber?: number,
286
261
  ): Promise<PublicInputsAndRecursiveProof<RootRollupPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
287
262
  return this.enqueueAndWaitForJob(
288
- this.generateId(ProvingRequestType.ROOT_ROLLUP, input),
263
+ this.generateId(ProvingRequestType.ROOT_ROLLUP, input, epochNumber),
289
264
  ProvingRequestType.ROOT_ROLLUP,
290
265
  input,
266
+ epochNumber,
291
267
  signal,
292
268
  );
293
269
  }
@@ -295,18 +271,19 @@ export class CachingBrokerFacade implements ServerCircuitProver {
295
271
  getTubeProof(
296
272
  tubeInput: TubeInputs,
297
273
  signal?: AbortSignal,
298
- _epochNumber?: number,
274
+ epochNumber?: number,
299
275
  ): Promise<ProofAndVerificationKey<typeof TUBE_PROOF_LENGTH>> {
300
276
  return this.enqueueAndWaitForJob(
301
- this.generateId(ProvingRequestType.TUBE_PROOF, tubeInput),
277
+ this.generateId(ProvingRequestType.TUBE_PROOF, tubeInput, epochNumber),
302
278
  ProvingRequestType.TUBE_PROOF,
303
279
  tubeInput,
280
+ epochNumber,
304
281
  signal,
305
282
  );
306
283
  }
307
284
 
308
- private generateId(type: ProvingRequestType, inputs: { toBuffer(): Buffer }) {
285
+ private generateId(type: ProvingRequestType, inputs: { toBuffer(): Buffer }, epochNumber = 0) {
309
286
  const inputsHash = sha256(inputs.toBuffer());
310
- return `${ProvingRequestType[type]}:${inputsHash.toString('hex')}`;
287
+ return `${epochNumber}:${ProvingRequestType[type]}:${inputsHash.toString('hex')}`;
311
288
  }
312
289
  }
@@ -8,10 +8,11 @@ import {
8
8
  ProvingRequestType,
9
9
  type ServerCircuitProver,
10
10
  } from '@aztec/circuit-types';
11
- import { createDebugLogger } from '@aztec/foundation/log';
11
+ import { createLogger } from '@aztec/foundation/log';
12
12
  import { RunningPromise } from '@aztec/foundation/running-promise';
13
+ import { truncate } from '@aztec/foundation/string';
13
14
  import { Timer } from '@aztec/foundation/timer';
14
- import { type TelemetryClient } from '@aztec/telemetry-client';
15
+ import { type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client';
15
16
 
16
17
  import { type ProofStore } from './proof_store.js';
17
18
  import { ProvingAgentInstrumentation } from './proving_agent_instrumentation.js';
@@ -20,12 +21,14 @@ import { ProvingJobController, ProvingJobControllerStatus } from './proving_job_
20
21
  /**
21
22
  * A helper class that encapsulates a circuit prover and connects it to a job source.
22
23
  */
23
- export class ProvingAgent {
24
+ export class ProvingAgent implements Traceable {
24
25
  private currentJobController?: ProvingJobController;
25
26
  private runningPromise: RunningPromise;
26
27
  private instrumentation: ProvingAgentInstrumentation;
27
28
  private idleTimer: Timer | undefined;
28
29
 
30
+ public readonly tracer: Tracer;
31
+
29
32
  constructor(
30
33
  /** The source of proving jobs */
31
34
  private broker: ProvingJobConsumer,
@@ -39,10 +42,11 @@ export class ProvingAgent {
39
42
  private proofAllowList: Array<ProvingRequestType> = [],
40
43
  /** How long to wait between jobs */
41
44
  private pollIntervalMs = 1000,
42
- private log = createDebugLogger('aztec:prover-client:proving-agent'),
45
+ private log = createLogger('prover-client:proving-agent'),
43
46
  ) {
47
+ this.tracer = client.getTracer('ProvingAgent');
44
48
  this.instrumentation = new ProvingAgentInstrumentation(client);
45
- this.runningPromise = new RunningPromise(this.safeWork, this.pollIntervalMs);
49
+ this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.pollIntervalMs);
46
50
  }
47
51
 
48
52
  public setCircuitProver(circuitProver: ServerCircuitProver): void {
@@ -63,76 +67,74 @@ export class ProvingAgent {
63
67
  await this.runningPromise.stop();
64
68
  }
65
69
 
66
- private safeWork = async () => {
67
- try {
68
- // every tick we need to
69
- // (1) either do a heartbeat, telling the broker that we're working
70
- // (2) get a new job
71
- // If during (1) the broker returns a new job that means we can cancel the current job and start the new one
72
- let maybeJob: { job: ProvingJob; time: number } | undefined;
73
- if (this.currentJobController?.getStatus() === ProvingJobControllerStatus.PROVING) {
74
- maybeJob = await this.broker.reportProvingJobProgress(
75
- this.currentJobController.getJobId(),
76
- this.currentJobController.getStartedAt(),
77
- { allowList: this.proofAllowList },
78
- );
79
- } else {
80
- maybeJob = await this.broker.getProvingJob({ allowList: this.proofAllowList });
81
- }
82
-
83
- if (!maybeJob) {
84
- return;
85
- }
86
-
87
- let abortedProofJobId: string | undefined;
88
- let abortedProofName: string | undefined;
89
- if (this.currentJobController?.getStatus() === ProvingJobControllerStatus.PROVING) {
90
- abortedProofJobId = this.currentJobController.getJobId();
91
- abortedProofName = this.currentJobController.getProofTypeName();
92
- this.currentJobController?.abort();
93
- }
94
-
95
- const { job, time } = maybeJob;
96
- let inputs: ProvingJobInputs;
97
- try {
98
- inputs = await this.proofStore.getProofInput(job.inputsUri);
99
- } catch (err) {
100
- await this.broker.reportProvingJobError(job.id, 'Failed to load proof inputs', true);
101
- return;
102
- }
103
-
104
- this.currentJobController = new ProvingJobController(
105
- job.id,
106
- inputs,
107
- time,
108
- this.circuitProver,
109
- this.handleJobResult,
70
+ @trackSpan('ProvingAgent.safeWork')
71
+ private async work() {
72
+ // every tick we need to
73
+ // (1) either do a heartbeat, telling the broker that we're working
74
+ // (2) get a new job
75
+ // If during (1) the broker returns a new job that means we can cancel the current job and start the new one
76
+ let maybeJob: { job: ProvingJob; time: number } | undefined;
77
+ if (this.currentJobController?.getStatus() === ProvingJobControllerStatus.PROVING) {
78
+ maybeJob = await this.broker.reportProvingJobProgress(
79
+ this.currentJobController.getJobId(),
80
+ this.currentJobController.getStartedAt(),
81
+ { allowList: this.proofAllowList },
110
82
  );
83
+ } else {
84
+ maybeJob = await this.broker.getProvingJob({ allowList: this.proofAllowList });
85
+ }
86
+
87
+ if (!maybeJob) {
88
+ return;
89
+ }
90
+
91
+ let abortedProofJobId: string | undefined;
92
+ let abortedProofName: string | undefined;
93
+ if (this.currentJobController?.getStatus() === ProvingJobControllerStatus.PROVING) {
94
+ abortedProofJobId = this.currentJobController.getJobId();
95
+ abortedProofName = this.currentJobController.getProofTypeName();
96
+ this.currentJobController?.abort();
97
+ }
111
98
 
112
- if (abortedProofJobId) {
113
- this.log.info(
114
- `Aborting job id=${abortedProofJobId} type=${abortedProofName} to start new job id=${this.currentJobController.getJobId()} type=${this.currentJobController.getProofTypeName()} inputsUri=${truncateString(
115
- job.inputsUri,
116
- )}`,
117
- );
118
- } else {
119
- this.log.info(
120
- `Starting job id=${this.currentJobController.getJobId()} type=${this.currentJobController.getProofTypeName()} inputsUri=${truncateString(
121
- job.inputsUri,
122
- )}`,
123
- );
124
- }
125
-
126
- if (this.idleTimer) {
127
- this.instrumentation.recordIdleTime(this.idleTimer);
128
- }
129
- this.idleTimer = undefined;
130
-
131
- this.currentJobController.start();
99
+ const { job, time } = maybeJob;
100
+ let inputs: ProvingJobInputs;
101
+ try {
102
+ inputs = await this.proofStore.getProofInput(job.inputsUri);
132
103
  } catch (err) {
133
- this.log.error(`Error in ProvingAgent: ${String(err)}`);
104
+ await this.broker.reportProvingJobError(job.id, 'Failed to load proof inputs', true);
105
+ return;
134
106
  }
135
- };
107
+
108
+ this.currentJobController = new ProvingJobController(
109
+ job.id,
110
+ inputs,
111
+ job.epochNumber,
112
+ time,
113
+ this.circuitProver,
114
+ this.handleJobResult,
115
+ );
116
+
117
+ if (abortedProofJobId) {
118
+ this.log.info(
119
+ `Aborting job id=${abortedProofJobId} type=${abortedProofName} to start new job id=${this.currentJobController.getJobId()} type=${this.currentJobController.getProofTypeName()} inputsUri=${truncate(
120
+ job.inputsUri,
121
+ )}`,
122
+ );
123
+ } else {
124
+ this.log.info(
125
+ `Starting job id=${this.currentJobController.getJobId()} type=${this.currentJobController.getProofTypeName()} inputsUri=${truncate(
126
+ job.inputsUri,
127
+ )}`,
128
+ );
129
+ }
130
+
131
+ if (this.idleTimer) {
132
+ this.instrumentation.recordIdleTime(this.idleTimer);
133
+ }
134
+ this.idleTimer = undefined;
135
+
136
+ this.currentJobController.start();
137
+ }
136
138
 
137
139
  handleJobResult = async <T extends ProvingRequestType>(
138
140
  jobId: ProvingJobId,
@@ -147,14 +149,8 @@ export class ProvingAgent {
147
149
  return this.broker.reportProvingJobError(jobId, err.message, retry);
148
150
  } else if (result) {
149
151
  const outputUri = await this.proofStore.saveProofOutput(jobId, type, result);
150
- this.log.info(
151
- `Job id=${jobId} type=${ProvingRequestType[type]} completed outputUri=${truncateString(outputUri)}`,
152
- );
152
+ this.log.info(`Job id=${jobId} type=${ProvingRequestType[type]} completed outputUri=${truncate(outputUri)}`);
153
153
  return this.broker.reportProvingJobSuccess(jobId, outputUri);
154
154
  }
155
155
  };
156
156
  }
157
-
158
- function truncateString(str: string, length: number = 64): string {
159
- return str.length > length ? str.slice(0, length) + '...' : str;
160
- }