@aztec/prover-client 0.70.0 → 0.72.1

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.d.ts +2 -0
  2. package/dest/bin/get-proof-inputs.d.ts.map +1 -0
  3. package/dest/bin/get-proof-inputs.js +50 -0
  4. package/dest/block_builder/light.d.ts +3 -4
  5. package/dest/block_builder/light.d.ts.map +1 -1
  6. package/dest/block_builder/light.js +8 -11
  7. package/dest/config.js +2 -2
  8. package/dest/mocks/test_context.d.ts +2 -1
  9. package/dest/mocks/test_context.d.ts.map +1 -1
  10. package/dest/mocks/test_context.js +13 -11
  11. package/dest/orchestrator/block-building-helpers.d.ts +8 -7
  12. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  13. package/dest/orchestrator/block-building-helpers.js +20 -16
  14. package/dest/orchestrator/block-proving-state.d.ts +9 -10
  15. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  16. package/dest/orchestrator/block-proving-state.js +70 -52
  17. package/dest/orchestrator/epoch-proving-state.d.ts +5 -5
  18. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  19. package/dest/orchestrator/epoch-proving-state.js +8 -29
  20. package/dest/orchestrator/orchestrator.d.ts +4 -3
  21. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  22. package/dest/orchestrator/orchestrator.js +24 -43
  23. package/dest/prover-agent/memory-proving-queue.d.ts +1 -1
  24. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  25. package/dest/prover-agent/memory-proving-queue.js +2 -2
  26. package/dest/prover-agent/prover-agent.d.ts +0 -2
  27. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  28. package/dest/prover-agent/prover-agent.js +4 -6
  29. package/dest/prover-agent/rpc.d.ts +1 -1
  30. package/dest/prover-agent/rpc.d.ts.map +1 -1
  31. package/dest/prover-agent/rpc.js +6 -6
  32. package/dest/prover-client/factory.d.ts.map +1 -1
  33. package/dest/prover-client/factory.js +3 -3
  34. package/dest/prover-client/prover-client.d.ts +4 -2
  35. package/dest/prover-client/prover-client.d.ts.map +1 -1
  36. package/dest/prover-client/prover-client.js +13 -15
  37. package/dest/prover-client/server-epoch-prover.d.ts +1 -1
  38. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  39. package/dest/prover-client/server-epoch-prover.js +3 -3
  40. package/dest/proving_broker/broker_prover_facade.d.ts +4 -3
  41. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  42. package/dest/proving_broker/broker_prover_facade.js +25 -6
  43. package/dest/proving_broker/factory.d.ts.map +1 -1
  44. package/dest/proving_broker/factory.js +3 -3
  45. package/dest/proving_broker/index.d.ts +1 -1
  46. package/dest/proving_broker/index.d.ts.map +1 -1
  47. package/dest/proving_broker/index.js +2 -2
  48. package/dest/proving_broker/proof_store/factory.d.ts +6 -0
  49. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
  50. package/dest/proving_broker/proof_store/factory.js +39 -0
  51. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +13 -0
  52. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
  53. package/dest/proving_broker/proof_store/gcs_proof_store.js +46 -0
  54. package/dest/proving_broker/proof_store/index.d.ts +4 -0
  55. package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
  56. package/dest/proving_broker/proof_store/index.js +4 -0
  57. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +14 -0
  58. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
  59. package/dest/proving_broker/proof_store/inline_proof_store.js +37 -0
  60. package/dest/proving_broker/{proof_store.d.ts → proof_store/proof_store.d.ts} +1 -12
  61. package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
  62. package/dest/proving_broker/proof_store/proof_store.js +2 -0
  63. package/dest/proving_broker/proving_agent.d.ts +4 -4
  64. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  65. package/dest/proving_broker/proving_agent.js +5 -5
  66. package/dest/proving_broker/proving_broker.d.ts +1 -1
  67. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  68. package/dest/proving_broker/proving_broker.js +3 -3
  69. package/dest/proving_broker/proving_broker_database/persisted.d.ts +1 -1
  70. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  71. package/dest/proving_broker/proving_broker_database/persisted.js +4 -4
  72. package/dest/proving_broker/rpc.d.ts +3 -3
  73. package/dest/proving_broker/rpc.d.ts.map +1 -1
  74. package/dest/proving_broker/rpc.js +7 -7
  75. package/dest/test/mock_prover.d.ts +2 -2
  76. package/dest/test/mock_prover.d.ts.map +1 -1
  77. package/dest/test/mock_prover.js +4 -5
  78. package/package.json +14 -12
  79. package/src/bin/get-proof-inputs.ts +60 -0
  80. package/src/block_builder/light.ts +6 -11
  81. package/src/config.ts +1 -1
  82. package/src/mocks/test_context.ts +12 -11
  83. package/src/orchestrator/block-building-helpers.ts +358 -326
  84. package/src/orchestrator/block-proving-state.ts +81 -57
  85. package/src/orchestrator/epoch-proving-state.ts +16 -45
  86. package/src/orchestrator/orchestrator.ts +49 -79
  87. package/src/prover-agent/memory-proving-queue.ts +1 -1
  88. package/src/prover-agent/prover-agent.ts +10 -4
  89. package/src/prover-agent/rpc.ts +5 -5
  90. package/src/prover-client/factory.ts +2 -3
  91. package/src/prover-client/prover-client.ts +14 -15
  92. package/src/prover-client/server-epoch-prover.ts +6 -2
  93. package/src/proving_broker/broker_prover_facade.ts +28 -5
  94. package/src/proving_broker/factory.ts +9 -5
  95. package/src/proving_broker/index.ts +1 -1
  96. package/src/proving_broker/proof_store/factory.ts +42 -0
  97. package/src/proving_broker/proof_store/gcs_proof_store.ts +72 -0
  98. package/src/proving_broker/proof_store/index.ts +3 -0
  99. package/src/proving_broker/{proof_store.ts → proof_store/inline_proof_store.ts} +1 -44
  100. package/src/proving_broker/proof_store/proof_store.ts +54 -0
  101. package/src/proving_broker/proving_agent.ts +11 -5
  102. package/src/proving_broker/proving_broker.ts +8 -2
  103. package/src/proving_broker/proving_broker_database/persisted.ts +3 -3
  104. package/src/proving_broker/rpc.ts +13 -6
  105. package/src/test/mock_prover.ts +3 -4
  106. package/dest/proving_broker/proof_store.d.ts.map +0 -1
  107. package/dest/proving_broker/proof_store.js +0 -37
