@aztec/prover-client 0.69.0 → 0.69.1-devnet

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 (90) hide show
  1. package/dest/block_builder/light.d.ts +0 -1
  2. package/dest/block_builder/light.d.ts.map +1 -1
  3. package/dest/block_builder/light.js +4 -14
  4. package/dest/config.d.ts +2 -1
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +3 -2
  7. package/dest/mocks/test_context.d.ts +2 -2
  8. package/dest/mocks/test_context.d.ts.map +1 -1
  9. package/dest/mocks/test_context.js +6 -6
  10. package/dest/orchestrator/block-building-helpers.d.ts +10 -25
  11. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  12. package/dest/orchestrator/block-building-helpers.js +33 -44
  13. package/dest/orchestrator/block-proving-state.d.ts +40 -44
  14. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  15. package/dest/orchestrator/block-proving-state.js +149 -85
  16. package/dest/orchestrator/epoch-proving-state.d.ts +23 -30
  17. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  18. package/dest/orchestrator/epoch-proving-state.js +92 -65
  19. package/dest/orchestrator/orchestrator.d.ts +16 -47
  20. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  21. package/dest/orchestrator/orchestrator.js +204 -341
  22. package/dest/orchestrator/tx-proving-state.d.ts +10 -6
  23. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  24. package/dest/orchestrator/tx-proving-state.js +57 -46
  25. package/dest/prover-agent/memory-proving-queue.d.ts +3 -3
  26. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  27. package/dest/prover-agent/memory-proving-queue.js +4 -4
  28. package/dest/prover-agent/prover-agent.js +4 -4
  29. package/dest/prover-client/prover-client.d.ts.map +1 -1
  30. package/dest/prover-client/prover-client.js +5 -2
  31. package/dest/prover-client/server-epoch-prover.d.ts +25 -0
  32. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
  33. package/dest/prover-client/server-epoch-prover.js +40 -0
  34. package/dest/proving_broker/broker_prover_facade.d.ts +15 -4
  35. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  36. package/dest/proving_broker/broker_prover_facade.js +247 -44
  37. package/dest/proving_broker/config.d.ts +61 -0
  38. package/dest/proving_broker/config.d.ts.map +1 -0
  39. package/dest/proving_broker/config.js +83 -0
  40. package/dest/proving_broker/factory.d.ts +1 -1
  41. package/dest/proving_broker/factory.d.ts.map +1 -1
  42. package/dest/proving_broker/factory.js +2 -5
  43. package/dest/proving_broker/fixtures.d.ts +5 -0
  44. package/dest/proving_broker/fixtures.d.ts.map +1 -0
  45. package/dest/proving_broker/fixtures.js +12 -0
  46. package/dest/proving_broker/index.d.ts +1 -0
  47. package/dest/proving_broker/index.d.ts.map +1 -1
  48. package/dest/proving_broker/index.js +2 -1
  49. package/dest/proving_broker/proving_broker.d.ts +16 -12
  50. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  51. package/dest/proving_broker/proving_broker.js +306 -273
  52. package/dest/proving_broker/proving_broker_database/memory.d.ts +4 -2
  53. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
  54. package/dest/proving_broker/proving_broker_database/memory.js +17 -4
  55. package/dest/proving_broker/proving_broker_database/persisted.d.ts +10 -6
  56. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  57. package/dest/proving_broker/proving_broker_database/persisted.js +105 -13
  58. package/dest/proving_broker/proving_broker_database.d.ts +7 -3
  59. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
  60. package/dest/proving_broker/proving_job_controller.js +4 -4
  61. package/dest/proving_broker/rpc.d.ts.map +1 -1
  62. package/dest/proving_broker/rpc.js +4 -4
  63. package/dest/test/mock_prover.d.ts +6 -6
  64. package/dest/test/mock_prover.d.ts.map +1 -1
  65. package/dest/test/mock_prover.js +6 -6
  66. package/package.json +11 -11
  67. package/src/block_builder/light.ts +3 -21
  68. package/src/config.ts +4 -4
  69. package/src/mocks/test_context.ts +3 -6
  70. package/src/orchestrator/block-building-helpers.ts +44 -118
  71. package/src/orchestrator/block-proving-state.ts +251 -121
  72. package/src/orchestrator/epoch-proving-state.ts +159 -88
  73. package/src/orchestrator/orchestrator.ts +251 -527
  74. package/src/orchestrator/tx-proving-state.ts +35 -19
  75. package/src/prover-agent/memory-proving-queue.ts +11 -12
  76. package/src/prover-agent/prover-agent.ts +4 -4
  77. package/src/prover-client/prover-client.ts +4 -6
  78. package/src/prover-client/server-epoch-prover.ts +44 -0
  79. package/src/proving_broker/broker_prover_facade.ts +321 -61
  80. package/src/proving_broker/config.ts +93 -0
  81. package/src/proving_broker/factory.ts +2 -5
  82. package/src/proving_broker/fixtures.ts +14 -0
  83. package/src/proving_broker/index.ts +1 -0
  84. package/src/proving_broker/proving_broker.ts +114 -71
  85. package/src/proving_broker/proving_broker_database/memory.ts +24 -4
  86. package/src/proving_broker/proving_broker_database/persisted.ts +141 -19
  87. package/src/proving_broker/proving_broker_database.ts +8 -3
  88. package/src/proving_broker/proving_job_controller.ts +5 -5
  89. package/src/proving_broker/rpc.ts +2 -3
  90. package/src/test/mock_prover.ts +9 -11
@@ -1,23 +1,19 @@
1
1
  import { __esDecorate, __runInitializers } from "tslib";
2
- import { L2Block, MerkleTreeId, makeEmptyProcessedTx, toNumBlobFields, } from '@aztec/circuit-types';
3
- import { AVM_PROOF_LENGTH_IN_FIELDS, AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS, BLOBS_PER_BLOCK, BaseParityInputs, FIELDS_PER_BLOB, Fr, L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NUM_BASE_PARITY_PER_ROOT_PARITY, PrivateKernelEmptyInputData, RootParityInput, RootParityInputs, VerificationKeyData, makeEmptyRecursiveProof, } from '@aztec/circuits.js';
4
- import { BlobPublicInputs } from '@aztec/circuits.js/blobs';
5
- import { BlockRootRollupInputs, EmptyBlockRootRollupInputs, } from '@aztec/circuits.js/rollup';
2
+ import { L2Block, MerkleTreeId, toNumBlobFields, } from '@aztec/circuit-types';
3
+ import { AVM_PROOF_LENGTH_IN_FIELDS, AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS, BaseParityInputs, BlockHeader, ContentCommitment, Fr, GlobalVariables, L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NUM_BASE_PARITY_PER_ROOT_PARITY, PartialStateReference, StateReference, VerificationKeyData, makeEmptyRecursiveProof, } from '@aztec/circuits.js';
4
+ import { EmptyBlockRootRollupInputs, PrivateBaseRollupInputs, SingleTxBlockRootRollupInputs, TubeInputs, } from '@aztec/circuits.js/rollup';
6
5
  import { makeTuple } from '@aztec/foundation/array';
7
- import { Blob } from '@aztec/foundation/blob';
8
- import { maxBy, padArrayEnd } from '@aztec/foundation/collection';
9
- import { sha256ToField } from '@aztec/foundation/crypto';
6
+ import { padArrayEnd } from '@aztec/foundation/collection';
10
7
  import { AbortError } from '@aztec/foundation/error';
