@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.
- 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 +30 -20
- 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 +3 -3
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +2 -2
- package/dest/mocks/test_context.d.ts +10 -9
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +24 -13
- package/dest/orchestrator/block-building-helpers.d.ts +10 -6
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +27 -16
- 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 +11 -8
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +94 -58
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +2 -5
- 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 +241 -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 +187 -160
- 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 +6 -9
- package/dest/proving_broker/broker_prover_facade.d.ts +26 -0
- 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 +74 -65
- package/dest/proving_broker/proving_broker.d.ts +27 -7
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +405 -258
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +4 -8
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.js +2 -8
- 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.js +2 -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 +5 -5
- package/package.json +18 -13
- package/src/block_builder/light.ts +31 -22
- package/src/index.ts +0 -1
- package/src/mocks/fixtures.ts +4 -4
- package/src/mocks/test_context.ts +39 -24
- package/src/orchestrator/block-building-helpers.ts +33 -20
- package/src/orchestrator/block-proving-state.ts +17 -6
- package/src/orchestrator/epoch-proving-state.ts +0 -2
- package/src/orchestrator/orchestrator.ts +111 -62
- package/src/orchestrator/orchestrator_metrics.ts +1 -11
- package/src/prover-agent/memory-proving-queue.ts +12 -7
- package/src/prover-agent/prover-agent.ts +67 -48
- package/src/prover-client/prover-client.ts +5 -12
- package/src/proving_broker/{caching_broker_facade.ts → broker_prover_facade.ts} +62 -85
- package/src/proving_broker/proving_agent.ts +74 -78
- package/src/proving_broker/proving_broker.ts +240 -73
- package/src/proving_broker/proving_broker_database/persisted.ts +2 -8
- package/src/proving_broker/proving_broker_instrumentation.ts +0 -7
- package/src/proving_broker/proving_job_controller.ts +13 -12
- package/src/proving_broker/rpc.ts +1 -1
- package/src/test/mock_prover.ts +7 -3
- package/dest/proving_broker/caching_broker_facade.d.ts +0 -30
- package/dest/proving_broker/caching_broker_facade.d.ts.map +0 -1
- package/dest/proving_broker/caching_broker_facade.js +0 -150
- 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,
|
|
@@ -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 {
|
|
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 =
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
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.
|
|
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
|
-
|
|
108
|
+
throw new Error(`Unexpected proof type: ${output.type}. Expected: ${type}`);
|
|
144
109
|
}
|
|
145
110
|
} else {
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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 =
|
|
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
|
-
}
|