@aztec/prover-client 0.0.0-test.1 → 0.0.1-fake-ceab37513c

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 (107) hide show
  1. package/dest/bin/get-proof-inputs.js +1 -1
  2. package/dest/block-factory/index.d.ts +2 -0
  3. package/dest/block-factory/index.d.ts.map +1 -0
  4. package/dest/block-factory/light.d.ts +36 -0
  5. package/dest/block-factory/light.d.ts.map +1 -0
  6. package/dest/{block_builder → block-factory}/light.js +35 -30
  7. package/dest/config.d.ts +6 -6
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +11 -1
  10. package/dest/mocks/fixtures.d.ts +3 -3
  11. package/dest/mocks/fixtures.d.ts.map +1 -1
  12. package/dest/mocks/fixtures.js +2 -2
  13. package/dest/mocks/test_context.d.ts +18 -13
  14. package/dest/mocks/test_context.d.ts.map +1 -1
  15. package/dest/mocks/test_context.js +44 -38
  16. package/dest/orchestrator/block-building-helpers.d.ts +18 -11
  17. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  18. package/dest/orchestrator/block-building-helpers.js +80 -63
  19. package/dest/orchestrator/block-proving-state.d.ts +19 -10
  20. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  21. package/dest/orchestrator/block-proving-state.js +63 -46
  22. package/dest/orchestrator/epoch-proving-state.d.ts +13 -6
  23. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  24. package/dest/orchestrator/epoch-proving-state.js +40 -14
  25. package/dest/orchestrator/orchestrator.d.ts +7 -5
  26. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  27. package/dest/orchestrator/orchestrator.js +78 -52
  28. package/dest/orchestrator/orchestrator_metrics.d.ts +2 -0
  29. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  30. package/dest/orchestrator/orchestrator_metrics.js +9 -0
  31. package/dest/orchestrator/tx-proving-state.d.ts +2 -2
  32. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  33. package/dest/orchestrator/tx-proving-state.js +9 -20
  34. package/dest/prover-client/prover-client.d.ts +3 -3
  35. package/dest/prover-client/prover-client.d.ts.map +1 -1
  36. package/dest/prover-client/prover-client.js +5 -4
  37. package/dest/prover-client/server-epoch-prover.d.ts +6 -4
  38. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  39. package/dest/prover-client/server-epoch-prover.js +4 -4
  40. package/dest/proving_broker/broker_prover_facade.d.ts +5 -3
  41. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  42. package/dest/proving_broker/broker_prover_facade.js +31 -21
  43. package/dest/proving_broker/config.d.ts +9 -4
  44. package/dest/proving_broker/config.d.ts.map +1 -1
  45. package/dest/proving_broker/config.js +15 -4
  46. package/dest/proving_broker/factory.d.ts +1 -1
  47. package/dest/proving_broker/factory.d.ts.map +1 -1
  48. package/dest/proving_broker/factory.js +5 -1
  49. package/dest/proving_broker/proof_store/factory.js +1 -1
  50. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
  51. package/dest/proving_broker/proof_store/gcs_proof_store.js +1 -0
  52. package/dest/proving_broker/proving_agent.d.ts +3 -3
  53. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  54. package/dest/proving_broker/proving_agent.js +83 -47
  55. package/dest/proving_broker/proving_broker.d.ts +11 -2
  56. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  57. package/dest/proving_broker/proving_broker.js +6 -5
  58. package/dest/proving_broker/proving_broker_database/memory.js +1 -1
  59. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  60. package/dest/proving_broker/proving_broker_database/persisted.js +9 -8
  61. package/dest/proving_broker/proving_job_controller.d.ts +7 -8
  62. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  63. package/dest/proving_broker/proving_job_controller.js +53 -45
  64. package/dest/proving_broker/rpc.d.ts +3 -5
  65. package/dest/proving_broker/rpc.d.ts.map +1 -1
  66. package/dest/proving_broker/rpc.js +1 -4
  67. package/dest/test/mock_proof_store.d.ts +9 -0
  68. package/dest/test/mock_proof_store.d.ts.map +1 -0
  69. package/dest/test/mock_proof_store.js +10 -0
  70. package/dest/test/mock_prover.d.ts +7 -5
  71. package/dest/test/mock_prover.d.ts.map +1 -1
  72. package/dest/test/mock_prover.js +6 -3
  73. package/package.json +28 -27
  74. package/src/bin/get-proof-inputs.ts +1 -1
  75. package/src/block-factory/index.ts +1 -0
  76. package/src/{block_builder → block-factory}/light.ts +42 -29
  77. package/src/config.ts +24 -8
  78. package/src/mocks/fixtures.ts +5 -5
  79. package/src/mocks/test_context.ts +79 -59
  80. package/src/orchestrator/block-building-helpers.ts +96 -92
  81. package/src/orchestrator/block-proving-state.ts +78 -52
  82. package/src/orchestrator/epoch-proving-state.ts +51 -20
  83. package/src/orchestrator/orchestrator.ts +119 -60
  84. package/src/orchestrator/orchestrator_metrics.ts +20 -1
  85. package/src/orchestrator/tx-proving-state.ts +17 -24
  86. package/src/prover-client/prover-client.ts +16 -14
  87. package/src/prover-client/server-epoch-prover.ts +16 -7
  88. package/src/proving_broker/broker_prover_facade.ts +52 -36
  89. package/src/proving_broker/config.ts +17 -6
  90. package/src/proving_broker/factory.ts +2 -1
  91. package/src/proving_broker/proof_store/factory.ts +1 -1
  92. package/src/proving_broker/proof_store/gcs_proof_store.ts +5 -1
  93. package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
  94. package/src/proving_broker/proving_agent.ts +89 -47
  95. package/src/proving_broker/proving_broker.ts +16 -15
  96. package/src/proving_broker/proving_broker_database/memory.ts +1 -1
  97. package/src/proving_broker/proving_broker_database/persisted.ts +9 -8
  98. package/src/proving_broker/proving_job_controller.ts +56 -65
  99. package/src/proving_broker/rpc.ts +1 -6
  100. package/src/test/mock_proof_store.ts +14 -0
  101. package/src/test/mock_prover.ts +27 -5
  102. package/dest/block_builder/index.d.ts +0 -6
  103. package/dest/block_builder/index.d.ts.map +0 -1
  104. package/dest/block_builder/light.d.ts +0 -33
  105. package/dest/block_builder/light.d.ts.map +0 -1
  106. package/src/block_builder/index.ts +0 -6
  107. /package/dest/{block_builder → block-factory}/index.js +0 -0
