@aztec/prover-client 3.0.0-canary.a9708bd → 3.0.0-manual.20251030

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 (74) hide show
  1. package/dest/block-factory/light.d.ts +5 -3
  2. package/dest/block-factory/light.d.ts.map +1 -1
  3. package/dest/block-factory/light.js +16 -9
  4. package/dest/config.js +1 -1
  5. package/dest/mocks/fixtures.d.ts +4 -1
  6. package/dest/mocks/fixtures.d.ts.map +1 -1
  7. package/dest/mocks/fixtures.js +31 -3
  8. package/dest/mocks/test_context.d.ts +32 -9
  9. package/dest/mocks/test_context.d.ts.map +1 -1
  10. package/dest/mocks/test_context.js +78 -22
  11. package/dest/orchestrator/block-building-helpers.d.ts +33 -31
  12. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  13. package/dest/orchestrator/block-building-helpers.js +126 -137
  14. package/dest/orchestrator/block-proving-state.d.ts +60 -53
  15. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  16. package/dest/orchestrator/block-proving-state.js +214 -187
  17. package/dest/orchestrator/checkpoint-proving-state.d.ts +63 -0
  18. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
  19. package/dest/orchestrator/checkpoint-proving-state.js +211 -0
  20. package/dest/orchestrator/epoch-proving-state.d.ts +34 -28
  21. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  22. package/dest/orchestrator/epoch-proving-state.js +128 -84
  23. package/dest/orchestrator/orchestrator.d.ts +31 -30
  24. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  25. package/dest/orchestrator/orchestrator.js +368 -236
  26. package/dest/orchestrator/tx-proving-state.d.ts +11 -9
  27. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  28. package/dest/orchestrator/tx-proving-state.js +26 -23
  29. package/dest/prover-client/server-epoch-prover.d.ts +9 -8
  30. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  31. package/dest/prover-client/server-epoch-prover.js +9 -9
  32. package/dest/proving_broker/broker_prover_facade.d.ts +20 -15
  33. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  34. package/dest/proving_broker/broker_prover_facade.js +36 -21
  35. package/dest/proving_broker/config.d.ts +8 -8
  36. package/dest/proving_broker/config.js +5 -5
  37. package/dest/proving_broker/factory.js +1 -1
  38. package/dest/proving_broker/fixtures.js +1 -1
  39. package/dest/proving_broker/proof_store/index.d.ts +1 -0
  40. package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
  41. package/dest/proving_broker/proof_store/index.js +1 -0
  42. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  43. package/dest/proving_broker/proving_broker.js +29 -18
  44. package/dest/proving_broker/proving_broker_database/persisted.js +5 -5
  45. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  46. package/dest/proving_broker/proving_job_controller.js +38 -18
  47. package/dest/test/mock_prover.d.ts +22 -17
  48. package/dest/test/mock_prover.d.ts.map +1 -1
  49. package/dest/test/mock_prover.js +35 -20
  50. package/package.json +16 -17
  51. package/src/block-factory/light.ts +35 -9
  52. package/src/config.ts +1 -1
  53. package/src/mocks/fixtures.ts +39 -11
  54. package/src/mocks/test_context.ts +137 -31
  55. package/src/orchestrator/block-building-helpers.ts +211 -211
  56. package/src/orchestrator/block-proving-state.ts +235 -245
  57. package/src/orchestrator/checkpoint-proving-state.ts +299 -0
  58. package/src/orchestrator/epoch-proving-state.ts +172 -127
  59. package/src/orchestrator/orchestrator.ts +545 -303
  60. package/src/orchestrator/tx-proving-state.ts +49 -43
  61. package/src/prover-client/server-epoch-prover.ts +28 -18
  62. package/src/proving_broker/broker_prover_facade.ts +157 -86
  63. package/src/proving_broker/config.ts +7 -7
  64. package/src/proving_broker/factory.ts +1 -1
  65. package/src/proving_broker/fixtures.ts +1 -1
  66. package/src/proving_broker/proof_store/index.ts +1 -0
  67. package/src/proving_broker/proving_broker.ts +36 -18
  68. package/src/proving_broker/proving_broker_database/persisted.ts +5 -5
  69. package/src/proving_broker/proving_job_controller.ts +38 -18
  70. package/src/test/mock_prover.ts +142 -60
  71. package/dest/bin/get-proof-inputs.d.ts +0 -2
  72. package/dest/bin/get-proof-inputs.d.ts.map +0 -1
  73. package/dest/bin/get-proof-inputs.js +0 -51
  74. package/src/bin/get-proof-inputs.ts +0 -59
