@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.
- 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 -17
- package/dest/index.d.ts +0 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -2
- 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 +20 -9
- package/dest/orchestrator/block-building-helpers.d.ts +6 -2
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +18 -6
- package/dest/orchestrator/block-proving-state.d.ts +6 -5
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +16 -8
- package/dest/orchestrator/epoch-proving-state.d.ts +1 -1
- 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 +9 -6
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +92 -56
- package/dest/prover-agent/memory-proving-queue.d.ts +2 -1
- 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} +4 -8
- 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 +4 -5
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +3 -6
- package/package.json +14 -13
- package/src/block_builder/light.ts +23 -17
- package/src/index.ts +0 -1
- package/src/mocks/test_context.ts +29 -14
- package/src/orchestrator/block-building-helpers.ts +20 -6
- package/src/orchestrator/block-proving-state.ts +17 -6
- package/src/orchestrator/epoch-proving-state.ts +0 -2
- package/src/orchestrator/orchestrator.ts +106 -57
- package/src/prover-agent/memory-proving-queue.ts +8 -4
- 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} +35 -74
- 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 +5 -4
- 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
|
@@ -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:
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
108
|
+
throw new Error(`Unexpected proof type: ${output.type}. Expected: ${type}`);
|
|
146
109
|
}
|
|
147
110
|
} else {
|
|
148
|
-
|
|
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.
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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.
|
|
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
|
-
}
|