@aztec/prover-client 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bin/get-proof-inputs.d.ts +2 -0
- package/dest/bin/get-proof-inputs.d.ts.map +1 -0
- package/dest/bin/get-proof-inputs.js +16 -18
- package/dest/block_builder/index.d.ts +6 -0
- package/dest/block_builder/index.d.ts.map +1 -0
- package/dest/block_builder/index.js +1 -0
- package/dest/block_builder/light.d.ts +31 -0
- package/dest/block_builder/light.d.ts.map +1 -0
- package/dest/block_builder/light.js +13 -23
- package/dest/config.d.ts +17 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +11 -9
- package/dest/index.d.ts +4 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +1 -0
- package/dest/mocks/fixtures.d.ts +19 -0
- package/dest/mocks/fixtures.d.ts.map +1 -0
- package/dest/mocks/fixtures.js +26 -28
- package/dest/mocks/test_context.d.ts +49 -0
- package/dest/mocks/test_context.d.ts.map +1 -0
- package/dest/mocks/test_context.js +46 -72
- package/dest/orchestrator/block-building-helpers.d.ts +50 -0
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -0
- package/dest/orchestrator/block-building-helpers.js +81 -99
- package/dest/orchestrator/block-proving-state.d.ts +71 -0
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/block-proving-state.js +74 -99
- package/dest/orchestrator/epoch-proving-state.d.ts +56 -0
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/epoch-proving-state.js +41 -57
- package/dest/orchestrator/index.d.ts +2 -0
- package/dest/orchestrator/index.d.ts.map +1 -0
- package/dest/orchestrator/index.js +1 -0
- package/dest/orchestrator/orchestrator.d.ts +108 -0
- package/dest/orchestrator/orchestrator.d.ts.map +1 -0
- package/dest/orchestrator/orchestrator.js +654 -650
- package/dest/orchestrator/orchestrator_metrics.d.ts +8 -0
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -0
- package/dest/orchestrator/orchestrator_metrics.js +3 -4
- package/dest/orchestrator/tx-proving-state.d.ts +31 -0
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/tx-proving-state.js +52 -53
- package/dest/prover-client/factory.d.ts +6 -0
- package/dest/prover-client/factory.d.ts.map +1 -0
- package/dest/prover-client/factory.js +1 -0
- package/dest/prover-client/index.d.ts +3 -0
- package/dest/prover-client/index.d.ts.map +1 -0
- package/dest/prover-client/index.js +1 -0
- package/dest/prover-client/prover-client.d.ts +42 -0
- package/dest/prover-client/prover-client.d.ts.map +1 -0
- package/dest/prover-client/prover-client.js +25 -30
- package/dest/prover-client/server-epoch-prover.d.ts +25 -0
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
- package/dest/prover-client/server-epoch-prover.js +4 -4
- package/dest/proving_broker/broker_prover_facade.d.ts +39 -0
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
- package/dest/proving_broker/broker_prover_facade.js +59 -70
- package/dest/proving_broker/config.d.ts +61 -0
- package/dest/proving_broker/config.d.ts.map +1 -0
- package/dest/proving_broker/config.js +37 -22
- package/dest/proving_broker/factory.d.ts +5 -0
- package/dest/proving_broker/factory.d.ts.map +1 -0
- package/dest/proving_broker/factory.js +2 -1
- package/dest/proving_broker/fixtures.d.ts +5 -0
- package/dest/proving_broker/fixtures.d.ts.map +1 -0
- package/dest/proving_broker/fixtures.js +1 -0
- package/dest/proving_broker/index.d.ts +10 -0
- package/dest/proving_broker/index.d.ts.map +1 -0
- package/dest/proving_broker/index.js +1 -0
- package/dest/proving_broker/proof_store/factory.d.ts +6 -0
- package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/factory.js +12 -9
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +13 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.js +7 -11
- package/dest/proving_broker/proof_store/index.d.ts +4 -0
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/index.js +1 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts +14 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/inline_proof_store.js +7 -11
- package/dest/proving_broker/proof_store/proof_store.d.ts +35 -0
- package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/proof_store.js +2 -3
- package/dest/proving_broker/proving_agent.d.ts +45 -0
- package/dest/proving_broker/proving_agent.d.ts.map +1 -0
- package/dest/proving_broker/proving_agent.js +124 -120
- package/dest/proving_broker/proving_agent_instrumentation.d.ts +8 -0
- package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -0
- package/dest/proving_broker/proving_agent_instrumentation.js +3 -3
- package/dest/proving_broker/proving_broker.d.ts +72 -0
- package/dest/proving_broker/proving_broker.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker.js +449 -491
- package/dest/proving_broker/proving_broker_database/memory.d.ts +16 -0
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database/memory.js +13 -19
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +21 -0
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database/persisted.js +21 -41
- package/dest/proving_broker/proving_broker_database.d.ts +39 -0
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database.js +2 -3
- package/dest/proving_broker/proving_broker_instrumentation.d.ts +25 -0
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_instrumentation.js +21 -28
- package/dest/proving_broker/proving_job_controller.d.ts +31 -0
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -0
- package/dest/proving_broker/proving_job_controller.js +62 -81
- package/dest/proving_broker/rpc.d.ts +26 -0
- package/dest/proving_broker/rpc.d.ts.map +1 -0
- package/dest/proving_broker/rpc.js +36 -26
- package/dest/test/mock_prover.d.ts +35 -0
- package/dest/test/mock_prover.d.ts.map +1 -0
- package/dest/test/mock_prover.js +13 -11
- package/package.json +12 -13
- package/src/index.ts +1 -1
- package/src/mocks/test_context.ts +23 -22
- package/src/orchestrator/block-building-helpers.ts +1 -38
- package/src/orchestrator/block-proving-state.ts +15 -15
- package/src/orchestrator/epoch-proving-state.ts +7 -10
- package/src/orchestrator/orchestrator.ts +36 -39
- package/src/orchestrator/tx-proving-state.ts +13 -13
- package/src/proving_broker/rpc.ts +24 -4
- package/src/test/mock_prover.ts +7 -1
- package/dest/prover-agent/index.js +0 -3
- package/dest/prover-agent/memory-proving-queue.js +0 -249
- package/dest/prover-agent/prover-agent.js +0 -201
- package/dest/prover-agent/proving-error.js +0 -8
- package/dest/prover-agent/queue_metrics.js +0 -24
- package/dest/prover-agent/rpc.js +0 -20
- package/src/prover-agent/index.ts +0 -3
- package/src/prover-agent/memory-proving-queue.ts +0 -416
- package/src/prover-agent/prover-agent.ts +0 -248
- package/src/prover-agent/proving-error.ts +0 -9
- package/src/prover-agent/queue_metrics.ts +0 -29
- package/src/prover-agent/rpc.ts +0 -22
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
}
|
|
7
|
-
import { ProvingRequestType } from '@aztec/circuit-types';
|
|
8
|
-
import { randomBytes } from '@aztec/foundation/crypto';
|
|
9
|
-
import { AbortError, TimeoutError } from '@aztec/foundation/error';
|
|
10
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
11
|
-
import { RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
|
|
12
|
-
import { PriorityMemoryQueue } from '@aztec/foundation/queue';
|
|
13
|
-
import { trackSpan } from '@aztec/telemetry-client';
|
|
14
|
-
import { InlineProofStore } from '../proving_broker/proof_store/index.js';
|
|
15
|
-
import { ProvingQueueMetrics } from './queue_metrics.js';
|
|
16
|
-
const MAX_RETRIES = 3;
|
|
17
|
-
const defaultIdGenerator = ()=>randomBytes(4).toString('hex');
|
|
18
|
-
const defaultTimeSource = ()=>Date.now();
|
|
19
|
-
/**
|
|
20
|
-
* A helper class that sits in between services that need proofs created and agents that can create them.
|
|
21
|
-
* The queue accumulates jobs and provides them to agents prioritized by block number.
|
|
22
|
-
*/ export class MemoryProvingQueue {
|
|
23
|
-
jobTimeoutMs;
|
|
24
|
-
generateId;
|
|
25
|
-
timeSource;
|
|
26
|
-
proofStore;
|
|
27
|
-
log;
|
|
28
|
-
queue;
|
|
29
|
-
jobsInProgress;
|
|
30
|
-
runningPromise;
|
|
31
|
-
metrics;
|
|
32
|
-
tracer;
|
|
33
|
-
constructor(client, /** Timeout the job if an agent doesn't report back in this time */ jobTimeoutMs = 60 * 1000, /** How often to check for timed out jobs */ pollingIntervalMs = 1000, generateId = defaultIdGenerator, timeSource = defaultTimeSource, proofStore = new InlineProofStore()){
|
|
34
|
-
this.jobTimeoutMs = jobTimeoutMs;
|
|
35
|
-
this.generateId = generateId;
|
|
36
|
-
this.timeSource = timeSource;
|
|
37
|
-
this.proofStore = proofStore;
|
|
38
|
-
this.log = createLogger('prover-client:prover-pool:queue');
|
|
39
|
-
this.queue = new PriorityMemoryQueue((a, b)=>(a.epochNumber ?? 0) - (b.epochNumber ?? 0));
|
|
40
|
-
this.jobsInProgress = new Map();
|
|
41
|
-
this.tracer = client.getTracer('MemoryProvingQueue');
|
|
42
|
-
this.metrics = new ProvingQueueMetrics(client, 'MemoryProvingQueue');
|
|
43
|
-
this.runningPromise = new RunningPromise(this.poll.bind(this), this.log, pollingIntervalMs);
|
|
44
|
-
}
|
|
45
|
-
start() {
|
|
46
|
-
if (this.runningPromise.isRunning()) {
|
|
47
|
-
this.log.warn('Proving queue is already running');
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
this.runningPromise.start();
|
|
51
|
-
this.log.info('Proving queue started');
|
|
52
|
-
}
|
|
53
|
-
async stop() {
|
|
54
|
-
if (!this.runningPromise.isRunning()) {
|
|
55
|
-
this.log.warn('Proving queue is already stopped');
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
await this.runningPromise.stop();
|
|
59
|
-
this.log.info('Proving queue stopped');
|
|
60
|
-
}
|
|
61
|
-
async getProvingJob({ timeoutSec = 1 } = {}) {
|
|
62
|
-
if (!this.runningPromise.isRunning()) {
|
|
63
|
-
throw new Error('Proving queue is not running. Start the queue before getting jobs.');
|
|
64
|
-
}
|
|
65
|
-
try {
|
|
66
|
-
const job = await this.queue.get(timeoutSec);
|
|
67
|
-
if (!job) {
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
if (job.signal?.aborted) {
|
|
71
|
-
return undefined;
|
|
72
|
-
}
|
|
73
|
-
job.heartbeat = this.timeSource();
|
|
74
|
-
this.jobsInProgress.set(job.id, job);
|
|
75
|
-
return {
|
|
76
|
-
id: job.id,
|
|
77
|
-
type: job.type,
|
|
78
|
-
inputsUri: job.inputsUri,
|
|
79
|
-
epochNumber: job.epochNumber
|
|
80
|
-
};
|
|
81
|
-
} catch (err) {
|
|
82
|
-
if (err instanceof TimeoutError) {
|
|
83
|
-
return undefined;
|
|
84
|
-
}
|
|
85
|
-
throw err;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
resolveProvingJob(jobId, result) {
|
|
89
|
-
if (!this.runningPromise.isRunning()) {
|
|
90
|
-
throw new Error('Proving queue is not running.');
|
|
91
|
-
}
|
|
92
|
-
const job = this.jobsInProgress.get(jobId);
|
|
93
|
-
if (!job) {
|
|
94
|
-
this.log.warn(`Job id=${jobId} not found. Can't resolve`);
|
|
95
|
-
return Promise.resolve();
|
|
96
|
-
}
|
|
97
|
-
this.jobsInProgress.delete(jobId);
|
|
98
|
-
if (!job.signal?.aborted) {
|
|
99
|
-
job.resolve(result);
|
|
100
|
-
}
|
|
101
|
-
return Promise.resolve();
|
|
102
|
-
}
|
|
103
|
-
rejectProvingJob(jobId, reason) {
|
|
104
|
-
if (!this.runningPromise.isRunning()) {
|
|
105
|
-
throw new Error('Proving queue is not running.');
|
|
106
|
-
}
|
|
107
|
-
const job = this.jobsInProgress.get(jobId);
|
|
108
|
-
if (!job) {
|
|
109
|
-
this.log.warn(`Job id=${jobId} not found. Can't reject`);
|
|
110
|
-
return Promise.resolve();
|
|
111
|
-
}
|
|
112
|
-
this.jobsInProgress.delete(jobId);
|
|
113
|
-
if (job.signal?.aborted) {
|
|
114
|
-
return Promise.resolve();
|
|
115
|
-
}
|
|
116
|
-
// every job should be retried with the exception of the public VM since its in development and can fail
|
|
117
|
-
if (job.attempts < MAX_RETRIES && job.type !== ProvingRequestType.PUBLIC_VM) {
|
|
118
|
-
job.attempts++;
|
|
119
|
-
this.log.warn(`Job id=${job.id} type=${ProvingRequestType[job.type]} failed with error: ${reason}. Retry ${job.attempts}/${MAX_RETRIES}`);
|
|
120
|
-
this.queue.put(job);
|
|
121
|
-
} else {
|
|
122
|
-
const logFn = job.type === ProvingRequestType.PUBLIC_VM && !process.env.AVM_PROVING_STRICT ? this.log.warn : this.log.error;
|
|
123
|
-
logFn(`Job id=${job.id} type=${ProvingRequestType[job.type]} failed with error: ${reason}`);
|
|
124
|
-
job.reject(new Error(reason));
|
|
125
|
-
}
|
|
126
|
-
return Promise.resolve();
|
|
127
|
-
}
|
|
128
|
-
heartbeat(jobId) {
|
|
129
|
-
if (!this.runningPromise.isRunning()) {
|
|
130
|
-
throw new Error('Proving queue is not running.');
|
|
131
|
-
}
|
|
132
|
-
const job = this.jobsInProgress.get(jobId);
|
|
133
|
-
if (job) {
|
|
134
|
-
job.heartbeat = this.timeSource();
|
|
135
|
-
}
|
|
136
|
-
return Promise.resolve();
|
|
137
|
-
}
|
|
138
|
-
isJobRunning(jobId) {
|
|
139
|
-
return this.jobsInProgress.has(jobId);
|
|
140
|
-
}
|
|
141
|
-
poll() {
|
|
142
|
-
const now = this.timeSource();
|
|
143
|
-
this.metrics.recordQueueSize(this.queue.length());
|
|
144
|
-
for (const job of this.jobsInProgress.values()){
|
|
145
|
-
if (job.signal?.aborted) {
|
|
146
|
-
this.jobsInProgress.delete(job.id);
|
|
147
|
-
continue;
|
|
148
|
-
}
|
|
149
|
-
if (job.heartbeat + this.jobTimeoutMs < now) {
|
|
150
|
-
this.log.warn(`Job ${job.id} type=${ProvingRequestType[job.type]} has timed out`);
|
|
151
|
-
this.jobsInProgress.delete(job.id);
|
|
152
|
-
job.heartbeat = 0;
|
|
153
|
-
this.queue.put(job);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
async enqueue(type, inputs, signal, epochNumber) {
|
|
158
|
-
if (!this.runningPromise.isRunning()) {
|
|
159
|
-
return Promise.reject(new Error('Proving queue is not running.'));
|
|
160
|
-
}
|
|
161
|
-
const { promise, resolve, reject } = promiseWithResolvers();
|
|
162
|
-
const id = this.generateId();
|
|
163
|
-
const inputsUri = await this.proofStore.saveProofInput(id, type, inputs);
|
|
164
|
-
const item = {
|
|
165
|
-
id,
|
|
166
|
-
type,
|
|
167
|
-
inputsUri,
|
|
168
|
-
signal,
|
|
169
|
-
promise,
|
|
170
|
-
resolve,
|
|
171
|
-
reject,
|
|
172
|
-
attempts: 1,
|
|
173
|
-
heartbeat: 0,
|
|
174
|
-
epochNumber: epochNumber ?? 0
|
|
175
|
-
};
|
|
176
|
-
if (signal) {
|
|
177
|
-
signal.addEventListener('abort', ()=>reject(new AbortError('Operation has been aborted')));
|
|
178
|
-
}
|
|
179
|
-
this.log.debug(`Adding id=${item.id} type=${ProvingRequestType[type]} proving job to queue depth=${this.queue.length()}`);
|
|
180
|
-
if (!this.queue.put(item)) {
|
|
181
|
-
throw new Error();
|
|
182
|
-
}
|
|
183
|
-
return promise.then(({ result })=>result);
|
|
184
|
-
}
|
|
185
|
-
getTubeProof(inputs, signal, epochNumber) {
|
|
186
|
-
return this.enqueue(ProvingRequestType.TUBE_PROOF, inputs, signal, epochNumber);
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Creates a proof for the given input.
|
|
190
|
-
* @param input - Input to the circuit.
|
|
191
|
-
*/ getBaseParityProof(inputs, signal, epochNumber) {
|
|
192
|
-
return this.enqueue(ProvingRequestType.BASE_PARITY, inputs, signal, epochNumber);
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Creates a proof for the given input.
|
|
196
|
-
* @param input - Input to the circuit.
|
|
197
|
-
*/ getRootParityProof(inputs, signal, epochNumber) {
|
|
198
|
-
return this.enqueue(ProvingRequestType.ROOT_PARITY, inputs, signal, epochNumber);
|
|
199
|
-
}
|
|
200
|
-
getPrivateBaseRollupProof(inputs, signal, epochNumber) {
|
|
201
|
-
return this.enqueue(ProvingRequestType.PRIVATE_BASE_ROLLUP, inputs, signal, epochNumber);
|
|
202
|
-
}
|
|
203
|
-
getPublicBaseRollupProof(inputs, signal, epochNumber) {
|
|
204
|
-
return this.enqueue(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs, signal, epochNumber);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Creates a proof for the given input.
|
|
208
|
-
* @param input - Input to the circuit.
|
|
209
|
-
*/ getMergeRollupProof(inputs, signal, epochNumber) {
|
|
210
|
-
return this.enqueue(ProvingRequestType.MERGE_ROLLUP, inputs, signal, epochNumber);
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Creates a proof for the given input.
|
|
214
|
-
* @param input - Input to the circuit.
|
|
215
|
-
*/ getBlockRootRollupProof(inputs, signal, epochNumber) {
|
|
216
|
-
return this.enqueue(ProvingRequestType.BLOCK_ROOT_ROLLUP, inputs, signal, epochNumber);
|
|
217
|
-
}
|
|
218
|
-
getSingleTxBlockRootRollupProof(inputs, signal, epochNumber) {
|
|
219
|
-
return this.enqueue(ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP, inputs, signal, epochNumber);
|
|
220
|
-
}
|
|
221
|
-
getEmptyBlockRootRollupProof(inputs, signal, epochNumber) {
|
|
222
|
-
return this.enqueue(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, inputs, signal, epochNumber);
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Creates a proof for the given input.
|
|
226
|
-
* @param input - Input to the circuit.
|
|
227
|
-
*/ getBlockMergeRollupProof(inputs, signal, epochNumber) {
|
|
228
|
-
return this.enqueue(ProvingRequestType.BLOCK_MERGE_ROLLUP, inputs, signal, epochNumber);
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Creates a proof for the given input.
|
|
232
|
-
* @param input - Input to the circuit.
|
|
233
|
-
*/ getRootRollupProof(inputs, signal, epochNumber) {
|
|
234
|
-
return this.enqueue(ProvingRequestType.ROOT_ROLLUP, inputs, signal, epochNumber);
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Creates an AVM proof.
|
|
238
|
-
*/ getAvmProof(inputs, signal, epochNumber) {
|
|
239
|
-
return this.enqueue(ProvingRequestType.PUBLIC_VM, inputs, signal, epochNumber);
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Verifies a circuit proof
|
|
243
|
-
*/ verifyProof() {
|
|
244
|
-
return Promise.reject('not implemented');
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
_ts_decorate([
|
|
248
|
-
trackSpan('MemoryProvingQueue.poll')
|
|
249
|
-
], MemoryProvingQueue.prototype, "poll", null);
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
}
|
|
7
|
-
import { ProvingRequestType, makeProvingRequestResult } from '@aztec/circuit-types';
|
|
8
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
9
|
-
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
10
|
-
import { elapsed } from '@aztec/foundation/timer';
|
|
11
|
-
import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
12
|
-
import { InlineProofStore } from '../proving_broker/proof_store/index.js';
|
|
13
|
-
const PRINT_THRESHOLD_NS = 6e10; // 60 seconds
|
|
14
|
-
/**
|
|
15
|
-
* A helper class that encapsulates a circuit prover and connects it to a job source.
|
|
16
|
-
*/ export class ProverAgent {
|
|
17
|
-
circuitProver;
|
|
18
|
-
maxConcurrency;
|
|
19
|
-
pollIntervalMs;
|
|
20
|
-
log;
|
|
21
|
-
inFlightPromises;
|
|
22
|
-
runningPromise;
|
|
23
|
-
proofInputsDatabase;
|
|
24
|
-
tracer;
|
|
25
|
-
constructor(/** The prover implementation to defer jobs to */ circuitProver, /** How many proving jobs this agent can handle in parallel */ maxConcurrency = 1, /** How long to wait between jobs */ pollIntervalMs = 100, /** Telemetry client */ telemetry = getTelemetryClient(), /** Logger */ log = createLogger('prover-client:prover-agent')){
|
|
26
|
-
this.circuitProver = circuitProver;
|
|
27
|
-
this.maxConcurrency = maxConcurrency;
|
|
28
|
-
this.pollIntervalMs = pollIntervalMs;
|
|
29
|
-
this.log = log;
|
|
30
|
-
this.inFlightPromises = new Map();
|
|
31
|
-
this.proofInputsDatabase = new InlineProofStore();
|
|
32
|
-
this.tracer = telemetry.getTracer('ProverAgent');
|
|
33
|
-
}
|
|
34
|
-
setMaxConcurrency(maxConcurrency) {
|
|
35
|
-
if (maxConcurrency < 1) {
|
|
36
|
-
throw new Error('Concurrency must be at least 1');
|
|
37
|
-
}
|
|
38
|
-
this.maxConcurrency = maxConcurrency;
|
|
39
|
-
return Promise.resolve();
|
|
40
|
-
}
|
|
41
|
-
setCircuitProver(circuitProver) {
|
|
42
|
-
this.circuitProver = circuitProver;
|
|
43
|
-
}
|
|
44
|
-
isRunning() {
|
|
45
|
-
return Promise.resolve(this.#isRunning());
|
|
46
|
-
}
|
|
47
|
-
#isRunning() {
|
|
48
|
-
return this.runningPromise?.isRunning() ?? false;
|
|
49
|
-
}
|
|
50
|
-
getCurrentJobs() {
|
|
51
|
-
return Promise.resolve(Array.from(this.inFlightPromises.values()).map(({ id, type })=>({
|
|
52
|
-
id,
|
|
53
|
-
type: ProvingRequestType[type]
|
|
54
|
-
})));
|
|
55
|
-
}
|
|
56
|
-
start(jobSource) {
|
|
57
|
-
if (this.runningPromise) {
|
|
58
|
-
throw new Error('Agent is already running');
|
|
59
|
-
}
|
|
60
|
-
let lastPrint = process.hrtime.bigint();
|
|
61
|
-
this.runningPromise = new RunningPromise(async ()=>{
|
|
62
|
-
for (const jobId of this.inFlightPromises.keys()){
|
|
63
|
-
await jobSource.heartbeat(jobId);
|
|
64
|
-
}
|
|
65
|
-
const now = process.hrtime.bigint();
|
|
66
|
-
if (now - lastPrint >= PRINT_THRESHOLD_NS) {
|
|
67
|
-
// only log if we're actually doing work
|
|
68
|
-
if (this.inFlightPromises.size > 0) {
|
|
69
|
-
const jobs = Array.from(this.inFlightPromises.values()).map((job)=>`id=${job.id},type=${ProvingRequestType[job.type]}`).join(' ');
|
|
70
|
-
this.log.info(`Agent is running with ${this.inFlightPromises.size} in-flight jobs: ${jobs}`);
|
|
71
|
-
}
|
|
72
|
-
lastPrint = now;
|
|
73
|
-
}
|
|
74
|
-
while(this.inFlightPromises.size < this.maxConcurrency){
|
|
75
|
-
try {
|
|
76
|
-
const job = await jobSource.getProvingJob();
|
|
77
|
-
if (!job) {
|
|
78
|
-
// job source is fully drained, sleep for a bit and try again
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
try {
|
|
82
|
-
const promise = this.work(jobSource, job).finally(()=>this.inFlightPromises.delete(job.id));
|
|
83
|
-
this.inFlightPromises.set(job.id, {
|
|
84
|
-
id: job.id,
|
|
85
|
-
type: job.type,
|
|
86
|
-
promise
|
|
87
|
-
});
|
|
88
|
-
} catch (err) {
|
|
89
|
-
this.log.warn(`Error processing job! type=${ProvingRequestType[job.type]}: ${err}. ${err.stack}`);
|
|
90
|
-
}
|
|
91
|
-
} catch (err) {
|
|
92
|
-
this.log.error(`Error fetching job`, err);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}, this.log, this.pollIntervalMs);
|
|
96
|
-
this.runningPromise.start();
|
|
97
|
-
this.log.info(`Agent started with concurrency=${this.maxConcurrency}`);
|
|
98
|
-
}
|
|
99
|
-
async stop() {
|
|
100
|
-
if (!this.runningPromise?.isRunning()) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
await this.runningPromise.stop();
|
|
104
|
-
this.runningPromise = undefined;
|
|
105
|
-
this.log.info('Agent stopped');
|
|
106
|
-
}
|
|
107
|
-
async work(jobSource, job) {
|
|
108
|
-
try {
|
|
109
|
-
this.log.debug(`Picked up proving job ${job.id} ${ProvingRequestType[job.type]}`, {
|
|
110
|
-
jobId: job.id,
|
|
111
|
-
jobType: ProvingRequestType[job.type]
|
|
112
|
-
});
|
|
113
|
-
const type = job.type;
|
|
114
|
-
const inputs = await this.proofInputsDatabase.getProofInput(job.inputsUri);
|
|
115
|
-
const [time, result] = await elapsed(this.getProof(inputs));
|
|
116
|
-
if (this.#isRunning()) {
|
|
117
|
-
this.log.verbose(`Processed proving job id=${job.id} type=${ProvingRequestType[type]} duration=${time}ms`);
|
|
118
|
-
await jobSource.resolveProvingJob(job.id, makeProvingRequestResult(type, result));
|
|
119
|
-
} else {
|
|
120
|
-
this.log.verbose(`Dropping proving job id=${job.id} type=${ProvingRequestType[job.type]} duration=${time}ms: agent stopped`);
|
|
121
|
-
}
|
|
122
|
-
} catch (err) {
|
|
123
|
-
const type = ProvingRequestType[job.type];
|
|
124
|
-
if (this.#isRunning()) {
|
|
125
|
-
if (job.type === ProvingRequestType.PUBLIC_VM && !process.env.AVM_PROVING_STRICT) {
|
|
126
|
-
this.log.warn(`Expected error processing VM proving job id=${job.id} type=${type}: ${err}`);
|
|
127
|
-
} else {
|
|
128
|
-
this.log.error(`Error processing proving job id=${job.id} type=${type}: ${err}`, err);
|
|
129
|
-
}
|
|
130
|
-
const reason = err?.message ?? String(err);
|
|
131
|
-
await jobSource.rejectProvingJob(job.id, reason);
|
|
132
|
-
} else {
|
|
133
|
-
this.log.verbose(`Dropping proving job id=${job.id} type=${type}: agent stopped: ${err.stack || err}`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
getProof(request) {
|
|
138
|
-
const { type, inputs } = request;
|
|
139
|
-
switch(type){
|
|
140
|
-
case ProvingRequestType.PUBLIC_VM:
|
|
141
|
-
{
|
|
142
|
-
return this.circuitProver.getAvmProof(inputs);
|
|
143
|
-
}
|
|
144
|
-
case ProvingRequestType.PRIVATE_BASE_ROLLUP:
|
|
145
|
-
{
|
|
146
|
-
return this.circuitProver.getPrivateBaseRollupProof(inputs);
|
|
147
|
-
}
|
|
148
|
-
case ProvingRequestType.PUBLIC_BASE_ROLLUP:
|
|
149
|
-
{
|
|
150
|
-
return this.circuitProver.getPublicBaseRollupProof(inputs);
|
|
151
|
-
}
|
|
152
|
-
case ProvingRequestType.MERGE_ROLLUP:
|
|
153
|
-
{
|
|
154
|
-
return this.circuitProver.getMergeRollupProof(inputs);
|
|
155
|
-
}
|
|
156
|
-
case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP:
|
|
157
|
-
{
|
|
158
|
-
return this.circuitProver.getEmptyBlockRootRollupProof(inputs);
|
|
159
|
-
}
|
|
160
|
-
case ProvingRequestType.BLOCK_ROOT_ROLLUP:
|
|
161
|
-
{
|
|
162
|
-
return this.circuitProver.getBlockRootRollupProof(inputs);
|
|
163
|
-
}
|
|
164
|
-
case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP:
|
|
165
|
-
{
|
|
166
|
-
return this.circuitProver.getSingleTxBlockRootRollupProof(inputs);
|
|
167
|
-
}
|
|
168
|
-
case ProvingRequestType.BLOCK_MERGE_ROLLUP:
|
|
169
|
-
{
|
|
170
|
-
return this.circuitProver.getBlockMergeRollupProof(inputs);
|
|
171
|
-
}
|
|
172
|
-
case ProvingRequestType.ROOT_ROLLUP:
|
|
173
|
-
{
|
|
174
|
-
return this.circuitProver.getRootRollupProof(inputs);
|
|
175
|
-
}
|
|
176
|
-
case ProvingRequestType.BASE_PARITY:
|
|
177
|
-
{
|
|
178
|
-
return this.circuitProver.getBaseParityProof(inputs);
|
|
179
|
-
}
|
|
180
|
-
case ProvingRequestType.ROOT_PARITY:
|
|
181
|
-
{
|
|
182
|
-
return this.circuitProver.getRootParityProof(inputs);
|
|
183
|
-
}
|
|
184
|
-
case ProvingRequestType.TUBE_PROOF:
|
|
185
|
-
{
|
|
186
|
-
return this.circuitProver.getTubeProof(inputs);
|
|
187
|
-
}
|
|
188
|
-
default:
|
|
189
|
-
{
|
|
190
|
-
const _exhaustive = type;
|
|
191
|
-
return Promise.reject(new Error(`Invalid proof request type: ${type}`));
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
_ts_decorate([
|
|
197
|
-
trackSpan('ProverAgent.work', (_jobSoure, job)=>({
|
|
198
|
-
[Attributes.PROVING_JOB_ID]: job.id,
|
|
199
|
-
[Attributes.PROVING_JOB_TYPE]: ProvingRequestType[job.type]
|
|
200
|
-
}))
|
|
201
|
-
], ProverAgent.prototype, "work", null);
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { ProvingRequestType } from '@aztec/circuit-types';
|
|
2
|
-
import { Attributes, Metrics } from '@aztec/telemetry-client';
|
|
3
|
-
export class ProvingQueueMetrics {
|
|
4
|
-
jobSize;
|
|
5
|
-
queueSize;
|
|
6
|
-
constructor(client, name = 'ProvingQueueMetrics'){
|
|
7
|
-
const meter = client.getMeter(name);
|
|
8
|
-
this.jobSize = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_SIZE, {
|
|
9
|
-
description: 'Size of proving job',
|
|
10
|
-
unit: 'by'
|
|
11
|
-
});
|
|
12
|
-
this.queueSize = meter.createGauge(Metrics.PROVING_QUEUE_SIZE, {
|
|
13
|
-
description: 'Size of proving queue'
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
recordNewJob(type, size) {
|
|
17
|
-
this.jobSize.record(size, {
|
|
18
|
-
[Attributes.PROVING_JOB_TYPE]: ProvingRequestType[type]
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
recordQueueSize(size) {
|
|
22
|
-
this.queueSize.record(size);
|
|
23
|
-
}
|
|
24
|
-
}
|
package/dest/prover-agent/rpc.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { ProverAgentApiSchema, ProvingJobSourceSchema } from '@aztec/circuit-types';
|
|
2
|
-
import { createSafeJsonRpcClient } from '@aztec/foundation/json-rpc/client';
|
|
3
|
-
import { createTracedJsonRpcServer, makeTracedFetch } from '@aztec/telemetry-client';
|
|
4
|
-
export function createProvingJobSourceServer(queue) {
|
|
5
|
-
return createTracedJsonRpcServer(queue, ProvingJobSourceSchema);
|
|
6
|
-
}
|
|
7
|
-
export function createProvingJobSourceClient(url, fetch = makeTracedFetch([
|
|
8
|
-
1,
|
|
9
|
-
2,
|
|
10
|
-
3
|
|
11
|
-
], false)) {
|
|
12
|
-
return createSafeJsonRpcClient(url, ProvingJobSourceSchema, false, 'provingJobSource', fetch);
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Wrap a ProverAgent instance with a JSON RPC HTTP server.
|
|
16
|
-
* @param agent - The Prover Agent
|
|
17
|
-
* @returns An JSON-RPC HTTP server
|
|
18
|
-
*/ export function createProverAgentRpcServer(agent) {
|
|
19
|
-
return createTracedJsonRpcServer(agent, ProverAgentApiSchema);
|
|
20
|
-
}
|