11
8
  import { createLogger } from '@aztec/foundation/log';
12
9
  import { promiseWithResolvers } from '@aztec/foundation/promise';
13
10
  import { pushTestData } from '@aztec/foundation/testing';
14
11
  import { elapsed } from '@aztec/foundation/timer';
15
- import { getVKIndex, getVKSiblingPath, getVKTreeRoot } from '@aztec/noir-protocol-circuits-types';
16
- import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
12
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vks';
17
13
  import { Attributes, trackSpan, wrapCallbackInSpan } from '@aztec/telemetry-client';
18
14
  import { inspect } from 'util';
19
- import { buildBaseRollupHints, buildHeaderAndBodyFromTxs, buildHeaderFromCircuitOutputs, createBlockMergeRollupInputs, createMergeRollupInputs, getPreviousRollupDataFromPublicInputs, getRootRollupInput, getRootTreeSiblingPath, getSubtreeSiblingPath, getTreeSnapshot, validatePartialState, validateTx, } from './block-building-helpers.js';
20
- import { EpochProvingState, } from './epoch-proving-state.js';
15
+ import { buildBaseRollupHints, buildHeaderAndBodyFromTxs, getRootTreeSiblingPath, getSubtreeSiblingPath, getTreeSnapshot, validatePartialState, validateTx, } from './block-building-helpers.js';
16
+ import { EpochProvingState } from './epoch-proving-state.js';
21
17
  import { ProvingOrchestratorMetrics } from './orchestrator_metrics.js';
22
18
  import { TxProvingState } from './tx-proving-state.js';
23
19
  const logger = createLogger('prover-client:orchestrator');