@@ -11,7 +11,6 @@ import {
11
11
  type L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
12
12
  MembershipWitness,
13
13
  type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
14
- type NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
15
14
  NUM_BASE_PARITY_PER_ROOT_PARITY,
16
15
  type ParityPublicInputs,
17
16
  type RECURSIVE_PROOF_LENGTH,
@@ -24,6 +23,7 @@ import { SpongeBlob } from '@aztec/circuits.js/blobs';
24
23
  import {
25
24
  type BaseOrMergeRollupPublicInputs,
26
25
  type BlockRootOrBlockMergePublicInputs,
26
+ BlockRootRollupBlobData,
27
27
  BlockRootRollupData,
28
28
  BlockRootRollupInputs,
29
29
  ConstantRollupData,
@@ -68,14 +68,12 @@ export class BlockProvingState {
68
68
  constructor(
69
69
  public readonly index: number,
70
70
  public readonly globalVariables: GlobalVariables,
71
- public readonly newL1ToL2Messages: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>,
72
- private readonly messageTreeSnapshot: AppendOnlyTreeSnapshot,
73
- private readonly messageTreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>,
74
- private readonly messageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot,
75
- private readonly archiveTreeSnapshot: AppendOnlyTreeSnapshot,
76
- private readonly archiveTreeRootSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
71
+ public readonly newL1ToL2Messages: Fr[],
72
+ private readonly l1ToL2MessageSubtreeSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>,
73
+ private readonly l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot,
74
+ private readonly lastArchiveSnapshot: AppendOnlyTreeSnapshot,
75
+ private readonly newArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
77
76
  private readonly previousBlockHeader: BlockHeader,
78
- private readonly previousBlockHash: Fr,
79
77
  private readonly parentEpoch: EpochProvingState,
80
78
  ) {
81
79
  this.baseParityProvingOutputs = Array.from({ length: NUM_BASE_PARITY_PER_ROOT_PARITY }).map(_ => undefined);
@@ -176,11 +174,8 @@ export class BlockProvingState {
176
174
  }
177
175
 
178
176
  public getBlockRootRollupTypeAndInputs(proverId: Fr) {
179
- if (this.totalNumTxs === 0) {
180
- return {
181
- rollupType: 'empty-block-root-rollup' satisfies CircuitName,
182
- inputs: this.#getEmptyBlockRootInputs(proverId),
183
- };
177
+ if (!this.rootParityProvingOutput) {
178
+ throw new Error('Root parity is not ready.');
184
179
  }
185
180
 
186
181
  const proofs = this.#getChildProofsForBlockRoot();
@@ -189,41 +184,88 @@ export class BlockProvingState {
189
184
  throw new Error('At lease one child is not ready for the block root.');
190
185
  }
191
186
 
192
- const previousRollupData = nonEmptyProofs.map(p => this.#getPreviousRollupData(p!));
193
187
  const data = this.#getBlockRootRollupData(proverId);
194
188
 
189
+ if (this.totalNumTxs === 0) {
190
+ const constants = ConstantRollupData.from({
191
+ lastArchive: this.lastArchiveSnapshot,
192
+ globalVariables: this.globalVariables,
193
+ vkTreeRoot: getVKTreeRoot(),
194
+ protocolContractTreeRoot,
195
+ });
196
+
197
+ return {
198
+ rollupType: 'empty-block-root-rollup' satisfies CircuitName,
199
+ inputs: EmptyBlockRootRollupInputs.from({
200
+ data,
201
+ constants,
202
+ isPadding: false,
203
+ }),
204
+ };
205
+ }
206
+
207
+ const previousRollupData = nonEmptyProofs.map(p => this.#getPreviousRollupData(p!));
208
+ const blobData = this.#getBlockRootRollupBlobData();
209
+
195
210
  if (previousRollupData.length === 1) {
196
211
  return {
197
212
  rollupType: 'single-tx-block-root-rollup' satisfies CircuitName,
198
- inputs: new SingleTxBlockRootRollupInputs(previousRollupData as [PreviousRollupData], data),
213
+ inputs: new SingleTxBlockRootRollupInputs(previousRollupData as [PreviousRollupData], data, blobData),
199
214
  };
200
215
  } else {
201
216
  return {
202
217
  rollupType: 'block-root-rollup' satisfies CircuitName,
203
- inputs: new BlockRootRollupInputs(previousRollupData as [PreviousRollupData, PreviousRollupData], data),
218
+ inputs: new BlockRootRollupInputs(
219
+ previousRollupData as [PreviousRollupData, PreviousRollupData],
220
+ data,
221
+ blobData,
222
+ ),
204
223
  };
205
224
  }
206
225
  }
207
226
 
227
+ public getPaddingBlockRootInputs(proverId: Fr) {
228
+ if (!this.rootParityProvingOutput) {
229
+ throw new Error('Root parity is not ready.');
230
+ }
231
+
232
+ // Use the new block header and archive of the current block as the previous header and archiver of the next padding block.
233
+ const newBlockHeader = this.buildHeaderFromProvingOutputs();
234
+ const newArchive = this.blockRootProvingOutput!.inputs.newArchive;
235
+
236
+ const data = BlockRootRollupData.from({
237
+ l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput!),
238
+ l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
239
+ newArchiveSiblingPath: this.newArchiveSiblingPath,
240
+ previousBlockHeader: newBlockHeader,
241
+ proverId,
242
+ });
243
+
244
+ const constants = ConstantRollupData.from({
245
+ lastArchive: newArchive,
246
+ globalVariables: this.globalVariables,
247
+ vkTreeRoot: getVKTreeRoot(),
248
+ protocolContractTreeRoot,
249
+ });
250
+
251
+ return EmptyBlockRootRollupInputs.from({
252
+ data,
253
+ constants,
254
+ isPadding: true,
255
+ });
256
+ }
257
+
208
258
  public getRootParityInputs() {
209
259
  if (!this.baseParityProvingOutputs.every(p => !!p)) {
210
260
  throw new Error('At lease one base parity is not ready.');
211
261
  }
212
262
 
213
- const children = this.baseParityProvingOutputs.map(p => this.#getRootParityInputFromProvingOutput(p!));
263
+ const children = this.baseParityProvingOutputs.map(p => this.#getRootParityData(p!));
214
264
  return new RootParityInputs(
215
265
  children as Tuple<RootParityInput<typeof RECURSIVE_PROOF_LENGTH>, typeof NUM_BASE_PARITY_PER_ROOT_PARITY>,
216
266
  );
217
267
  }
218
268
 
219
- public getL1ToL2Roots() {
220
- if (!this.rootParityProvingOutput) {
221
- throw new Error('Root parity is not ready.');
222
- }
223
-
224
- return this.#getRootParityInputFromProvingOutput(this.rootParityProvingOutput);
225
- }
226
-
227
269
  // Returns a specific transaction proving state
228
270
  public getTxProvingState(txIndex: number) {
229
271
  return this.txs[txIndex];
@@ -242,7 +284,7 @@ export class BlockProvingState {
242
284
  }
243
285
  endPartialState = lastRollup.inputs.end;
244
286
  }
245
- const endState = new StateReference(this.messageTreeSnapshotAfterInsertion, endPartialState);
287
+ const endState = new StateReference(this.l1ToL2MessageTreeSnapshotAfterInsertion, endPartialState);
246
288
 
247
289
  return buildHeaderFromCircuitOutputs(
248
290
  previousRollupData.map(d => d.baseOrMergeRollupPublicInputs),
@@ -268,6 +310,10 @@ export class BlockProvingState {
268
310
  return this.baseParityProvingOutputs.every(p => !!p);
269
311
  }
270
312
 
313
+ public isComplete() {
314
+ return !!this.blockRootProvingOutput;
315
+ }
316
+
271
317
  // Returns whether the proving state is still valid
272
318
  public verifyState() {
273
319
  return this.parentEpoch.verifyState();
@@ -278,38 +324,20 @@ export class BlockProvingState {
278
324
  this.parentEpoch.reject(reason);
279
325
  }
280
326
 
281
- #getEmptyBlockRootInputs(proverId: Fr) {
282
- const l1ToL2Roots = this.getL1ToL2Roots();
283
- const constants = ConstantRollupData.from({
284
- lastArchive: this.archiveTreeSnapshot,
285
- globalVariables: this.globalVariables,
286
- vkTreeRoot: getVKTreeRoot(),
287
- protocolContractTreeRoot,
288
- });
289
-
290
- return EmptyBlockRootRollupInputs.from({
291
- l1ToL2Roots,
292
- newL1ToL2MessageTreeRootSiblingPath: this.messageTreeRootSiblingPath,
293
- startL1ToL2MessageTreeSnapshot: this.messageTreeSnapshot,
294
- newArchiveSiblingPath: this.archiveTreeRootSiblingPath,
295
- previousBlockHash: this.previousBlockHash,
296
- previousPartialState: this.previousBlockHeader.state.partial,
297
- constants,
327
+ #getBlockRootRollupData(proverId: Fr) {
328
+ return BlockRootRollupData.from({
329
+ l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput!),
330
+ l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
331
+ newArchiveSiblingPath: this.newArchiveSiblingPath,
332
+ previousBlockHeader: this.previousBlockHeader,
298
333
  proverId,
299
- isPadding: false,
300
334
  });
301
335
  }
302
336
 
303
- #getBlockRootRollupData(proverId: Fr) {
337
+ #getBlockRootRollupBlobData() {
304
338
  const txEffects = this.txs.map(txProvingState => txProvingState.processedTx.txEffect);
305
339
  const { blobFields, blobCommitments, blobsHash } = buildBlobHints(txEffects);
306
- return BlockRootRollupData.from({
307
- l1ToL2Roots: this.getL1ToL2Roots(),
308
- newL1ToL2MessageTreeRootSiblingPath: this.messageTreeRootSiblingPath,
309
- startL1ToL2MessageTreeSnapshot: this.messageTreeSnapshot,
310
- newArchiveSiblingPath: this.archiveTreeRootSiblingPath,
311
- previousBlockHash: this.previousBlockHash,
312
- proverId,
340
+ return BlockRootRollupBlobData.from({
313
341
  blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK),
314
342
  blobCommitments: padArrayEnd(blobCommitments, [Fr.ZERO, Fr.ZERO], BLOBS_PER_BLOCK),
315
343
  blobsHash,
@@ -342,11 +370,7 @@ export class BlockProvingState {
342
370
  );
343
371
  }
344
372
 
345
- #getRootParityInputFromProvingOutput({
346
- inputs,
347
- proof,
348
- verificationKey,
349
- }: PublicInputsAndRecursiveProof<ParityPublicInputs>) {
373
+ #getRootParityData({ inputs, proof, verificationKey }: PublicInputsAndRecursiveProof<ParityPublicInputs>) {
350
374
  return new RootParityInput(
351
375
  proof,
352
376
  verificationKey.keyAsFields,
@@ -4,33 +4,27 @@ import {
4
4
  type PublicInputsAndRecursiveProof,
5
5
  } from '@aztec/circuit-types';
6
6
  import {
7
- ARCHIVE_HEIGHT,
8
- AppendOnlyTreeSnapshot,
7
+ type ARCHIVE_HEIGHT,
8
+ type AppendOnlyTreeSnapshot,
9
9
  type BlockHeader,
10
- Fr,
10
+ type Fr,
11
11
  type GlobalVariables,
12
- L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
12
+ type L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
13
13
  MembershipWitness,
14
14
  type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
15
- NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
16
15
  type TUBE_PROOF_LENGTH,
17
16
  VK_TREE_HEIGHT,
18
17
  } from '@aztec/circuits.js';
19
18
  import {
20
19
  BlockMergeRollupInputs,
21
20
  type BlockRootOrBlockMergePublicInputs,
22
- ConstantRollupData,
23
- EmptyBlockRootRollupInputs,
24
21
  PreviousRollupBlockData,
25
22
  RootRollupInputs,
26
23
  type RootRollupPublicInputs,
27
24
  } from '@aztec/circuits.js/rollup';
28
- import { makeTuple } from '@aztec/foundation/array';
29
- import { padArrayEnd } from '@aztec/foundation/collection';
30
25
  import { type Tuple } from '@aztec/foundation/serialize';
31
26
  import { type TreeNodeLocation, UnbalancedTreeStore } from '@aztec/foundation/trees';
32
- import { getVKIndex, getVKSiblingPath, getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vks';
33
- import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
27
+ import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/vks';
34
28
 
35
29
  import { BlockProvingState } from './block-proving-state.js';
36
30
 
@@ -81,26 +75,22 @@ export class EpochProvingState {
81
75
  public startNewBlock(
82
76
  globalVariables: GlobalVariables,
83
77
  l1ToL2Messages: Fr[],
84
- messageTreeSnapshot: AppendOnlyTreeSnapshot,
85
- messageTreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>,
86
- messageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot,
87
- archiveTreeSnapshot: AppendOnlyTreeSnapshot,
88
- archiveTreeRootSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
78
+ l1ToL2MessageSubtreeSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>,
79
+ l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot,
80
+ lastArchiveSnapshot: AppendOnlyTreeSnapshot,
81
+ newArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
89
82
  previousBlockHeader: BlockHeader,
90
- previousBlockHash: Fr,
91
83
  ): BlockProvingState {
92
84
  const index = globalVariables.blockNumber.toNumber() - this.firstBlockNumber;
93
85
  const block = new BlockProvingState(
94
86
  index,
95
87
  globalVariables,
96
- padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP),
97
- messageTreeSnapshot,
98
- messageTreeRootSiblingPath,
99
- messageTreeSnapshotAfterInsertion,
100
- archiveTreeSnapshot,
101
- archiveTreeRootSiblingPath,
88
+ l1ToL2Messages,
89
+ l1ToL2MessageSubtreeSiblingPath,
90
+ l1ToL2MessageTreeSnapshotAfterInsertion,
91
+ lastArchiveSnapshot,
92
+ newArchiveSiblingPath,
102
93
  previousBlockHeader,
103
- previousBlockHash,
104
94
  this,
105
95
  );
106
96
  this.blocks[index] = block;
@@ -182,30 +172,11 @@ export class EpochProvingState {
182
172
  }
183
173
 
184
174
  public getPaddingBlockRootInputs(proverId: Fr) {
185
- const { block } = this.blocks[0] ?? {};
186
- const l1ToL2Roots = this.blocks[0]?.getL1ToL2Roots();
187
- if (!block || !l1ToL2Roots) {
175
+ if (!this.blocks[0]?.isComplete()) {
188
176
  throw new Error('Epoch needs one completed block in order to be padded.');
189
177
  }
190
178
 
191
- const constants = ConstantRollupData.from({
192
- lastArchive: block.archive,
193
- globalVariables: block.header.globalVariables,
194
- vkTreeRoot: getVKTreeRoot(),
195
- protocolContractTreeRoot,
196
- });
197
-
198
- return EmptyBlockRootRollupInputs.from({
199
- l1ToL2Roots,
200
- newL1ToL2MessageTreeRootSiblingPath: makeTuple(L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, Fr.zero),
201
- startL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot.zero(),
202
- newArchiveSiblingPath: makeTuple(ARCHIVE_HEIGHT, Fr.zero),
203
- previousBlockHash: block.header.hash(),
204
- previousPartialState: block.header.state.partial,
205
- constants,
206
- proverId,
207
- isPadding: true,
208
- });
179
+ return this.blocks[0].getPaddingBlockRootInputs(proverId);
209
180
  }
210
181
 
211
182
  // Returns a specific transaction proving state
@@ -18,16 +18,13 @@ import {
18
18
  AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS,
19
19
  type AppendOnlyTreeSnapshot,
20
20
  BaseParityInputs,
21
- BlockHeader,
22
- ContentCommitment,
21
+ type BlockHeader,
23
22
  Fr,
24
- GlobalVariables,
23
+ type GlobalVariables,
25
24
  L1_TO_L2_MSG_SUBTREE_HEIGHT,
26
25
  L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
27
26
  NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
28
27
  NUM_BASE_PARITY_PER_ROOT_PARITY,
29
- PartialStateReference,
30
- StateReference,
31
28
  type TUBE_PROOF_LENGTH,
32
29
  VerificationKeyData,
33
30
  makeEmptyRecursiveProof,
@@ -39,17 +36,23 @@ import {
39
36
  SingleTxBlockRootRollupInputs,
40
37
  TubeInputs,
41
38
  } from '@aztec/circuits.js/rollup';
42
- import { makeTuple } from '@aztec/foundation/array';
43
39
  import { padArrayEnd } from '@aztec/foundation/collection';
44
40
  import { AbortError } from '@aztec/foundation/error';
45
41
  import { createLogger } from '@aztec/foundation/log';
46
42
  import { promiseWithResolvers } from '@aztec/foundation/promise';
47
- import { type Tuple } from '@aztec/foundation/serialize';
43
+ import { assertLength } from '@aztec/foundation/serialize';
48
44
  import { pushTestData } from '@aztec/foundation/testing';
49
45
  import { elapsed } from '@aztec/foundation/timer';
50
46
  import { type TreeNodeLocation } from '@aztec/foundation/trees';
51
47
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vks';
52
- import { Attributes, type TelemetryClient, type Tracer, trackSpan, wrapCallbackInSpan } from '@aztec/telemetry-client';
48
+ import {
49
+ Attributes,
50
+ type TelemetryClient,
51
+ type Tracer,
52
+ getTelemetryClient,
53
+ trackSpan,
54
+ wrapCallbackInSpan,
55
+ } from '@aztec/telemetry-client';
53
56
 
54
57
  import { inspect } from 'util';
55
58
 
@@ -94,8 +97,8 @@ export class ProvingOrchestrator implements EpochProver {
94
97
  constructor(
95
98
  private dbProvider: ForkMerkleTreeOperations,
96
99
  private prover: ServerCircuitProver,
97
- telemetryClient: TelemetryClient,
98
100
  private readonly proverId: Fr = Fr.ZERO,
101
+ telemetryClient: TelemetryClient = getTelemetryClient(),
99
102
  ) {
100
103
  this.metrics = new ProvingOrchestratorMetrics(telemetryClient, 'ProvingOrchestrator');
101
104
  }
@@ -133,7 +136,7 @@ export class ProvingOrchestrator implements EpochProver {
133
136
  @trackSpan('ProvingOrchestrator.startNewBlock', globalVariables => ({
134
137
  [Attributes.BLOCK_NUMBER]: globalVariables.blockNumber.toNumber(),
135
138
  }))
136
- public async startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[]) {
139
+ public async startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[], previousBlockHeader: BlockHeader) {
137
140
  if (!this.provingState) {
138
141
  throw new Error(`Invalid proving state, call startNewEpoch before starting a block`);
139
142
  }
@@ -151,70 +154,21 @@ export class ProvingOrchestrator implements EpochProver {
151
154
  this.dbs.set(globalVariables.blockNumber.toNumber(), db);
152
155
 
153
156
  // we start the block by enqueueing all of the base parity circuits
154
- let baseParityInputs: BaseParityInputs[] = [];
155
- let l1ToL2MessagesPadded: Tuple<Fr, typeof NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP>;
156
- try {
157
- l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
158
- } catch (err) {
159
- throw new Error('Too many L1 to L2 messages');
160
- }
161
- baseParityInputs = Array.from({ length: NUM_BASE_PARITY_PER_ROOT_PARITY }, (_, i) =>
162
- BaseParityInputs.fromSlice(l1ToL2MessagesPadded, i, getVKTreeRoot()),
163
- );
164
-
165
- const messageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
166
-
167
- const newL1ToL2MessageTreeRootSiblingPathArray = await getSubtreeSiblingPath(
168
- MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
169
- L1_TO_L2_MSG_SUBTREE_HEIGHT,
170
- db,
171
- );
172
-
173
- const newL1ToL2MessageTreeRootSiblingPath = makeTuple(
174
- L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
175
- i =>
176
- i < newL1ToL2MessageTreeRootSiblingPathArray.length ? newL1ToL2MessageTreeRootSiblingPathArray[i] : Fr.ZERO,
177
- 0,
178
- );
179
-
180
- // Update the local trees to include the new l1 to l2 messages
181
- await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
182
- const messageTreeSnapshotAfterInsertion = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
157
+ const { l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, baseParityInputs } =
158
+ await this.prepareBaseParityInputs(l1ToL2Messages, db);
183
159
 
184
160
  // Get archive snapshot before this block lands
185
- const startArchiveSnapshot = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
161
+ const lastArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
186
162
  const newArchiveSiblingPath = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE, db);
187
- const previousBlockHash = await db.getLeafValue(
188
- MerkleTreeId.ARCHIVE,
189
- BigInt(startArchiveSnapshot.nextAvailableLeafIndex - 1),
190
- );
191
-
192
- const partial = new PartialStateReference(
193
- await getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE, db),
194
- await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE, db),
195
- await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE, db),
196
- );
197
- const state = new StateReference(messageTreeSnapshot, partial);
198
- // TODO: Construct the full previousBlockHeader.
199
- const previousBlockHeader = BlockHeader.from({
200
- lastArchive: startArchiveSnapshot,
201
- contentCommitment: ContentCommitment.empty(),
202
- state,
203
- globalVariables: GlobalVariables.empty(),
204
- totalFees: Fr.ZERO,
205
- totalManaUsed: Fr.ZERO,
206
- });
207
163
 
208
164
  const blockProvingState = this.provingState!.startNewBlock(
209
165
  globalVariables,
210
- l1ToL2MessagesPadded,
211
- messageTreeSnapshot,
212
- newL1ToL2MessageTreeRootSiblingPath,
213
- messageTreeSnapshotAfterInsertion,
214
- startArchiveSnapshot,
166
+ l1ToL2Messages,
167
+ l1ToL2MessageSubtreeSiblingPath,
168
+ l1ToL2MessageTreeSnapshotAfterInsertion,
169
+ lastArchive,
215
170
  newArchiveSiblingPath,
216
171
  previousBlockHeader,
217
- previousBlockHash!,
218
172
  );
219
173
 
220
174
  // Enqueue base parity circuits for the block
@@ -263,11 +217,6 @@ export class ProvingOrchestrator implements EpochProver {
263
217
 
264
218
  logger.info(`Received transaction: ${tx.hash}`);
265
219
 
266
- if (tx.isEmpty) {
267
- logger.warn(`Ignoring empty transaction ${tx.hash} - it will not be added to this block`);
268
- continue;
269
- }
270
-
271
220
  const [hints, treeSnapshots] = await this.prepareTransaction(tx, provingState);
272
221
  const txProvingState = new TxProvingState(tx, hints, treeSnapshots);
273
222
  const txIndex = provingState.addNewTx(txProvingState);
@@ -500,6 +449,33 @@ export class ProvingOrchestrator implements EpochProver {
500
449
  setImmediate(safeJob);
501
450
  }
502
451
 
452
+ private async prepareBaseParityInputs(l1ToL2Messages: Fr[], db: MerkleTreeWriteOperations) {
453
+ const l1ToL2MessagesPadded = padArrayEnd(
454
+ l1ToL2Messages,
455
+ Fr.ZERO,
456
+ NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
457
+ 'Too many L1 to L2 messages',
458
+ );
459
+ const baseParityInputs = Array.from({ length: NUM_BASE_PARITY_PER_ROOT_PARITY }, (_, i) =>
460
+ BaseParityInputs.fromSlice(l1ToL2MessagesPadded, i, getVKTreeRoot()),
461
+ );
462
+
463
+ const l1ToL2MessageSubtreeSiblingPath = assertLength(
464
+ await getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT, db),
465
+ L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
466
+ );
467
+
468
+ // Update the local trees to include the new l1 to l2 messages
469
+ await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
470
+ const l1ToL2MessageTreeSnapshotAfterInsertion = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
471
+
472
+ return {
473
+ l1ToL2MessageSubtreeSiblingPath,
474
+ l1ToL2MessageTreeSnapshotAfterInsertion,
475
+ baseParityInputs,
476
+ };
477
+ }
478
+
503
479
  // Updates the merkle trees for a transaction. The first enqueued job for a transaction
504
480
  @trackSpan('ProvingOrchestrator.prepareBaseRollupInputs', (_, tx) => ({
505
481
  [Attributes.TX_HASH]: tx.hash.toString(),
@@ -521,9 +497,7 @@ export class ProvingOrchestrator implements EpochProver {
521
497
  buildBaseRollupHints(tx, provingState.globalVariables, db, provingState.spongeBlobState),
522
498
  );
523
499
 
524
- if (!tx.isEmpty) {
525
- this.metrics.recordBaseRollupInputs(ms);
526
- }
500
+ this.metrics.recordBaseRollupInputs(ms);
527
501
 
528
502
  const promises = [MerkleTreeId.NOTE_HASH_TREE, MerkleTreeId.NULLIFIER_TREE, MerkleTreeId.PUBLIC_DATA_TREE].map(
529
503
  async (id: MerkleTreeId) => {
@@ -551,11 +525,7 @@ export class ProvingOrchestrator implements EpochProver {
551
525
  const { processedTx } = txProvingState;
552
526
  const { rollupType, inputs } = txProvingState.getBaseRollupTypeAndInputs();
553
527
 
554
- logger.debug(
555
- `Enqueuing deferred proving base rollup${
556
- processedTx.isEmpty ? ' with padding tx' : ''
557
- } for ${processedTx.hash.toString()}`,
558
- );
528
+ logger.debug(`Enqueuing deferred proving base rollup for ${processedTx.hash.toString()}`);
559
529
 
560
530
  this.deferredProving(
561
531
  provingState,
@@ -40,7 +40,7 @@ import { type PromiseWithResolvers, RunningPromise, promiseWithResolvers } from
40
40
  import { PriorityMemoryQueue } from '@aztec/foundation/queue';
41
41
  import { type TelemetryClient, type Tracer, trackSpan } from '@aztec/telemetry-client';
42
42
 
43
- import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store.js';
43
+ import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store/index.js';
44
44
  import { ProvingQueueMetrics } from './queue_metrics.js';
45
45
 
46
46
  type ProvingJobWithResolvers<T extends ProvingRequestType = ProvingRequestType> = ProvingJob &
@@ -11,10 +11,16 @@ import {
11
11
  import { createLogger } from '@aztec/foundation/log';
12
12
  import { RunningPromise } from '@aztec/foundation/running-promise';
13
13
  import { elapsed } from '@aztec/foundation/timer';
14
- import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client';
15
- import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
14
+ import {
15
+ Attributes,
16
+ type TelemetryClient,
17
+ type Traceable,
18
+ type Tracer,
19
+ getTelemetryClient,
20
+ trackSpan,
21
+ } from '@aztec/telemetry-client';
16
22
 
17
- import { InlineProofStore } from '../proving_broker/proof_store.js';
23
+ import { InlineProofStore } from '../proving_broker/proof_store/index.js';
18
24
 
19
25
  const PRINT_THRESHOLD_NS = 6e10; // 60 seconds
20
26
 
@@ -42,7 +48,7 @@ export class ProverAgent implements ProverAgentApi, Traceable {
42
48
  /** How long to wait between jobs */
43
49
  private pollIntervalMs = 100,
44
50
  /** Telemetry client */
45
- private telemetry: TelemetryClient = new NoopTelemetryClient(),
51
+ telemetry: TelemetryClient = getTelemetryClient(),
46
52
  /** Logger */
47
53
  private log = createLogger('prover-client:prover-agent'),
48
54
  ) {
@@ -1,14 +1,14 @@
1
1
  import { ProverAgentApiSchema, type ProvingJobSource, ProvingJobSourceSchema } from '@aztec/circuit-types';
2
- import { createSafeJsonRpcClient, makeFetch } from '@aztec/foundation/json-rpc/client';
3
- import { createSafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
2
+ import { createSafeJsonRpcClient } from '@aztec/foundation/json-rpc/client';
3
+ import { createTracedJsonRpcServer, makeTracedFetch } from '@aztec/telemetry-client';
4
4
 
5
5
  import { type ProverAgent } from './prover-agent.js';
6
6
 
7
7
  export function createProvingJobSourceServer(queue: ProvingJobSource) {
8
- return createSafeJsonRpcServer(queue, ProvingJobSourceSchema);
8
+ return createTracedJsonRpcServer(queue, ProvingJobSourceSchema);
9
9
  }
10
10
 
11
- export function createProvingJobSourceClient(url: string, fetch = makeFetch([1, 2, 3], false)): ProvingJobSource {
11
+ export function createProvingJobSourceClient(url: string, fetch = makeTracedFetch([1, 2, 3], false)): ProvingJobSource {
12
12
  return createSafeJsonRpcClient(url, ProvingJobSourceSchema, false, 'provingJobSource', fetch);
13
13
  }
14
14
 
@@ -18,5 +18,5 @@ export function createProvingJobSourceClient(url: string, fetch = makeFetch([1,
18
18
  * @returns An JSON-RPC HTTP server
19
19
  */
20
20
  export function createProverAgentRpcServer(agent: ProverAgent) {
21
- return createSafeJsonRpcServer(agent, ProverAgentApiSchema);
21
+ return createTracedJsonRpcServer(agent, ProverAgentApiSchema);
22
22
  }
@@ -1,6 +1,5 @@
1
1
  import { type ForkMerkleTreeOperations, type ProvingJobBroker } from '@aztec/circuit-types';
2
- import { type TelemetryClient } from '@aztec/telemetry-client';
3
- import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
2
+ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
4
3
 
5
4
  import { type ProverClientConfig } from '../config.js';
6
5
  import { ProverClient } from './prover-client.js';
@@ -9,7 +8,7 @@ export function createProverClient(
9
8
  config: ProverClientConfig,
10
9
  worldState: ForkMerkleTreeOperations,
11
10
  broker: ProvingJobBroker,
12
- telemetry: TelemetryClient = new NoopTelemetryClient(),
11
+ telemetry: TelemetryClient = getTelemetryClient(),
13
12
  ) {
14
13
  return ProverClient.new(config, worldState, broker, telemetry);
15
14
  }