@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.
Files changed (136) hide show
  1. package/dest/bin/get-proof-inputs.d.ts +2 -0
  2. package/dest/bin/get-proof-inputs.d.ts.map +1 -0
  3. package/dest/bin/get-proof-inputs.js +16 -18
  4. package/dest/block_builder/index.d.ts +6 -0
  5. package/dest/block_builder/index.d.ts.map +1 -0
  6. package/dest/block_builder/index.js +1 -0
  7. package/dest/block_builder/light.d.ts +31 -0
  8. package/dest/block_builder/light.d.ts.map +1 -0
  9. package/dest/block_builder/light.js +13 -23
  10. package/dest/config.d.ts +17 -0
  11. package/dest/config.d.ts.map +1 -0
  12. package/dest/config.js +11 -9
  13. package/dest/index.d.ts +4 -0
  14. package/dest/index.d.ts.map +1 -0
  15. package/dest/index.js +1 -0
  16. package/dest/mocks/fixtures.d.ts +19 -0
  17. package/dest/mocks/fixtures.d.ts.map +1 -0
  18. package/dest/mocks/fixtures.js +26 -28
  19. package/dest/mocks/test_context.d.ts +49 -0
  20. package/dest/mocks/test_context.d.ts.map +1 -0
  21. package/dest/mocks/test_context.js +46 -72
  22. package/dest/orchestrator/block-building-helpers.d.ts +50 -0
  23. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -0
  24. package/dest/orchestrator/block-building-helpers.js +81 -99
  25. package/dest/orchestrator/block-proving-state.d.ts +71 -0
  26. package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
  27. package/dest/orchestrator/block-proving-state.js +74 -99
  28. package/dest/orchestrator/epoch-proving-state.d.ts +56 -0
  29. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
  30. package/dest/orchestrator/epoch-proving-state.js +41 -57
  31. package/dest/orchestrator/index.d.ts +2 -0
  32. package/dest/orchestrator/index.d.ts.map +1 -0
  33. package/dest/orchestrator/index.js +1 -0
  34. package/dest/orchestrator/orchestrator.d.ts +108 -0
  35. package/dest/orchestrator/orchestrator.d.ts.map +1 -0
  36. package/dest/orchestrator/orchestrator.js +654 -650
  37. package/dest/orchestrator/orchestrator_metrics.d.ts +8 -0
  38. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -0
  39. package/dest/orchestrator/orchestrator_metrics.js +3 -4
  40. package/dest/orchestrator/tx-proving-state.d.ts +31 -0
  41. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -0
  42. package/dest/orchestrator/tx-proving-state.js +52 -53
  43. package/dest/prover-client/factory.d.ts +6 -0
  44. package/dest/prover-client/factory.d.ts.map +1 -0
  45. package/dest/prover-client/factory.js +1 -0
  46. package/dest/prover-client/index.d.ts +3 -0
  47. package/dest/prover-client/index.d.ts.map +1 -0
  48. package/dest/prover-client/index.js +1 -0
  49. package/dest/prover-client/prover-client.d.ts +42 -0
  50. package/dest/prover-client/prover-client.d.ts.map +1 -0
  51. package/dest/prover-client/prover-client.js +25 -30
  52. package/dest/prover-client/server-epoch-prover.d.ts +25 -0
  53. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
  54. package/dest/prover-client/server-epoch-prover.js +4 -4
  55. package/dest/proving_broker/broker_prover_facade.d.ts +39 -0
  56. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
  57. package/dest/proving_broker/broker_prover_facade.js +59 -70
  58. package/dest/proving_broker/config.d.ts +61 -0
  59. package/dest/proving_broker/config.d.ts.map +1 -0
  60. package/dest/proving_broker/config.js +37 -22
  61. package/dest/proving_broker/factory.d.ts +5 -0
  62. package/dest/proving_broker/factory.d.ts.map +1 -0
  63. package/dest/proving_broker/factory.js +2 -1
  64. package/dest/proving_broker/fixtures.d.ts +5 -0
  65. package/dest/proving_broker/fixtures.d.ts.map +1 -0
  66. package/dest/proving_broker/fixtures.js +1 -0
  67. package/dest/proving_broker/index.d.ts +10 -0
  68. package/dest/proving_broker/index.d.ts.map +1 -0
  69. package/dest/proving_broker/index.js +1 -0
  70. package/dest/proving_broker/proof_store/factory.d.ts +6 -0
  71. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
  72. package/dest/proving_broker/proof_store/factory.js +12 -9
  73. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +13 -0
  74. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
  75. package/dest/proving_broker/proof_store/gcs_proof_store.js +7 -11
  76. package/dest/proving_broker/proof_store/index.d.ts +4 -0
  77. package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
  78. package/dest/proving_broker/proof_store/index.js +1 -0
  79. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +14 -0
  80. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
  81. package/dest/proving_broker/proof_store/inline_proof_store.js +7 -11
  82. package/dest/proving_broker/proof_store/proof_store.d.ts +35 -0
  83. package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
  84. package/dest/proving_broker/proof_store/proof_store.js +2 -3
  85. package/dest/proving_broker/proving_agent.d.ts +45 -0
  86. package/dest/proving_broker/proving_agent.d.ts.map +1 -0
  87. package/dest/proving_broker/proving_agent.js +124 -120
  88. package/dest/proving_broker/proving_agent_instrumentation.d.ts +8 -0
  89. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -0
  90. package/dest/proving_broker/proving_agent_instrumentation.js +3 -3
  91. package/dest/proving_broker/proving_broker.d.ts +72 -0
  92. package/dest/proving_broker/proving_broker.d.ts.map +1 -0
  93. package/dest/proving_broker/proving_broker.js +449 -491
  94. package/dest/proving_broker/proving_broker_database/memory.d.ts +16 -0
  95. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
  96. package/dest/proving_broker/proving_broker_database/memory.js +13 -19
  97. package/dest/proving_broker/proving_broker_database/persisted.d.ts +21 -0
  98. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
  99. package/dest/proving_broker/proving_broker_database/persisted.js +21 -41
  100. package/dest/proving_broker/proving_broker_database.d.ts +39 -0
  101. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
  102. package/dest/proving_broker/proving_broker_database.js +2 -3
  103. package/dest/proving_broker/proving_broker_instrumentation.d.ts +25 -0
  104. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -0
  105. package/dest/proving_broker/proving_broker_instrumentation.js +21 -28
  106. package/dest/proving_broker/proving_job_controller.d.ts +31 -0
  107. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -0
  108. package/dest/proving_broker/proving_job_controller.js +62 -81
  109. package/dest/proving_broker/rpc.d.ts +26 -0
  110. package/dest/proving_broker/rpc.d.ts.map +1 -0
  111. package/dest/proving_broker/rpc.js +36 -26
  112. package/dest/test/mock_prover.d.ts +35 -0
  113. package/dest/test/mock_prover.d.ts.map +1 -0
  114. package/dest/test/mock_prover.js +13 -11
  115. package/package.json +12 -13
  116. package/src/index.ts +1 -1
  117. package/src/mocks/test_context.ts +23 -22
  118. package/src/orchestrator/block-building-helpers.ts +1 -38
  119. package/src/orchestrator/block-proving-state.ts +15 -15
  120. package/src/orchestrator/epoch-proving-state.ts +7 -10
  121. package/src/orchestrator/orchestrator.ts +36 -39
  122. package/src/orchestrator/tx-proving-state.ts +13 -13
  123. package/src/proving_broker/rpc.ts +24 -4
  124. package/src/test/mock_prover.ts +7 -1
  125. package/dest/prover-agent/index.js +0 -3
  126. package/dest/prover-agent/memory-proving-queue.js +0 -249
  127. package/dest/prover-agent/prover-agent.js +0 -201
  128. package/dest/prover-agent/proving-error.js +0 -8
  129. package/dest/prover-agent/queue_metrics.js +0 -24
  130. package/dest/prover-agent/rpc.js +0 -20
  131. package/src/prover-agent/index.ts +0 -3
  132. package/src/prover-agent/memory-proving-queue.ts +0 -416
  133. package/src/prover-agent/prover-agent.ts +0 -248
  134. package/src/prover-agent/proving-error.ts +0 -9
  135. package/src/prover-agent/queue_metrics.ts +0 -29
  136. package/src/prover-agent/rpc.ts +0 -22
@@ -1,3 +0,0 @@
1
- export * from './prover-agent.js';
2
- export * from './memory-proving-queue.js';
3
- export * from './rpc.js';
@@ -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,8 +0,0 @@
1
- export class ProvingError extends Error {
2
- toString() {
3
- return this.message;
4
- }
5
- static fromString(message) {
6
- return new ProvingError(message);
7
- }
8
- }
@@ -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
- }
@@ -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
- }
@@ -1,3 +0,0 @@
1
- export * from './prover-agent.js';
2
- export * from './memory-proving-queue.js';
3
- export * from './rpc.js';