@@ -1,268 +1,303 @@
1
- import { BatchedBlobAccumulator, BlobAccumulatorPublicInputs, SpongeBlob } from '@aztec/blob-lib';
2
- import { BLOBS_PER_BLOCK, FIELDS_PER_BLOB, NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
3
- import { padArrayEnd } from '@aztec/foundation/collection';
4
- import { BLS12Point, Fr } from '@aztec/foundation/fields';
1
+ import { NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
2
+ import { assertLength } from '@aztec/foundation/serialize';
5
3
  import { UnbalancedTreeStore } from '@aztec/foundation/trees';
6
- import { getVKIndex, getVKSiblingPath, getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
7
- import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
8
- import { RootParityInput, RootParityInputs } from '@aztec/stdlib/parity';
9
- import { BlockConstantData, BlockRootRollupBlobData, BlockRootRollupData, BlockRootRollupInputs, EmptyBlockRootRollupInputs, EpochConstantData, MergeRollupInputs, PaddingBlockRootRollupInputs, PreviousRollupData, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
10
- import { StateReference } from '@aztec/stdlib/tx';
11
- import { VkData } from '@aztec/stdlib/vks';
12
- import { accumulateBlobs, buildBlobHints, buildHeaderFromCircuitOutputs, getEmptyBlockBlobsHash } from './block-building-helpers.js';
4
+ import { ParityRootPrivateInputs } from '@aztec/stdlib/parity';
5
+ import { BlockRootEmptyTxFirstRollupPrivateInputs, BlockRootFirstRollupPrivateInputs, BlockRootRollupPrivateInputs, BlockRootSingleTxFirstRollupPrivateInputs, BlockRootSingleTxRollupPrivateInputs, TxMergeRollupPrivateInputs } from '@aztec/stdlib/rollup';
6
+ import { GlobalVariables } from '@aztec/stdlib/tx';
7
+ import { buildHeaderFromCircuitOutputs, toProofData } from './block-building-helpers.js';
13
8
  /**
14
9
  * The current state of the proving schedule for a given block. Managed by ProvingState.
15
10
  * Contains the raw inputs and intermediate state to generate every constituent proof in the tree.
16
11
  */ export class BlockProvingState {
17
12
  index;
18
- globalVariables;
19
- newL1ToL2Messages;
20
- l1ToL2MessageTreeSnapshot;
21
- l1ToL2MessageSubtreeSiblingPath;
22
- l1ToL2MessageTreeSnapshotAfterInsertion;
23
- lastArchiveSnapshot;
24
- lastArchiveSiblingPath;
25
- newArchiveSiblingPath;
26
- previousBlockHeader;
27
- proverId;
28
- parentEpoch;
29
- baseOrMergeProvingOutputs;
30
- baseParityProvingOutputs;
31
- rootParityProvingOutput;
32
- blockRootProvingOutput;
33
- blockRootRollupStarted;
34
- block;
35
- spongeBlobState;
36
- startBlobAccumulator;
37
- endBlobAccumulator;
38
- blobsHash;
13
+ blockNumber;
39
14
  totalNumTxs;
15
+ constants;
16
+ timestamp;
17
+ lastArchiveTreeSnapshot;
18
+ lastArchiveSiblingPath;
19
+ lastL1ToL2MessageTreeSnapshot;
20
+ lastL1ToL2MessageSubtreeRootSiblingPath;
21
+ newL1ToL2MessageTreeSnapshot;
22
+ headerOfLastBlockInPreviousCheckpoint;
23
+ startSpongeBlob;
24
+ parentCheckpoint;
25
+ baseOrMergeProofs;
26
+ baseParityProofs;
27
+ rootParityProof;
28
+ blockRootProof;
29
+ builtBlockHeader;
30
+ endSpongeBlob;
40
31
  txs;
32
+ isFirstBlock;
41
33
  error;
42
- constructor(index, globalVariables, newL1ToL2Messages, l1ToL2MessageTreeSnapshot, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, lastArchiveSiblingPath, newArchiveSiblingPath, previousBlockHeader, proverId, parentEpoch){
34
+ constructor(index, blockNumber, totalNumTxs, constants, timestamp, lastArchiveTreeSnapshot, lastArchiveSiblingPath, lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, newL1ToL2MessageTreeSnapshot, headerOfLastBlockInPreviousCheckpoint, startSpongeBlob, parentCheckpoint){
43
35
  this.index = index;
44
- this.globalVariables = globalVariables;
45
- this.newL1ToL2Messages = newL1ToL2Messages;
46
- this.l1ToL2MessageTreeSnapshot = l1ToL2MessageTreeSnapshot;
47
- this.l1ToL2MessageSubtreeSiblingPath = l1ToL2MessageSubtreeSiblingPath;
48
- this.l1ToL2MessageTreeSnapshotAfterInsertion = l1ToL2MessageTreeSnapshotAfterInsertion;
49
- this.lastArchiveSnapshot = lastArchiveSnapshot;
36
+ this.blockNumber = blockNumber;
37
+ this.totalNumTxs = totalNumTxs;
38
+ this.constants = constants;
39
+ this.timestamp = timestamp;
40
+ this.lastArchiveTreeSnapshot = lastArchiveTreeSnapshot;
50
41
  this.lastArchiveSiblingPath = lastArchiveSiblingPath;
51
- this.newArchiveSiblingPath = newArchiveSiblingPath;
52
- this.previousBlockHeader = previousBlockHeader;
53
- this.proverId = proverId;
54
- this.parentEpoch = parentEpoch;
55
- this.baseOrMergeProvingOutputs = new UnbalancedTreeStore(0);
56
- this.blockRootRollupStarted = false;
57
- this.txs = [];
58
- this.baseParityProvingOutputs = Array.from({
42
+ this.lastL1ToL2MessageTreeSnapshot = lastL1ToL2MessageTreeSnapshot;
43
+ this.lastL1ToL2MessageSubtreeRootSiblingPath = lastL1ToL2MessageSubtreeRootSiblingPath;
44
+ this.newL1ToL2MessageTreeSnapshot = newL1ToL2MessageTreeSnapshot;
45
+ this.headerOfLastBlockInPreviousCheckpoint = headerOfLastBlockInPreviousCheckpoint;
46
+ this.startSpongeBlob = startSpongeBlob;
47
+ this.parentCheckpoint = parentCheckpoint;
48
+ this.baseOrMergeProofs = new UnbalancedTreeStore(0);
49
+ this.baseParityProofs = Array.from({
59
50
  length: NUM_BASE_PARITY_PER_ROOT_PARITY
60
51
  }).map((_)=>undefined);
61
- this.totalNumTxs = 0;
62
- if (this.blockNumber == parentEpoch.firstBlockNumber) {
63
- this.startBlobAccumulator = BatchedBlobAccumulator.newWithChallenges(parentEpoch.finalBlobBatchingChallenges);
52
+ this.txs = [];
53
+ this.isFirstBlock = index === 0;
54
+ if (!totalNumTxs && !this.isFirstBlock) {
55
+ throw new Error(`Cannot create a block with 0 txs, unless it's the first block.`);
64
56
  }
57
+ this.baseOrMergeProofs = new UnbalancedTreeStore(totalNumTxs);
65
58
  }
66
- get blockNumber() {
67
- return this.globalVariables.blockNumber;
68
- }
69
- startNewBlock(numTxs, numBlobFields) {
70
- if (this.spongeBlobState) {
71
- throw new Error(`Block ${this.blockNumber} already initalised.`);
72
- }
73
- this.baseOrMergeProvingOutputs = new UnbalancedTreeStore(numTxs);
74
- // Initialize the sponge which will eventually absorb all tx effects to be added to the blob.
75
- // Like l1 to l2 messages, we need to know beforehand how many effects will be absorbed.
76
- this.spongeBlobState = SpongeBlob.init(numBlobFields);
77
- this.totalNumTxs = numTxs;
59
+ get epochNumber() {
60
+ return this.parentCheckpoint.epochNumber;
78
61
  }
79
62
  // Adds a transaction to the proving state, returns it's index
80
63
  addNewTx(tx) {
81
- if (!this.spongeBlobState) {
82
- throw new Error(`Invalid block proving state, call startNewBlock before adding transactions.`);
64
+ if (!this.isAcceptingTxs()) {
65
+ throw new Error(`Cannot add more txs to block ${this.blockNumber}.`);
83
66
  }
84
67
  const txIndex = this.txs.length;
85
68
  this.txs[txIndex] = tx;
86
69
  return txIndex;
87
70
  }
71
+ isAcceptingTxs() {
72
+ return this.txs.length < this.totalNumTxs;
73
+ }
74
+ getProcessedTxs() {
75
+ return this.txs.map((t)=>t.processedTx);
76
+ }
77
+ tryStartProvingBase(txIndex) {
78
+ if (this.baseOrMergeProofs.getLeaf(txIndex)?.isProving) {
79
+ return false;
80
+ } else {
81
+ this.baseOrMergeProofs.setLeaf(txIndex, {
82
+ isProving: true
83
+ });
84
+ return true;
85
+ }
86
+ }
88
87
  setBaseRollupProof(txIndex, provingOutput) {
89
- return this.baseOrMergeProvingOutputs.setLeaf(txIndex, provingOutput);
88
+ return this.baseOrMergeProofs.setLeaf(txIndex, {
89
+ provingOutput
90
+ });
91
+ }
92
+ tryStartProvingMerge(location) {
93
+ if (this.baseOrMergeProofs.getNode(location)?.isProving) {
94
+ return false;
95
+ } else {
96
+ this.baseOrMergeProofs.setNode(location, {
97
+ isProving: true
98
+ });
99
+ return true;
100
+ }
90
101
  }
91
102
  setMergeRollupProof(location, provingOutput) {
92
- this.baseOrMergeProvingOutputs.setNode(location, provingOutput);
103
+ this.baseOrMergeProofs.setNode(location, {
104
+ provingOutput
105
+ });
106
+ }
107
+ tryStartProvingBaseParity(index) {
108
+ if (this.baseParityProofs[index]?.isProving) {
109
+ return false;
110
+ } else {
111
+ this.baseParityProofs[index] = {
112
+ isProving: true
113
+ };
114
+ return true;
115
+ }
93
116
  }
94
117
  // Stores a set of root parity inputs at the given index
95
118
  setBaseParityProof(index, provingOutput) {
96
119
  if (index >= NUM_BASE_PARITY_PER_ROOT_PARITY) {
97
120
  throw new Error(`Unable to set a base parity proofs at index ${index}. Expected at most ${NUM_BASE_PARITY_PER_ROOT_PARITY} proofs.`);
98
121
  }
99
- this.baseParityProvingOutputs[index] = provingOutput;
122
+ this.baseParityProofs[index] = {
123
+ provingOutput
124
+ };
125
+ }
126
+ tryStartProvingRootParity() {
127
+ if (this.rootParityProof?.isProving) {
128
+ return false;
129
+ } else {
130
+ this.rootParityProof = {
131
+ isProving: true
132
+ };
133
+ return true;
134
+ }
100
135
  }
101
136
  setRootParityProof(provingOutput) {
102
- this.rootParityProvingOutput = provingOutput;
137
+ this.rootParityProof = {
138
+ provingOutput
139
+ };
140
+ }
141
+ tryStartProvingBlockRoot() {
142
+ if (this.blockRootProof?.isProving) {
143
+ return false;
144
+ } else {
145
+ this.blockRootProof = {
146
+ isProving: true
147
+ };
148
+ return true;
149
+ }
103
150
  }
104
151
  setBlockRootRollupProof(provingOutput) {
105
- this.blockRootProvingOutput = provingOutput;
152
+ this.blockRootProof = {
153
+ provingOutput
154
+ };
155
+ return this.parentCheckpoint.setBlockRootRollupProof(this.index, provingOutput);
106
156
  }
107
- setBlock(block) {
108
- this.block = block;
157
+ getBlockRootRollupOutput() {
158
+ return this.blockRootProof?.provingOutput?.inputs;
109
159
  }
110
- setStartBlobAccumulator(accumulator) {
111
- this.startBlobAccumulator = accumulator;
160
+ setBuiltBlockHeader(blockHeader) {
161
+ this.builtBlockHeader = blockHeader;
112
162
  }
113
- setEndBlobAccumulator(accumulator) {
114
- this.endBlobAccumulator = accumulator;
163
+ getBuiltBlockHeader() {
164
+ return this.builtBlockHeader;
115
165
  }
116
- async accumulateBlobs() {
117
- if (!this.block || !this.startBlobAccumulator) {
118
- // We only want to accumulate once we have all txs, so we wait until the block is set.
119
- return;
166
+ getGlobalVariables() {
167
+ if (this.txs.length) {
168
+ return this.txs[0].processedTx.globalVariables;
120
169
  }
121
- const endBlobAccumulator = await accumulateBlobs(this.allTxs.map((t)=>t.processedTx), this.startBlobAccumulator);
122
- this.setEndBlobAccumulator(endBlobAccumulator);
170
+ const constants = this.constants;
171
+ return GlobalVariables.from({
172
+ chainId: constants.chainId,
173
+ version: constants.version,
174
+ blockNumber: this.blockNumber,
175
+ slotNumber: constants.slotNumber,
176
+ timestamp: this.timestamp,
177
+ coinbase: constants.coinbase,
178
+ feeRecipient: constants.feeRecipient,
179
+ gasFees: constants.gasFees
180
+ });
181
+ }
182
+ getStartSpongeBlob() {
183
+ return this.startSpongeBlob;
123
184
  }
124
- // Returns the complete set of transaction proving state objects
125
- get allTxs() {
126
- return this.txs;
185
+ setEndSpongeBlob(endSpongeBlob) {
186
+ this.endSpongeBlob = endSpongeBlob;
127
187
  }
128
- /** Returns the block number as an epoch number. Used for prioritizing proof requests. */ get epochNumber() {
129
- return this.parentEpoch.epochNumber;
188
+ getEndSpongeBlob() {
189
+ return this.endSpongeBlob;
190
+ }
191
+ getTxEffects() {
192
+ return this.txs.map((t)=>t.processedTx.txEffect);
130
193
  }
131
194
  getParentLocation(location) {
132
- return this.baseOrMergeProvingOutputs.getParentLocation(location);
195
+ return this.baseOrMergeProofs.getParentLocation(location);
133
196
  }
134
197
  getMergeRollupInputs(mergeLocation) {
135
- const [left, right] = this.baseOrMergeProvingOutputs.getChildren(mergeLocation);
198
+ const [left, right] = this.baseOrMergeProofs.getChildren(mergeLocation).map((c)=>c?.provingOutput);
136
199
  if (!left || !right) {
137
- throw new Error('At lease one child is not ready.');
200
+ throw new Error('At least one child is not ready for the merge rollup.');
138
201
  }
139
- return new MergeRollupInputs([
140
- this.#getPreviousRollupData(left),
141
- this.#getPreviousRollupData(right)
202
+ return new TxMergeRollupPrivateInputs([
203
+ toProofData(left),
204
+ toProofData(right)
142
205
  ]);
143
206
  }
144
- async getBlockRootRollupTypeAndInputs() {
145
- if (!this.rootParityProvingOutput) {
146
- throw new Error('Root parity is not ready.');
207
+ getBlockRootRollupTypeAndInputs() {
208
+ const provingOutputs = this.#getChildProvingOutputsForBlockRoot();
209
+ if (!provingOutputs.every((p)=>!!p)) {
210
+ throw new Error('At least one child is not ready for the block root rollup.');
147
211
  }
148
- const proofs = this.#getChildProofsForBlockRoot();
149
- const nonEmptyProofs = proofs.filter((p)=>!!p);
150
- if (proofs.length !== nonEmptyProofs.length) {
151
- throw new Error('At lease one child is not ready for the block root.');
212
+ const previousRollups = provingOutputs.map((p)=>toProofData(p));
213
+ if (this.isFirstBlock) {
214
+ return this.#getFirstBlockRootRollupTypeAndInputs(previousRollups);
152
215
  }
153
- const data = this.#getBlockRootRollupData();
154
- if (this.totalNumTxs === 0) {
155
- const constants = BlockConstantData.from({
156
- lastArchive: this.lastArchiveSnapshot,
157
- newL1ToL2: this.l1ToL2MessageTreeSnapshotAfterInsertion,
158
- globalVariables: this.globalVariables,
159
- vkTreeRoot: getVKTreeRoot(),
160
- protocolContractTreeRoot
161
- });
162
- this.blobsHash = await getEmptyBlockBlobsHash();
216
+ const [leftRollup, rightRollup] = previousRollups;
217
+ if (!rightRollup) {
218
+ return {
219
+ rollupType: 'rollup-block-root-single-tx',
220
+ inputs: new BlockRootSingleTxRollupPrivateInputs(leftRollup, this.lastArchiveSiblingPath)
221
+ };
222
+ } else {
163
223
  return {
164
- rollupType: 'empty-block-root-rollup',
165
- inputs: EmptyBlockRootRollupInputs.from({
166
- data,
167
- constants
168
- })
224
+ rollupType: 'rollup-block-root',
225
+ inputs: new BlockRootRollupPrivateInputs([
226
+ leftRollup,
227
+ rightRollup
228
+ ], this.lastArchiveSiblingPath)
169
229
  };
170
230
  }
171
- const previousRollupData = await Promise.all(nonEmptyProofs.map((p)=>this.#getPreviousRollupData(p)));
172
- const blobData = await this.#getBlockRootRollupBlobData();
173
- this.blobsHash = blobData.blobsHash;
174
- if (previousRollupData.length === 1) {
231
+ }
232
+ #getFirstBlockRootRollupTypeAndInputs([leftRollup, rightRollup]) {
233
+ if (!this.rootParityProof?.provingOutput) {
234
+ throw new Error('Root parity is not ready.');
235
+ }
236
+ const l1ToL2Roots = toProofData(this.rootParityProof.provingOutput);
237
+ if (!leftRollup) {
175
238
  return {
176
- rollupType: 'single-tx-block-root-rollup',
177
- inputs: new SingleTxBlockRootRollupInputs(previousRollupData, data, blobData)
239
+ rollupType: 'rollup-block-root-first-empty-tx',
240
+ inputs: new BlockRootEmptyTxFirstRollupPrivateInputs(l1ToL2Roots, this.lastArchiveTreeSnapshot, this.headerOfLastBlockInPreviousCheckpoint.state, this.constants, this.startSpongeBlob, this.timestamp, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
241
+ };
242
+ } else if (!rightRollup) {
243
+ return {
244
+ rollupType: 'rollup-block-root-first-single-tx',
245
+ inputs: new BlockRootSingleTxFirstRollupPrivateInputs(l1ToL2Roots, leftRollup, this.lastL1ToL2MessageTreeSnapshot, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
178
246
  };
179
247
  } else {
180
248
  return {
181
- rollupType: 'block-root-rollup',
182
- inputs: new BlockRootRollupInputs(previousRollupData, data, blobData)
249
+ rollupType: 'rollup-block-root-first',
250
+ inputs: new BlockRootFirstRollupPrivateInputs(l1ToL2Roots, [
251
+ leftRollup,
252
+ rightRollup
253
+ ], this.lastL1ToL2MessageTreeSnapshot, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
183
254
  };
184
255
  }
185
256
  }
186
- getPaddingBlockRootInputs() {
187
- const constants = EpochConstantData.from({
188
- vkTreeRoot: getVKTreeRoot(),
189
- protocolContractTreeRoot,
190
- proverId: this.proverId.toField()
191
- });
192
- return PaddingBlockRootRollupInputs.from({
193
- constants
194
- });
195
- }
196
- getRootParityInputs() {
197
- if (!this.baseParityProvingOutputs.every((p)=>!!p)) {
257
+ getParityRootInputs() {
258
+ const baseParityProvingOutputs = this.baseParityProofs.filter((p)=>!!p?.provingOutput).map((p)=>p.provingOutput);
259
+ if (baseParityProvingOutputs.length !== this.baseParityProofs.length) {
198
260
  throw new Error('At lease one base parity is not ready.');
199
261
  }
200
- const children = this.baseParityProvingOutputs.map((p)=>this.#getRootParityData(p));
201
- return new RootParityInputs(children);
262
+ const children = baseParityProvingOutputs.map((p)=>toProofData(p));
263
+ return new ParityRootPrivateInputs(assertLength(children, NUM_BASE_PARITY_PER_ROOT_PARITY));
202
264
  }
203
265
  // Returns a specific transaction proving state
204
266
  getTxProvingState(txIndex) {
205
267
  return this.txs[txIndex];
206
268
  }
207
269
  async buildHeaderFromProvingOutputs() {
208
- const previousRollupData = this.totalNumTxs === 0 ? [] : await Promise.all(this.#getChildProofsForBlockRoot().map((p)=>this.#getPreviousRollupData(p)));
209
- let endPartialState = this.previousBlockHeader.state.partial;
210
- if (this.totalNumTxs !== 0) {
211
- const previousRollupData = this.#getChildProofsForBlockRoot();
212
- const lastRollup = previousRollupData[previousRollupData.length - 1];
213
- if (!lastRollup) {
214
- throw new Error('End state of the block is not available. Last rollup is not ready yet.');
215
- }
216
- endPartialState = lastRollup.inputs.end;
270
+ if (!this.blockRootProof?.provingOutput) {
271
+ throw new Error('Block root rollup is not ready.');
217
272
  }
218
- const endState = new StateReference(this.l1ToL2MessageTreeSnapshotAfterInsertion, endPartialState);
219
- return buildHeaderFromCircuitOutputs(previousRollupData.map((d)=>d.baseOrMergeRollupPublicInputs), this.rootParityProvingOutput.inputs, this.blockRootProvingOutput.inputs, this.blobsHash, endState);
273
+ return await buildHeaderFromCircuitOutputs(this.blockRootProof.provingOutput.inputs);
220
274
  }
221
275
  isReadyForMergeRollup(location) {
222
- return this.baseOrMergeProvingOutputs.getSibling(location) !== undefined;
276
+ return !!this.baseOrMergeProofs.getSibling(location)?.provingOutput;
223
277
  }
224
278
  // Returns true if we have sufficient inputs to execute the block root rollup
225
279
  isReadyForBlockRootRollup() {
226
- const childProofs = this.#getChildProofsForBlockRoot();
227
- return this.block !== undefined && this.rootParityProvingOutput !== undefined && this.endBlobAccumulator !== undefined && childProofs.every((p)=>!!p);
280
+ const childProofs = this.#getChildProvingOutputsForBlockRoot();
281
+ return (!this.isFirstBlock || !!this.rootParityProof?.provingOutput) && childProofs.every((p)=>!!p);
228
282
  }
229
283
  // Returns true if we have sufficient root parity inputs to execute the root parity circuit
230
284
  isReadyForRootParity() {
231
- return this.baseParityProvingOutputs.every((p)=>!!p);
285
+ return this.baseParityProofs.every((p)=>!!p?.provingOutput);
232
286
  }
233
287
  isComplete() {
234
- return !!this.blockRootProvingOutput;
288
+ return !!this.blockRootProof;
235
289
  }
236
- // Returns whether the proving state is still valid
237
290
  verifyState() {
238
- return this.parentEpoch.verifyState();
291
+ return this.parentCheckpoint.verifyState();
292
+ }
293
+ getError() {
294
+ return this.error;
239
295
  }
240
296
  reject(reason) {
241
297
  this.error = reason;
242
- this.parentEpoch.reject(reason);
243
- }
244
- #getBlockRootRollupData() {
245
- return BlockRootRollupData.from({
246
- l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput),
247
- l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
248
- previousArchiveSiblingPath: this.lastArchiveSiblingPath,
249
- newArchiveSiblingPath: this.newArchiveSiblingPath,
250
- previousBlockHeader: this.previousBlockHeader,
251
- startBlobAccumulator: BlobAccumulatorPublicInputs.fromBatchedBlobAccumulator(this.startBlobAccumulator),
252
- finalBlobChallenges: this.startBlobAccumulator.finalBlobChallenges,
253
- proverId: this.proverId.toField()
254
- });
298
+ this.parentCheckpoint.reject(reason);
255
299
  }
256
- async #getBlockRootRollupBlobData() {
257
- const txEffects = this.txs.map((txProvingState)=>txProvingState.processedTx.txEffect);
258
- const { blobFields, blobCommitments, blobsHash } = await buildBlobHints(txEffects);
259
- return BlockRootRollupBlobData.from({
260
- blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK),
261
- blobCommitments: padArrayEnd(blobCommitments, BLS12Point.ZERO, BLOBS_PER_BLOCK),
262
- blobsHash
263
- });
264
- }
265
- #getChildProofsForBlockRoot() {
300
+ #getChildProvingOutputsForBlockRoot() {
266
301
  if (this.totalNumTxs === 0) {
267
302
  return [];
268
303
  }
@@ -272,15 +307,7 @@ import { accumulateBlobs, buildBlobHints, buildHeaderFromCircuitOutputs, getEmpt
272
307
  };
273
308
  // If there's only 1 tx, its base rollup proof will be stored at the root.
274
309
  return this.totalNumTxs === 1 ? [
275
- this.baseOrMergeProvingOutputs.getNode(rootLocation)
276
- ] : this.baseOrMergeProvingOutputs.getChildren(rootLocation);
277
- }
278
- #getPreviousRollupData({ inputs, proof, verificationKey }) {
279
- const leafIndex = getVKIndex(verificationKey.keyAsFields);
280
- const vkData = new VkData(verificationKey, leafIndex, getVKSiblingPath(leafIndex));
281
- return new PreviousRollupData(inputs, proof, vkData);
282
- }
283
- #getRootParityData({ inputs, proof, verificationKey }) {
284
- return new RootParityInput(proof, verificationKey.keyAsFields, getVKSiblingPath(getVKIndex(verificationKey)), inputs);
310
+ this.baseOrMergeProofs.getNode(rootLocation)?.provingOutput
311
+ ] : this.baseOrMergeProofs.getChildren(rootLocation).map((c)=>c?.provingOutput);
285
312
  }
286
313
  }
@@ -0,0 +1,63 @@
1
+ import { BatchedBlobAccumulator, type FinalBlobBatchingChallenges } from '@aztec/blob-lib';
2
+ import { type ARCHIVE_HEIGHT, type L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH, type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH } from '@aztec/constants';
3
+ import { Fr } from '@aztec/foundation/fields';
4
+ import type { Tuple } from '@aztec/foundation/serialize';
5
+ import { type TreeNodeLocation } from '@aztec/foundation/trees';
6
+ import type { PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
7
+ import { ParityBasePrivateInputs } from '@aztec/stdlib/parity';
8
+ import { BlockMergeRollupPrivateInputs, BlockRollupPublicInputs, CheckpointConstantData, CheckpointRollupPublicInputs, CheckpointRootRollupPrivateInputs, CheckpointRootSingleBlockRollupPrivateInputs } from '@aztec/stdlib/rollup';
9
+ import type { CircuitName } from '@aztec/stdlib/stats';
10
+ import type { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
11
+ import type { BlockHeader } from '@aztec/stdlib/tx';
12
+ import type { UInt64 } from '@aztec/stdlib/types';
13
+ import { BlockProvingState } from './block-proving-state.js';
14
+ import type { EpochProvingState } from './epoch-proving-state.js';
15
+ export declare class CheckpointProvingState {
16
+ #private;
17
+ readonly index: number;
18
+ readonly constants: CheckpointConstantData;
19
+ readonly totalNumBlocks: number;
20
+ private readonly totalNumBlobFields;
21
+ private readonly finalBlobBatchingChallenges;
22
+ private readonly headerOfLastBlockInPreviousCheckpoint;
23
+ private readonly lastArchiveSiblingPath;
24
+ private readonly l1ToL2Messages;
25
+ private readonly lastL1ToL2MessageTreeSnapshot;
26
+ private readonly lastL1ToL2MessageSubtreeRootSiblingPath;
27
+ private readonly newL1ToL2MessageTreeSnapshot;
28
+ private readonly newL1ToL2MessageSubtreeRootSiblingPath;
29
+ parentEpoch: EpochProvingState;
30
+ private onBlobAccumulatorSet;
31
+ private blockProofs;
32
+ private checkpointRootProof;
33
+ private blocks;
34
+ private startBlobAccumulator;
35
+ private endBlobAccumulator;
36
+ private blobFields;
37
+ private error;
38
+ readonly firstBlockNumber: number;
39
+ constructor(index: number, constants: CheckpointConstantData, totalNumBlocks: number, totalNumBlobFields: number, finalBlobBatchingChallenges: FinalBlobBatchingChallenges, headerOfLastBlockInPreviousCheckpoint: BlockHeader, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, l1ToL2Messages: Fr[], lastL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>, newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>, parentEpoch: EpochProvingState, onBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => void);
40
+ get epochNumber(): number;
41
+ startNewBlock(blockNumber: number, timestamp: UInt64, totalNumTxs: number, lastArchiveTreeSnapshot: AppendOnlyTreeSnapshot, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>): Promise<BlockProvingState>;
42
+ isAcceptingBlocks(): boolean;
43
+ setBlockRootRollupProof(blockIndex: number, provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
44
+ tryStartProvingBlockMerge(location: TreeNodeLocation): boolean;
45
+ setBlockMergeRollupProof(location: TreeNodeLocation, provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
46
+ tryStartProvingCheckpointRoot(): boolean;
47
+ setCheckpointRootRollupProof(provingOutput: PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
48
+ getBaseParityInputs(baseParityIndex: number): ParityBasePrivateInputs;
49
+ accumulateBlobs(startBlobAccumulator: BatchedBlobAccumulator): Promise<BatchedBlobAccumulator | undefined>;
50
+ getEndBlobAccumulator(): BatchedBlobAccumulator | undefined;
51
+ getParentLocation(location: TreeNodeLocation): TreeNodeLocation;
52
+ getBlockMergeRollupInputs(mergeLocation: TreeNodeLocation): BlockMergeRollupPrivateInputs;
53
+ getCheckpointRootRollupType(): CircuitName;
54
+ getCheckpointRootRollupInputs(): CheckpointRootSingleBlockRollupPrivateInputs | CheckpointRootRollupPrivateInputs;
55
+ getBlockProvingStateByBlockNumber(blockNumber: number): BlockProvingState | undefined;
56
+ isReadyForBlockMerge(location: TreeNodeLocation): boolean;
57
+ isReadyForCheckpointRoot(): boolean;
58
+ verifyState(): boolean;
59
+ getError(): string | undefined;
60
+ cancel(): void;
61
+ reject(reason: string): void;
62
+ }
63
+ //# sourceMappingURL=checkpoint-proving-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/checkpoint-proving-state.ts"],"names":[],"mappings":"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"}