@@ -1,6 +1,5 @@
1
+ import { BlobAccumulatorPublicInputs, FinalBlobBatchingChallenges } from '@aztec/blob-lib';
1
2
  import {
2
- AVM_PROOF_LENGTH_IN_FIELDS,
3
- AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS,
4
3
  L1_TO_L2_MSG_SUBTREE_HEIGHT,
5
4
  L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
6
5
  NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
@@ -17,7 +16,8 @@ import { pushTestData } from '@aztec/foundation/testing';
17
16
  import { elapsed } from '@aztec/foundation/timer';
18
17
  import type { TreeNodeLocation } from '@aztec/foundation/trees';
19
18
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
20
- import { L2Block } from '@aztec/stdlib/block';
19
+ import { readAvmMinimalPublicTxInputsFromFile } from '@aztec/simulator/public/fixtures';
20
+ import { EthAddress, L2Block } from '@aztec/stdlib/block';
21
21
  import type {
22
22
  EpochProver,
23
23
  ForkMerkleTreeOperations,
@@ -26,7 +26,6 @@ import type {
26
26
  ServerCircuitProver,
27
27
  } from '@aztec/stdlib/interfaces/server';
28
28
  import { BaseParityInputs } from '@aztec/stdlib/parity';
29
- import { makeEmptyRecursiveProof } from '@aztec/stdlib/proofs';
30
29
  import {
31
30
  type BaseRollupHints,
32
31
  EmptyBlockRootRollupInputs,
@@ -37,7 +36,6 @@ import {
37
36
  import type { CircuitName } from '@aztec/stdlib/stats';
38
37
  import { type AppendOnlyTreeSnapshot, MerkleTreeId } from '@aztec/stdlib/trees';
39
38
  import { type BlockHeader, type GlobalVariables, type ProcessedTx, type Tx, toNumBlobFields } from '@aztec/stdlib/tx';
40
- import { VerificationKeyData } from '@aztec/stdlib/vks';
41
39
  import {
42
40
  Attributes,
43
41
  type TelemetryClient,
@@ -50,11 +48,12 @@ import {
50
48
  import { inspect } from 'util';
51
49
 
52
50
  import {
53
- buildBaseRollupHints,
54
51
  buildHeaderAndBodyFromTxs,
52
+ getLastSiblingPath,
55
53
  getRootTreeSiblingPath,
56
54
  getSubtreeSiblingPath,
57
55
  getTreeSnapshot,
56
+ insertSideEffectsAndBuildBaseRollupHints,
58
57
  validatePartialState,
59
58
  validateTx,
60
59
  } from './block-building-helpers.js';
@@ -90,7 +89,7 @@ export class ProvingOrchestrator implements EpochProver {
90
89
  constructor(
91
90
  private dbProvider: ForkMerkleTreeOperations,
92
91
  private prover: ServerCircuitProver,
93
- private readonly proverId: Fr = Fr.ZERO,
92
+ private readonly proverId: EthAddress,
94
93
  telemetryClient: TelemetryClient = getTelemetryClient(),
95
94
  ) {
96
95
  this.metrics = new ProvingOrchestratorMetrics(telemetryClient, 'ProvingOrchestrator');
@@ -100,7 +99,7 @@ export class ProvingOrchestrator implements EpochProver {
100
99
  return this.metrics.tracer;
101
100
  }
102
101
 
103
- public getProverId(): Fr {
102
+ public getProverId(): EthAddress {
104
103
  return this.proverId;
105
104
  }
106
105
 
@@ -109,14 +108,26 @@ export class ProvingOrchestrator implements EpochProver {
109
108
  return Promise.resolve();
110
109
  }
111
110
 
112
- public startNewEpoch(epochNumber: number, firstBlockNumber: number, totalNumBlocks: number) {
111
+ public startNewEpoch(
112
+ epochNumber: number,
113
+ firstBlockNumber: number,
114
+ totalNumBlocks: number,
115
+ finalBlobBatchingChallenges: FinalBlobBatchingChallenges,
116
+ ) {
113
117
  const { promise: _promise, resolve, reject } = promiseWithResolvers<ProvingResult>();
114
118
  const promise = _promise.catch((reason): ProvingResult => ({ status: 'failure', reason }));
115
119
  if (totalNumBlocks <= 0 || !Number.isInteger(totalNumBlocks)) {
116
120
  throw new Error(`Invalid number of blocks for epoch (got ${totalNumBlocks})`);
117
121
  }
118
122
  logger.info(`Starting epoch ${epochNumber} with ${totalNumBlocks} blocks`);
119
- this.provingState = new EpochProvingState(epochNumber, firstBlockNumber, totalNumBlocks, resolve, reject);
123
+ this.provingState = new EpochProvingState(
124
+ epochNumber,
125
+ firstBlockNumber,
126
+ totalNumBlocks,
127
+ finalBlobBatchingChallenges,
128
+ resolve,
129
+ reject,
130
+ );
120
131
  this.provingPromise = promise;
121
132
  }
122
133
 
@@ -127,7 +138,7 @@ export class ProvingOrchestrator implements EpochProver {
127
138
  * @returns A proving ticket, containing a promise notifying of proving completion
128
139
  */
129
140
  @trackSpan('ProvingOrchestrator.startNewBlock', globalVariables => ({
130
- [Attributes.BLOCK_NUMBER]: globalVariables.blockNumber.toNumber(),
141
+ [Attributes.BLOCK_NUMBER]: globalVariables.blockNumber,
131
142
  }))
132
143
  public async startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[], previousBlockHeader: BlockHeader) {
133
144
  if (!this.provingState) {
@@ -138,30 +149,36 @@ export class ProvingOrchestrator implements EpochProver {
138
149
  throw new Error(`Epoch not accepting further blocks`);
139
150
  }
140
151
 
141
- logger.info(
142
- `Starting block ${globalVariables.blockNumber.toNumber()} for slot ${globalVariables.slotNumber.toNumber()}`,
143
- );
152
+ logger.info(`Starting block ${globalVariables.blockNumber} for slot ${globalVariables.slotNumber.toNumber()}`);
144
153
 
145
154
  // Fork world state at the end of the immediately previous block
146
- const db = await this.dbProvider.fork(globalVariables.blockNumber.toNumber() - 1);
147
- this.dbs.set(globalVariables.blockNumber.toNumber(), db);
155
+ const db = await this.dbProvider.fork(globalVariables.blockNumber - 1);
156
+ this.dbs.set(globalVariables.blockNumber, db);
148
157
 
149
158
  // we start the block by enqueueing all of the base parity circuits
150
- const { l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, baseParityInputs } =
151
- await this.prepareBaseParityInputs(l1ToL2Messages, db);
159
+ const {
160
+ l1ToL2MessageTreeSnapshot,
161
+ l1ToL2MessageSubtreeSiblingPath,
162
+ l1ToL2MessageTreeSnapshotAfterInsertion,
163
+ baseParityInputs,
164
+ } = await this.prepareBaseParityInputs(l1ToL2Messages, db);
152
165
 
153
166
  // Get archive snapshot before this block lands
154
167
  const lastArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
168
+ const lastArchiveSiblingPath = await getLastSiblingPath(MerkleTreeId.ARCHIVE, db);
155
169
  const newArchiveSiblingPath = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE, db);
156
170
 
157
171
  const blockProvingState = this.provingState!.startNewBlock(
158
172
  globalVariables,
159
173
  l1ToL2Messages,
174
+ l1ToL2MessageTreeSnapshot,
160
175
  l1ToL2MessageSubtreeSiblingPath,
161
176
  l1ToL2MessageTreeSnapshotAfterInsertion,
162
177
  lastArchive,
178
+ lastArchiveSiblingPath,
163
179
  newArchiveSiblingPath,
164
180
  previousBlockHeader,
181
+ this.proverId,
165
182
  );
166
183
 
167
184
  // Enqueue base parity circuits for the block
@@ -184,7 +201,7 @@ export class ProvingOrchestrator implements EpochProver {
184
201
  logger.warn(`Provided no txs to orchestrator addTxs.`);
185
202
  return;
186
203
  }
187
- const blockNumber = txs[0].constants.globalVariables.blockNumber.toNumber();
204
+ const blockNumber = txs[0].globalVariables.blockNumber;
188
205
  const provingState = this.provingState?.getBlockProvingStateByBlockNumber(blockNumber!);
189
206
  if (!provingState) {
190
207
  throw new Error(`Block proving state for ${blockNumber} not found`);
@@ -231,18 +248,19 @@ export class ProvingOrchestrator implements EpochProver {
231
248
  * Note that if the tube circuits are not started this way, they will be started nontheless after processing.
232
249
  */
233
250
  @trackSpan('ProvingOrchestrator.startTubeCircuits')
234
- public async startTubeCircuits(txs: Tx[]) {
251
+ public startTubeCircuits(txs: Tx[]) {
235
252
  if (!this.provingState?.verifyState()) {
236
253
  throw new Error(`Invalid proving state, call startNewEpoch before starting tube circuits`);
237
254
  }
238
255
  for (const tx of txs) {
239
- const txHash = (await tx.getTxHash()).toString();
240
- const tubeInputs = new TubeInputs(tx.clientIvcProof);
256
+ const txHash = tx.getTxHash().toString();
257
+ const tubeInputs = new TubeInputs(!!tx.data.forPublic, tx.clientIvcProof);
241
258
  const tubeProof = promiseWithResolvers<ProofAndVerificationKey<typeof TUBE_PROOF_LENGTH>>();
242
259
  logger.debug(`Starting tube circuit for tx ${txHash}`);
243
260
  this.doEnqueueTube(txHash, tubeInputs, proof => tubeProof.resolve(proof));
244
261
  this.provingState?.cachedTubeProofs.set(txHash, tubeProof.promise);
245
262
  }
263
+ return Promise.resolve();
246
264
  }
247
265
 
248
266
  /**
@@ -259,7 +277,7 @@ export class ProvingOrchestrator implements EpochProver {
259
277
  }
260
278
 
261
279
  if (!provingState.spongeBlobState) {
262
- // If we are completing an empty block, initialise the provingState.
280
+ // If we are completing an empty block, initialize the provingState.
263
281
  // We will have 0 txs and no blob fields.
264
282
  provingState.startNewBlock(0, 0);
265
283
  }
@@ -272,6 +290,9 @@ export class ProvingOrchestrator implements EpochProver {
272
290
  logger.verbose(`Block ${blockNumber} completed. Assembling header.`);
273
291
  await this.buildBlock(provingState, expectedHeader);
274
292
 
293
+ logger.debug(`Accumulating blobs for ${blockNumber}`);
294
+ await this.provingState?.setBlobAccumulators(blockNumber);
295
+
275
296
  // If the proofs were faster than the block building, then we need to try the block root rollup again here
276
297
  await this.checkAndEnqueueBlockRootRollup(provingState);
277
298
  return provingState.block!;
@@ -318,8 +339,8 @@ export class ProvingOrchestrator implements EpochProver {
318
339
 
319
340
  await this.verifyBuiltBlockAgainstSyncedState(l2Block, newArchive);
320
341
 
321
- logger.verbose(`Orchestrator finalised block ${l2Block.number}`);
322
- provingState.block = l2Block;
342
+ logger.verbose(`Orchestrator finalized block ${l2Block.number}`);
343
+ provingState.setBlock(l2Block);
323
344
  }
324
345
 
325
346
  // Flagged as protected to disable in certain unit tests
@@ -348,9 +369,9 @@ export class ProvingOrchestrator implements EpochProver {
348
369
  /**
349
370
  * Returns the proof for the current epoch.
350
371
  */
351
- public async finaliseEpoch() {
372
+ public async finalizeEpoch() {
352
373
  if (!this.provingState || !this.provingPromise) {
353
- throw new Error(`Invalid proving state, an epoch must be proven before it can be finalised`);
374
+ throw new Error(`Invalid proving state, an epoch must be proven before it can be finalized`);
354
375
  }
355
376
 
356
377
  const result = await this.provingPromise!;
@@ -358,6 +379,15 @@ export class ProvingOrchestrator implements EpochProver {
358
379
  throw new Error(`Epoch proving failed: ${result.reason}`);
359
380
  }
360
381
 
382
+ // TODO(MW): Move this? Requires async and don't want to force root methods to be async
383
+ // TODO(MW): EpochProvingState uses this.blocks.filter(b => !!b).length as total blocks, use this below:
384
+ const finalBlock = this.provingState.blocks[this.provingState.totalNumBlocks - 1];
385
+ if (!finalBlock || !finalBlock.endBlobAccumulator) {
386
+ throw new Error(`Epoch's final block not ready for finalize`);
387
+ }
388
+ const finalBatchedBlob = await finalBlock.endBlobAccumulator.finalize();
389
+ this.provingState.setFinalBatchedBlob(finalBatchedBlob);
390
+
361
391
  const epochProofResult = this.provingState.getEpochProofResult();
362
392
 
363
393
  pushTestData('epochProofResult', {
@@ -455,6 +485,8 @@ export class ProvingOrchestrator implements EpochProver {
455
485
  BaseParityInputs.fromSlice(l1ToL2MessagesPadded, i, getVKTreeRoot()),
456
486
  );
457
487
 
488
+ const l1ToL2MessageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
489
+
458
490
  const l1ToL2MessageSubtreeSiblingPath = assertLength(
459
491
  await getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT, db),
460
492
  L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
@@ -465,6 +497,7 @@ export class ProvingOrchestrator implements EpochProver {
465
497
  const l1ToL2MessageTreeSnapshotAfterInsertion = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
466
498
 
467
499
  return {
500
+ l1ToL2MessageTreeSnapshot,
468
501
  l1ToL2MessageSubtreeSiblingPath,
469
502
  l1ToL2MessageTreeSnapshotAfterInsertion,
470
503
  baseParityInputs,
@@ -489,7 +522,13 @@ export class ProvingOrchestrator implements EpochProver {
489
522
  // We build the base rollup inputs using a mock proof and verification key.
490
523
  // These will be overwritten later once we have proven the tube circuit and any public kernels
491
524
  const [ms, hints] = await elapsed(
492
- buildBaseRollupHints(tx, provingState.globalVariables, db, provingState.spongeBlobState),
525
+ insertSideEffectsAndBuildBaseRollupHints(
526
+ tx,
527
+ provingState.globalVariables,
528
+ provingState.l1ToL2MessageTreeSnapshotAfterInsertion,
529
+ db,
530
+ provingState.spongeBlobState,
531
+ ),
493
532
  );
494
533
 
495
534
  this.metrics.recordBaseRollupInputs(ms);
@@ -531,7 +570,6 @@ export class ProvingOrchestrator implements EpochProver {
531
570
  }`,
532
571
  {
533
572
  [Attributes.TX_HASH]: processedTx.hash.toString(),
534
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
535
573
  [Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType,
536
574
  },
537
575
  signal => {
@@ -601,7 +639,6 @@ export class ProvingOrchestrator implements EpochProver {
601
639
  'ProvingOrchestrator.prover.getTubeProof',
602
640
  {
603
641
  [Attributes.TX_HASH]: txHash,
604
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
605
642
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'tube-circuit' satisfies CircuitName,
606
643
  },
607
644
  signal => this.prover.getTubeProof(inputs, signal, this.provingState!.epochNumber),
@@ -626,7 +663,6 @@ export class ProvingOrchestrator implements EpochProver {
626
663
  this.tracer,
627
664
  'ProvingOrchestrator.prover.getMergeRollupProof',
628
665
  {
629
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
630
666
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'merge-rollup' satisfies CircuitName,
631
667
  },
632
668
  signal => this.prover.getMergeRollupProof(inputs, signal, provingState.epochNumber),
@@ -647,7 +683,7 @@ export class ProvingOrchestrator implements EpochProver {
647
683
 
648
684
  provingState.blockRootRollupStarted = true;
649
685
 
650
- const { rollupType, inputs } = await provingState.getBlockRootRollupTypeAndInputs(this.proverId);
686
+ const { rollupType, inputs } = await provingState.getBlockRootRollupTypeAndInputs();
651
687
 
652
688
  logger.debug(
653
689
  `Enqueuing ${rollupType} for block ${provingState.blockNumber} with ${provingState.newL1ToL2Messages.length} l1 to l2 msgs.`,
@@ -659,7 +695,6 @@ export class ProvingOrchestrator implements EpochProver {
659
695
  this.tracer,
660
696
  'ProvingOrchestrator.prover.getBlockRootRollupProof',
661
697
  {
662
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
663
698
  [Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType,
664
699
  },
665
700
  signal => {
@@ -674,12 +709,34 @@ export class ProvingOrchestrator implements EpochProver {
674
709
  ),
675
710
  async result => {
676
711
  provingState.setBlockRootRollupProof(result);
677
- const header = await provingState.buildHeaderFromProvingOutputs(logger);
712
+ const header = await provingState.buildHeaderFromProvingOutputs();
678
713
  if (!(await header.hash()).equals(await provingState.block!.header.hash())) {
679
714
  logger.error(
680
- `Block header mismatch\nCircuit:${inspect(header)}\nComputed:${inspect(provingState.block!.header)}`,
715
+ `Block header mismatch.\nCircuit: ${inspect(header)}\nComputed: ${inspect(provingState.block!.header)}`,
681
716
  );
682
- provingState.reject(`Block header hash mismatch`);
717
+ provingState.reject(`Block header hash mismatch.`);
718
+ }
719
+
720
+ const dbArchiveRoot = provingState.block!.archive.root;
721
+ const circuitArchiveRoot = result.inputs.newArchive.root;
722
+ if (!dbArchiveRoot.equals(circuitArchiveRoot)) {
723
+ logger.error(
724
+ `New archive root mismatch.\nCircuit: ${result.inputs.newArchive.root}\nComputed: ${dbArchiveRoot}`,
725
+ );
726
+ provingState.reject(`New archive root mismatch.`);
727
+ }
728
+
729
+ const endBlobAccumulatorPublicInputs = BlobAccumulatorPublicInputs.fromBatchedBlobAccumulator(
730
+ provingState.endBlobAccumulator!,
731
+ );
732
+ const circuitEndBlobAccumulatorState = result.inputs.blobPublicInputs.endBlobAccumulator;
733
+ if (!circuitEndBlobAccumulatorState.equals(endBlobAccumulatorPublicInputs)) {
734
+ logger.error(
735
+ `Blob accumulator state mismatch.\nCircuit: ${inspect(circuitEndBlobAccumulatorState)}\nComputed: ${inspect(
736
+ endBlobAccumulatorPublicInputs,
737
+ )}`,
738
+ );
739
+ provingState.reject(`Blob accumulator state mismatch.`);
683
740
  }
684
741
 
685
742
  logger.debug(`Completed ${rollupType} proof for block ${provingState.block!.number}`);
@@ -688,7 +745,7 @@ export class ProvingOrchestrator implements EpochProver {
688
745
  const epochProvingState = this.provingState!;
689
746
  const leafLocation = epochProvingState.setBlockRootRollupProof(provingState.index, result);
690
747
  if (epochProvingState.totalNumBlocks === 1) {
691
- await this.enqueueEpochPadding(epochProvingState);
748
+ this.enqueueEpochPadding(epochProvingState);
692
749
  } else {
693
750
  this.checkAndEnqueueNextBlockMergeRollup(epochProvingState, leafLocation);
694
751
  }
@@ -710,7 +767,6 @@ export class ProvingOrchestrator implements EpochProver {
710
767
  this.tracer,
711
768
  'ProvingOrchestrator.prover.getBaseParityProof',
712
769
  {
713
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
714
770
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'base-parity' satisfies CircuitName,
715
771
  },
716
772
  signal => this.prover.getBaseParityProof(inputs, signal, provingState.epochNumber),
@@ -746,7 +802,6 @@ export class ProvingOrchestrator implements EpochProver {
746
802
  this.tracer,
747
803
  'ProvingOrchestrator.prover.getRootParityProof',
748
804
  {
749
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
750
805
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'root-parity' satisfies CircuitName,
751
806
  },
752
807
  signal => this.prover.getRootParityProof(inputs, signal, provingState.epochNumber),
@@ -767,14 +822,12 @@ export class ProvingOrchestrator implements EpochProver {
767
822
  }
768
823
 
769
824
  const inputs = provingState.getBlockMergeRollupInputs(location);
770
-
771
825
  this.deferredProving(
772
826
  provingState,
773
827
  wrapCallbackInSpan(
774
828
  this.tracer,
775
829
  'ProvingOrchestrator.prover.getBlockMergeRollupProof',
776
830
  {
777
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
778
831
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'block-merge-rollup' satisfies CircuitName,
779
832
  },
780
833
  signal => this.prover.getBlockMergeRollupProof(inputs, signal, provingState.epochNumber),
@@ -786,26 +839,25 @@ export class ProvingOrchestrator implements EpochProver {
786
839
  );
787
840
  }
788
841
 
789
- private async enqueueEpochPadding(provingState: EpochProvingState) {
842
+ private enqueueEpochPadding(provingState: EpochProvingState) {
790
843
  if (!provingState.verifyState()) {
791
844
  logger.debug('Not running epoch padding. State no longer valid.');
792
845
  return;
793
846
  }
794
847
 
795
- logger.debug('Padding epoch proof with an empty block root proof.');
848
+ logger.debug('Padding epoch proof with a padding block root proof.');
796
849
 
797
- const inputs = await provingState.getPaddingBlockRootInputs(this.proverId);
850
+ const inputs = provingState.getPaddingBlockRootInputs();
798
851
 
799
852
  this.deferredProving(
800
853
  provingState,
801
854
  wrapCallbackInSpan(
802
855
  this.tracer,
803
- 'ProvingOrchestrator.prover.getEmptyBlockRootRollupProof',
856
+ 'ProvingOrchestrator.prover.getPaddingBlockRootRollupProof',
804
857
  {
805
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
806
- [Attributes.PROTOCOL_CIRCUIT_NAME]: 'empty-block-root-rollup' satisfies CircuitName,
858
+ [Attributes.PROTOCOL_CIRCUIT_NAME]: 'padding-block-root-rollup' satisfies CircuitName,
807
859
  },
808
- signal => this.prover.getEmptyBlockRootRollupProof(inputs, signal, provingState.epochNumber),
860
+ signal => this.prover.getPaddingBlockRootRollupProof(inputs, signal, provingState.epochNumber),
809
861
  ),
810
862
  result => {
811
863
  logger.debug('Completed proof for padding block root.');
@@ -824,7 +876,7 @@ export class ProvingOrchestrator implements EpochProver {
824
876
 
825
877
  logger.debug(`Preparing root rollup`);
826
878
 
827
- const inputs = provingState.getRootRollupInputs(this.proverId);
879
+ const inputs = provingState.getRootRollupInputs();
828
880
 
829
881
  this.deferredProving(
830
882
  provingState,
@@ -832,7 +884,6 @@ export class ProvingOrchestrator implements EpochProver {
832
884
  this.tracer,
833
885
  'ProvingOrchestrator.prover.getRootRollupProof',
834
886
  {
835
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
836
887
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'root-rollup' satisfies CircuitName,
837
888
  },
838
889
  signal => this.prover.getRootRollupProof(inputs, signal, provingState.epochNumber),
@@ -859,15 +910,17 @@ export class ProvingOrchestrator implements EpochProver {
859
910
  }
860
911
 
861
912
  private async checkAndEnqueueBlockRootRollup(provingState: BlockProvingState) {
913
+ const blockNumber = provingState.blockNumber;
914
+ // Accumulate as far as we can, in case blocks came in out of order and we are behind:
915
+ await this.provingState?.setBlobAccumulators(blockNumber);
862
916
  if (!provingState.isReadyForBlockRootRollup()) {
863
- logger.debug('Not ready for root rollup');
917
+ logger.debug('Not ready for block root rollup');
864
918
  return;
865
919
  }
866
920
  if (provingState.blockRootRollupStarted) {
867
921
  logger.debug('Block root rollup already started');
868
922
  return;
869
923
  }
870
- const blockNumber = provingState.blockNumber;
871
924
 
872
925
  // TODO(palla/prover): This closes the fork only on the happy path. If this epoch orchestrator
873
926
  // is aborted and never reaches this point, it will leak the fork. We need to add a global cleanup,
@@ -930,21 +983,27 @@ export class ProvingOrchestrator implements EpochProver {
930
983
  async (signal: AbortSignal) => {
931
984
  const inputs = txProvingState.getAvmInputs();
932
985
  try {
933
- return await this.prover.getAvmProof(inputs, signal, provingState.epochNumber);
986
+ // TODO(#14234)[Unconditional PIs validation]: Remove the whole try-catch logic and
987
+ // just keep the next line but removing the second argument (false).
988
+ return await this.prover.getAvmProof(inputs, false, signal, provingState.epochNumber);
934
989
  } catch (err) {
935
990
  if (process.env.AVM_PROVING_STRICT) {
936
991
  logger.error(`Error thrown when proving AVM circuit with AVM_PROVING_STRICT on`, err);
937
992
  throw err;
938
993
  } else {
939
994
  logger.warn(
940
- `Error thrown when proving AVM circuit but AVM_PROVING_STRICT is off. Faking AVM proof and carrying on. ${inspect(
941
- err,
942
- )}.`,
995
+ `Error thrown when proving AVM circuit but AVM_PROVING_STRICT is off. Use snapshotted
996
+ AVM inputs and carrying on. ${inspect(err)}.`,
943
997
  );
944
- return {
945
- proof: makeEmptyRecursiveProof(AVM_PROOF_LENGTH_IN_FIELDS),
946
- verificationKey: VerificationKeyData.makeFake(AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS),
947
- };
998
+
999
+ try {
1000
+ this.metrics.incAvmFallback();
1001
+ const snapshotAvmPrivateInputs = readAvmMinimalPublicTxInputsFromFile();
1002
+ return await this.prover.getAvmProof(snapshotAvmPrivateInputs, true, signal, provingState.epochNumber);
1003
+ } catch (err) {
1004
+ logger.error(`Error thrown when proving snapshotted AVM inputs.`, err);
1005
+ throw err;
1006
+ }
948
1007
  }
949
1008
  }
950
1009
  },
@@ -1,9 +1,17 @@
1
- import { type Histogram, Metrics, type TelemetryClient, type Tracer, ValueType } from '@aztec/telemetry-client';
1
+ import {
2
+ type Histogram,
3
+ Metrics,
4
+ type TelemetryClient,
5
+ type Tracer,
6
+ type UpDownCounter,
7
+ ValueType,
8
+ } from '@aztec/telemetry-client';
2
9
 
3
10
  export class ProvingOrchestratorMetrics {
4
11
  public readonly tracer: Tracer;
5
12
 
6
13
  private baseRollupInputsDuration: Histogram;
14
+ private avmFallbackCount: UpDownCounter;
7
15
 
8
16
  constructor(client: TelemetryClient, name = 'ProvingOrchestrator') {
9
17
  this.tracer = client.getTracer(name);
@@ -14,9 +22,20 @@ export class ProvingOrchestratorMetrics {
14
22
  description: 'Duration to build base rollup inputs',
15
23
  valueType: ValueType.INT,
16
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);
17
32
  }
18
33
 
19
34
  recordBaseRollupInputs(durationMs: number) {
20
35
  this.baseRollupInputsDuration.record(Math.ceil(durationMs));
21
36
  }
37
+
38
+ incAvmFallback() {
39
+ this.avmFallbackCount.add(1);
40
+ }
22
41
  }
@@ -1,5 +1,11 @@
1
- import { type AVM_PROOF_LENGTH_IN_FIELDS, AVM_VK_INDEX, type TUBE_PROOF_LENGTH, TUBE_VK_INDEX } from '@aztec/constants';
2
- import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/vk-tree';
1
+ import {
2
+ AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED,
3
+ AVM_VK_INDEX,
4
+ PRIVATE_TUBE_VK_INDEX,
5
+ PUBLIC_TUBE_VK_INDEX,
6
+ type TUBE_PROOF_LENGTH,
7
+ } from '@aztec/constants';
8
+ import { getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/vk-tree';
3
9
  import type { AvmCircuitInputs } from '@aztec/stdlib/avm';
4
10
  import type { ProofAndVerificationKey } from '@aztec/stdlib/interfaces/server';
5
11
  import {
@@ -16,7 +22,7 @@ import {
16
22
  import type { CircuitName } from '@aztec/stdlib/stats';
17
23
  import type { AppendOnlyTreeSnapshot, MerkleTreeId } from '@aztec/stdlib/trees';
18
24
  import type { ProcessedTx } from '@aztec/stdlib/tx';
19
- import { VkWitnessData } from '@aztec/stdlib/vks';
25
+ import { VerificationKeyData, VkData } from '@aztec/stdlib/vks';
20
26
 
21
27
  /**
22
28
  * Helper class to manage the proving cycle of a transaction
@@ -25,7 +31,7 @@ import { VkWitnessData } from '@aztec/stdlib/vks';
25
31
  */
26
32
  export class TxProvingState {
27
33
  private tube?: ProofAndVerificationKey<typeof TUBE_PROOF_LENGTH>;
28
- private avm?: ProofAndVerificationKey<typeof AVM_PROOF_LENGTH_IN_FIELDS>;
34
+ private avm?: ProofAndVerificationKey<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>;
29
35
 
30
36
  constructor(
31
37
  public readonly processedTx: ProcessedTx,
@@ -42,7 +48,7 @@ export class TxProvingState {
42
48
  }
43
49
 
44
50
  public getTubeInputs() {
45
- return new TubeInputs(this.processedTx.clientIvcProof);
51
+ return new TubeInputs(!!this.processedTx.data.forPublic, this.processedTx.clientIvcProof);
46
52
  }
47
53
 
48
54
  public getAvmInputs(): AvmCircuitInputs {
@@ -67,7 +73,7 @@ export class TxProvingState {
67
73
  this.tube = tubeProofAndVk;
68
74
  }
69
75
 
70
- public setAvmProof(avmProofAndVk: ProofAndVerificationKey<typeof AVM_PROOF_LENGTH_IN_FIELDS>) {
76
+ public setAvmProof(avmProofAndVk: ProofAndVerificationKey<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>) {
71
77
  this.avm = avmProofAndVk;
72
78
  }
73
79
 
@@ -76,7 +82,7 @@ export class TxProvingState {
76
82
  throw new Error('Tx not ready for proving base rollup.');
77
83
  }
78
84
 
79
- const vkData = this.#getTubeVkData();
85
+ const vkData = this.#getVkData(this.tube!.verificationKey, PRIVATE_TUBE_VK_INDEX);
80
86
  const tubeData = new PrivateTubeData(
81
87
  this.processedTx.data.toPrivateToRollupKernelCircuitPublicInputs(),
82
88
  this.tube.proof,
@@ -103,13 +109,13 @@ export class TxProvingState {
103
109
  const tubeData = new PublicTubeData(
104
110
  this.processedTx.data.toPrivateToPublicKernelCircuitPublicInputs(),
105
111
  this.tube.proof,
106
- this.#getTubeVkData(),
112
+ this.#getVkData(this.tube!.verificationKey, PUBLIC_TUBE_VK_INDEX),
107
113
  );
108
114
 
109
115
  const avmProofData = new AvmProofData(
110
116
  this.processedTx.avmProvingRequest.inputs.publicInputs,
111
117
  this.avm.proof,
112
- this.#getAvmVkData(),
118
+ this.#getVkData(this.avm!.verificationKey, AVM_VK_INDEX),
113
119
  );
114
120
 
115
121
  if (!(this.baseRollupHints instanceof PublicBaseRollupHints)) {
@@ -119,21 +125,8 @@ export class TxProvingState {
119
125
  return new PublicBaseRollupInputs(tubeData, avmProofData, this.baseRollupHints);
120
126
  }
121
127
 
122
- #getTubeVkData() {
123
- let vkIndex = TUBE_VK_INDEX;
124
- try {
125
- vkIndex = getVKIndex(this.tube!.verificationKey);
126
- } catch (_ignored) {
127
- // TODO(#7410) The VK for the tube won't be in the tree for now, so we manually set it to the tube vk index
128
- }
129
- const vkPath = getVKSiblingPath(vkIndex);
130
-
131
- return new VkWitnessData(this.tube!.verificationKey, vkIndex, vkPath);
132
- }
133
-
134
- #getAvmVkData() {
135
- const vkIndex = AVM_VK_INDEX;
128
+ #getVkData(verificationKey: VerificationKeyData, vkIndex: number) {
136
129
  const vkPath = getVKSiblingPath(vkIndex);
137
- return new VkWitnessData(this.avm!.verificationKey, AVM_VK_INDEX, vkPath);
130
+ return new VkData(verificationKey, vkIndex, vkPath);
138
131
  }
139
132
  }
@@ -1,17 +1,18 @@
1
1
  import { type ACVMConfig, type BBConfig, BBNativeRollupProver, TestCircuitProver } from '@aztec/bb-prover';
2
2
  import { times } from '@aztec/foundation/collection';
3
- import { Fr } from '@aztec/foundation/fields';
3
+ import type { EthAddress } from '@aztec/foundation/eth-address';
4
4
  import { createLogger } from '@aztec/foundation/log';
5
5
  import { NativeACVMSimulator } from '@aztec/simulator/server';
6
- import type {
7
- ActualProverConfig,
8
- EpochProver,
9
- EpochProverManager,
10
- ForkMerkleTreeOperations,
11
- ProvingJobBroker,
12
- ProvingJobConsumer,
13
- ProvingJobProducer,
14
- ServerCircuitProver,
6
+ import {
7
+ type ActualProverConfig,
8
+ type EpochProver,
9
+ type EpochProverManager,
10
+ type ForkMerkleTreeOperations,
11
+ type ProvingJobBroker,
12
+ type ProvingJobConsumer,
13
+ type ProvingJobProducer,
14
+ type ServerCircuitProver,
15
+ tryStop,
15
16
  } from '@aztec/stdlib/interfaces/server';
16
17
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
17
18
 
@@ -48,8 +49,8 @@ export class ProverClient implements EpochProverManager {
48
49
  return new ServerEpochProver(facade, orchestrator);
49
50
  }
50
51
 
51
- public getProverId(): Fr {
52
- return this.config.proverId ?? Fr.ZERO;
52
+ public getProverId(): EthAddress {
53
+ return this.config.proverId;
53
54
  }
54
55
 
55
56
  async updateProverConfig(config: Partial<ProverClientConfig>): Promise<void> {
@@ -87,6 +88,7 @@ export class ProverClient implements EpochProverManager {
87
88
  }
88
89
  this.running = false;
89
90
  await this.stopAgents();
91
+ await tryStop(this.orchestratorClient);
90
92
  }
91
93
 
92
94
  /**
@@ -154,9 +156,9 @@ export function buildServerCircuitProver(
154
156
  return BBNativeRollupProver.new(config, telemetry);
155
157
  }
156
158
 
157
- const simulationProvider = config.acvmBinaryPath
159
+ const simulator = config.acvmBinaryPath
158
160
  ? new NativeACVMSimulator(config.acvmWorkingDirectory, config.acvmBinaryPath)
159
161
  : undefined;
160
162
 
161
- return Promise.resolve(new TestCircuitProver(simulationProvider, config, telemetry));
163
+ return Promise.resolve(new TestCircuitProver(simulator, config, telemetry));
162
164
  }