@aztec/prover-client 0.67.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 (70) 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 +23 -17
  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/test_context.d.ts +3 -2
  8. package/dest/mocks/test_context.d.ts.map +1 -1
  9. package/dest/mocks/test_context.js +20 -9
  10. package/dest/orchestrator/block-building-helpers.d.ts +6 -2
  11. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  12. package/dest/orchestrator/block-building-helpers.js +18 -6
  13. package/dest/orchestrator/block-proving-state.d.ts +6 -5
  14. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  15. package/dest/orchestrator/block-proving-state.js +16 -8
  16. package/dest/orchestrator/epoch-proving-state.d.ts +1 -1
  17. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  18. package/dest/orchestrator/epoch-proving-state.js +3 -3
  19. package/dest/orchestrator/orchestrator.d.ts +9 -6
  20. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  21. package/dest/orchestrator/orchestrator.js +92 -56
  22. package/dest/prover-agent/memory-proving-queue.d.ts +2 -1
  23. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  24. package/dest/prover-agent/memory-proving-queue.js +240 -224
  25. package/dest/prover-agent/prover-agent.d.ts +11 -2
  26. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  27. package/dest/prover-agent/prover-agent.js +186 -159
  28. package/dest/prover-client/prover-client.d.ts +2 -3
  29. package/dest/prover-client/prover-client.d.ts.map +1 -1
  30. package/dest/prover-client/prover-client.js +4 -7
  31. package/dest/proving_broker/{caching_broker_facade.d.ts → broker_prover_facade.d.ts} +4 -8
  32. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
  33. package/dest/proving_broker/broker_prover_facade.js +107 -0
  34. package/dest/proving_broker/proving_agent.d.ts +4 -3
  35. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  36. package/dest/proving_broker/proving_agent.js +73 -64
  37. package/dest/proving_broker/proving_broker.d.ts +4 -3
  38. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  39. package/dest/proving_broker/proving_broker.js +403 -324
  40. package/dest/proving_broker/proving_job_controller.d.ts +2 -1
  41. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  42. package/dest/proving_broker/proving_job_controller.js +15 -14
  43. package/dest/proving_broker/rpc.d.ts.map +1 -1
  44. package/dest/proving_broker/rpc.js +1 -2
  45. package/dest/test/mock_prover.d.ts +4 -5
  46. package/dest/test/mock_prover.d.ts.map +1 -1
  47. package/dest/test/mock_prover.js +3 -6
  48. package/package.json +14 -13
  49. package/src/block_builder/light.ts +23 -17
  50. package/src/index.ts +0 -1
  51. package/src/mocks/test_context.ts +29 -14
  52. package/src/orchestrator/block-building-helpers.ts +20 -6
  53. package/src/orchestrator/block-proving-state.ts +17 -6
  54. package/src/orchestrator/epoch-proving-state.ts +0 -2
  55. package/src/orchestrator/orchestrator.ts +106 -57
  56. package/src/prover-agent/memory-proving-queue.ts +8 -4
  57. package/src/prover-agent/prover-agent.ts +65 -46
  58. package/src/prover-client/prover-client.ts +3 -10
  59. package/src/proving_broker/{caching_broker_facade.ts → broker_prover_facade.ts} +35 -74
  60. package/src/proving_broker/proving_agent.ts +72 -76
  61. package/src/proving_broker/proving_broker.ts +114 -36
  62. package/src/proving_broker/proving_job_controller.ts +13 -12
  63. package/src/proving_broker/rpc.ts +0 -1
  64. package/src/test/mock_prover.ts +5 -4
  65. package/dest/proving_broker/caching_broker_facade.d.ts.map +0 -1
  66. package/dest/proving_broker/caching_broker_facade.js +0 -153
  67. package/dest/proving_broker/prover_cache/memory.d.ts +0 -9
  68. package/dest/proving_broker/prover_cache/memory.d.ts.map +0 -1
  69. package/dest/proving_broker/prover_cache/memory.js +0 -16
  70. 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,
