@aztec/prover-client 0.0.0-test.0 → 0.0.1-commit.0208eb9

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 (155) hide show
  1. package/dest/config.d.ts +8 -8
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +12 -2
  4. package/dest/index.d.ts +1 -1
  5. package/dest/light/index.d.ts +2 -0
  6. package/dest/light/index.d.ts.map +1 -0
  7. package/dest/light/index.js +1 -0
  8. package/dest/light/lightweight_checkpoint_builder.d.ts +47 -0
  9. package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
  10. package/dest/light/lightweight_checkpoint_builder.js +200 -0
  11. package/dest/mocks/fixtures.d.ts +8 -8
  12. package/dest/mocks/fixtures.d.ts.map +1 -1
  13. package/dest/mocks/fixtures.js +36 -17
  14. package/dest/mocks/test_context.d.ts +43 -32
  15. package/dest/mocks/test_context.d.ts.map +1 -1
  16. package/dest/mocks/test_context.js +149 -87
  17. package/dest/orchestrator/block-building-helpers.d.ts +37 -30
  18. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  19. package/dest/orchestrator/block-building-helpers.js +170 -189
  20. package/dest/orchestrator/block-proving-state.d.ts +70 -48
  21. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  22. package/dest/orchestrator/block-proving-state.js +282 -177
  23. package/dest/orchestrator/checkpoint-proving-state.d.ts +76 -0
  24. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
  25. package/dest/orchestrator/checkpoint-proving-state.js +243 -0
  26. package/dest/orchestrator/epoch-proving-state.d.ts +43 -28
  27. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  28. package/dest/orchestrator/epoch-proving-state.js +177 -73
  29. package/dest/orchestrator/index.d.ts +1 -1
  30. package/dest/orchestrator/orchestrator.d.ts +53 -35
  31. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  32. package/dest/orchestrator/orchestrator.js +855 -302
  33. package/dest/orchestrator/orchestrator_metrics.d.ts +1 -1
  34. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  35. package/dest/orchestrator/orchestrator_metrics.js +2 -6
  36. package/dest/orchestrator/tx-proving-state.d.ts +15 -12
  37. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  38. package/dest/orchestrator/tx-proving-state.js +27 -44
  39. package/dest/prover-client/factory.d.ts +3 -3
  40. package/dest/prover-client/factory.d.ts.map +1 -1
  41. package/dest/prover-client/index.d.ts +1 -1
  42. package/dest/prover-client/prover-client.d.ts +7 -7
  43. package/dest/prover-client/prover-client.d.ts.map +1 -1
  44. package/dest/prover-client/prover-client.js +19 -13
  45. package/dest/prover-client/server-epoch-prover.d.ts +16 -12
  46. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  47. package/dest/prover-client/server-epoch-prover.js +11 -11
  48. package/dest/proving_broker/broker_prover_facade.d.ts +28 -19
  49. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  50. package/dest/proving_broker/broker_prover_facade.js +62 -43
  51. package/dest/proving_broker/config.d.ts +31 -10
  52. package/dest/proving_broker/config.d.ts.map +1 -1
  53. package/dest/proving_broker/config.js +41 -7
  54. package/dest/proving_broker/factory.d.ts +2 -2
  55. package/dest/proving_broker/factory.d.ts.map +1 -1
  56. package/dest/proving_broker/factory.js +5 -1
  57. package/dest/proving_broker/fixtures.d.ts +3 -2
  58. package/dest/proving_broker/fixtures.d.ts.map +1 -1
  59. package/dest/proving_broker/fixtures.js +3 -2
  60. package/dest/proving_broker/index.d.ts +1 -1
  61. package/dest/proving_broker/proof_store/factory.d.ts +2 -5
  62. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -1
  63. package/dest/proving_broker/proof_store/factory.js +7 -30
  64. package/dest/proving_broker/proof_store/file_store_proof_store.d.ts +18 -0
  65. package/dest/proving_broker/proof_store/file_store_proof_store.d.ts.map +1 -0
  66. package/dest/proving_broker/proof_store/file_store_proof_store.js +60 -0
  67. package/dest/proving_broker/proof_store/index.d.ts +2 -1
  68. package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
  69. package/dest/proving_broker/proof_store/index.js +1 -0
  70. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
  71. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
  72. package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
  73. package/dest/proving_broker/proving_agent.d.ts +8 -12
  74. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  75. package/dest/proving_broker/proving_agent.js +86 -65
  76. package/dest/proving_broker/proving_broker.d.ts +17 -5
  77. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  78. package/dest/proving_broker/proving_broker.js +69 -34
  79. package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
  80. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
  81. package/dest/proving_broker/proving_broker_database/memory.js +1 -1
  82. package/dest/proving_broker/proving_broker_database/persisted.d.ts +5 -3
  83. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  84. package/dest/proving_broker/proving_broker_database/persisted.js +401 -11
  85. package/dest/proving_broker/proving_broker_database.d.ts +3 -2
  86. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
  87. package/dest/proving_broker/proving_broker_instrumentation.d.ts +1 -1
  88. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
  89. package/dest/proving_broker/proving_broker_instrumentation.js +15 -35
  90. package/dest/proving_broker/proving_job_controller.d.ts +11 -10
  91. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  92. package/dest/proving_broker/proving_job_controller.js +92 -62
  93. package/dest/proving_broker/rpc.d.ts +7 -7
  94. package/dest/proving_broker/rpc.d.ts.map +1 -1
  95. package/dest/proving_broker/rpc.js +9 -4
  96. package/dest/test/mock_proof_store.d.ts +9 -0
  97. package/dest/test/mock_proof_store.d.ts.map +1 -0
  98. package/dest/test/mock_proof_store.js +10 -0
  99. package/dest/test/mock_prover.d.ts +23 -17
  100. package/dest/test/mock_prover.d.ts.map +1 -1
  101. package/dest/test/mock_prover.js +38 -20
  102. package/package.json +33 -31
  103. package/src/config.ts +25 -9
  104. package/src/light/index.ts +1 -0
  105. package/src/light/lightweight_checkpoint_builder.ts +289 -0
  106. package/src/mocks/fixtures.ts +46 -40
  107. package/src/mocks/test_context.ts +223 -116
  108. package/src/orchestrator/block-building-helpers.ts +258 -334
  109. package/src/orchestrator/block-proving-state.ts +325 -231
  110. package/src/orchestrator/checkpoint-proving-state.ts +349 -0
  111. package/src/orchestrator/epoch-proving-state.ts +237 -111
  112. package/src/orchestrator/orchestrator.ts +653 -343
  113. package/src/orchestrator/orchestrator_metrics.ts +2 -6
  114. package/src/orchestrator/tx-proving-state.ts +48 -66
  115. package/src/prover-client/factory.ts +6 -2
  116. package/src/prover-client/prover-client.ts +47 -37
  117. package/src/prover-client/server-epoch-prover.ts +40 -22
  118. package/src/proving_broker/broker_prover_facade.ts +212 -131
  119. package/src/proving_broker/config.ts +47 -7
  120. package/src/proving_broker/factory.ts +2 -1
  121. package/src/proving_broker/fixtures.ts +8 -3
  122. package/src/proving_broker/proof_store/factory.ts +10 -32
  123. package/src/proving_broker/proof_store/file_store_proof_store.ts +78 -0
  124. package/src/proving_broker/proof_store/index.ts +1 -0
  125. package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
  126. package/src/proving_broker/proving_agent.ts +95 -66
  127. package/src/proving_broker/proving_broker.ts +87 -42
  128. package/src/proving_broker/proving_broker_database/memory.ts +3 -2
  129. package/src/proving_broker/proving_broker_database/persisted.ts +29 -13
  130. package/src/proving_broker/proving_broker_database.ts +2 -1
  131. package/src/proving_broker/proving_broker_instrumentation.ts +14 -35
  132. package/src/proving_broker/proving_job_controller.ts +100 -83
  133. package/src/proving_broker/rpc.ts +14 -5
  134. package/src/test/mock_proof_store.ts +14 -0
  135. package/src/test/mock_prover.ts +156 -64
  136. package/dest/bin/get-proof-inputs.d.ts +0 -2
  137. package/dest/bin/get-proof-inputs.d.ts.map +0 -1
  138. package/dest/bin/get-proof-inputs.js +0 -51
  139. package/dest/block_builder/index.d.ts +0 -6
  140. package/dest/block_builder/index.d.ts.map +0 -1
  141. package/dest/block_builder/index.js +0 -1
  142. package/dest/block_builder/light.d.ts +0 -33
  143. package/dest/block_builder/light.d.ts.map +0 -1
  144. package/dest/block_builder/light.js +0 -82
  145. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +0 -14
  146. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +0 -1
  147. package/dest/proving_broker/proof_store/gcs_proof_store.js +0 -51
  148. package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
  149. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
  150. package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
  151. package/src/bin/get-proof-inputs.ts +0 -59
  152. package/src/block_builder/index.ts +0 -6
  153. package/src/block_builder/light.ts +0 -101
  154. package/src/proving_broker/proof_store/gcs_proof_store.ts +0 -72
  155. package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
