@aztec/prover-client 0.0.1-fake-ceab37513c → 0.0.6-commit.a2d1860fe9

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 (148) hide show
  1. package/dest/config.d.ts +2 -2
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +2 -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 +48 -0
  9. package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
  10. package/dest/light/lightweight_checkpoint_builder.js +202 -0
  11. package/dest/mocks/fixtures.d.ts +5 -5
  12. package/dest/mocks/fixtures.d.ts.map +1 -1
  13. package/dest/mocks/fixtures.js +35 -16
  14. package/dest/mocks/test_context.d.ts +39 -33
  15. package/dest/mocks/test_context.d.ts.map +1 -1
  16. package/dest/mocks/test_context.js +141 -82
  17. package/dest/orchestrator/block-building-helpers.d.ts +34 -34
  18. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  19. package/dest/orchestrator/block-building-helpers.js +151 -187
  20. package/dest/orchestrator/block-proving-state.d.ts +71 -55
  21. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  22. package/dest/orchestrator/block-proving-state.js +280 -185
  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 +40 -32
  27. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  28. package/dest/orchestrator/epoch-proving-state.js +165 -85
  29. package/dest/orchestrator/index.d.ts +1 -1
  30. package/dest/orchestrator/orchestrator.d.ts +51 -35
  31. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  32. package/dest/orchestrator/orchestrator.js +847 -329
  33. package/dest/orchestrator/orchestrator_metrics.d.ts +1 -3
  34. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  35. package/dest/orchestrator/orchestrator_metrics.js +2 -15
  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 -33
  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 +5 -5
  43. package/dest/prover-client/prover-client.d.ts.map +1 -1
  44. package/dest/prover-client/prover-client.js +15 -10
  45. package/dest/prover-client/server-epoch-prover.d.ts +13 -11
  46. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  47. package/dest/prover-client/server-epoch-prover.js +9 -9
  48. package/dest/proving_broker/broker_prover_facade.d.ts +28 -21
  49. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  50. package/dest/proving_broker/broker_prover_facade.js +45 -36
  51. package/dest/proving_broker/config.d.ts +24 -8
  52. package/dest/proving_broker/config.d.ts.map +1 -1
  53. package/dest/proving_broker/config.js +26 -3
  54. package/dest/proving_broker/factory.d.ts +1 -1
  55. package/dest/proving_broker/fixtures.d.ts +3 -2
  56. package/dest/proving_broker/fixtures.d.ts.map +1 -1
  57. package/dest/proving_broker/fixtures.js +3 -2
  58. package/dest/proving_broker/index.d.ts +1 -1
  59. package/dest/proving_broker/proof_store/factory.d.ts +2 -5
  60. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -1
  61. package/dest/proving_broker/proof_store/factory.js +7 -30
  62. package/dest/proving_broker/proof_store/file_store_proof_store.d.ts +18 -0
  63. package/dest/proving_broker/proof_store/file_store_proof_store.d.ts.map +1 -0
  64. package/dest/proving_broker/proof_store/file_store_proof_store.js +60 -0
  65. package/dest/proving_broker/proof_store/index.d.ts +2 -1
  66. package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
  67. package/dest/proving_broker/proof_store/index.js +1 -0
  68. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
  69. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
  70. package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
  71. package/dest/proving_broker/proving_agent.d.ts +5 -9
  72. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  73. package/dest/proving_broker/proving_agent.js +4 -19
  74. package/dest/proving_broker/proving_broker.d.ts +7 -4
  75. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  76. package/dest/proving_broker/proving_broker.js +64 -30
  77. package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
  78. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
  79. package/dest/proving_broker/proving_broker_database/persisted.d.ts +5 -3
  80. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  81. package/dest/proving_broker/proving_broker_database/persisted.js +392 -3
  82. package/dest/proving_broker/proving_broker_database.d.ts +3 -2
  83. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
  84. package/dest/proving_broker/proving_broker_instrumentation.d.ts +1 -1
  85. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
  86. package/dest/proving_broker/proving_broker_instrumentation.js +15 -35
  87. package/dest/proving_broker/proving_job_controller.d.ts +5 -3
  88. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  89. package/dest/proving_broker/proving_job_controller.js +46 -24
  90. package/dest/proving_broker/rpc.d.ts +7 -5
  91. package/dest/proving_broker/rpc.d.ts.map +1 -1
  92. package/dest/proving_broker/rpc.js +8 -0
  93. package/dest/test/mock_proof_store.d.ts +1 -1
  94. package/dest/test/mock_proof_store.d.ts.map +1 -1
  95. package/dest/test/mock_prover.d.ts +23 -19
  96. package/dest/test/mock_prover.d.ts.map +1 -1
  97. package/dest/test/mock_prover.js +38 -23
  98. package/package.json +21 -20
  99. package/src/config.ts +2 -2
  100. package/src/light/index.ts +1 -0
  101. package/src/light/lightweight_checkpoint_builder.ts +294 -0
  102. package/src/mocks/fixtures.ts +43 -37
  103. package/src/mocks/test_context.ts +201 -114
  104. package/src/orchestrator/block-building-helpers.ts +233 -313
  105. package/src/orchestrator/block-proving-state.ts +324 -247
  106. package/src/orchestrator/checkpoint-proving-state.ts +349 -0
  107. package/src/orchestrator/epoch-proving-state.ts +229 -132
  108. package/src/orchestrator/orchestrator.ts +630 -385
  109. package/src/orchestrator/orchestrator_metrics.ts +2 -25
  110. package/src/orchestrator/tx-proving-state.ts +49 -60
  111. package/src/prover-client/factory.ts +6 -2
  112. package/src/prover-client/prover-client.ts +31 -23
  113. package/src/prover-client/server-epoch-prover.ts +30 -21
  114. package/src/proving_broker/broker_prover_facade.ts +183 -118
  115. package/src/proving_broker/config.ts +30 -1
  116. package/src/proving_broker/fixtures.ts +8 -3
  117. package/src/proving_broker/proof_store/factory.ts +10 -32
  118. package/src/proving_broker/proof_store/file_store_proof_store.ts +78 -0
  119. package/src/proving_broker/proof_store/index.ts +1 -0
  120. package/src/proving_broker/proving_agent.ts +6 -19
  121. package/src/proving_broker/proving_broker.ts +72 -28
  122. package/src/proving_broker/proving_broker_database/memory.ts +2 -1
  123. package/src/proving_broker/proving_broker_database/persisted.ts +20 -5
  124. package/src/proving_broker/proving_broker_database.ts +2 -1
  125. package/src/proving_broker/proving_broker_instrumentation.ts +14 -35
  126. package/src/proving_broker/proving_job_controller.ts +51 -25
  127. package/src/proving_broker/rpc.ts +14 -0
  128. package/src/test/mock_prover.ts +144 -74
  129. package/dest/bin/get-proof-inputs.d.ts +0 -2
  130. package/dest/bin/get-proof-inputs.d.ts.map +0 -1
  131. package/dest/bin/get-proof-inputs.js +0 -51
  132. package/dest/block-factory/index.d.ts +0 -2
  133. package/dest/block-factory/index.d.ts.map +0 -1
  134. package/dest/block-factory/index.js +0 -1
  135. package/dest/block-factory/light.d.ts +0 -36
  136. package/dest/block-factory/light.d.ts.map +0 -1
  137. package/dest/block-factory/light.js +0 -87
  138. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +0 -14
  139. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +0 -1
  140. package/dest/proving_broker/proof_store/gcs_proof_store.js +0 -52
  141. package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
  142. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
  143. package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
  144. package/src/bin/get-proof-inputs.ts +0 -59
  145. package/src/block-factory/index.ts +0 -1
  146. package/src/block-factory/light.ts +0 -114
  147. package/src/proving_broker/proof_store/gcs_proof_store.ts +0 -76
  148. package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