@@ -39,8 +35,8 @@ let ProvingOrchestrator = (() => {
39
35
  let _instanceExtraInitializers = [];
40
36
  let _startNewBlock_decorators;
41
37
  let _addTxs_decorators;
38
+ let _startTubeCircuits_decorators;
42
39
  let _setBlockCompleted_decorators;
43
- let _padEpoch_decorators;
44
40
  let _prepareBaseRollupInputs_decorators;
45
41
  return _a = class ProvingOrchestrator {
46
42
  constructor(dbProvider, prover, telemetryClient, proverId = Fr.ZERO) {
@@ -59,11 +55,9 @@ let ProvingOrchestrator = (() => {
59
55
  getProverId() {
60
56
  return this.proverId;
61
57
  }
62
- /**
63
- * Resets the orchestrator's cached padding tx.
64
- */
65
- reset() {
66
- this.paddingTxProof = undefined;
58
+ stop() {
59
+ this.cancel();
60
+ return Promise.resolve();
67
61
  }
68
62
  startNewEpoch(epochNumber, firstBlockNumber, totalNumBlocks) {
69
63
  const { promise: _promise, resolve, reject } = promiseWithResolvers();
@@ -112,14 +106,25 @@ let ProvingOrchestrator = (() => {
112
106
  const startArchiveSnapshot = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
113
107
  const newArchiveSiblingPath = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE, db);
114
108
  const previousBlockHash = await db.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(startArchiveSnapshot.nextAvailableLeafIndex - 1));
115
- const blockProvingState = this.provingState.startNewBlock(globalVariables, l1ToL2MessagesPadded, messageTreeSnapshot, newL1ToL2MessageTreeRootSiblingPath, messageTreeSnapshotAfterInsertion, startArchiveSnapshot, newArchiveSiblingPath, previousBlockHash);
109
+ const partial = new PartialStateReference(await getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE, db), await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE, db), await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE, db));
110
+ const state = new StateReference(messageTreeSnapshot, partial);
111
+ // TODO: Construct the full previousBlockHeader.
112
+ const previousBlockHeader = BlockHeader.from({
113
+ lastArchive: startArchiveSnapshot,
114
+ contentCommitment: ContentCommitment.empty(),
115
+ state,
116
+ globalVariables: GlobalVariables.empty(),
117
+ totalFees: Fr.ZERO,
118
+ totalManaUsed: Fr.ZERO,
119
+ });
120
+ const blockProvingState = this.provingState.startNewBlock(globalVariables, l1ToL2MessagesPadded, messageTreeSnapshot, newL1ToL2MessageTreeRootSiblingPath, messageTreeSnapshotAfterInsertion, startArchiveSnapshot, newArchiveSiblingPath, previousBlockHeader, previousBlockHash);
116
121
  // Enqueue base parity circuits for the block
117
122
  for (let i = 0; i < baseParityInputs.length; i++) {
118
123
  this.enqueueBaseParityCircuit(blockProvingState, baseParityInputs[i], i);
119
124
  }
120
125
  }
121
126
  /**
122
- * The interface to add simulated transactions to the scheduler
127
+ * The interface to add simulated transactions to the scheduler. This can only be called once per block.
123
128
  * @param txs - The transactions to be proven
124
129
  */
125
130
  async addTxs(txs) {
@@ -134,9 +139,12 @@ let ProvingOrchestrator = (() => {
134
139
  if (!provingState) {
135
140
  throw new Error(`Block proving state for ${blockNumber} not found`);
136
141
  }
142
+ if (provingState.totalNumTxs) {
143
+ throw new Error(`Block ${blockNumber} has been initialized with transactions.`);
144
+ }
137
145
  const numBlobFields = toNumBlobFields(txs);
138
- provingState.startNewBlock(Math.max(2, txs.length), numBlobFields);
139
- logger.info(`Adding ${txs.length} transactions with ${numBlobFields} blob fields to block ${provingState?.blockNumber}`);
146
+ provingState.startNewBlock(txs.length, numBlobFields);
147
+ logger.info(`Adding ${txs.length} transactions with ${numBlobFields} blob fields to block ${provingState.blockNumber}`);
140
148
  for (const tx of txs) {
141
149
  try {
142
150
  if (!provingState.verifyState()) {
@@ -149,7 +157,13 @@ let ProvingOrchestrator = (() => {
149
157
  continue;
150
158
  }
151
159
  const [hints, treeSnapshots] = await this.prepareTransaction(tx, provingState);
152
- this.enqueueFirstProofs(hints, treeSnapshots, tx, provingState);
160
+ const txProvingState = new TxProvingState(tx, hints, treeSnapshots);
161
+ const txIndex = provingState.addNewTx(txProvingState);
162
+ this.getOrEnqueueTube(provingState, txIndex);
163
+ if (txProvingState.requireAvmProof) {
164
+ logger.debug(`Enqueueing public VM for tx ${txIndex}`);
165
+ this.enqueueVM(provingState, txIndex);
166
+ }
153
167
  }
154
168
  catch (err) {
155
169
  throw new Error(`Error adding transaction ${tx.hash.toString()} to block ${blockNumber}: ${err.message}`, {
@@ -157,12 +171,26 @@ let ProvingOrchestrator = (() => {
157
171
  });
158
172
  }
159
173
  }
160
- if (provingState.transactionsReceived === provingState.totalNumTxs) {
161
- logger.verbose(`All transactions received for block ${provingState.globalVariables.blockNumber}.`);
174
+ }
175
+ /**
176
+ * Kickstarts tube circuits for the specified txs. These will be used during epoch proving.
177
+ * Note that if the tube circuits are not started this way, they will be started nontheless after processing.
178
+ */
179
+ startTubeCircuits(txs) {
180
+ if (!this.provingState?.verifyState()) {
181
+ throw new Error(`Invalid proving state, call startNewEpoch before starting tube circuits`);
182
+ }
183
+ for (const tx of txs) {
184
+ const txHash = tx.getTxHash().toString();
185
+ const tubeInputs = new TubeInputs(tx.clientIvcProof);
186
+ const tubeProof = promiseWithResolvers();
187
+ logger.debug(`Starting tube circuit for tx ${txHash}`);
188
+ this.doEnqueueTube(txHash, tubeInputs, proof => tubeProof.resolve(proof));
189
+ this.provingState?.cachedTubeProofs.set(txHash, tubeProof.promise);
162
190
  }
163
191
  }
164
192
  /**
165
- * Marks the block as full and pads it if required, no more transactions will be accepted.
193
+ * Marks the block as completed.
166
194
  * Computes the block header and updates the archive tree.
167
195
  */
168
196
  async setBlockCompleted(blockNumber, expectedHeader) {
@@ -172,39 +200,12 @@ let ProvingOrchestrator = (() => {
172
200
  }
173
201
  if (!provingState.spongeBlobState) {
174
202
  // If we are completing an empty block, initialise the provingState.
175
- // We will have 2 padding txs, and => no blob fields.
176
- provingState.startNewBlock(2, 0);
203
+ // We will have 0 txs and no blob fields.
204
+ provingState.startNewBlock(0, 0);
177
205
  }
178
206
  if (!provingState.verifyState()) {
179
207
  throw new Error(`Block proving failed: ${provingState.error}`);
180
208
  }
181
- // We may need to pad the rollup with empty transactions
182
- const paddingTxCount = provingState.totalNumTxs - provingState.transactionsReceived;
183
- if (paddingTxCount > 0 && provingState.totalNumTxs > 2) {
184
- throw new Error(`Block not ready for completion: expecting ${paddingTxCount} more transactions.`);
185
- }
186
- if (paddingTxCount > 0) {
187
- logger.debug(`Padding rollup with ${paddingTxCount} empty transactions`);
188
- // Make an empty padding transaction
189
- // Required for:
190
- // 0 (when we want an empty block, largely for testing), or
191
- // 1 (we need to pad with one tx as all rollup circuits require a pair of inputs) txs
192
- // Insert it into the tree the required number of times to get all of the
193
- // base rollup inputs
194
- // Then enqueue the proving of all the transactions
195
- const unprovenPaddingTx = makeEmptyProcessedTx(this.dbs.get(blockNumber).getInitialHeader(), provingState.globalVariables.chainId, provingState.globalVariables.version, getVKTreeRoot(), protocolContractTreeRoot);
196
- const txInputs = [];
197
- for (let i = 0; i < paddingTxCount; i++) {
198
- const [hints, snapshot] = await this.prepareTransaction(unprovenPaddingTx, provingState);
199
- const txInput = {
200
- hints,
201
- snapshot,
202
- };
203
- txInputs.push(txInput);
204
- }
205
- // Now enqueue the proving
206
- this.enqueuePaddingTxs(provingState, txInputs, unprovenPaddingTx);
207
- }
208
209
  // And build the block header
209
210
  logger.verbose(`Block ${blockNumber} completed. Assembling header.`);
210
211
  await this.buildBlock(provingState, expectedHeader);
@@ -220,44 +221,6 @@ let ProvingOrchestrator = (() => {
220
221
  }
221
222
  return block;
222
223
  }
223
- padEpoch() {
224
- const provingState = this.provingState;
225
- const lastBlock = maxBy(provingState.blocks.filter(b => !!b), b => b.blockNumber)?.block;
226
- if (!lastBlock) {
227
- return Promise.reject(new Error(`Epoch needs at least one completed block in order to be padded`));
228
- }
229
- const paddingBlockCount = Math.max(2, provingState.totalNumBlocks) - provingState.blocks.length;
230
- if (paddingBlockCount === 0) {
231
- return Promise.resolve();
232
- }
233
- logger.debug(`Padding epoch proof with ${paddingBlockCount} empty block proofs`);
234
- const inputs = EmptyBlockRootRollupInputs.from({
235
- archive: lastBlock.archive,
236
- blockHash: lastBlock.header.hash(),
237
- globalVariables: lastBlock.header.globalVariables,
238
- vkTreeRoot: getVKTreeRoot(),
239
- protocolContractTreeRoot,
240
- proverId: this.proverId,
241
- });
242
- logger.debug(`Enqueuing deferred proving for padding block to enqueue ${paddingBlockCount} paddings`);
243
- this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getEmptyBlockRootRollupProof', {
244
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
245
- [Attributes.PROTOCOL_CIRCUIT_NAME]: 'empty-block-root-rollup',
246
- }, signal => this.prover.getEmptyBlockRootRollupProof(inputs, signal, provingState.epochNumber)), result => {
247
- logger.debug(`Completed proof for padding block`);
248
- const currentLevel = provingState.numMergeLevels + 1n;
249
- for (let i = 0; i < paddingBlockCount; i++) {
250
- logger.debug(`Enqueuing padding block with index ${provingState.blocks.length + i}`);
251
- const index = BigInt(provingState.blocks.length + i);
252
- this.storeAndExecuteNextBlockMergeLevel(provingState, currentLevel, index, [
253
- result.inputs,
254
- result.proof,
255
- result.verificationKey.keyAsFields,
256
- ]);
257
- }
258
- });
259
- return Promise.resolve();
260
- }
261
224
  async buildBlock(provingState, expectedHeader) {
262
225
  // Collect all new nullifiers, commitments, and contracts from all txs in this block to build body
263
226
  const txs = provingState.allTxs.map(a => a.processedTx);
@@ -286,47 +249,6 @@ let ProvingOrchestrator = (() => {
286
249
  throw new Error(`Archive tree mismatch for block ${l2Block.number}: world state synced to ${inspect(syncedArchive)} but built ${inspect(newArchive)}`);
287
250
  }
288
251
  }
289
- // Enqueues the proving of the required padding transactions
290
- // If the fully proven padding transaction is not available, this will first be proven
291
- enqueuePaddingTxs(provingState, txInputs, paddingTx) {
292
- if (this.paddingTxProof) {
293
- // We already have the padding transaction
294
- logger.debug(`Enqueuing ${txInputs.length} padding transactions using existing padding tx`);
295
- this.provePaddingTransactions(txInputs, paddingTx, this.paddingTxProof, provingState);
296
- return;
297
- }
298
- logger.debug(`Enqueuing deferred proving for padding txs to enqueue ${txInputs.length} paddings`);
299
- this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getEmptyPrivateKernelProof', {
300
- [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
301
- [Attributes.PROTOCOL_CIRCUIT_NAME]: 'private-kernel-empty',
302
- }, signal => this.prover.getEmptyPrivateKernelProof(new PrivateKernelEmptyInputData(paddingTx.constants.historicalHeader,
303
- // Chain id and version should not change even if the proving state does, so it's safe to use them for the padding tx
304
- // which gets cached across multiple runs of the orchestrator with different proving states. If they were to change,
305
- // we'd have to clear out the paddingTx here and regenerate it when they do.
306
- paddingTx.constants.txContext.chainId, paddingTx.constants.txContext.version, paddingTx.constants.vkTreeRoot, paddingTx.constants.protocolContractTreeRoot), signal, provingState.epochNumber)), result => {
307
- logger.debug(`Completed proof for padding tx, now enqueuing ${txInputs.length} padding txs`);
308
- this.paddingTxProof = { proof: result.proof, verificationKey: result.verificationKey };
309
- this.provePaddingTransactions(txInputs, paddingTx, this.paddingTxProof, provingState);
310
- });
311
- }
312
- /**
313
- * Prepares the cached sets of base rollup inputs for padding transactions and proves them
314
- * @param txInputs - The base rollup inputs, start and end hash paths etc
315
- * @param paddingTx - The padding tx, contains the header and public inputs used in the proof
316
- * @param proofAndVk - The proof and vk of the paddingTx.
317
- * @param provingState - The block proving state
318
- */
319
- provePaddingTransactions(txInputs, paddingTx, proofAndVk, provingState) {
320
- // The padding tx contains the proof and vk, generated separately from the base inputs
321
- // Copy these into the base rollup inputs and enqueue the base rollup proof
322
- for (let i = 0; i < txInputs.length; i++) {
323
- const { hints, snapshot } = txInputs[i];
324
- const txProvingState = new TxProvingState(paddingTx, hints, snapshot);
325
- txProvingState.assignTubeProof(proofAndVk);
326
- const txIndex = provingState.addNewTx(txProvingState);
327
- this.enqueueBaseRollup(provingState, txIndex);
328
- }
329
- }
330
252
  /**
331
253
  * Cancel any further proving
332
254
  */
@@ -336,31 +258,6 @@ let ProvingOrchestrator = (() => {
336
258
  }
337
259
  this.provingState?.cancel();
338
260
  }
339
- /**
340
- * Extract the block header from public inputs.
341
- * @returns The header of this proving state's block.
342
- */
343
- extractBlockHeaderFromPublicInputs(provingState, rootRollupOutputs) {
344
- const previousMergeData = provingState.getMergeInputs(0).inputs;
345
- if (!previousMergeData[0] || !previousMergeData[1]) {
346
- throw new Error(`Invalid proving state, final merge inputs before block root circuit missing.`);
347
- }
348
- return buildHeaderFromCircuitOutputs([previousMergeData[0], previousMergeData[1]], provingState.finalRootParityInput.publicInputs, rootRollupOutputs, provingState.messageTreeSnapshotAfterInsertion, logger);
349
- }
350
- /**
351
- * Collect all new nullifiers, commitments, and contracts from all txs in a block
352
- * @returns The array of non empty tx effects.
353
- */
354
- extractTxEffects(provingState) {
355
- // Note: this check should ensure that we have all txs and their effects ready.
356
- if (!provingState.finalRootParityInput?.publicInputs.shaRoot) {
357
- throw new Error(`Invalid proving state, a block must be ready to be proven before its effects can be extracted.`);
358
- }
359
- const nonEmptyTxEffects = provingState.allTxs
360
- .map(txProvingState => txProvingState.processedTx.txEffect)
361
- .filter(txEffect => !txEffect.isEmpty());
362
- return nonEmptyTxEffects;
363
- }
364
261
  /**
365
262
  * Returns the proof for the current epoch.
366
263
  */
@@ -368,19 +265,16 @@ let ProvingOrchestrator = (() => {
368
265
  if (!this.provingState || !this.provingPromise) {
369
266
  throw new Error(`Invalid proving state, an epoch must be proven before it can be finalised`);
370
267
  }
371
- await this.padEpoch();
372
268
  const result = await this.provingPromise;
373
269
  if (result.status === 'failure') {
374
270
  throw new Error(`Epoch proving failed: ${result.reason}`);
375
271
  }
376
- if (!this.provingState.rootRollupPublicInputs || !this.provingState.finalProof) {
377
- throw new Error(`Invalid proving state, missing root rollup public inputs or final proof`);
378
- }
272
+ const epochProofResult = this.provingState.getEpochProofResult();
379
273
  pushTestData('epochProofResult', {
380
- proof: this.provingState.finalProof.toString(),
381
- publicInputs: this.provingState.rootRollupPublicInputs.toString(),
274
+ proof: epochProofResult.proof.toString(),
275
+ publicInputs: epochProofResult.publicInputs.toString(),
382
276
  });
383
- return { proof: this.provingState.finalProof, publicInputs: this.provingState.rootRollupPublicInputs };
277
+ return epochProofResult;
384
278
  }
385
279
  /**
386
280
  * Starts the proving process for the given transaction and adds it to our state
@@ -395,15 +289,6 @@ let ProvingOrchestrator = (() => {
395
289
  }
396
290
  return txInputs;
397
291
  }
398
- enqueueFirstProofs(hints, treeSnapshots, tx, provingState) {
399
- const txProvingState = new TxProvingState(tx, hints, treeSnapshots);
400
- const txIndex = provingState.addNewTx(txProvingState);
401
- this.enqueueTube(provingState, txIndex);
402
- if (txProvingState.requireAvmProof) {
403
- logger.debug(`Enqueueing public VM for tx ${txIndex}`);
404
- this.enqueueVM(provingState, txIndex);
405
- }
406
- }
407
292
  /**
408
293
  * Enqueue a job to be scheduled
409
294
  * @param provingState - The proving state object being operated on
@@ -458,7 +343,7 @@ let ProvingOrchestrator = (() => {
458
343
  }
459
344
  // Updates the merkle trees for a transaction. The first enqueued job for a transaction
460
345
  async prepareBaseRollupInputs(provingState, tx) {
461
- if (!provingState?.verifyState() || !provingState.spongeBlobState) {
346
+ if (!provingState.verifyState() || !provingState.spongeBlobState) {
462
347
  logger.debug('Not preparing base rollup inputs, state invalid');
463
348
  return;
464
349
  }
@@ -473,7 +358,7 @@ let ProvingOrchestrator = (() => {
473
358
  return { key: id, value: await getTreeSnapshot(id, db) };
474
359
  });
475
360
  const treeSnapshots = new Map((await Promise.all(promises)).map(obj => [obj.key, obj.value]));
476
- if (!provingState?.verifyState()) {
361
+ if (!provingState.verifyState()) {
477
362
  logger.debug(`Discarding proving job, state no longer valid`);
478
363
  return;
479
364
  }
@@ -482,201 +367,228 @@ let ProvingOrchestrator = (() => {
482
367
  // Executes the base rollup circuit and stored the output as intermediate state for the parent merge/root circuit
483
368
  // Executes the next level of merge if all inputs are available
484
369
  enqueueBaseRollup(provingState, txIndex) {
485
- if (!provingState?.verifyState()) {
370
+ if (!provingState.verifyState()) {
486
371
  logger.debug('Not running base rollup, state invalid');
487
372
  return;
488
373
  }
489
374
  const txProvingState = provingState.getTxProvingState(txIndex);
490
375
  const { processedTx } = txProvingState;
491
- const rollupType = txProvingState.requireAvmProof ? 'public-base-rollup' : 'private-base-rollup';
376
+ const { rollupType, inputs } = txProvingState.getBaseRollupTypeAndInputs();
492
377
  logger.debug(`Enqueuing deferred proving base rollup${processedTx.isEmpty ? ' with padding tx' : ''} for ${processedTx.hash.toString()}`);
493
- this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, `ProvingOrchestrator.prover.${rollupType === 'private-base-rollup' ? 'getPrivateBaseRollupProof' : 'getPublicBaseRollupProof'}`, {
378
+ this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, `ProvingOrchestrator.prover.${inputs instanceof PrivateBaseRollupInputs ? 'getPrivateBaseRollupProof' : 'getPublicBaseRollupProof'}`, {
494
379
  [Attributes.TX_HASH]: processedTx.hash.toString(),
495
380
  [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
496
381
  [Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType,
497
382
  }, signal => {
498
- if (rollupType === 'private-base-rollup') {
499
- const inputs = txProvingState.getPrivateBaseInputs();
383
+ if (inputs instanceof PrivateBaseRollupInputs) {
500
384
  return this.prover.getPrivateBaseRollupProof(inputs, signal, provingState.epochNumber);
501
385
  }
502
386
  else {
503
- const inputs = txProvingState.getPublicBaseInputs();
504
387
  return this.prover.getPublicBaseRollupProof(inputs, signal, provingState.epochNumber);
505
388
  }
506
389
  }), result => {
507
390
  logger.debug(`Completed proof for ${rollupType} for tx ${processedTx.hash.toString()}`);
508
391
  validatePartialState(result.inputs.end, txProvingState.treeSnapshots);
509
- const currentLevel = provingState.numMergeLevels + 1n;
510
- this.storeAndExecuteNextMergeLevel(provingState, currentLevel, BigInt(txIndex), [
511
- result.inputs,
512
- result.proof,
513
- result.verificationKey.keyAsFields,
514
- ]);
392
+ const leafLocation = provingState.setBaseRollupProof(txIndex, result);
393
+ if (provingState.totalNumTxs === 1) {
394
+ this.checkAndEnqueueBlockRootRollup(provingState);
395
+ }
396
+ else {
397
+ this.checkAndEnqueueNextMergeRollup(provingState, leafLocation);
398
+ }
515
399
  });
516
400
  }
517
- // Enqueues the tube circuit for a given transaction index
401
+ // Enqueues the tube circuit for a given transaction index, or reuses the one already enqueued
518
402
  // Once completed, will enqueue the next circuit, either a public kernel or the base rollup
519
- enqueueTube(provingState, txIndex) {
520
- if (!provingState?.verifyState()) {
403
+ getOrEnqueueTube(provingState, txIndex) {
404
+ if (!provingState.verifyState()) {
521
405
  logger.debug('Not running tube circuit, state invalid');
522
406
  return;
523
407
  }
524
408
  const txProvingState = provingState.getTxProvingState(txIndex);
409
+ const txHash = txProvingState.processedTx.hash.toString();
410
+ const handleResult = (result) => {
411
+ logger.debug(`Got tube proof for tx index: ${txIndex}`, { txHash });
412
+ txProvingState.setTubeProof(result);
413
+ this.provingState?.cachedTubeProofs.delete(txHash);
414
+ this.checkAndEnqueueNextTxCircuit(provingState, txIndex);
415
+ };
416
+ if (this.provingState?.cachedTubeProofs.has(txHash)) {
417
+ logger.debug(`Tube proof already enqueued for tx index: ${txIndex}`, { txHash });
418
+ void this.provingState.cachedTubeProofs.get(txHash).then(handleResult);
419
+ return;
420
+ }
525
421
  logger.debug(`Enqueuing tube circuit for tx index: ${txIndex}`);
422
+ this.doEnqueueTube(txHash, txProvingState.getTubeInputs(), handleResult);
423
+ }
424
+ doEnqueueTube(txHash, inputs, handler, provingState = this.provingState) {
425
+ if (!provingState?.verifyState()) {
426
+ logger.debug('Not running tube circuit, state invalid');
427
+ return;
428
+ }
526
429
  this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getTubeProof', {
527
- [Attributes.TX_HASH]: txProvingState.processedTx.hash.toString(),
430
+ [Attributes.TX_HASH]: txHash,
528
431
  [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
529
432
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'tube-circuit',
530
- }, signal => {
531
- const inputs = txProvingState.getTubeInputs();
532
- return this.prover.getTubeProof(inputs, signal, provingState.epochNumber);
533
- }), result => {
534
- logger.debug(`Completed tube proof for tx index: ${txIndex}`);
535
- txProvingState.assignTubeProof(result);
536
- this.checkAndEnqueueNextTxCircuit(provingState, txIndex);
537
- });
433
+ }, signal => this.prover.getTubeProof(inputs, signal, this.provingState.epochNumber)), handler);
538
434
  }
539
435
  // Executes the merge rollup circuit and stored the output as intermediate state for the parent merge/block root circuit
540
436
  // Enqueues the next level of merge if all inputs are available
541
- enqueueMergeRollup(provingState, level, index, mergeInputData) {
542
- const inputs = createMergeRollupInputs([mergeInputData.inputs[0], mergeInputData.proofs[0], mergeInputData.verificationKeys[0]], [mergeInputData.inputs[1], mergeInputData.proofs[1], mergeInputData.verificationKeys[1]]);
437
+ enqueueMergeRollup(provingState, location) {
438
+ if (!provingState.verifyState()) {
439
+ logger.debug('Not running merge rollup. State no longer valid.');
440
+ return;
441
+ }
442
+ const inputs = provingState.getMergeRollupInputs(location);
543
443
  this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getMergeRollupProof', {
544
444
  [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
545
445
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'merge-rollup',
546
446
  }, signal => this.prover.getMergeRollupProof(inputs, signal, provingState.epochNumber)), result => {
547
- this.storeAndExecuteNextMergeLevel(provingState, level, index, [
548
- result.inputs,
549
- result.proof,
550
- result.verificationKey.keyAsFields,
551
- ]);
447
+ provingState.setMergeRollupProof(location, result);
448
+ this.checkAndEnqueueNextMergeRollup(provingState, location);
552
449
  });
553
450
  }
554
451
  // Executes the block root rollup circuit
555
452
  enqueueBlockRootRollup(provingState) {
556
- if (!provingState.block) {
557
- throw new Error(`Invalid proving state for block root rollup, block not available`);
558
- }
559
453
  if (!provingState.verifyState()) {
560
454
  logger.debug('Not running block root rollup, state no longer valid');
561
455
  return;
562
456
  }
563
457
  provingState.blockRootRollupStarted = true;
564
- const mergeInputData = provingState.getMergeInputs(0);
565
- const rootParityInput = provingState.finalRootParityInput;
566
- const blobFields = this.extractTxEffects(provingState)
567
- .map(tx => tx.toBlobFields())
568
- .flat();
569
- const blobs = Blob.getBlobs(blobFields);
570
- const blobsHash = sha256ToField(blobs.map(b => b.getEthVersionedBlobHash()));
571
- logger.debug(`Enqueuing block root rollup for block ${provingState.blockNumber} with ${provingState.newL1ToL2Messages.length} l1 to l2 msgs and ${blobs.length} blobs.`);
572
- const previousRollupData = makeTuple(2, i => getPreviousRollupDataFromPublicInputs(mergeInputData.inputs[i], mergeInputData.proofs[i], mergeInputData.verificationKeys[i]));
573
- const inputs = BlockRootRollupInputs.from({
574
- previousRollupData,
575
- l1ToL2Roots: rootParityInput,
576
- newL1ToL2Messages: provingState.newL1ToL2Messages,
577
- newL1ToL2MessageTreeRootSiblingPath: provingState.messageTreeRootSiblingPath,
578
- startL1ToL2MessageTreeSnapshot: provingState.messageTreeSnapshot,
579
- startArchiveSnapshot: provingState.archiveTreeSnapshot,
580
- newArchiveSiblingPath: provingState.archiveTreeRootSiblingPath,
581
- previousBlockHash: provingState.previousBlockHash,
582
- proverId: this.proverId,
583
- blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK),
584
- blobCommitments: padArrayEnd(blobs.map(b => b.commitmentToFields()), [Fr.ZERO, Fr.ZERO], BLOBS_PER_BLOCK),
585
- blobsHash: blobsHash,
586
- });
458
+ const { rollupType, inputs } = provingState.getBlockRootRollupTypeAndInputs(this.proverId);
459
+ logger.debug(`Enqueuing ${rollupType} for block ${provingState.blockNumber} with ${provingState.newL1ToL2Messages.length} l1 to l2 msgs.`);
587
460
  this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockRootRollupProof', {
588
461
  [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
589
- [Attributes.PROTOCOL_CIRCUIT_NAME]: 'block-root-rollup',
590
- }, signal => this.prover.getBlockRootRollupProof(inputs, signal, provingState.epochNumber)), result => {
591
- const header = this.extractBlockHeaderFromPublicInputs(provingState, result.inputs);
462
+ [Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType,
463
+ }, signal => {
464
+ if (inputs instanceof EmptyBlockRootRollupInputs) {
465
+ return this.prover.getEmptyBlockRootRollupProof(inputs, signal, provingState.epochNumber);
466
+ }
467
+ else if (inputs instanceof SingleTxBlockRootRollupInputs) {
468
+ return this.prover.getSingleTxBlockRootRollupProof(inputs, signal, provingState.epochNumber);
469
+ }
470
+ else {
471
+ return this.prover.getBlockRootRollupProof(inputs, signal, provingState.epochNumber);
472
+ }
473
+ }), result => {
474
+ provingState.setBlockRootRollupProof(result);
475
+ const header = provingState.buildHeaderFromProvingOutputs(logger);
592
476
  if (!header.hash().equals(provingState.block.header.hash())) {
593
477
  logger.error(`Block header mismatch\nCircuit:${inspect(header)}\nComputed:${inspect(provingState.block.header)}`);
594
478
  provingState.reject(`Block header hash mismatch`);
595
479
  }
596
- provingState.blockRootRollupPublicInputs = result.inputs;
597
- provingState.finalProof = result.proof.binaryProof;
598
- const blobOutputs = result.inputs.blobPublicInputs[0];
599
- blobOutputs.inner.forEach((blobOutput, i) => {
600
- if (!blobOutput.isEmpty() && !blobOutput.equals(BlobPublicInputs.fromBlob(blobs[i]))) {
601
- throw new Error(`Rollup circuits produced mismatched blob evaluation:
602
- z: ${blobOutput.z} == ${blobs[i].challengeZ},
603
- y: ${blobOutput.y.toString(16)} == ${blobs[i].evaluationY.toString('hex')},
604
- C: ${blobOutput.kzgCommitment} == ${blobs[i].commitmentToFields()}`);
605
- }
606
- });
607
- logger.debug(`Completed proof for block root rollup for ${provingState.block?.number}`);
480
+ logger.debug(`Completed ${rollupType} proof for block ${provingState.block.number}`);
608
481
  // validatePartialState(result.inputs.end, tx.treeSnapshots); // TODO(palla/prover)
609
- const currentLevel = this.provingState.numMergeLevels + 1n;
610
- this.storeAndExecuteNextBlockMergeLevel(this.provingState, currentLevel, BigInt(provingState.index), [
611
- result.inputs,
612
- result.proof,
613
- result.verificationKey.keyAsFields,
614
- ]);
482
+ const epochProvingState = this.provingState;
483
+ const leafLocation = epochProvingState.setBlockRootRollupProof(provingState.index, result);
484
+ if (epochProvingState.totalNumBlocks === 1) {
485
+ this.enqueueEpochPadding(epochProvingState);
486
+ }
487
+ else {
488
+ this.checkAndEnqueueNextBlockMergeRollup(epochProvingState, leafLocation);
489
+ }
615
490
  });
616
491
  }
617
492
  // Executes the base parity circuit and stores the intermediate state for the root parity circuit
618
493
  // Enqueues the root parity circuit if all inputs are available
619
494
  enqueueBaseParityCircuit(provingState, inputs, index) {
495
+ if (!provingState.verifyState()) {
496
+ logger.debug('Not running base parity. State no longer valid.');
497
+ return;
498
+ }
620
499
  this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBaseParityProof', {
621
500
  [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
622
501
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'base-parity',
623
502
  }, signal => this.prover.getBaseParityProof(inputs, signal, provingState.epochNumber)), provingOutput => {
624
- const rootParityInput = new RootParityInput(provingOutput.proof, provingOutput.verificationKey.keyAsFields, getVKSiblingPath(getVKIndex(provingOutput.verificationKey)), provingOutput.inputs);
625
- provingState.setRootParityInputs(rootParityInput, index);
626
- if (provingState.areRootParityInputsReady()) {
627
- const rootParityInputs = new RootParityInputs(provingState.rootParityInput);
628
- this.enqueueRootParityCircuit(provingState, rootParityInputs);
629
- }
503
+ provingState.setBaseParityProof(index, provingOutput);
504
+ this.checkAndEnqueueRootParityCircuit(provingState);
630
505
  });
631
506
  }
507
+ checkAndEnqueueRootParityCircuit(provingState) {
508
+ if (!provingState.isReadyForRootParity()) {
509
+ return;
510
+ }
511
+ this.enqueueRootParityCircuit(provingState);
512
+ }
632
513
  // Runs the root parity circuit ans stored the outputs
633
514
  // Enqueues the root rollup proof if all inputs are available
634
- enqueueRootParityCircuit(provingState, inputs) {
515
+ enqueueRootParityCircuit(provingState) {
516
+ if (!provingState.verifyState()) {
517
+ logger.debug('Not running root parity. State no longer valid.');
518
+ return;
519
+ }
520
+ const inputs = provingState.getRootParityInputs();
635
521
  this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getRootParityProof', {
636
522
  [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
637
523
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'root-parity',
638
- }, signal => this.prover.getRootParityProof(inputs, signal, provingState.epochNumber)), provingOutput => {
639
- const rootParityInput = new RootParityInput(provingOutput.proof, provingOutput.verificationKey.keyAsFields, getVKSiblingPath(getVKIndex(provingOutput.verificationKey)), provingOutput.inputs);
640
- provingState.finalRootParityInput = rootParityInput;
524
+ }, signal => this.prover.getRootParityProof(inputs, signal, provingState.epochNumber)), result => {
525
+ provingState.setRootParityProof(result);
641
526
  this.checkAndEnqueueBlockRootRollup(provingState);
642
527
  });
643
528
  }
644
529
  // Executes the block merge rollup circuit and stored the output as intermediate state for the parent merge/block root circuit
645
530
  // Enqueues the next level of merge if all inputs are available
646
- enqueueBlockMergeRollup(provingState, level, index, mergeInputData) {
647
- const inputs = createBlockMergeRollupInputs([mergeInputData.inputs[0], mergeInputData.proofs[0], mergeInputData.verificationKeys[0]], [mergeInputData.inputs[1], mergeInputData.proofs[1], mergeInputData.verificationKeys[1]]);
531
+ enqueueBlockMergeRollup(provingState, location) {
532
+ if (!provingState.verifyState()) {
533
+ logger.debug('Not running block merge rollup. State no longer valid.');
534
+ return;
535
+ }
536
+ const inputs = provingState.getBlockMergeRollupInputs(location);
648
537
  this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockMergeRollupProof', {
649
538
  [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
650
539
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'block-merge-rollup',
651
540
  }, signal => this.prover.getBlockMergeRollupProof(inputs, signal, provingState.epochNumber)), result => {
652
- this.storeAndExecuteNextBlockMergeLevel(provingState, level, index, [
653
- result.inputs,
654
- result.proof,
655
- result.verificationKey.keyAsFields,
656
- ]);
541
+ provingState.setBlockMergeRollupProof(location, result);
542
+ this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
543
+ });
544
+ }
545
+ enqueueEpochPadding(provingState) {
546
+ if (!provingState.verifyState()) {
547
+ logger.debug('Not running epoch padding. State no longer valid.');
548
+ return;
549
+ }
550
+ logger.debug('Padding epoch proof with an empty block root proof.');
551
+ const inputs = provingState.getPaddingBlockRootInputs(this.proverId);
552
+ this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getEmptyBlockRootRollupProof', {
553
+ [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
554
+ [Attributes.PROTOCOL_CIRCUIT_NAME]: 'empty-block-root-rollup',
555
+ }, signal => this.prover.getEmptyBlockRootRollupProof(inputs, signal, provingState.epochNumber)), result => {
556
+ logger.debug('Completed proof for padding block root.');
557
+ provingState.setPaddingBlockRootProof(result);
558
+ this.checkAndEnqueueRootRollup(provingState);
657
559
  });
658
560
  }
659
561
  // Executes the root rollup circuit
660
562
  enqueueRootRollup(provingState) {
661
- if (!provingState?.verifyState()) {
563
+ if (!provingState.verifyState()) {
662
564
  logger.debug('Not running root rollup, state no longer valid');
663
565
  return;
664
566
  }
665
567
  logger.debug(`Preparing root rollup`);
666
- const mergeInputData = provingState.getMergeInputs(0);
667
- const inputs = getRootRollupInput(mergeInputData.inputs[0], mergeInputData.proofs[0], mergeInputData.verificationKeys[0], mergeInputData.inputs[1], mergeInputData.proofs[1], mergeInputData.verificationKeys[1], this.proverId);
568
+ const inputs = provingState.getRootRollupInputs(this.proverId);
668
569
  this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getRootRollupProof', {
669
570
  [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
670
571
  [Attributes.PROTOCOL_CIRCUIT_NAME]: 'root-rollup',
671
572
  }, signal => this.prover.getRootRollupProof(inputs, signal, provingState.epochNumber)), result => {
672
573
  logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`);
673
- provingState.rootRollupPublicInputs = result.inputs;
674
- provingState.finalProof = result.proof.binaryProof;
574
+ provingState.setRootRollupProof(result);
675
575
  provingState.resolve({ status: 'success' });
676
576
  });
677
577
  }
578
+ checkAndEnqueueNextMergeRollup(provingState, currentLocation) {
579
+ if (!provingState.isReadyForMergeRollup(currentLocation)) {
580
+ return;
581
+ }
582
+ const parentLocation = provingState.getParentLocation(currentLocation);
583
+ if (parentLocation.level === 0) {
584
+ this.checkAndEnqueueBlockRootRollup(provingState);
585
+ }
586
+ else {
587
+ this.enqueueMergeRollup(provingState, parentLocation);
588
+ }
589
+ }
678
590
  checkAndEnqueueBlockRootRollup(provingState) {
679
- if (!provingState?.isReadyForBlockRootRollup()) {
591
+ if (!provingState.isReadyForBlockRootRollup()) {
680
592
  logger.debug('Not ready for root rollup');
681
593
  return;
682
594
  }
@@ -697,65 +609,24 @@ let ProvingOrchestrator = (() => {
697
609
  .catch(err => logger.error(`Error closing db for block ${blockNumber}`, err));
698
610
  this.enqueueBlockRootRollup(provingState);
699
611
  }
700
- checkAndEnqueueRootRollup(provingState) {
701
- if (!provingState?.isReadyForRootRollup()) {
702
- logger.debug('Not ready for root rollup');
703
- return;
704
- }
705
- this.enqueueRootRollup(provingState);
706
- }
707
- /**
708
- * Stores the inputs to a merge/root circuit and enqueues the circuit if ready
709
- * @param provingState - The proving state being operated on
710
- * @param currentLevel - The level of the merge/root circuit
711
- * @param currentIndex - The index of the merge/root circuit
712
- * @param mergeInputData - The inputs to be stored
713
- */
714
- storeAndExecuteNextMergeLevel(provingState, currentLevel, currentIndex, mergeInputData) {
715
- const [mergeLevel, indexWithinMergeLevel, indexWithinMerge] = provingState.findMergeLevel(currentLevel, currentIndex);
716
- const mergeIndex = 2n ** mergeLevel - 1n + indexWithinMergeLevel;
717
- const ready = provingState.storeMergeInputs(mergeInputData, Number(indexWithinMerge), Number(mergeIndex));
718
- const nextMergeInputData = provingState.getMergeInputs(Number(mergeIndex));
719
- // Are we ready to execute the next circuit?
720
- if (!ready) {
612
+ checkAndEnqueueNextBlockMergeRollup(provingState, currentLocation) {
613
+ if (!provingState.isReadyForBlockMerge(currentLocation)) {
721
614
  return;
722
615
  }
723
- if (mergeLevel === 0n) {
724
- this.checkAndEnqueueBlockRootRollup(provingState);
616
+ const parentLocation = provingState.getParentLocation(currentLocation);
617
+ if (parentLocation.level === 0) {
618
+ this.checkAndEnqueueRootRollup(provingState);
725
619
  }
726
620
  else {
727
- // onto the next merge level
728
- this.enqueueMergeRollup(provingState, mergeLevel, indexWithinMergeLevel, nextMergeInputData);
621
+ this.enqueueBlockMergeRollup(provingState, parentLocation);
729
622
  }
730
623
  }
731
- /**
732
- * Stores the inputs to a block merge/root circuit and enqueues the circuit if ready
733
- * @param provingState - The proving state being operated on
734
- * @param currentLevel - The level of the merge/root circuit
735
- * @param currentIndex - The index of the merge/root circuit
736
- * @param mergeInputData - The inputs to be stored
737
- */
738
- storeAndExecuteNextBlockMergeLevel(provingState, currentLevel, currentIndex, mergeInputData) {
739
- const [mergeLevel, indexWithinMergeLevel, indexWithinMerge] = provingState.findMergeLevel(currentLevel, currentIndex);
740
- logger.debug(`Computed merge for ${currentLevel}.${currentIndex} as ${mergeLevel}.${indexWithinMergeLevel}`);
741
- if (mergeLevel < 0n) {
742
- throw new Error(`Invalid merge level ${mergeLevel}`);
743
- }
744
- const mergeIndex = 2n ** mergeLevel - 1n + indexWithinMergeLevel;
745
- const ready = provingState.storeMergeInputs(mergeInputData, Number(indexWithinMerge), Number(mergeIndex));
746
- const nextMergeInputData = provingState.getMergeInputs(Number(mergeIndex));
747
- // Are we ready to execute the next circuit?
748
- if (!ready) {
749
- logger.debug(`Not ready to execute next block merge for level ${mergeLevel} index ${indexWithinMergeLevel}`);
624
+ checkAndEnqueueRootRollup(provingState) {
625
+ if (!provingState.isReadyForRootRollup()) {
626
+ logger.debug('Not ready for root rollup');
750
627
  return;
751
628
  }
752
- if (mergeLevel === 0n) {
753
- this.checkAndEnqueueRootRollup(provingState);
754
- }
755
- else {
756
- // onto the next merge level
757
- this.enqueueBlockMergeRollup(provingState, mergeLevel, indexWithinMergeLevel, nextMergeInputData);
758
- }
629
+ this.enqueueRootRollup(provingState);
759
630
  }
760
631
  /**
761
632
  * Executes the VM circuit for a public function, will enqueue the corresponding kernel if the
@@ -764,7 +635,7 @@ let ProvingOrchestrator = (() => {
764
635
  * @param txIndex - The index of the transaction being proven
765
636
  */
766
637
  enqueueVM(provingState, txIndex) {
767
- if (!provingState?.verifyState()) {
638
+ if (!provingState.verifyState()) {
768
639
  logger.debug(`Not running VM circuit as state is no longer valid`);
769
640
  return;
770
641
  }
@@ -794,7 +665,7 @@ let ProvingOrchestrator = (() => {
794
665
  });
795
666
  this.deferredProving(provingState, doAvmProving, proofAndVk => {
796
667
  logger.debug(`Proven VM for tx index: ${txIndex}`);
797
- txProvingState.assignAvmProof(proofAndVk);
668
+ txProvingState.setAvmProof(proofAndVk);
798
669
  this.checkAndEnqueueNextTxCircuit(provingState, txIndex);
799
670
  });
800
671
  }
@@ -816,29 +687,21 @@ let ProvingOrchestrator = (() => {
816
687
  _addTxs_decorators = [trackSpan('ProvingOrchestrator.addTxs', txs => ({
817
688
  [Attributes.BLOCK_TXS_COUNT]: txs.length,
818
689
  }))];
690
+ _startTubeCircuits_decorators = [trackSpan('ProvingOrchestrator.startTubeCircuits')];
819
691
  _setBlockCompleted_decorators = [trackSpan('ProvingOrchestrator.setBlockCompleted', (blockNumber) => ({
820
692
  [Attributes.BLOCK_NUMBER]: blockNumber,
821
693
  }))];
822
- _padEpoch_decorators = [trackSpan('ProvingOrchestrator.padEpoch', function () {
823
- if (!this.provingState) {
824
- return {};
825
- }
826
- return {
827
- [Attributes.EPOCH_NUMBER]: this.provingState.epochNumber,
828
- [Attributes.EPOCH_SIZE]: this.provingState.totalNumBlocks,
829
- };
830
- })];
831
694
  _prepareBaseRollupInputs_decorators = [trackSpan('ProvingOrchestrator.prepareBaseRollupInputs', (_, tx) => ({
832
695
  [Attributes.TX_HASH]: tx.hash.toString(),
833
696
  }))];
834
697
  __esDecorate(_a, null, _startNewBlock_decorators, { kind: "method", name: "startNewBlock", static: false, private: false, access: { has: obj => "startNewBlock" in obj, get: obj => obj.startNewBlock }, metadata: _metadata }, null, _instanceExtraInitializers);
835
698
  __esDecorate(_a, null, _addTxs_decorators, { kind: "method", name: "addTxs", static: false, private: false, access: { has: obj => "addTxs" in obj, get: obj => obj.addTxs }, metadata: _metadata }, null, _instanceExtraInitializers);
699
+ __esDecorate(_a, null, _startTubeCircuits_decorators, { kind: "method", name: "startTubeCircuits", static: false, private: false, access: { has: obj => "startTubeCircuits" in obj, get: obj => obj.startTubeCircuits }, metadata: _metadata }, null, _instanceExtraInitializers);
836
700
  __esDecorate(_a, null, _setBlockCompleted_decorators, { kind: "method", name: "setBlockCompleted", static: false, private: false, access: { has: obj => "setBlockCompleted" in obj, get: obj => obj.setBlockCompleted }, metadata: _metadata }, null, _instanceExtraInitializers);
837
- __esDecorate(_a, null, _padEpoch_decorators, { kind: "method", name: "padEpoch", static: false, private: false, access: { has: obj => "padEpoch" in obj, get: obj => obj.padEpoch }, metadata: _metadata }, null, _instanceExtraInitializers);
838
701
  __esDecorate(_a, null, _prepareBaseRollupInputs_decorators, { kind: "method", name: "prepareBaseRollupInputs", static: false, private: false, access: { has: obj => "prepareBaseRollupInputs" in obj, get: obj => obj.prepareBaseRollupInputs }, metadata: _metadata }, null, _instanceExtraInitializers);
839
702
  if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
840
703
  })(),
841
704
  _a;
842
705
  })();
843
706
  export { ProvingOrchestrator };
844
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JjaGVzdHJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yY2hlc3RyYXRvci9vcmNoZXN0cmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxPQUFPLEVBQ1AsWUFBWSxFQUdaLG9CQUFvQixFQUNwQixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFROUIsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixxQ0FBcUMsRUFFckMsZUFBZSxFQUNmLGdCQUFnQixFQUVoQixlQUFlLEVBQ2YsRUFBRSxFQUVGLDJCQUEyQixFQUMzQix3Q0FBd0MsRUFFeEMsbUNBQW1DLEVBQ25DLCtCQUErQixFQUMvQiwyQkFBMkIsRUFHM0IsZUFBZSxFQUNmLGdCQUFnQixFQUVoQixtQkFBbUIsRUFDbkIsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUlMLHFCQUFxQixFQUNyQiwwQkFBMEIsR0FDM0IsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFakUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxP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
707
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JjaGVzdHJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yY2hlc3RyYXRvci9vcmNoZXN0cmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxPQUFPLEVBQ1AsWUFBWSxFQUlaLGVBQWUsR0FDaEIsTUFBTSxzQkFBc0IsQ0FBQztBQVE5QixPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHFDQUFxQyxFQUVyQyxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixFQUFFLEVBQ0YsZUFBZSxFQUNmLDJCQUEyQixFQUMzQix3Q0FBd0MsRUFDeEMsbUNBQW1DLEVBQ25DLCtCQUErQixFQUMvQixxQkFBcUIsRUFDckIsY0FBYyxFQUVkLG1CQUFtQixFQUNuQix1QkFBdUIsR0FDeEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBRUwsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsVUFBVSxHQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQXFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixD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