@aztec/prover-client 0.0.1-commit.9593d84 → 0.0.1-commit.96bb3f7

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 (99) hide show
  1. package/dest/block-factory/light.d.ts +3 -3
  2. package/dest/block-factory/light.d.ts.map +1 -1
  3. package/dest/block-factory/light.js +4 -6
  4. package/dest/config.d.ts +2 -2
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +1 -1
  7. package/dest/light/index.d.ts +2 -0
  8. package/dest/light/index.d.ts.map +1 -0
  9. package/dest/light/index.js +1 -0
  10. package/dest/light/lightweight_checkpoint_builder.d.ts +28 -13
  11. package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -1
  12. package/dest/light/lightweight_checkpoint_builder.js +94 -18
  13. package/dest/mocks/fixtures.js +4 -4
  14. package/dest/mocks/test_context.d.ts +3 -2
  15. package/dest/mocks/test_context.d.ts.map +1 -1
  16. package/dest/mocks/test_context.js +19 -10
  17. package/dest/orchestrator/block-building-helpers.d.ts +4 -4
  18. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  19. package/dest/orchestrator/block-building-helpers.js +4 -3
  20. package/dest/orchestrator/block-proving-state.d.ts +5 -4
  21. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  22. package/dest/orchestrator/block-proving-state.js +1 -1
  23. package/dest/orchestrator/checkpoint-proving-state.d.ts +6 -5
  24. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -1
  25. package/dest/orchestrator/checkpoint-proving-state.js +6 -4
  26. package/dest/orchestrator/epoch-proving-state.d.ts +5 -5
  27. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  28. package/dest/orchestrator/epoch-proving-state.js +1 -1
  29. package/dest/orchestrator/orchestrator.d.ts +7 -7
  30. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  31. package/dest/orchestrator/orchestrator.js +421 -60
  32. package/dest/orchestrator/orchestrator_metrics.d.ts +1 -3
  33. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  34. package/dest/orchestrator/orchestrator_metrics.js +2 -15
  35. package/dest/orchestrator/tx-proving-state.d.ts +6 -5
  36. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  37. package/dest/orchestrator/tx-proving-state.js +8 -8
  38. package/dest/prover-client/factory.d.ts +3 -3
  39. package/dest/prover-client/factory.d.ts.map +1 -1
  40. package/dest/prover-client/prover-client.d.ts +3 -3
  41. package/dest/prover-client/prover-client.d.ts.map +1 -1
  42. package/dest/prover-client/prover-client.js +1 -1
  43. package/dest/prover-client/server-epoch-prover.d.ts +5 -5
  44. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  45. package/dest/proving_broker/broker_prover_facade.d.ts +4 -3
  46. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  47. package/dest/proving_broker/broker_prover_facade.js +3 -10
  48. package/dest/proving_broker/config.d.ts +2 -2
  49. package/dest/proving_broker/config.d.ts.map +1 -1
  50. package/dest/proving_broker/config.js +1 -1
  51. package/dest/proving_broker/fixtures.js +1 -1
  52. package/dest/proving_broker/proving_agent.d.ts +3 -8
  53. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  54. package/dest/proving_broker/proving_agent.js +1 -16
  55. package/dest/proving_broker/proving_broker.d.ts +1 -1
  56. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  57. package/dest/proving_broker/proving_broker.js +4 -10
  58. package/dest/proving_broker/proving_broker_database/persisted.d.ts +3 -2
  59. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  60. package/dest/proving_broker/proving_broker_database/persisted.js +389 -1
  61. package/dest/proving_broker/proving_broker_instrumentation.d.ts +1 -1
  62. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
  63. package/dest/proving_broker/proving_broker_instrumentation.js +11 -35
  64. package/dest/proving_broker/proving_job_controller.d.ts +1 -1
  65. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  66. package/dest/proving_broker/proving_job_controller.js +2 -3
  67. package/dest/test/mock_prover.d.ts +2 -2
  68. package/dest/test/mock_prover.d.ts.map +1 -1
  69. package/dest/test/mock_prover.js +4 -4
  70. package/package.json +19 -17
  71. package/src/block-factory/light.ts +5 -6
  72. package/src/config.ts +1 -1
  73. package/src/light/index.ts +1 -0
  74. package/src/light/lightweight_checkpoint_builder.ts +133 -26
  75. package/src/mocks/fixtures.ts +4 -4
  76. package/src/mocks/test_context.ts +20 -10
  77. package/src/orchestrator/block-building-helpers.ts +4 -3
  78. package/src/orchestrator/block-proving-state.ts +3 -2
  79. package/src/orchestrator/checkpoint-proving-state.ts +9 -7
  80. package/src/orchestrator/epoch-proving-state.ts +8 -5
  81. package/src/orchestrator/orchestrator.ts +16 -40
  82. package/src/orchestrator/orchestrator_metrics.ts +2 -25
  83. package/src/orchestrator/tx-proving-state.ts +10 -14
  84. package/src/prover-client/factory.ts +6 -2
  85. package/src/prover-client/prover-client.ts +4 -11
  86. package/src/prover-client/server-epoch-prover.ts +4 -4
  87. package/src/proving_broker/broker_prover_facade.ts +4 -14
  88. package/src/proving_broker/config.ts +1 -1
  89. package/src/proving_broker/fixtures.ts +1 -1
  90. package/src/proving_broker/proving_agent.ts +1 -17
  91. package/src/proving_broker/proving_broker.ts +4 -8
  92. package/src/proving_broker/proving_broker_database/persisted.ts +15 -1
  93. package/src/proving_broker/proving_broker_instrumentation.ts +10 -35
  94. package/src/proving_broker/proving_job_controller.ts +2 -3
  95. package/src/test/mock_prover.ts +2 -14
  96. package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
  97. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
  98. package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
  99. package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