@@ -1,5 +1,5 @@
1
1
  import { AbortError } from '@aztec/foundation/error';
2
- import { createLogger } from '@aztec/foundation/log';
2
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
3
  import { RunningPromise } from '@aztec/foundation/running-promise';
4
4
  import { truncate } from '@aztec/foundation/string';
5
5
  import { ProvingError } from '@aztec/stdlib/errors';
@@ -13,27 +13,17 @@ import type {
13
13
  ServerCircuitProver,
14
14
  } from '@aztec/stdlib/interfaces/server';
15
15
  import { ProvingRequestType } from '@aztec/stdlib/proofs';
16
- import {
17
- type TelemetryClient,
18
- type Traceable,
19
- type Tracer,
20
- getTelemetryClient,
21
- trackSpan,
22
- } from '@aztec/telemetry-client';
23
16
 
24
17
  import type { ProofStore } from './proof_store/index.js';
25
- import { ProvingAgentInstrumentation } from './proving_agent_instrumentation.js';
26
18
  import { ProvingJobController, ProvingJobControllerStatus } from './proving_job_controller.js';
27
19
 
28
20
  /**
29
21
  * A helper class that encapsulates a circuit prover and connects it to a job source.
30
22
  */
31
- export class ProvingAgent implements Traceable {
23
+ export class ProvingAgent {
32
24
  private currentJobController?: ProvingJobController;
33
25
  private runningPromise: RunningPromise;
34
- private instrumentation: ProvingAgentInstrumentation;
35
-
36
- public readonly tracer: Tracer;
26
+ private log: Logger;
37
27
 
38
28
  constructor(
39
29
  /** The source of proving jobs */
@@ -46,12 +36,9 @@ export class ProvingAgent implements Traceable {
46
36
  private proofAllowList: Array<ProvingRequestType> = [],
47
37
  /** How long to wait between jobs */
48
38
  private pollIntervalMs = 1000,
49
- /** A telemetry client through which to emit metrics */
50
- client: TelemetryClient = getTelemetryClient(),
51
- private log = createLogger('prover-client:proving-agent'),
39
+ bindings?: LoggerBindings,
52
40
  ) {
53
- this.tracer = client.getTracer('ProvingAgent');
54
- this.instrumentation = new ProvingAgentInstrumentation(client);
41
+ this.log = createLogger('prover-client:proving-agent', bindings);
55
42
  this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.pollIntervalMs);
56
43
  }
57
44
 
@@ -85,7 +72,6 @@ export class ProvingAgent implements Traceable {
85
72
  return this.runningPromise.isRunning() ? { status: 'running' } : { status: 'stopped' };
86
73
  }
87
74
 
88
- @trackSpan('ProvingAgent.safeWork')
89
75
  private async work() {
90
76
  // every tick we need to take one of the following actions:
91
77
  // 1. send a hearbeat to the broker that we're working on some job
@@ -175,6 +161,7 @@ export class ProvingAgent implements Traceable {
175
161
  // no need to await this here. The controller will stay alive (in DONE state) until the result is send to the broker
176
162
  void this.runningPromise.trigger();
177
163
  },
164
+ this.log.getBindings(),
178
165
  );
179
166
 
180
167
  if (abortedProofJobId) {
@@ -1,3 +1,4 @@
1
+ import { EpochNumber } from '@aztec/foundation/branded-types';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
  import { type PromiseWithResolvers, RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
3
4
  import { PriorityMemoryQueue } from '@aztec/foundation/queue';
@@ -6,6 +7,7 @@ import {
6
7
  type GetProvingJobResponse,
7
8
  type ProofUri,
8
9
  type ProvingJob,
10
+ type ProvingJobBrokerDebug,
9
11
  type ProvingJobConsumer,
10
12
  type ProvingJobFilter,
11
13
  type ProvingJobId,
@@ -15,13 +17,7 @@ import {
15
17
  tryStop,
16
18
  } from '@aztec/stdlib/interfaces/server';
17
19
  import { ProvingRequestType } from '@aztec/stdlib/proofs';
18
- import {
19
- type TelemetryClient,
20
- type Traceable,
21
- type Tracer,
22
- getTelemetryClient,
23
- trackSpan,
24
- } from '@aztec/telemetry-client';
20
+ import { type TelemetryClient, type Traceable, type Tracer, getTelemetryClient } from '@aztec/telemetry-client';
25
21
 
26
22
  import assert from 'assert';
27
23
 
@@ -41,24 +37,36 @@ type EnqueuedProvingJob = Pick<ProvingJob, 'id' | 'epochNumber'>;
41
37
  * A broker that manages proof requests and distributes them to workers based on their priority.
42
38
  * It takes a backend that is responsible for storing and retrieving proof requests and results.
43
39
  */
44
- export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Traceable {
40
+ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, ProvingJobBrokerDebug, Traceable {
45
41
  private queues: ProvingQueues = {
46
42
  [ProvingRequestType.PUBLIC_VM]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
47
- [ProvingRequestType.TUBE_PROOF]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
43
+ [ProvingRequestType.PUBLIC_CHONK_VERIFIER]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
48
44
 
49
- [ProvingRequestType.PRIVATE_BASE_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
50
- [ProvingRequestType.PUBLIC_BASE_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
51
- [ProvingRequestType.MERGE_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
45
+ [ProvingRequestType.PRIVATE_TX_BASE_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
46
+ [ProvingRequestType.PUBLIC_TX_BASE_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
47
+ [ProvingRequestType.TX_MERGE_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
52
48
  [ProvingRequestType.ROOT_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
53
49
 
54
50
  [ProvingRequestType.BLOCK_MERGE_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
51
+ [ProvingRequestType.BLOCK_ROOT_FIRST_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
52
+ [ProvingRequestType.BLOCK_ROOT_SINGLE_TX_FIRST_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(
53
+ provingJobComparator,
54
+ ),
55
+ [ProvingRequestType.BLOCK_ROOT_EMPTY_TX_FIRST_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(
56
+ provingJobComparator,
57
+ ),
55
58
  [ProvingRequestType.BLOCK_ROOT_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
56
- [ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
57
- [ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
58
- [ProvingRequestType.PADDING_BLOCK_ROOT_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
59
+ [ProvingRequestType.BLOCK_ROOT_SINGLE_TX_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
60
+
61
+ [ProvingRequestType.CHECKPOINT_ROOT_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
62
+ [ProvingRequestType.CHECKPOINT_ROOT_SINGLE_BLOCK_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(
63
+ provingJobComparator,
64
+ ),
65
+ [ProvingRequestType.CHECKPOINT_MERGE_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
66
+ [ProvingRequestType.CHECKPOINT_PADDING_ROLLUP]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
59
67
 
60
- [ProvingRequestType.BASE_PARITY]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
61
- [ProvingRequestType.ROOT_PARITY]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
68
+ [ProvingRequestType.PARITY_BASE]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
69
+ [ProvingRequestType.PARITY_ROOT]: new PriorityMemoryQueue<EnqueuedProvingJob>(provingJobComparator),
62
70
  };
63
71
 
64
72
  // holds a copy of the database in memory in order to quickly fulfill requests
@@ -107,6 +115,8 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
107
115
 
108
116
  private started = false;
109
117
 
118
+ private debugReplayEnabled: boolean;
119
+
110
120
  public constructor(
111
121
  private database: ProvingBrokerDatabase,
112
122
  {
@@ -114,6 +124,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
114
124
  proverBrokerPollIntervalMs,
115
125
  proverBrokerJobMaxRetries,
116
126
  proverBrokerMaxEpochsToKeepResultsFor,
127
+ proverBrokerDebugReplayEnabled,
117
128
  }: Required<
118
129
  Pick<
119
130
  ProverBrokerConfig,
@@ -121,6 +132,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
121
132
  | 'proverBrokerPollIntervalMs'
122
133
  | 'proverBrokerJobMaxRetries'
123
134
  | 'proverBrokerMaxEpochsToKeepResultsFor'
135
+ | 'proverBrokerDebugReplayEnabled'
124
136
  >
125
137
  > = defaultProverBrokerConfig,
126
138
  client: TelemetryClient = getTelemetryClient(),
@@ -132,6 +144,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
132
144
  this.jobTimeoutMs = proverBrokerJobTimeoutMs!;
133
145
  this.maxRetries = proverBrokerJobMaxRetries!;
134
146
  this.maxEpochsToKeepResultsFor = proverBrokerMaxEpochsToKeepResultsFor!;
147
+ this.debugReplayEnabled = proverBrokerDebugReplayEnabled ?? false;
135
148
  }
136
149
 
137
150
  private measureQueueDepth: MonitorCallback = (type: ProvingRequestType) => {
@@ -234,6 +247,29 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
234
247
  return Promise.resolve(this.#reportProvingJobProgress(id, startedAt, filter));
235
248
  }
236
249
 
250
+ public async replayProvingJob(
251
+ jobId: ProvingJobId,
252
+ type: ProvingRequestType,
253
+ epochNumber: EpochNumber,
254
+ inputsUri: ProofUri,
255
+ ): Promise<ProvingJobStatus> {
256
+ if (!this.debugReplayEnabled) {
257
+ throw new Error('Debug replay not enabled. Set PROVER_BROKER_DEBUG_REPLAY_ENABLED=true');
258
+ }
259
+
260
+ this.logger.info(`Replaying proving job`, { provingJobId: jobId, epochNumber, inputsUri });
261
+
262
+ // Clear existing state and enqueue
263
+ this.cleanUpProvingJobState([jobId]);
264
+
265
+ const job: ProvingJob = { id: jobId, type, epochNumber, inputsUri };
266
+ this.jobsCache.set(jobId, job);
267
+ await this.database.addProvingJob(job);
268
+ this.enqueueJobInternal(job);
269
+
270
+ return { status: 'in-queue' };
271
+ }
272
+
237
273
  async #enqueueProvingJob(job: ProvingJob): Promise<ProvingJobStatus> {
238
274
  // We return the job status at the start of this call
239
275
  const jobStatus = this.#getProvingJobStatus(job.id);
@@ -289,6 +325,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
289
325
  this.resultsCache.delete(id);
290
326
  this.inProgress.delete(id);
291
327
  this.retries.delete(id);
328
+ this.enqueuedAt.delete(id);
292
329
  }
293
330
  }
294
331
 
@@ -341,6 +378,8 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
341
378
  const enqueuedAt = this.enqueuedAt.get(job.id);
342
379
  if (enqueuedAt) {
343
380
  this.instrumentation.recordJobWait(job.type, enqueuedAt);
381
+ // we can clear this flag now.
382
+ this.enqueuedAt.delete(job.id);
344
383
  }
345
384
 
346
385
  return { job, time };
@@ -549,13 +588,12 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
549
588
  return this.#getProvingJob(filter);
550
589
  }
551
590
 
552
- @trackSpan('ProvingBroker.cleanupPass')
553
591
  private async cleanupPass() {
554
592
  this.cleanupStaleJobs();
555
593
  this.reEnqueueExpiredJobs();
556
594
  const oldestEpochToKeep = this.oldestEpochToKeep();
557
595
  if (oldestEpochToKeep > 0) {
558
- await this.database.deleteAllProvingJobsOlderThanEpoch(oldestEpochToKeep);
596
+ await this.database.deleteAllProvingJobsOlderThanEpoch(EpochNumber(oldestEpochToKeep));
559
597
  this.logger.trace(`Deleted all epochs older than ${oldestEpochToKeep}`);
560
598
  }
561
599
  }
@@ -673,16 +711,22 @@ function proofTypeComparator(a: ProvingRequestType, b: ProvingRequestType): -1 |
673
711
  * is to get picked up by agents
674
712
  */
675
713
  export const PROOF_TYPES_IN_PRIORITY_ORDER: ProvingRequestType[] = [
714
+ ProvingRequestType.ROOT_ROLLUP,
715
+ ProvingRequestType.BLOCK_ROOT_FIRST_ROLLUP,
716
+ ProvingRequestType.BLOCK_ROOT_SINGLE_TX_FIRST_ROLLUP,
717
+ ProvingRequestType.BLOCK_ROOT_EMPTY_TX_FIRST_ROLLUP,
676
718
  ProvingRequestType.BLOCK_ROOT_ROLLUP,
677
- ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP,
719
+ ProvingRequestType.BLOCK_ROOT_SINGLE_TX_ROLLUP,
678
720
  ProvingRequestType.BLOCK_MERGE_ROLLUP,
679
- ProvingRequestType.ROOT_ROLLUP,
680
- ProvingRequestType.MERGE_ROLLUP,
681
- ProvingRequestType.PUBLIC_BASE_ROLLUP,
682
- ProvingRequestType.PRIVATE_BASE_ROLLUP,
721
+ ProvingRequestType.CHECKPOINT_ROOT_ROLLUP,
722
+ ProvingRequestType.CHECKPOINT_ROOT_SINGLE_BLOCK_ROLLUP,
723
+ ProvingRequestType.CHECKPOINT_MERGE_ROLLUP,
724
+ ProvingRequestType.CHECKPOINT_PADDING_ROLLUP,
725
+ ProvingRequestType.TX_MERGE_ROLLUP,
726
+ ProvingRequestType.PUBLIC_TX_BASE_ROLLUP,
727
+ ProvingRequestType.PRIVATE_TX_BASE_ROLLUP,
683
728
  ProvingRequestType.PUBLIC_VM,
684
- ProvingRequestType.TUBE_PROOF,
685
- ProvingRequestType.ROOT_PARITY,
686
- ProvingRequestType.BASE_PARITY,
687
- ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP,
729
+ ProvingRequestType.PUBLIC_CHONK_VERIFIER,
730
+ ProvingRequestType.PARITY_ROOT,
731
+ ProvingRequestType.PARITY_BASE,
688
732
  ];
@@ -1,3 +1,4 @@
1
+ import { EpochNumber } from '@aztec/foundation/branded-types';
1
2
  import {
2
3
  type ProofUri,
3
4
  type ProvingJob,
@@ -43,7 +44,7 @@ export class InMemoryBrokerDatabase implements ProvingBrokerDatabase {
43
44
  return Promise.resolve();
44
45
  }
45
46
 
46
- deleteAllProvingJobsOlderThanEpoch(epochNumber: number): Promise<void> {
47
+ deleteAllProvingJobsOlderThanEpoch(epochNumber: EpochNumber): Promise<void> {
47
48
  const toDelete = [
48
49
  ...Array.from(this.jobs.keys()).filter(x => getEpochFromProvingJobId(x) < epochNumber),
49
50
  ...Array.from(this.results.keys()).filter(x => getEpochFromProvingJobId(x) < epochNumber),
@@ -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';
@@ -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,7 +116,7 @@ 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
 
@@ -164,8 +176,11 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
164
176
  }
165
177
  }
166
178
 
167
- async deleteAllProvingJobsOlderThanEpoch(epochNumber: number): Promise<void> {
168
- 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));
169
184
  for (const old of oldEpochs) {
170
185
  const db = this.epochs.get(old);
171
186
  if (!db) {
@@ -196,7 +211,7 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
196
211
  return this.batchQueue.put([id, { status: 'fulfilled', value }], getEpochFromProvingJobId(id));
197
212
  }
198
213
 
199
- private async getEpochDatabase(epochNumber: number): Promise<SingleEpochDatabase> {
214
+ private async getEpochDatabase(epochNumber: EpochNumber): Promise<SingleEpochDatabase> {
200
215
  let epochDb = this.epochs.get(epochNumber);
201
216
  if (!epochDb) {
202
217
  const newEpochDirectory = join(this.config.dataDirectory!, epochNumber.toString());
@@ -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,6 +1,7 @@
1
- import { randomBytes } from '@aztec/foundation/crypto';
1
+ import { EpochNumber } from '@aztec/foundation/branded-types';
2
+ import { randomBytes } from '@aztec/foundation/crypto/random';
2
3
  import { AbortError } from '@aztec/foundation/error';
3
- import { createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
4
5
  import type {
5
6
  ProvingJobId,
6
7
  ProvingJobInputs,
@@ -20,16 +21,22 @@ export class ProvingJobController {
20
21
  private promise?: Promise<void>;
21
22
  private abortController = new AbortController();
22
23
  private result?: ProvingJobResultsMap[ProvingRequestType] | Error;
24
+ private log: Logger;
23
25
 
24
26
  constructor(
25
27
  private jobId: ProvingJobId,
26
28
  private inputs: ProvingJobInputs,
27
- private epochNumber: number,
29
+ private epochNumber: EpochNumber,
28
30
  private startedAt: number,
29
31
  private circuitProver: ServerCircuitProver,
30
32
  private onComplete: () => void,
31
- private log = createLogger('prover-client:proving-agent:job-controller-' + randomBytes(4).toString('hex')),
32
- ) {}
33
+ bindings?: LoggerBindings,
34
+ ) {
35
+ this.log = createLogger('prover-client:proving-agent:job-controller', {
36
+ instanceId: randomBytes(4).toString('hex'),
37
+ ...bindings,
38
+ });
39
+ }
33
40
 
34
41
  public start(): void {
35
42
  if (this.status !== ProvingJobControllerStatus.IDLE) {
@@ -124,58 +131,77 @@ export class ProvingJobController {
124
131
  const signal = this.abortController.signal;
125
132
  switch (type) {
126
133
  case ProvingRequestType.PUBLIC_VM: {
127
- // TODO(#14234)[Unconditional PIs validation]: Remove argument "undefined".
128
- return await this.circuitProver.getAvmProof(inputs, undefined, signal, this.epochNumber);
134
+ return await this.circuitProver.getAvmProof(inputs, signal, this.epochNumber);
135
+ }
136
+
137
+ case ProvingRequestType.PUBLIC_CHONK_VERIFIER: {
138
+ return await this.circuitProver.getPublicChonkVerifierProof(inputs, signal, this.epochNumber);
129
139
  }
130
140
 
131
- case ProvingRequestType.PRIVATE_BASE_ROLLUP: {
132
- return await this.circuitProver.getPrivateBaseRollupProof(inputs, signal, this.epochNumber);
141
+ case ProvingRequestType.PRIVATE_TX_BASE_ROLLUP: {
142
+ return await this.circuitProver.getPrivateTxBaseRollupProof(inputs, signal, this.epochNumber);
133
143
  }
134
144
 
135
- case ProvingRequestType.PUBLIC_BASE_ROLLUP: {
136
- return await this.circuitProver.getPublicBaseRollupProof(inputs, signal, this.epochNumber);
145
+ case ProvingRequestType.PUBLIC_TX_BASE_ROLLUP: {
146
+ return await this.circuitProver.getPublicTxBaseRollupProof(inputs, signal, this.epochNumber);
137
147
  }
138
148
 
139
- case ProvingRequestType.MERGE_ROLLUP: {
140
- return await this.circuitProver.getMergeRollupProof(inputs, signal, this.epochNumber);
149
+ case ProvingRequestType.TX_MERGE_ROLLUP: {
150
+ return await this.circuitProver.getTxMergeRollupProof(inputs, signal, this.epochNumber);
141
151
  }
142
152
 
143
- case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: {
144
- return await this.circuitProver.getEmptyBlockRootRollupProof(inputs, signal, this.epochNumber);
153
+ case ProvingRequestType.BLOCK_ROOT_FIRST_ROLLUP: {
154
+ return await this.circuitProver.getBlockRootFirstRollupProof(inputs, signal, this.epochNumber);
145
155
  }
146
156
 
147
- case ProvingRequestType.PADDING_BLOCK_ROOT_ROLLUP: {
148
- return await this.circuitProver.getPaddingBlockRootRollupProof(inputs, signal, this.epochNumber);
157
+ case ProvingRequestType.BLOCK_ROOT_SINGLE_TX_FIRST_ROLLUP: {
158
+ return await this.circuitProver.getBlockRootSingleTxFirstRollupProof(inputs, signal, this.epochNumber);
159
+ }
160
+
161
+ case ProvingRequestType.BLOCK_ROOT_EMPTY_TX_FIRST_ROLLUP: {
162
+ return await this.circuitProver.getBlockRootEmptyTxFirstRollupProof(inputs, signal, this.epochNumber);
149
163
  }
150
164
 
151
165
  case ProvingRequestType.BLOCK_ROOT_ROLLUP: {
152
166
  return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber);
153
167
  }
154
168
 
155
- case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP: {
156
- 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);
157
171
  }
158
172
 
159
173
  case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
160
174
  return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber);
161
175
  }
162
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
+
163
193
  case ProvingRequestType.ROOT_ROLLUP: {
164
194
  return await this.circuitProver.getRootRollupProof(inputs, signal, this.epochNumber);
165
195
  }
166
196
 
167
- case ProvingRequestType.BASE_PARITY: {
197
+ case ProvingRequestType.PARITY_BASE: {
168
198
  return await this.circuitProver.getBaseParityProof(inputs, signal, this.epochNumber);
169
199
  }
170
200
 
171
- case ProvingRequestType.ROOT_PARITY: {
201
+ case ProvingRequestType.PARITY_ROOT: {
172
202
  return await this.circuitProver.getRootParityProof(inputs, signal, this.epochNumber);
173
203
  }
174
204
 
175
- case ProvingRequestType.TUBE_PROOF: {
176
- return await this.circuitProver.getTubeProof(inputs, signal, this.epochNumber);
177
- }
178
-
179
205
  default: {
180
206
  const _exhaustive: never = type;
181
207
  return Promise.reject(new Error(`Invalid proof request type: ${type}`));
@@ -1,9 +1,11 @@
1
+ import { EpochNumberSchema } from '@aztec/foundation/branded-types';
1
2
  import { createSafeJsonRpcClient } from '@aztec/foundation/json-rpc/client';
2
3
  import {
3
4
  type GetProvingJobResponse,
4
5
  ProofUri,
5
6
  ProvingJob,
6
7
  type ProvingJobBroker,
8
+ type ProvingJobBrokerDebug,
7
9
  type ProvingJobConsumer,
8
10
  ProvingJobId,
9
11
  type ProvingJobProducer,
@@ -53,6 +55,18 @@ export const ProvingJobBrokerSchema: ApiSchemaFor<ProvingJobBroker> = {
53
55
  ...ProvingJobProducerSchema,
54
56
  };
55
57
 
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
+ };
69
+
56
70
  export function createProvingJobBrokerClient(
57
71
  url: string,
58
72
  versions: Partial<ComponentsVersions>,