@@ -35,24 +34,20 @@ import {
35
34
  import { sha256 } from '@aztec/foundation/crypto';
36
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 = createLogger('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>(
@@ -62,49 +57,23 @@ export class CachingBrokerFacade implements ServerCircuitProver {
62
57
  epochNumber = 0,
63
58
  signal?: AbortSignal,
64
59
  ): Promise<ProvingJobResultsMap[T]> {
65
- // first try the cache
66
- let jobEnqueued = false;
67
- try {
68
- const cachedResult = await this.cache.getProvingJobStatus(id);
69
- if (cachedResult.status !== 'not-found') {
70
- this.log.debug(`Found cached result for job=${id}: status=${cachedResult.status}`);
71
- }
72
-
73
- if (cachedResult.status === 'fulfilled') {
74
- const output = await this.proofStore.getProofOutput(cachedResult.value);
75
- if (output.type === type) {
76
- return output.result as ProvingJobResultsMap[T];
77
- } else {
78
- this.log.warn(`Cached result type mismatch for job=${id}. Expected=${type} but got=${output.type}`);
79
- }
80
- } else if (cachedResult.status === 'rejected') {
81
- // prefer returning a rejected promises so that we don't trigger the catch block below
82
- return Promise.reject(new Error(cachedResult.reason));
83
- } else if (cachedResult.status === 'in-progress' || cachedResult.status === 'in-queue') {
84
- jobEnqueued = true;
85
- } else {
86
- jobEnqueued = false;
87
- }
88
- } catch (err) {
89
- this.log.warn(`Failed to get cached proving job id=${id}: ${err}. Re-running job`);
90
- }
60
+ const inputsUri = await this.proofStore.saveProofInput(id, type, inputs);
61
+ await this.broker.enqueueProvingJob({
62
+ id,
63
+ type,
64
+ inputsUri,
65
+ epochNumber,
66
+ });
91
67
 
92
- if (!jobEnqueued) {
93
- try {
94
- const inputsUri = await this.proofStore.saveProofInput(id, type, inputs);
95
- await this.broker.enqueueProvingJob({
96
- id,
97
- type,
98
- inputsUri,
99
- epochNumber,
100
- });
101
- await this.cache.setProvingJobStatus(id, { status: 'in-queue' });
102
- } catch (err) {
103
- this.log.error(`Failed to enqueue proving job id=${id}: ${err}`);
104
- await this.cache.setProvingJobStatus(id, { status: 'not-found' });
105
- throw err;
106
- }
107
- }
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
+ );
108
77
 
109
78
  // notify broker of cancelled job
110
79
  const abortFn = async () => {
@@ -131,26 +100,18 @@ export class CachingBrokerFacade implements ServerCircuitProver {
131
100
  this.pollIntervalMs / 1000,
132
101
  );
133
102
 
134
- try {
135
- await this.cache.setProvingJobStatus(id, result);
136
- } catch (err) {
137
- this.log.warn(`Failed to cache proving job id=${id} resultStatus=${result.status}: ${err}`);
138
- }
139
-
140
103
  if (result.status === 'fulfilled') {
141
104
  const output = await this.proofStore.getProofOutput(result.value);
142
105
  if (output.type === type) {
143
106
  return output.result as ProvingJobResultsMap[T];
144
107
  } else {
145
- return Promise.reject(new Error(`Unexpected proof type: ${output.type}. Expected: ${type}`));
108
+ throw new Error(`Unexpected proof type: ${output.type}. Expected: ${type}`);
146
109
  }
147
110
  } else {
148
- return Promise.reject(new Error(result.reason));
111
+ throw new Error(result.reason);
149
112
  }
150
113
  } finally {
151
114
  signal?.removeEventListener('abort', abortFn);
152
- // we've saved the result in our cache. We can tell the broker to clear its state
153
- await this.broker.cleanUpProvingJobState(id);
154
115
  }
155
116
  }
156
117
 
@@ -160,7 +121,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
160
121
  epochNumber?: number,
161
122
  ): Promise<ProofAndVerificationKey<typeof AVM_PROOF_LENGTH_IN_FIELDS>> {
162
123
  return this.enqueueAndWaitForJob(
163
- this.generateId(ProvingRequestType.PUBLIC_VM, inputs),
124
+ this.generateId(ProvingRequestType.PUBLIC_VM, inputs, epochNumber),
164
125
  ProvingRequestType.PUBLIC_VM,
165
126
  inputs,
166
127
  epochNumber,
@@ -174,7 +135,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
174
135
  epochNumber?: number,
175
136
  ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
176
137
  return this.enqueueAndWaitForJob(
177
- this.generateId(ProvingRequestType.BASE_PARITY, inputs),
138
+ this.generateId(ProvingRequestType.BASE_PARITY, inputs, epochNumber),
178
139
  ProvingRequestType.BASE_PARITY,
179
140
  inputs,
180
141
  epochNumber,
@@ -188,7 +149,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
188
149
  epochNumber?: number,
189
150
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
190
151
  return this.enqueueAndWaitForJob(
191
- this.generateId(ProvingRequestType.BLOCK_MERGE_ROLLUP, input),
152
+ this.generateId(ProvingRequestType.BLOCK_MERGE_ROLLUP, input, epochNumber),
192
153
  ProvingRequestType.BLOCK_MERGE_ROLLUP,
193
154
  input,
194
155
  epochNumber,
@@ -202,7 +163,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
202
163
  epochNumber?: number,
203
164
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
204
165
  return this.enqueueAndWaitForJob(
205
- this.generateId(ProvingRequestType.BLOCK_ROOT_ROLLUP, input),
166
+ this.generateId(ProvingRequestType.BLOCK_ROOT_ROLLUP, input, epochNumber),
206
167
  ProvingRequestType.BLOCK_ROOT_ROLLUP,
207
168
  input,
208
169
  epochNumber,
@@ -216,7 +177,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
216
177
  epochNumber?: number,
217
178
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
218
179
  return this.enqueueAndWaitForJob(
219
- this.generateId(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, input),
180
+ this.generateId(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, input, epochNumber),
220
181
  ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP,
221
182
  input,
222
183
  epochNumber,
@@ -230,7 +191,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
230
191
  epochNumber?: number,
231
192
  ): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
232
193
  return this.enqueueAndWaitForJob(
233
- this.generateId(ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs),
194
+ this.generateId(ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs, epochNumber),
234
195
  ProvingRequestType.PRIVATE_KERNEL_EMPTY,
235
196
  inputs,
236
197
  epochNumber,
@@ -244,7 +205,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
244
205
  epochNumber?: number,
245
206
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
246
207
  return this.enqueueAndWaitForJob(
247
- this.generateId(ProvingRequestType.MERGE_ROLLUP, input),
208
+ this.generateId(ProvingRequestType.MERGE_ROLLUP, input, epochNumber),
248
209
  ProvingRequestType.MERGE_ROLLUP,
249
210
  input,
250
211
  epochNumber,
@@ -257,7 +218,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
257
218
  epochNumber?: number,
258
219
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
259
220
  return this.enqueueAndWaitForJob(
260
- this.generateId(ProvingRequestType.PRIVATE_BASE_ROLLUP, baseRollupInput),
221
+ this.generateId(ProvingRequestType.PRIVATE_BASE_ROLLUP, baseRollupInput, epochNumber),
261
222
  ProvingRequestType.PRIVATE_BASE_ROLLUP,
262
223
  baseRollupInput,
263
224
  epochNumber,
@@ -271,7 +232,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
271
232
  epochNumber?: number,
272
233
  ): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
273
234
  return this.enqueueAndWaitForJob(
274
- this.generateId(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs),
235
+ this.generateId(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs, epochNumber),
275
236
  ProvingRequestType.PUBLIC_BASE_ROLLUP,
276
237
  inputs,
277
238
  epochNumber,
@@ -285,7 +246,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
285
246
  epochNumber?: number,
286
247
  ): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof NESTED_RECURSIVE_PROOF_LENGTH>> {
287
248
  return this.enqueueAndWaitForJob(
288
- this.generateId(ProvingRequestType.ROOT_PARITY, inputs),
249
+ this.generateId(ProvingRequestType.ROOT_PARITY, inputs, epochNumber),
289
250
  ProvingRequestType.ROOT_PARITY,
290
251
  inputs,
291
252
  epochNumber,
@@ -299,7 +260,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
299
260
  epochNumber?: number,
300
261
  ): Promise<PublicInputsAndRecursiveProof<RootRollupPublicInputs, typeof RECURSIVE_PROOF_LENGTH>> {
301
262
  return this.enqueueAndWaitForJob(
302
- this.generateId(ProvingRequestType.ROOT_ROLLUP, input),
263
+ this.generateId(ProvingRequestType.ROOT_ROLLUP, input, epochNumber),
303
264
  ProvingRequestType.ROOT_ROLLUP,
304
265
  input,
305
266
  epochNumber,
@@ -313,7 +274,7 @@ export class CachingBrokerFacade implements ServerCircuitProver {
313
274
  epochNumber?: number,
314
275
  ): Promise<ProofAndVerificationKey<typeof TUBE_PROOF_LENGTH>> {
315
276
  return this.enqueueAndWaitForJob(
316
- this.generateId(ProvingRequestType.TUBE_PROOF, tubeInput),
277
+ this.generateId(ProvingRequestType.TUBE_PROOF, tubeInput, epochNumber),
317
278
  ProvingRequestType.TUBE_PROOF,
318
279
  tubeInput,
319
280
  epochNumber,
@@ -321,8 +282,8 @@ export class CachingBrokerFacade implements ServerCircuitProver {
321
282
  );
322
283
  }
323
284
 
324
- private generateId(type: ProvingRequestType, inputs: { toBuffer(): Buffer }) {
285
+ private generateId(type: ProvingRequestType, inputs: { toBuffer(): Buffer }, epochNumber = 0) {
325
286
  const inputsHash = sha256(inputs.toBuffer());
326
- return `${ProvingRequestType[type]}:${inputsHash.toString('hex')}`;
287
+ return `${epochNumber}:${ProvingRequestType[type]}:${inputsHash.toString('hex')}`;
327
288
  }
328
289
  }
@@ -10,8 +10,9 @@ import {
10
10
  } from '@aztec/circuit-types';
11
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,
@@ -41,8 +44,9 @@ export class ProvingAgent {
41
44
  private pollIntervalMs = 1000,
42
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
- }