@@ -6,23 +6,23 @@ import {
6
6
  NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
7
7
  NUM_BASE_PARITY_PER_ROOT_PARITY,
8
8
  } from '@aztec/constants';
9
- import { EpochNumber } from '@aztec/foundation/branded-types';
9
+ import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
10
10
  import { padArrayEnd } from '@aztec/foundation/collection';
11
+ import { Fr } from '@aztec/foundation/curves/bn254';
11
12
  import { AbortError } from '@aztec/foundation/error';
12
- import { Fr } from '@aztec/foundation/fields';
13
13
  import { createLogger } from '@aztec/foundation/log';
14
14
  import { promiseWithResolvers } from '@aztec/foundation/promise';
15
15
  import { assertLength } from '@aztec/foundation/serialize';
16
16
  import { pushTestData } from '@aztec/foundation/testing';
17
17
  import { elapsed } from '@aztec/foundation/timer';
18
18
  import type { TreeNodeLocation } from '@aztec/foundation/trees';
19
- import { readAvmMinimalPublicTxInputsFromFile } from '@aztec/simulator/public/fixtures';
20
19
  import { EthAddress } from '@aztec/stdlib/block';
21
20
  import type {
22
21
  EpochProver,
23
22
  ForkMerkleTreeOperations,
24
23
  MerkleTreeWriteOperations,
25
24
  PublicInputsAndRecursiveProof,
25
+ ReadonlyWorldStateAccess,
26
26
  ServerCircuitProver,
27
27
  } from '@aztec/stdlib/interfaces/server';
28
28
  import type { Proof } from '@aztec/stdlib/proofs';