@@ -1,3 +1,4 @@
1
+ import { EpochNumber } from '@aztec/foundation/branded-types';
1
2
  import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
2
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
4
  import { BatchQueue } from '@aztec/foundation/queue';
@@ -10,7 +11,14 @@ import {
10
11
  ProvingJobSettledResult,
11
12
  getEpochFromProvingJobId,
12
13
  } from '@aztec/stdlib/interfaces/server';
13
- import { Attributes, LmdbMetrics, type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
14
+ import {
15
+ Attributes,
16
+ LmdbMetrics,
17
+ type TelemetryClient,
18
+ type Tracer,
19
+ getTelemetryClient,
20
+ trackSpan,
21
+ } from '@aztec/telemetry-client';
14
22
 
15
23
  import { mkdir, readdir } from 'fs/promises';
16
24
  import { join } from 'path';
@@ -46,9 +54,9 @@ class SingleEpochDatabase {
46
54
 
47
55
  async *allProvingJobs(): AsyncIterableIterator<[ProvingJob, ProvingJobSettledResult | undefined]> {
48
56
  for await (const jobStr of this.jobs.valuesAsync()) {
49
- const job = await jsonParseWithSchema(jobStr, ProvingJob);
57
+ const job = jsonParseWithSchema(jobStr, ProvingJob);
50
58
  const resultStr = await this.jobResults.getAsync(job.id);
51
- const result = resultStr ? await jsonParseWithSchema(resultStr, ProvingJobSettledResult) : undefined;
59
+ const result = resultStr ? jsonParseWithSchema(resultStr, ProvingJobSettledResult) : undefined;
52
60
  yield [job, result];
53
61
  }
54
62
  }
@@ -77,6 +85,8 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
77
85
 
78
86
  private batchQueue: BatchQueue<ProvingJob | [ProvingJobId, ProvingJobSettledResult], number>;
79
87
 
88
+ public readonly tracer: Tracer;
89
+
80
90
  private constructor(
81
91
  private epochs: Map<number, SingleEpochDatabase>,
82
92
  private config: ProverBrokerConfig,
@@ -91,6 +101,8 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
91
101
  () => this.estimateSize(),
92
102
  );
93
103
 
104
+ this.tracer = client.getTracer('KVBrokerDatabase');
105
+
94
106
  this.batchQueue = new BatchQueue(
95
107
  (items, key) => this.commitWrites(items, key),
96
108
  config.proverBrokerBatchSize,
@@ -104,14 +116,15 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
104
116
  const jobsToAdd = items.filter((item): item is ProvingJob => 'id' in item);
105
117
  const resultsToAdd = items.filter((item): item is [ProvingJobId, ProvingJobSettledResult] => Array.isArray(item));
106
118
 
107
- const db = await this.getEpochDatabase(epochNumber);
119
+ const db = await this.getEpochDatabase(EpochNumber(epochNumber));
108
120
  await db.batchWrite(jobsToAdd, resultsToAdd);
109
121
  }
110
122
 
111
123
  private async estimateSize() {
112
124
  const sizes = await Promise.all(Array.from(this.epochs.values()).map(x => x.estimateSize()));
113
125
  return {
114
- mappingSize: this.config.dataStoreMapSizeKB,
126
+ mappingSize: this.config.dataStoreMapSizeKb,
127
+ physicalFileSize: sizes.reduce((prev, curr) => prev + curr.physicalFileSize, 0),
115
128
  numItems: sizes.reduce((prev, curr) => prev + curr.numItems, 0),
116
129
  actualSize: sizes.reduce((prev, curr) => prev + curr.actualSize, 0),
117
130
  };
@@ -136,13 +149,13 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
136
149
  continue;
137
150
  }
138
151
  logger.info(
139
- `Loading broker database for epoch ${epochNumber} from ${fullDirectory} with map size ${config.dataStoreMapSizeKB}KB`,
152
+ `Loading broker database for epoch ${epochNumber} from ${fullDirectory} with map size ${config.dataStoreMapSizeKb}KB`,
140
153
  );
141
154
  const db = await openVersionedStoreAt(
142
155
  fullDirectory,
143
156
  SingleEpochDatabase.SCHEMA_VERSION,
144
157
  config.l1Contracts.rollupAddress,
145
- config.dataStoreMapSizeKB,
158
+ config.dataStoreMapSizeKb,
146
159
  );
147
160
  const epochDb = new SingleEpochDatabase(db);
148
161
  epochs.set(epochNumber, epochDb);
@@ -163,14 +176,17 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
163
176
  }
164
177
  }