@@ -93,10 +93,11 @@ export class ProvingOrchestrator implements EpochProver {
93
93
 
94
94
  private provingPromise: Promise<ProvingResult> | undefined = undefined;
95
95
  private metrics: ProvingOrchestratorMetrics;
96
- private dbs: Map<number, MerkleTreeWriteOperations> = new Map();
96
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
97
+ private dbs: Map<BlockNumber, MerkleTreeWriteOperations> = new Map();
97
98
 
98
99
  constructor(
99
- private dbProvider: ForkMerkleTreeOperations,
100
+ private dbProvider: ReadonlyWorldStateAccess & ForkMerkleTreeOperations,
100
101
  private prover: ServerCircuitProver,
101
102
  private readonly proverId: EthAddress,
102
103
  telemetryClient: TelemetryClient = getTelemetryClient(),
@@ -161,7 +162,7 @@ export class ProvingOrchestrator implements EpochProver {
161
162
  const lastBlockNumber = headerOfLastBlockInPreviousCheckpoint.globalVariables.blockNumber;
162
163
  const db = await this.dbProvider.fork(lastBlockNumber);
163
164
 
164
- const firstBlockNumber = lastBlockNumber + 1;
165
+ const firstBlockNumber = BlockNumber(lastBlockNumber + 1);
165
166
  this.dbs.set(firstBlockNumber, db);
166
167
 
167
168
  // Get archive sibling path before any block in this checkpoint lands.
@@ -199,7 +200,7 @@ export class ProvingOrchestrator implements EpochProver {
199
200
  @trackSpan('ProvingOrchestrator.startNewBlock', blockNumber => ({
200
201
  [Attributes.BLOCK_NUMBER]: blockNumber,
201
202
  }))
202
- public async startNewBlock(blockNumber: number, timestamp: UInt64, totalNumTxs: number) {
203
+ public async startNewBlock(blockNumber: BlockNumber, timestamp: UInt64, totalNumTxs: number) {
203
204
  if (!this.provingState) {
204
205
  throw new Error('Empty epoch proving state. Call startNewEpoch before starting a block.');
205
206
  }
@@ -219,7 +220,7 @@ export class ProvingOrchestrator implements EpochProver {
219
220
  // Fork the db only when it's not already set. The db for the first block is set in `startNewCheckpoint`.
220
221
  if (!this.dbs.has(blockNumber)) {
221
222
  // Fork world state at the end of the immediately previous block
222
- const db = await this.dbProvider.fork(blockNumber - 1);
223
+ const db = await this.dbProvider.fork(BlockNumber(blockNumber - 1));
223
224
  this.dbs.set(blockNumber, db);
224
225
  }
225
226
  const db = this.dbs.get(blockNumber)!;
@@ -278,7 +279,7 @@ export class ProvingOrchestrator implements EpochProver {
278
279
  return;
279
280
  }
280
281
 
281
- const blockNumber = txs[0].globalVariables.blockNumber;
282
+ const blockNumber = BlockNumber(txs[0].globalVariables.blockNumber);
282
283
  const provingState = this.provingState.getBlockProvingStateByBlockNumber(blockNumber!);
283
284
  if (!provingState) {
284
285
  throw new Error(`Proving state for block ${blockNumber} not found. Call startNewBlock first.`);
@@ -309,7 +310,7 @@ export class ProvingOrchestrator implements EpochProver {
309
310
 
310
311
  validateTx(tx);
311
312
 
312
- logger.info(`Received transaction: ${tx.hash}`);
313
+ logger.debug(`Received transaction: ${tx.hash}`);
313
314
 
314
315
  const startSpongeBlob = spongeBlobState.clone();
315
316
  const [hints, treeSnapshots] = await this.prepareBaseRollupInputs(
@@ -388,10 +389,10 @@ export class ProvingOrchestrator implements EpochProver {
388
389
  * Marks the block as completed.
389
390
  * Computes the block header and updates the archive tree.
390
391
  */
391
- @trackSpan('ProvingOrchestrator.setBlockCompleted', (blockNumber: number) => ({
392
+ @trackSpan('ProvingOrchestrator.setBlockCompleted', (blockNumber: BlockNumber) => ({
392
393
  [Attributes.BLOCK_NUMBER]: blockNumber,
393
394
  }))
394
- public async setBlockCompleted(blockNumber: number, expectedHeader?: BlockHeader): Promise<BlockHeader> {
395
+ public async setBlockCompleted(blockNumber: BlockNumber, expectedHeader?: BlockHeader): Promise<BlockHeader> {
395
396
  const provingState = this.provingState?.getBlockProvingStateByBlockNumber(blockNumber);
396
397
  if (!provingState) {
397
398
  throw new Error(`Block proving state for ${blockNumber} not found`);
@@ -1206,8 +1207,6 @@ export class ProvingOrchestrator implements EpochProver {
1206
1207
 
1207
1208
  const txProvingState = provingState.getTxProvingState(txIndex);
1208
1209
 
1209
- // This function tries to do AVM proving. If there is a failure, it fakes the proof unless AVM_PROVING_STRICT is defined.
1210
- // Nothing downstream depends on the AVM proof yet. So having this mode lets us incrementally build the AVM circuit.
1211
1210
  const doAvmProving = wrapCallbackInSpan(
1212
1211
  this.tracer,
1213
1212
  'ProvingOrchestrator.prover.getAvmProof',
@@ -1216,36 +1215,13 @@ export class ProvingOrchestrator implements EpochProver {
1216
1215
  },
1217
1216
  async (signal: AbortSignal) => {
1218
1217
  const inputs = txProvingState.getAvmInputs();
1219
- try {
1220
- // TODO(#14234)[Unconditional PIs validation]: Remove the whole try-catch logic and
1221
- // just keep the next line but removing the second argument (false).
1222
- return await this.prover.getAvmProof(inputs, false, signal, provingState.epochNumber);
1223
- } catch (err) {
1224
- if (process.env.AVM_PROVING_STRICT) {
1225
- logger.error(`Error thrown when proving AVM circuit with AVM_PROVING_STRICT on`, err);
1226
- throw err;
1227
- } else {
1228
- logger.warn(
1229
- `Error thrown when proving AVM circuit but AVM_PROVING_STRICT is off. Use snapshotted
1230
- AVM inputs and carrying on. ${inspect(err)}.`,
1231
- );
1232
-
1233
- try {
1234
- this.metrics.incAvmFallback();
1235
- const snapshotAvmPrivateInputs = readAvmMinimalPublicTxInputsFromFile();
1236
- return await this.prover.getAvmProof(snapshotAvmPrivateInputs, true, signal, provingState.epochNumber);
1237
- } catch (err) {
1238
- logger.error(`Error thrown when proving snapshotted AVM inputs.`, err);
1239
- throw err;
1240
- }
1241
- }
1242
- }
1218
+ return await this.prover.getAvmProof(inputs, signal, provingState.epochNumber);
1243
1219
  },
1244
1220
  );
1245
1221
 
1246
- this.deferredProving(provingState, doAvmProving, proofAndVk => {
1222
+ this.deferredProving(provingState, doAvmProving, proof => {
1247
1223
  logger.debug(`Proven VM for tx index: ${txIndex}`);
1248
- txProvingState.setAvmProof(proofAndVk);
1224
+ txProvingState.setAvmProof(proof);
1249
1225
  this.checkAndEnqueueBaseRollup(provingState, txIndex);
1250
1226
  });
1251
1227
  }
@@ -1,41 +1,18 @@
1
- import {
2
- type Histogram,
3
- Metrics,
4
- type TelemetryClient,
5
- type Tracer,
6
- type UpDownCounter,
7
- ValueType,
8
- } from '@aztec/telemetry-client';
1
+ import { type Histogram, Metrics, type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
9
2
 
10
3
  export class ProvingOrchestratorMetrics {
11
4
  public readonly tracer: Tracer;
12
5
 
13
6
  private baseRollupInputsDuration: Histogram;
14
- private avmFallbackCount: UpDownCounter;
15
7
 
16
8
  constructor(client: TelemetryClient, name = 'ProvingOrchestrator') {
17
9
  this.tracer = client.getTracer(name);
18
10
  const meter = client.getMeter(name);
19
11
 
20
- this.baseRollupInputsDuration = meter.createHistogram(Metrics.PROVING_ORCHESTRATOR_BASE_ROLLUP_INPUTS_DURATION, {
21
- unit: 'ms',
22
- description: 'Duration to build base rollup inputs',
23
- valueType: ValueType.INT,
24
- });
25
-
26
- this.avmFallbackCount = meter.createUpDownCounter(Metrics.PROVING_ORCHESTRATOR_AVM_FALLBACK_COUNT, {
27
- description: 'How many times the AVM fallback was used',
28
- valueType: ValueType.INT,
29
- });
30
-
31
- this.avmFallbackCount.add(0);
12
+ this.baseRollupInputsDuration = meter.createHistogram(Metrics.PROVING_ORCHESTRATOR_BASE_ROLLUP_INPUTS_DURATION);
32
13
  }
33
14
 
34
15
  recordBaseRollupInputs(durationMs: number) {
35
16
  this.baseRollupInputsDuration.record(Math.ceil(durationMs));
36
17
  }
37
-
38
- incAvmFallback() {
39
- this.avmFallbackCount.add(1);
40
- }
41
18
  }
@@ -1,9 +1,9 @@
1
1
  import { AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH } from '@aztec/constants';
2
- import type { Fr } from '@aztec/foundation/fields';
3
- import { getAvmVkData, getVkData } from '@aztec/noir-protocol-circuits-types/server/vks';
2
+ import type { Fr } from '@aztec/foundation/curves/bn254';
3
+ import { getVkData } from '@aztec/noir-protocol-circuits-types/server/vks';
4
4
  import type { AvmCircuitInputs } from '@aztec/stdlib/avm';
5
- import type { ProofAndVerificationKey, PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
6
- import { ProofData } from '@aztec/stdlib/proofs';
5
+ import type { PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
6
+ import { ProofData, ProofDataForFixedVk, RecursiveProof } from '@aztec/stdlib/proofs';
7
7
  import {
8
8
  type BaseRollupHints,
9
9
  PrivateBaseRollupHints,
@@ -32,7 +32,7 @@ export class TxProvingState {
32
32
  PublicChonkVerifierPublicInputs,
33
33
  typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
34
34
  >;
35
- private avm?: ProofAndVerificationKey<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>;
35
+ private avmProof?: RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>;
36
36
 
37
37
  constructor(
38
38
  public readonly processedTx: ProcessedTx,
@@ -46,7 +46,7 @@ export class TxProvingState {
46
46
  }
47
47
 
48
48
  public ready() {
49
- return !this.requireAvmProof || (!!this.avm && !!this.publicChonkVerifier);
49
+ return !this.requireAvmProof || (!!this.avmProof && !!this.publicChonkVerifier);
50
50
  }
51
51
 
52
52
  public getAvmInputs(): AvmCircuitInputs {
@@ -80,8 +80,8 @@ export class TxProvingState {
80
80
  this.publicChonkVerifier = publicChonkVerifierProofAndVk;
81
81
  }
82
82
 
83
- public setAvmProof(avmProofAndVk: ProofAndVerificationKey<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>) {
84
- this.avm = avmProofAndVk;
83
+ public setAvmProof(avmProof: RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>) {
84
+ this.avmProof = avmProof;
85
85
  }
86
86
 
87
87
  #getPrivateBaseInputs() {
@@ -105,7 +105,7 @@ export class TxProvingState {
105
105
  if (!this.publicChonkVerifier) {
106
106
  throw new Error('Tx not ready for proving base rollup: public chonk verifier proof undefined');
107
107
  }
108
- if (!this.avm) {
108
+ if (!this.avmProof) {
109
109
  throw new Error('Tx not ready for proving base rollup: avm proof undefined');
110
110
  }
111
111
  if (!(this.baseRollupHints instanceof PublicBaseRollupHints)) {
@@ -114,11 +114,7 @@ export class TxProvingState {
114
114
 
115
115
  const publicChonkVerifierProofData = toProofData(this.publicChonkVerifier);
116
116
 
117
- const avmProofData = new ProofData(
118
- this.processedTx.avmProvingRequest.inputs.publicInputs,
119
- this.avm.proof,
120
- getAvmVkData(),
121
- );
117
+ const avmProofData = new ProofDataForFixedVk(this.processedTx.avmProvingRequest.inputs.publicInputs, this.avmProof);
122
118
 
123
119
  return new PublicTxBaseRollupPrivateInputs(publicChonkVerifierProofData, avmProofData, this.baseRollupHints);
124
120
  }
@@ -1,4 +1,8 @@
1
- import type { ForkMerkleTreeOperations, ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
1
+ import type {
2
+ ForkMerkleTreeOperations,
3
+ ProvingJobBroker,
4
+ ReadonlyWorldStateAccess,
5
+ } from '@aztec/stdlib/interfaces/server';
2
6
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
3
7
 
4
8
  import type { ProverClientConfig } from '../config.js';
@@ -6,7 +10,7 @@ import { ProverClient } from './prover-client.js';
6
10
 
7
11
  export function createProverClient(
8
12
  config: ProverClientConfig,
9
- worldState: ForkMerkleTreeOperations,
13
+ worldState: ForkMerkleTreeOperations & ReadonlyWorldStateAccess,
10
14
  broker: ProvingJobBroker,
11
15
  telemetry: TelemetryClient = getTelemetryClient(),
12
16
  ) {
@@ -11,6 +11,7 @@ import {
11
11
  type ProvingJobBroker,
12
12
  type ProvingJobConsumer,
13
13
  type ProvingJobProducer,
14
+ type ReadonlyWorldStateAccess,
14
15
  type ServerCircuitProver,
15
16
  tryStop,
16
17
  } from '@aztec/stdlib/interfaces/server';
@@ -33,7 +34,7 @@ export class ProverClient implements EpochProverManager {
33
34
 
34
35
  private constructor(
35
36
  private config: ProverClientConfig,
36
- private worldState: ForkMerkleTreeOperations,
37
+ private worldState: ForkMerkleTreeOperations & ReadonlyWorldStateAccess,
37
38
  private orchestratorClient: ProvingJobProducer,
38
39
  private agentClient?: ProvingJobConsumer,
39
40
  private telemetry: TelemetryClient = getTelemetryClient(),
@@ -99,7 +100,7 @@ export class ProverClient implements EpochProverManager {
99
100
  */
100
101
  public static async new(
101
102
  config: ProverClientConfig,
102
- worldState: ForkMerkleTreeOperations,
103
+ worldState: ForkMerkleTreeOperations & ReadonlyWorldStateAccess,
103
104
  broker: ProvingJobBroker,
104
105
  telemetry: TelemetryClient = getTelemetryClient(),
105
106
  ) {
@@ -129,15 +130,7 @@ export class ProverClient implements EpochProverManager {
129
130
  const prover = await buildServerCircuitProver(this.config, this.telemetry);
130
131
  this.agents = times(
131
132
  this.config.proverAgentCount,
132
- () =>
133
- new ProvingAgent(
134
- this.agentClient!,
135
- proofStore,
136
- prover,
137
- [],
138
- this.config.proverAgentPollIntervalMs,
139
- this.telemetry,
140
- ),
133
+ () => new ProvingAgent(this.agentClient!, proofStore, prover, [], this.config.proverAgentPollIntervalMs),
141
134
  );
142
135
 
143
136
  await Promise.all(this.agents.map(agent => agent.start()));
@@ -1,6 +1,6 @@
1
1
  import type { BatchedBlob, FinalBlobBatchingChallenges } from '@aztec/blob-lib/types';
2
- import { EpochNumber } from '@aztec/foundation/branded-types';
3
- import type { Fr } from '@aztec/foundation/fields';
2
+ import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
3
+ import type { Fr } from '@aztec/foundation/curves/bn254';
4
4
  import type { EthAddress } from '@aztec/stdlib/block';
5
5
  import type { EpochProver } from '@aztec/stdlib/interfaces/server';
6
6
  import type { Proof } from '@aztec/stdlib/proofs';
@@ -44,7 +44,7 @@ export class ServerEpochProver implements EpochProver {
44
44
  startChonkVerifierCircuits(txs: Tx[]): Promise<void> {
45
45
  return this.orchestrator.startChonkVerifierCircuits(txs);
46
46
  }
47
- setBlockCompleted(blockNumber: number, expectedBlockHeader?: BlockHeader): Promise<BlockHeader> {
47
+ setBlockCompleted(blockNumber: BlockNumber, expectedBlockHeader?: BlockHeader): Promise<BlockHeader> {
48
48
  return this.orchestrator.setBlockCompleted(blockNumber, expectedBlockHeader);
49
49
  }
50
50
  finalizeEpoch(): Promise<{ publicInputs: RootRollupPublicInputs; proof: Proof; batchedBlobInputs: BatchedBlob }> {
@@ -60,7 +60,7 @@ export class ServerEpochProver implements EpochProver {
60
60
  await this.facade.stop();
61
61
  await this.orchestrator.stop();
62
62
  }
63
- startNewBlock(blockNumber: number, timestamp: UInt64, totalNumTxs: number): Promise<void> {
63
+ startNewBlock(blockNumber: BlockNumber, timestamp: UInt64, totalNumTxs: number): Promise<void> {
64
64
  return this.orchestrator.startNewBlock(blockNumber, timestamp, totalNumTxs);
65
65
  }
66
66
  addTxs(txs: ProcessedTx[]): Promise<void> {
@@ -5,14 +5,12 @@ import type {
5
5
  RECURSIVE_PROOF_LENGTH,
6
6
  } from '@aztec/constants';
7
7
  import { EpochNumber } from '@aztec/foundation/branded-types';
8
- import { sha256 } from '@aztec/foundation/crypto';
9
- import { Fr } from '@aztec/foundation/fields';
8
+ import { sha256 } from '@aztec/foundation/crypto/sha256';
10
9
  import { createLogger } from '@aztec/foundation/log';
11
10
  import { type PromiseWithResolvers, RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
12
11
  import { truncate } from '@aztec/foundation/string';
13
12
  import type { AvmCircuitInputs } from '@aztec/stdlib/avm';
14
13
  import {
15
- type ProofAndVerificationKey,
16
14
  type ProofUri,
17
15
  type ProvingJobId,
18
16
  type ProvingJobInputsMap,
@@ -24,7 +22,7 @@ import {
24
22
  makeProvingJobId,
25
23
  } from '@aztec/stdlib/interfaces/server';
26
24
  import type { ParityBasePrivateInputs, ParityPublicInputs, ParityRootPrivateInputs } from '@aztec/stdlib/parity';
27
- import { ProvingRequestType } from '@aztec/stdlib/proofs';
25
+ import { ProvingRequestType, RecursiveProof } from '@aztec/stdlib/proofs';
28
26
  import type {
29
27
  BlockMergeRollupPrivateInputs,
30
28
  BlockRollupPublicInputs,
@@ -398,24 +396,16 @@ export class BrokerCircuitProverFacade implements ServerCircuitProver {
398
396
 
399
397
  getAvmProof(
400
398
  inputs: AvmCircuitInputs,
401
- skipPublicInputsValidation?: boolean, // TODO(#14234)[Unconditional PIs validation]: remove this argument
402
399
  signal?: AbortSignal,
403
400
  epochNumber?: EpochNumber,
404
- ): Promise<ProofAndVerificationKey<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>> {
405
- this.log.info(`getAvmProof() called with skipPublicInputsValidation: ${skipPublicInputsValidation}`);
406
-
401
+ ): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>> {
407
402
  return this.enqueueJob(
408
403
  this.generateId(ProvingRequestType.PUBLIC_VM, inputs, epochNumber),
409
404
  ProvingRequestType.PUBLIC_VM,
410
405
  inputs,
411
406
  epochNumber,
412
407
  signal,
413
- ).then(result => {
414
- // TODO(#14234)[Unconditional PIs validation]: Remove ".then()".
415
- // Override the default value of skipPublicInputsValidation potentially set in BBNativeRollupProver.getAvmProof().
416
- result.proof.proof[0] = skipPublicInputsValidation ? new Fr(1) : new Fr(0);
417
- return result;
418
- });
408
+ );
419
409
  }
420
410
 
421
411
  getBaseParityProof(
@@ -1,4 +1,4 @@
1
- import { type L1ReaderConfig, l1ReaderConfigMappings } from '@aztec/ethereum';
1
+ import { type L1ReaderConfig, l1ReaderConfigMappings } from '@aztec/ethereum/l1-reader';
2
2
  import {
3
3
  type ConfigMappingsType,
4
4
  booleanConfigHelper,
@@ -1,5 +1,5 @@
1
1
  import { EpochNumber } from '@aztec/foundation/branded-types';
2
- import { randomBytes } from '@aztec/foundation/crypto';
2
+ import { randomBytes } from '@aztec/foundation/crypto/random';
3
3
  import { type ProofUri, type ProvingJobId, makeProvingJobId } from '@aztec/stdlib/interfaces/server';
4
4
  import { ProvingRequestType } from '@aztec/stdlib/proofs';
5
5
 
@@ -13,27 +13,16 @@ 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;
37
26
 
38
27
  constructor(
39
28
  /** The source of proving jobs */
@@ -46,12 +35,8 @@ export class ProvingAgent implements Traceable {
46
35
  private proofAllowList: Array<ProvingRequestType> = [],
47
36
  /** How long to wait between jobs */
48
37
  private pollIntervalMs = 1000,
49
- /** A telemetry client through which to emit metrics */
50
- client: TelemetryClient = getTelemetryClient(),
51
38
  private log = createLogger('prover-client:proving-agent'),
52
39
  ) {
53
- this.tracer = client.getTracer('ProvingAgent');
54
- this.instrumentation = new ProvingAgentInstrumentation(client);
55
40
  this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.pollIntervalMs);
56
41
  }
57
42
 
@@ -85,7 +70,6 @@ export class ProvingAgent implements Traceable {
85
70
  return this.runningPromise.isRunning() ? { status: 'running' } : { status: 'stopped' };
86
71
  }
87
72
 
88
- @trackSpan('ProvingAgent.safeWork')
89
73
  private async work() {
90
74
  // every tick we need to take one of the following actions:
91
75
  // 1. send a hearbeat to the broker that we're working on some job
@@ -16,13 +16,7 @@ import {
16
16
  tryStop,
17
17
  } from '@aztec/stdlib/interfaces/server';
18
18
  import { ProvingRequestType } from '@aztec/stdlib/proofs';
19
- import {
20
- type TelemetryClient,
21
- type Traceable,
22
- type Tracer,
23
- getTelemetryClient,
24
- trackSpan,
25
- } from '@aztec/telemetry-client';
19
+ import { type TelemetryClient, type Traceable, type Tracer, getTelemetryClient } from '@aztec/telemetry-client';
26
20
 
27
21
  import assert from 'assert';
28
22
 
@@ -302,6 +296,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
302
296
  this.resultsCache.delete(id);
303
297
  this.inProgress.delete(id);
304
298
  this.retries.delete(id);
299
+ this.enqueuedAt.delete(id);
305
300
  }
306
301
  }
307
302
 
@@ -354,6 +349,8 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
354
349
  const enqueuedAt = this.enqueuedAt.get(job.id);
355
350
  if (enqueuedAt) {
356
351
  this.instrumentation.recordJobWait(job.type, enqueuedAt);
352
+ // we can clear this flag now.
353
+ this.enqueuedAt.delete(job.id);
357
354
  }
358
355
 
359
356
  return { job, time };
@@ -562,7 +559,6 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Tr
562
559
  return this.#getProvingJob(filter);
563
560
  }
564
561
 
565
- @trackSpan('ProvingBroker.cleanupPass')
566
562
  private async cleanupPass() {
567
563
  this.cleanupStaleJobs();
568
564
  this.reEnqueueExpiredJobs();
@@ -11,7 +11,14 @@ import {
11
11
  ProvingJobSettledResult,
12
12
  getEpochFromProvingJobId,
13
13
  } from '@aztec/stdlib/interfaces/server';
14
- 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';
15
22
 
16
23
  import { mkdir, readdir } from 'fs/promises';
17
24
  import { join } from 'path';
@@ -78,6 +85,8 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
78
85
 
79
86
  private batchQueue: BatchQueue<ProvingJob | [ProvingJobId, ProvingJobSettledResult], number>;
80
87
 
88
+ public readonly tracer: Tracer;
89
+
81
90
  private constructor(
82
91
  private epochs: Map<number, SingleEpochDatabase>,
83
92
  private config: ProverBrokerConfig,
@@ -92,6 +101,8 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
92
101
  () => this.estimateSize(),
93
102
  );
94
103
 
104
+ this.tracer = client.getTracer('KVBrokerDatabase');
105
+
95
106
  this.batchQueue = new BatchQueue(
96
107
  (items, key) => this.commitWrites(items, key),
97
108
  config.proverBrokerBatchSize,
@@ -165,6 +176,9 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
165
176
  }
166
177
  }
167
178
 
179
+ @trackSpan('KVBrokerDatabase.deleteAllProvingJobsOlderThanEpoch', epochNumber => ({
180
+ [Attributes.EPOCH_NUMBER]: epochNumber,
181
+ }))
168
182
  async deleteAllProvingJobsOlderThanEpoch(epochNumber: EpochNumber): Promise<void> {
169
183
  const oldEpochs = Array.from(this.epochs.keys()).filter(e => e < Number(epochNumber));
170
184
  for (const old of oldEpochs) {
@@ -8,7 +8,6 @@ import {
8
8
  type ObservableResult,
9
9
  type TelemetryClient,
10
10
  type UpDownCounter,
11
- ValueType,
12
11
  } from '@aztec/telemetry-client';
13
12
 
14
13
  export type MonitorCallback = (proofType: ProvingRequestType) => number;
@@ -28,49 +27,25 @@ export class ProvingBrokerInstrumentation {
28
27
  constructor(client: TelemetryClient, name = 'ProvingBroker') {
29
28
  const meter = client.getMeter(name);
30
29
 
31
- this.queueSize = meter.createObservableGauge(Metrics.PROVING_QUEUE_SIZE, {
32
- valueType: ValueType.INT,
33
- });
30
+ this.queueSize = meter.createObservableGauge(Metrics.PROVING_QUEUE_SIZE);
34
31
 
35
- this.activeJobs = meter.createObservableGauge(Metrics.PROVING_QUEUE_ACTIVE_JOBS, {
36
- valueType: ValueType.INT,
37
- });
32
+ this.activeJobs = meter.createObservableGauge(Metrics.PROVING_QUEUE_ACTIVE_JOBS);
38
33
 
39
- this.resolvedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_RESOLVED_JOBS, {
40
- valueType: ValueType.INT,
41
- });
34
+ this.resolvedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_RESOLVED_JOBS);
42
35
 
43
- this.rejectedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_REJECTED_JOBS, {
44
- valueType: ValueType.INT,
45
- });
36
+ this.rejectedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_REJECTED_JOBS);
46
37
 
47
- this.retriedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_RETRIED_JOBS, {
48
- valueType: ValueType.INT,
49
- });
38
+ this.retriedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_RETRIED_JOBS);
50
39
 
51
- this.timedOutJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_TIMED_OUT_JOBS, {
52
- valueType: ValueType.INT,
53
- });
40
+ this.timedOutJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_TIMED_OUT_JOBS);
54
41
 
55
- this.cachedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_CACHED_JOBS, {
56
- valueType: ValueType.INT,
57
- });
42
+ this.cachedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_CACHED_JOBS);
58
43
 
59
- this.totalJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_TOTAL_JOBS, {
60
- valueType: ValueType.INT,
61
- });
44
+ this.totalJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_TOTAL_JOBS);
62
45
 
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
- });
46
+ this.jobWait = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_WAIT);
68
47
 
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
- });
48
+ this.jobDuration = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_DURATION);
74
49
  }
75
50
 
76
51
  monitorQueueDepth(fn: MonitorCallback) {
@@ -1,5 +1,5 @@
1
1
  import { EpochNumber } from '@aztec/foundation/branded-types';
2
- import { randomBytes } from '@aztec/foundation/crypto';
2
+ import { randomBytes } from '@aztec/foundation/crypto/random';
3
3
  import { AbortError } from '@aztec/foundation/error';
4
4
  import { createLogger } from '@aztec/foundation/log';
5
5
  import type {
@@ -125,8 +125,7 @@ export class ProvingJobController {
125
125
  const signal = this.abortController.signal;
126
126
  switch (type) {
127
127
  case ProvingRequestType.PUBLIC_VM: {
128
- // TODO(#14234)[Unconditional PIs validation]: Remove argument "undefined".
129
- return await this.circuitProver.getAvmProof(inputs, undefined, signal, this.epochNumber);
128
+ return await this.circuitProver.getAvmProof(inputs, signal, this.epochNumber);
130
129
  }
131
130
 
132
131
  case ProvingRequestType.PUBLIC_CHONK_VERIFIER: {
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED,
3
- AVM_V2_VERIFICATION_KEY_LENGTH_IN_FIELDS_PADDED,
4
3
  NESTED_RECURSIVE_PROOF_LENGTH,
5
4
  NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
6
5
  RECURSIVE_PROOF_LENGTH,
@@ -14,7 +13,6 @@ import {
14
13
  type ProvingJobStatus,
15
14
  type PublicInputsAndRecursiveProof,
16
15
  type ServerCircuitProver,
17
- makeProofAndVerificationKey,
18
16
  makePublicInputsAndRecursiveProof,
19
17
  } from '@aztec/stdlib/interfaces/server';
20
18
  import type { ParityBasePrivateInputs, ParityRootPrivateInputs } from '@aztec/stdlib/parity';
@@ -105,18 +103,8 @@ export class TestBroker implements ProvingJobProducer {
105
103
  export class MockProver implements ServerCircuitProver {
106
104
  constructor() {}
107
105
 
108
- getAvmProof(
109
- _inputs: AvmCircuitInputs,
110
- _skipPublicInputsValidation?: boolean, // TODO(#14234)[Unconditional PIs validation]: Remove.
111
- _signal?: AbortSignal,
112
- _epochNumber?: number,
113
- ) {
114
- return Promise.resolve(
115
- makeProofAndVerificationKey(
116
- makeEmptyRecursiveProof(AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED),
117
- VerificationKeyData.makeFake(AVM_V2_VERIFICATION_KEY_LENGTH_IN_FIELDS_PADDED),
118
- ),
119
- );
106
+ getAvmProof(_inputs: AvmCircuitInputs, _signal?: AbortSignal, _epochNumber?: number) {
107
+ return Promise.resolve(makeEmptyRecursiveProof(AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED));
120
108
  }
121
109
 
122
110
  getBaseParityProof(_inputs: ParityBasePrivateInputs, _signal?: AbortSignal, _epochNumber?: number) {