165
178
 
166
- async deleteAllProvingJobsOlderThanEpoch(epochNumber: number): Promise<void> {
167
- const oldEpochs = Array.from(this.epochs.keys()).filter(e => e < epochNumber);
179
+ @trackSpan('KVBrokerDatabase.deleteAllProvingJobsOlderThanEpoch', epochNumber => ({
180
+ [Attributes.EPOCH_NUMBER]: epochNumber,
181
+ }))
182
+ async deleteAllProvingJobsOlderThanEpoch(epochNumber: EpochNumber): Promise<void> {
183
+ const oldEpochs = Array.from(this.epochs.keys()).filter(e => e < Number(epochNumber));
168
184
  for (const old of oldEpochs) {
169
185
  const db = this.epochs.get(old);
170
186
  if (!db) {
171
187
  continue;
172
188
  }
173
- this.logger.info(`Deleting broker database for epoch ${old}`);
189
+ this.logger.verbose(`Deleting broker database for epoch ${old}`);
174
190
  await db.delete();
175
191
  this.epochs.delete(old);
176
192
  }
@@ -195,19 +211,19 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
195
211
  return this.batchQueue.put([id, { status: 'fulfilled', value }], getEpochFromProvingJobId(id));
196
212
  }
197
213
 
198
- private async getEpochDatabase(epochNumber: number): Promise<SingleEpochDatabase> {
214
+ private async getEpochDatabase(epochNumber: EpochNumber): Promise<SingleEpochDatabase> {
199
215
  let epochDb = this.epochs.get(epochNumber);
200
216
  if (!epochDb) {
201
217
  const newEpochDirectory = join(this.config.dataDirectory!, epochNumber.toString());
202
218
  await mkdir(newEpochDirectory, { recursive: true });
203
219
  this.logger.info(
204
- `Creating broker database for epoch ${epochNumber} at ${newEpochDirectory} with map size ${this.config.dataStoreMapSizeKB}`,
220
+ `Creating broker database for epoch ${epochNumber} at ${newEpochDirectory} with map size ${this.config.dataStoreMapSizeKb}`,
205
221
  );
206
222
  const db = await openVersionedStoreAt(
207
223
  newEpochDirectory,
208
224
  SingleEpochDatabase.SCHEMA_VERSION,
209
225
  this.config.l1Contracts.rollupAddress,
210
- this.config.dataStoreMapSizeKB,
226
+ this.config.dataStoreMapSizeKb,
211
227
  );
212
228
  epochDb = new SingleEpochDatabase(db);
213
229
  this.epochs.set(epochNumber, epochDb);
@@ -1,3 +1,4 @@
1
+ import { EpochNumber } from '@aztec/foundation/branded-types';
1
2
  import type { ProofUri, ProvingJob, ProvingJobId, ProvingJobSettledResult } from '@aztec/stdlib/interfaces/server';
2
3
 
3
4
  /**
@@ -14,7 +15,7 @@ export interface ProvingBrokerDatabase {
14
15
  * Deletes all proving jobs belonging to epochs older than the given epoch
15
16
  * @param epochNumber - The epoch number beyond which jobs should be deleted
16
17
  */
17
- deleteAllProvingJobsOlderThanEpoch(epochNumber: number): Promise<void>;
18
+ deleteAllProvingJobsOlderThanEpoch(epochNumber: EpochNumber): Promise<void>;
18
19
 
19
20
  /**
20
21
  * Returns an iterator over all saved proving jobs
@@ -8,7 +8,7 @@ import {
8
8
  type ObservableResult,
9
9
  type TelemetryClient,
10
10
  type UpDownCounter,
11
- ValueType,
11
+ createUpDownCounterWithDefault,
12
12
  } from '@aztec/telemetry-client';
13
13
 
14
14
  export type MonitorCallback = (proofType: ProvingRequestType) => number;
@@ -28,49 +28,28 @@ export class ProvingBrokerInstrumentation {
28
28
  constructor(client: TelemetryClient, name = 'ProvingBroker') {
29
29
  const meter = client.getMeter(name);
30
30
 
31
- this.queueSize = meter.createObservableGauge(Metrics.PROVING_QUEUE_SIZE, {
32
- valueType: ValueType.INT,
33
- });
31
+ this.queueSize = meter.createObservableGauge(Metrics.PROVING_QUEUE_SIZE);
34
32
 
35
- this.activeJobs = meter.createObservableGauge(Metrics.PROVING_QUEUE_ACTIVE_JOBS, {
36
- valueType: ValueType.INT,
37
- });
33
+ this.activeJobs = meter.createObservableGauge(Metrics.PROVING_QUEUE_ACTIVE_JOBS);
38
34
 
39
- this.resolvedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_RESOLVED_JOBS, {
40
- valueType: ValueType.INT,
41
- });
35
+ const provingJobTypes = Object.values(ProvingRequestType).filter(v => typeof v === 'string');
36
+ const provingJobAttrs = { [Attributes.PROVING_JOB_TYPE]: provingJobTypes };
42
37
 
43
- this.rejectedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_REJECTED_JOBS, {
44
- valueType: ValueType.INT,
45
- });
38
+ this.resolvedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_RESOLVED_JOBS, provingJobAttrs);
46
39
 
47
- this.retriedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_RETRIED_JOBS, {
48
- valueType: ValueType.INT,
49
- });
40
+ this.rejectedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_REJECTED_JOBS, provingJobAttrs);
50
41
 
51
- this.timedOutJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_TIMED_OUT_JOBS, {
52
- valueType: ValueType.INT,
53
- });
42
+ this.retriedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_RETRIED_JOBS, provingJobAttrs);
54
43
 
55
- this.cachedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_CACHED_JOBS, {
56
- valueType: ValueType.INT,
57
- });
44
+ this.timedOutJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_TIMED_OUT_JOBS, provingJobAttrs);
58
45
 
59
- this.totalJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_TOTAL_JOBS, {
60
- valueType: ValueType.INT,
61
- });
46
+ this.cachedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_CACHED_JOBS, provingJobAttrs);
62
47
 
63
- this.jobWait = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_WAIT, {
64
- description: 'Records how long a job sits in the queue',
65
- unit: 'ms',
66
- valueType: ValueType.INT,
67
- });
48
+ this.totalJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_TOTAL_JOBS, provingJobAttrs);
68
49
 
69
- this.jobDuration = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_DURATION, {
70
- description: 'Records how long a job takes to complete',
71
- unit: 'ms',
72
- valueType: ValueType.INT,
73
- });
50
+ this.jobWait = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_WAIT);
51
+
52
+ this.jobDuration = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_DURATION);
74
53
  }
75
54
 
76
55
  monitorQueueDepth(fn: MonitorCallback) {
@@ -1,4 +1,7 @@
1
- import { createLogger } from '@aztec/foundation/log';
1
+ import { EpochNumber } from '@aztec/foundation/branded-types';
2
+ import { randomBytes } from '@aztec/foundation/crypto/random';
3
+ import { AbortError } from '@aztec/foundation/error';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
2
5
  import type {
3
6
  ProvingJobId,
4
7
  ProvingJobInputs,
@@ -9,38 +12,35 @@ import { ProvingRequestType } from '@aztec/stdlib/proofs';
9
12
 
10
13
  export enum ProvingJobControllerStatus {
11
14
  IDLE = 'idle',
12
- PROVING = 'proving',
15
+ RUNNING = 'running',
13
16
  DONE = 'done',
14
- ABORTED = 'aborted',
15
- }
16
-
17
- interface ProvingJobCompletionCallback<T extends ProvingRequestType = ProvingRequestType> {
18
- (
19
- jobId: ProvingJobId,
20
- type: T,
21
- error: Error | undefined,
22
- result: ProvingJobResultsMap[T] | undefined,
23
- ): void | Promise<void>;
24
17
  }
25
18
 
26
19
  export class ProvingJobController {
27
20
  private status: ProvingJobControllerStatus = ProvingJobControllerStatus.IDLE;
28
21
  private promise?: Promise<void>;
29
22
  private abortController = new AbortController();
23
+ private result?: ProvingJobResultsMap[ProvingRequestType] | Error;
24
+ private log: Logger;
30
25
 
31
26
  constructor(
32
27
  private jobId: ProvingJobId,
33
28
  private inputs: ProvingJobInputs,
34
- private epochNumber: number,
29
+ private epochNumber: EpochNumber,
35
30
  private startedAt: number,
36
31
  private circuitProver: ServerCircuitProver,
37
- private onComplete: ProvingJobCompletionCallback,
38
- private log = createLogger('prover-client:proving-agent:job-controller'),
39
- ) {}
32
+ private onComplete: () => void,
33
+ bindings?: LoggerBindings,
34
+ ) {
35
+ this.log = createLogger('prover-client:proving-agent:job-controller', {
36
+ instanceId: randomBytes(4).toString('hex'),
37
+ ...bindings,
38
+ });
39
+ }
40
40
 
41
41
  public start(): void {
42
42
  if (this.status !== ProvingJobControllerStatus.IDLE) {
43
- this.log.verbose(
43
+ this.log.warn(
44
44
  `Job controller for jobId=${this.jobId} not starting because it is not idle currentStatus=${this.status}`,
45
45
  {
46
46
  currentStatus: this.status,
@@ -50,63 +50,23 @@ export class ProvingJobController {
50
50
  return;
51
51
  }
52
52
 
53
- this.status = ProvingJobControllerStatus.PROVING;
54
- this.log.verbose(`Job controller started jobId=${this.jobId}`, {
53
+ this.promise = this.run();
54
+
55
+ this.log.info(`Job controller started jobId=${this.jobId}`, {
55
56
  jobId: this.jobId,
56
57
  });
57
-
58
- this.promise = this.generateProof()
59
- .then(
60
- result => {
61
- if (this.status === ProvingJobControllerStatus.ABORTED) {
62
- this.log.warn(`Job controller for jobId=${this.jobId} completed successfully but job was aborted`, {
63
- currentStatus: this.status,
64
- jobId: this.jobId,
65
- });
66
- return;
67
- }
68
- this.status = ProvingJobControllerStatus.DONE;
69
- this.log.verbose(`Job controller for jobId=${this.jobId} completed successfully`, {
70
- jobId: this.jobId,
71
- });
72
- return this.onComplete(this.jobId, this.inputs.type, undefined, result);
73
- },
74
- error => {
75
- if (this.status === ProvingJobControllerStatus.ABORTED) {
76
- this.log.warn(`Job controller for jobId=${this.jobId} finished with an error but job was aborted`, {
77
- currentStatus: this.status,
78
- jobId: this.jobId,
79
- });
80
- return;
81
- }
82
-
83
- if (error.name === 'AbortError') {
84
- // Ignore abort errors
85
- return;
86
- }
87
-
88
- this.log.verbose(`Job controller for jobId=${this.jobId} finished with an error`, {
89
- jobId: this.jobId,
90
- err: error,
91
- });
92
-
93
- this.status = ProvingJobControllerStatus.DONE;
94
- return this.onComplete(this.jobId, this.inputs.type, error, undefined);
95
- },
96
- )
97
- .catch(err => {
98
- this.log.error(`Job constroller failed to send result for jobId=${this.jobId}: ${err}`, err, {
99
- jobId: this.jobId,
100
- });
101
- });
102
58
  }
103
59
 
104
60
  public getStatus(): ProvingJobControllerStatus {
105
61
  return this.status;
106
62
  }
107
63
 
64
+ public getResult(): ProvingJobResultsMap[ProvingRequestType] | Error | undefined {
65
+ return this.result;
66
+ }
67
+
108
68
  public abort(): void {
109
- if (this.status !== ProvingJobControllerStatus.PROVING) {
69
+ if (this.status !== ProvingJobControllerStatus.RUNNING) {
110
70
  this.log.warn(`Tried to abort job controller for jobId=${this.jobId} but it is not running`, {
111
71
  currentStatus: this.status,
112
72
  jobId: this.jobId,
@@ -114,9 +74,8 @@ export class ProvingJobController {
114
74
  return;
115
75
  }
116
76
 
117
- this.status = ProvingJobControllerStatus.ABORTED;
118
77
  this.abortController.abort();
119
- this.log.verbose(`Aborted job controller for jobId=${this.jobId}`, {
78
+ this.log.warn(`Aborted job controller for jobId=${this.jobId}`, {
120
79
  jobId: this.jobId,
121
80
  });
122
81
  }
@@ -125,6 +84,10 @@ export class ProvingJobController {
125
84
  return this.jobId;
126
85
  }
127
86
 
87
+ public getProofType(): ProvingRequestType {
88
+ return this.inputs.type;
89
+ }
90
+
128
91
  public getStartedAt(): number {
129
92
  return this.startedAt;
130
93
  }
@@ -133,6 +96,36 @@ export class ProvingJobController {
133
96
  return ProvingRequestType[this.inputs.type];
134
97
  }
135
98
 
99
+ private run = async () => {
100
+ this.status = ProvingJobControllerStatus.RUNNING;
101
+ let result: ProvingJobResultsMap[ProvingRequestType] | Error;
102
+ try {
103
+ result = await this.generateProof();
104
+ } catch (err) {
105
+ if (err && err instanceof Error) {
106
+ result = err;
107
+ } else {
108
+ result = new Error('Unknown proving error: ' + String(err), { cause: err });
109
+ }
110
+ }
111
+
112
+ if (this.abortController.signal.aborted) {
113
+ this.log.warn(`Job controller for jobId=${this.jobId} completed but job was aborted`, {
114
+ currentStatus: this.status,
115
+ jobId: this.jobId,
116
+ });
117
+ result = new AbortError('Proof was aborted');
118
+ }
119
+
120
+ this.result = result;
121
+ this.status = ProvingJobControllerStatus.DONE;
122
+ try {
123
+ this.onComplete();
124
+ } catch (err) {
125
+ this.log.warn(`On complete handler error: ${err}`, { jobId: this.jobId });
126
+ }
127
+ };
128
+
136
129
  private async generateProof(): Promise<ProvingJobResultsMap[ProvingRequestType]> {
137
130
  const { type, inputs } = this.inputs;
138
131
  const signal = this.abortController.signal;
@@ -141,50 +134,74 @@ export class ProvingJobController {
141
134
  return await this.circuitProver.getAvmProof(inputs, signal, this.epochNumber);
142
135
  }
143
136
 
144
- case ProvingRequestType.PRIVATE_BASE_ROLLUP: {
145
- return await this.circuitProver.getPrivateBaseRollupProof(inputs, signal, this.epochNumber);
137
+ case ProvingRequestType.PUBLIC_CHONK_VERIFIER: {
138
+ return await this.circuitProver.getPublicChonkVerifierProof(inputs, signal, this.epochNumber);
139
+ }
140
+
141
+ case ProvingRequestType.PRIVATE_TX_BASE_ROLLUP: {
142
+ return await this.circuitProver.getPrivateTxBaseRollupProof(inputs, signal, this.epochNumber);
143
+ }
144
+
145
+ case ProvingRequestType.PUBLIC_TX_BASE_ROLLUP: {
146
+ return await this.circuitProver.getPublicTxBaseRollupProof(inputs, signal, this.epochNumber);
147
+ }
148
+
149
+ case ProvingRequestType.TX_MERGE_ROLLUP: {
150
+ return await this.circuitProver.getTxMergeRollupProof(inputs, signal, this.epochNumber);
146
151
  }
147
152
 
148
- case ProvingRequestType.PUBLIC_BASE_ROLLUP: {
149
- return await this.circuitProver.getPublicBaseRollupProof(inputs, signal, this.epochNumber);
153
+ case ProvingRequestType.BLOCK_ROOT_FIRST_ROLLUP: {
154
+ return await this.circuitProver.getBlockRootFirstRollupProof(inputs, signal, this.epochNumber);
150
155
  }
151
156
 
152
- case ProvingRequestType.MERGE_ROLLUP: {
153
- return await this.circuitProver.getMergeRollupProof(inputs, signal, this.epochNumber);
157
+ case ProvingRequestType.BLOCK_ROOT_SINGLE_TX_FIRST_ROLLUP: {
158
+ return await this.circuitProver.getBlockRootSingleTxFirstRollupProof(inputs, signal, this.epochNumber);
154
159
  }
155
160
 
156
- case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: {
157
- return await this.circuitProver.getEmptyBlockRootRollupProof(inputs, signal, this.epochNumber);
161
+ case ProvingRequestType.BLOCK_ROOT_EMPTY_TX_FIRST_ROLLUP: {
162
+ return await this.circuitProver.getBlockRootEmptyTxFirstRollupProof(inputs, signal, this.epochNumber);
158
163
  }
159
164
 
160
165
  case ProvingRequestType.BLOCK_ROOT_ROLLUP: {
161
166
  return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber);
162
167
  }
163
168
 
164
- case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP: {
165
- return await this.circuitProver.getSingleTxBlockRootRollupProof(inputs, signal, this.epochNumber);
169
+ case ProvingRequestType.BLOCK_ROOT_SINGLE_TX_ROLLUP: {
170
+ return await this.circuitProver.getBlockRootSingleTxRollupProof(inputs, signal, this.epochNumber);
166
171
  }
167
172
 
168
173
  case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
169
174
  return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber);
170
175
  }
171
176
 
177
+ case ProvingRequestType.CHECKPOINT_ROOT_ROLLUP: {
178
+ return await this.circuitProver.getCheckpointRootRollupProof(inputs, signal, this.epochNumber);
179
+ }
180
+
181
+ case ProvingRequestType.CHECKPOINT_ROOT_SINGLE_BLOCK_ROLLUP: {
182
+ return await this.circuitProver.getCheckpointRootSingleBlockRollupProof(inputs, signal, this.epochNumber);
183
+ }
184
+
185
+ case ProvingRequestType.CHECKPOINT_PADDING_ROLLUP: {
186
+ return await this.circuitProver.getCheckpointPaddingRollupProof(inputs, signal, this.epochNumber);
187
+ }
188
+
189
+ case ProvingRequestType.CHECKPOINT_MERGE_ROLLUP: {
190
+ return await this.circuitProver.getCheckpointMergeRollupProof(inputs, signal, this.epochNumber);
191
+ }
192
+
172
193
  case ProvingRequestType.ROOT_ROLLUP: {
173
194
  return await this.circuitProver.getRootRollupProof(inputs, signal, this.epochNumber);
174
195
  }
175
196
 
176
- case ProvingRequestType.BASE_PARITY: {
197
+ case ProvingRequestType.PARITY_BASE: {
177
198
  return await this.circuitProver.getBaseParityProof(inputs, signal, this.epochNumber);
178
199
  }
179
200
 
180
- case ProvingRequestType.ROOT_PARITY: {
201
+ case ProvingRequestType.PARITY_ROOT: {
181
202
  return await this.circuitProver.getRootParityProof(inputs, signal, this.epochNumber);
182
203
  }
183
204
 
184
- case ProvingRequestType.TUBE_PROOF: {
185
- return await this.circuitProver.getTubeProof(inputs, signal, this.epochNumber);
186
- }
187
-
188
205
  default: {
189
206
  const _exhaustive: never = type;
190
207
  return Promise.reject(new Error(`Invalid proof request type: ${type}`));
@@ -1,10 +1,11 @@
1
+ import { EpochNumberSchema } from '@aztec/foundation/branded-types';
1
2
  import { createSafeJsonRpcClient } from '@aztec/foundation/json-rpc/client';
2
- import type { SafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
3
3
  import {
4
4
  type GetProvingJobResponse,
5
5
  ProofUri,
6
6
  ProvingJob,
7
7
  type ProvingJobBroker,
8
+ type ProvingJobBrokerDebug,
8
9
  type ProvingJobConsumer,
9
10
  ProvingJobId,
10
11
  type ProvingJobProducer,
@@ -13,7 +14,7 @@ import {
13
14
  import { ProvingRequestType } from '@aztec/stdlib/proofs';
14
15
  import { type ApiSchemaFor, optional } from '@aztec/stdlib/schemas';
15
16
  import { type ComponentsVersions, getVersioningResponseHandler } from '@aztec/stdlib/versioning';
16
- import { createTracedJsonRpcServer, makeTracedFetch } from '@aztec/telemetry-client';
17
+ import { makeTracedFetch } from '@aztec/telemetry-client';
17
18
 
18
19
  import { z } from 'zod';
19
20
 
@@ -54,9 +55,17 @@ export const ProvingJobBrokerSchema: ApiSchemaFor<ProvingJobBroker> = {
54
55
  ...ProvingJobProducerSchema,
55
56
  };
56
57
 
57
- export function createProvingBrokerServer(broker: ProvingJobBroker): SafeJsonRpcServer {
58
- return createTracedJsonRpcServer(broker, ProvingJobBrokerSchema);
59
- }
58
+ export const ProvingJobBrokerDebugSchema: ApiSchemaFor<ProvingJobBrokerDebug> = {
59
+ replayProvingJob: z
60
+ .function()
61
+ .args(ProvingJobId, z.nativeEnum(ProvingRequestType), EpochNumberSchema, ProofUri)
62
+ .returns(ProvingJobStatus),
63
+ };
64
+
65
+ export const ProvingJobBrokerSchemaWithDebug: ApiSchemaFor<ProvingJobBroker & ProvingJobBrokerDebug> = {
66
+ ...ProvingJobBrokerSchema,
67
+ ...ProvingJobBrokerDebugSchema,
68
+ };
60
69
 
61
70
  export function createProvingJobBrokerClient(
62
71
  url: string,
@@ -0,0 +1,14 @@
1
+ import type { ProvingJobId } from '@aztec/stdlib/interfaces/server';
2
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
3
+
4
+ // Mock ProofStore for faster benchmarks with realistic Cloud Storage URIs
5
+ export class MockProofStore {
6
+ private mockCounter = 0;
7
+ private readonly bucketName = 'aztec-proving-benchmarks';
8
+ private readonly basePath = 'proving-jobs';
9
+
10
+ saveProofInput(jobId: ProvingJobId, type: ProvingRequestType): Promise<string> {
11
+ const uri = `gs://${this.bucketName}/${this.basePath}/inputs/${type}/${jobId}`;
12
+ return Promise.resolve(uri as any);
13
+ }
14
+ }