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

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 (121) hide show
  1. package/dest/block-factory/index.d.ts +2 -0
  2. package/dest/block-factory/index.d.ts.map +1 -0
  3. package/dest/block-factory/light.d.ts +38 -0
  4. package/dest/block-factory/light.d.ts.map +1 -0
  5. package/dest/block-factory/light.js +94 -0
  6. package/dest/config.d.ts +6 -6
  7. package/dest/config.d.ts.map +1 -1
  8. package/dest/config.js +11 -1
  9. package/dest/mocks/fixtures.d.ts +7 -4
  10. package/dest/mocks/fixtures.d.ts.map +1 -1
  11. package/dest/mocks/fixtures.js +32 -4
  12. package/dest/mocks/test_context.d.ts +43 -15
  13. package/dest/mocks/test_context.d.ts.map +1 -1
  14. package/dest/mocks/test_context.js +110 -48
  15. package/dest/orchestrator/block-building-helpers.d.ts +37 -28
  16. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  17. package/dest/orchestrator/block-building-helpers.js +156 -150
  18. package/dest/orchestrator/block-proving-state.d.ts +62 -46
  19. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  20. package/dest/orchestrator/block-proving-state.js +223 -179
  21. package/dest/orchestrator/checkpoint-proving-state.d.ts +63 -0
  22. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
  23. package/dest/orchestrator/checkpoint-proving-state.js +211 -0
  24. package/dest/orchestrator/epoch-proving-state.d.ts +37 -24
  25. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  26. package/dest/orchestrator/epoch-proving-state.js +143 -73
  27. package/dest/orchestrator/orchestrator.d.ts +34 -31
  28. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  29. package/dest/orchestrator/orchestrator.js +392 -234
  30. package/dest/orchestrator/orchestrator_metrics.d.ts +2 -0
  31. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  32. package/dest/orchestrator/orchestrator_metrics.js +9 -0
  33. package/dest/orchestrator/tx-proving-state.d.ts +12 -10
  34. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  35. package/dest/orchestrator/tx-proving-state.js +30 -38
  36. package/dest/prover-client/prover-client.d.ts +3 -3
  37. package/dest/prover-client/prover-client.d.ts.map +1 -1
  38. package/dest/prover-client/prover-client.js +5 -4
  39. package/dest/prover-client/server-epoch-prover.d.ts +13 -10
  40. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  41. package/dest/prover-client/server-epoch-prover.js +11 -11
  42. package/dest/proving_broker/broker_prover_facade.d.ts +22 -15
  43. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  44. package/dest/proving_broker/broker_prover_facade.js +64 -39
  45. package/dest/proving_broker/config.d.ts +9 -4
  46. package/dest/proving_broker/config.d.ts.map +1 -1
  47. package/dest/proving_broker/config.js +15 -4
  48. package/dest/proving_broker/factory.d.ts +1 -1
  49. package/dest/proving_broker/factory.d.ts.map +1 -1
  50. package/dest/proving_broker/factory.js +5 -1
  51. package/dest/proving_broker/fixtures.js +1 -1
  52. package/dest/proving_broker/proof_store/factory.js +1 -1
  53. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
  54. package/dest/proving_broker/proof_store/gcs_proof_store.js +1 -0
  55. package/dest/proving_broker/proof_store/index.d.ts +1 -0
  56. package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
  57. package/dest/proving_broker/proof_store/index.js +1 -0
  58. package/dest/proving_broker/proving_agent.d.ts +3 -3
  59. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  60. package/dest/proving_broker/proving_agent.js +83 -47
  61. package/dest/proving_broker/proving_broker.d.ts +11 -2
  62. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  63. package/dest/proving_broker/proving_broker.js +34 -22
  64. package/dest/proving_broker/proving_broker_database/memory.js +1 -1
  65. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  66. package/dest/proving_broker/proving_broker_database/persisted.js +9 -8
  67. package/dest/proving_broker/proving_job_controller.d.ts +7 -8
  68. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  69. package/dest/proving_broker/proving_job_controller.js +89 -61
  70. package/dest/proving_broker/rpc.d.ts +3 -5
  71. package/dest/proving_broker/rpc.d.ts.map +1 -1
  72. package/dest/proving_broker/rpc.js +1 -4
  73. package/dest/test/mock_proof_store.d.ts +9 -0
  74. package/dest/test/mock_proof_store.d.ts.map +1 -0
  75. package/dest/test/mock_proof_store.js +10 -0
  76. package/dest/test/mock_prover.d.ts +23 -16
  77. package/dest/test/mock_prover.d.ts.map +1 -1
  78. package/dest/test/mock_prover.js +38 -20
  79. package/package.json +29 -29
  80. package/src/block-factory/index.ts +1 -0
  81. package/src/block-factory/light.ts +140 -0
  82. package/src/config.ts +24 -8
  83. package/src/mocks/fixtures.ts +43 -15
  84. package/src/mocks/test_context.ts +201 -75
  85. package/src/orchestrator/block-building-helpers.ts +247 -243
  86. package/src/orchestrator/block-proving-state.ts +247 -231
  87. package/src/orchestrator/checkpoint-proving-state.ts +299 -0
  88. package/src/orchestrator/epoch-proving-state.ts +187 -111
  89. package/src/orchestrator/orchestrator.ts +590 -289
  90. package/src/orchestrator/orchestrator_metrics.ts +20 -1
  91. package/src/orchestrator/tx-proving-state.ts +60 -61
  92. package/src/prover-client/prover-client.ts +16 -14
  93. package/src/prover-client/server-epoch-prover.ts +40 -21
  94. package/src/proving_broker/broker_prover_facade.ts +200 -113
  95. package/src/proving_broker/config.ts +17 -6
  96. package/src/proving_broker/factory.ts +2 -1
  97. package/src/proving_broker/fixtures.ts +1 -1
  98. package/src/proving_broker/proof_store/factory.ts +1 -1
  99. package/src/proving_broker/proof_store/gcs_proof_store.ts +5 -1
  100. package/src/proving_broker/proof_store/index.ts +1 -0
  101. package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
  102. package/src/proving_broker/proving_agent.ts +89 -47
  103. package/src/proving_broker/proving_broker.ts +51 -32
  104. package/src/proving_broker/proving_broker_database/memory.ts +1 -1
  105. package/src/proving_broker/proving_broker_database/persisted.ts +9 -8
  106. package/src/proving_broker/proving_job_controller.ts +92 -81
  107. package/src/proving_broker/rpc.ts +1 -6
  108. package/src/test/mock_proof_store.ts +14 -0
  109. package/src/test/mock_prover.ts +164 -60
  110. package/dest/bin/get-proof-inputs.d.ts +0 -2
  111. package/dest/bin/get-proof-inputs.d.ts.map +0 -1
  112. package/dest/bin/get-proof-inputs.js +0 -51
  113. package/dest/block_builder/index.d.ts +0 -6
  114. package/dest/block_builder/index.d.ts.map +0 -1
  115. package/dest/block_builder/light.d.ts +0 -33
  116. package/dest/block_builder/light.d.ts.map +0 -1
  117. package/dest/block_builder/light.js +0 -82
  118. package/src/bin/get-proof-inputs.ts +0 -59
  119. package/src/block_builder/index.ts +0 -6
  120. package/src/block_builder/light.ts +0 -101
  121. /package/dest/{block_builder → block-factory}/index.js +0 -0
@@ -1,252 +1,303 @@
1
- import { SpongeBlob } from '@aztec/blob-lib';
2
- import { BLOBS_PER_BLOCK, FIELDS_PER_BLOB, NUM_BASE_PARITY_PER_ROOT_PARITY, VK_TREE_HEIGHT } from '@aztec/constants';
3
- import { padArrayEnd } from '@aztec/foundation/collection';
4
- import { Fr } from '@aztec/foundation/fields';
5
- import { MembershipWitness, 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 { BlockRootRollupBlobData, BlockRootRollupData, BlockRootRollupInputs, ConstantRollupData, EmptyBlockRootRollupInputs, MergeRollupInputs, PreviousRollupData, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
10
- import { StateReference } from '@aztec/stdlib/tx';
11
- import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-helpers.js';
1
+ import { NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
2
+ import { assertLength } from '@aztec/foundation/serialize';
3
+ import { UnbalancedTreeStore } from '@aztec/foundation/trees';
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';
12
8
  /**
13
9
  * The current state of the proving schedule for a given block. Managed by ProvingState.
14
10
  * Contains the raw inputs and intermediate state to generate every constituent proof in the tree.
15
11
  */ export class BlockProvingState {
16
12
  index;
17
- globalVariables;
18
- newL1ToL2Messages;
19
- l1ToL2MessageSubtreeSiblingPath;
20
- l1ToL2MessageTreeSnapshotAfterInsertion;
21
- lastArchiveSnapshot;
22
- newArchiveSiblingPath;
23
- previousBlockHeader;
24
- parentEpoch;
25
- baseOrMergeProvingOutputs;
26
- baseParityProvingOutputs;
27
- rootParityProvingOutput;
28
- blockRootProvingOutput;
29
- blockRootRollupStarted;
30
- block;
31
- spongeBlobState;
13
+ blockNumber;
32
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;
33
31
  txs;
32
+ isFirstBlock;
34
33
  error;
35
- constructor(index, globalVariables, newL1ToL2Messages, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, newArchiveSiblingPath, previousBlockHeader, parentEpoch){
34
+ constructor(index, blockNumber, totalNumTxs, constants, timestamp, lastArchiveTreeSnapshot, lastArchiveSiblingPath, lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, newL1ToL2MessageTreeSnapshot, headerOfLastBlockInPreviousCheckpoint, startSpongeBlob, parentCheckpoint){
36
35
  this.index = index;
37
- this.globalVariables = globalVariables;
38
- this.newL1ToL2Messages = newL1ToL2Messages;
39
- this.l1ToL2MessageSubtreeSiblingPath = l1ToL2MessageSubtreeSiblingPath;
40
- this.l1ToL2MessageTreeSnapshotAfterInsertion = l1ToL2MessageTreeSnapshotAfterInsertion;
41
- this.lastArchiveSnapshot = lastArchiveSnapshot;
42
- this.newArchiveSiblingPath = newArchiveSiblingPath;
43
- this.previousBlockHeader = previousBlockHeader;
44
- this.parentEpoch = parentEpoch;
45
- this.baseOrMergeProvingOutputs = new UnbalancedTreeStore(0);
46
- this.blockRootRollupStarted = false;
47
- this.txs = [];
48
- this.baseParityProvingOutputs = Array.from({
36
+ this.blockNumber = blockNumber;
37
+ this.totalNumTxs = totalNumTxs;
38
+ this.constants = constants;
39
+ this.timestamp = timestamp;
40
+ this.lastArchiveTreeSnapshot = lastArchiveTreeSnapshot;
41
+ this.lastArchiveSiblingPath = lastArchiveSiblingPath;
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({
49
50
  length: NUM_BASE_PARITY_PER_ROOT_PARITY
50
51
  }).map((_)=>undefined);
51
- this.totalNumTxs = 0;
52
- }
53
- get blockNumber() {
54
- return this.globalVariables.blockNumber.toNumber();
55
- }
56
- startNewBlock(numTxs, numBlobFields) {
57
- if (this.spongeBlobState) {
58
- throw new Error(`Block ${this.blockNumber} already initalised.`);
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.`);
59
56
  }
60
- this.baseOrMergeProvingOutputs = new UnbalancedTreeStore(numTxs);
61
- // Initialise the sponge which will eventually absorb all tx effects to be added to the blob.
62
- // Like l1 to l2 messages, we need to know beforehand how many effects will be absorbed.
63
- this.spongeBlobState = SpongeBlob.init(numBlobFields);
64
- this.totalNumTxs = numTxs;
57
+ this.baseOrMergeProofs = new UnbalancedTreeStore(totalNumTxs);
58
+ }
59
+ get epochNumber() {
60
+ return this.parentCheckpoint.epochNumber;
65
61
  }
66
62
  // Adds a transaction to the proving state, returns it's index
67
63
  addNewTx(tx) {
68
- if (!this.spongeBlobState) {
69
- 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}.`);
70
66
  }
71
67
  const txIndex = this.txs.length;
72
68
  this.txs[txIndex] = tx;
73
69
  return txIndex;
74
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
+ }
75
87
  setBaseRollupProof(txIndex, provingOutput) {
76
- 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
+ }
77
101
  }
78
102
  setMergeRollupProof(location, provingOutput) {
79
- 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
+ }
80
116
  }
81
117
  // Stores a set of root parity inputs at the given index
82
118
  setBaseParityProof(index, provingOutput) {
83
119
  if (index >= NUM_BASE_PARITY_PER_ROOT_PARITY) {
84
120
  throw new Error(`Unable to set a base parity proofs at index ${index}. Expected at most ${NUM_BASE_PARITY_PER_ROOT_PARITY} proofs.`);
85
121
  }
86
- 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
+ }
87
135
  }
88
136
  setRootParityProof(provingOutput) {
89
- 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
+ }
90
150
  }
91
151
  setBlockRootRollupProof(provingOutput) {
92
- this.blockRootProvingOutput = provingOutput;
152
+ this.blockRootProof = {
153
+ provingOutput
154
+ };
155
+ return this.parentCheckpoint.setBlockRootRollupProof(this.index, provingOutput);
93
156
  }
94
- // Returns the complete set of transaction proving state objects
95
- get allTxs() {
96
- return this.txs;
157
+ getBlockRootRollupOutput() {
158
+ return this.blockRootProof?.provingOutput?.inputs;
97
159
  }
98
- /** Returns the block number as an epoch number. Used for prioritizing proof requests. */ get epochNumber() {
99
- return this.parentEpoch.epochNumber;
160
+ setBuiltBlockHeader(blockHeader) {
161
+ this.builtBlockHeader = blockHeader;
162
+ }
163
+ getBuiltBlockHeader() {
164
+ return this.builtBlockHeader;
165
+ }
166
+ getGlobalVariables() {
167
+ if (this.txs.length) {
168
+ return this.txs[0].processedTx.globalVariables;
169
+ }
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;
184
+ }
185
+ setEndSpongeBlob(endSpongeBlob) {
186
+ this.endSpongeBlob = endSpongeBlob;
187
+ }
188
+ getEndSpongeBlob() {
189
+ return this.endSpongeBlob;
190
+ }
191
+ getTxEffects() {
192
+ return this.txs.map((t)=>t.processedTx.txEffect);
100
193
  }
101
194
  getParentLocation(location) {
102
- return this.baseOrMergeProvingOutputs.getParentLocation(location);
195
+ return this.baseOrMergeProofs.getParentLocation(location);
103
196
  }
104
197
  getMergeRollupInputs(mergeLocation) {
105
- const [left, right] = this.baseOrMergeProvingOutputs.getChildren(mergeLocation);
198
+ const [left, right] = this.baseOrMergeProofs.getChildren(mergeLocation).map((c)=>c?.provingOutput);
106
199
  if (!left || !right) {
107
- 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.');
108
201
  }
109
- return new MergeRollupInputs([
110
- this.#getPreviousRollupData(left),
111
- this.#getPreviousRollupData(right)
202
+ return new TxMergeRollupPrivateInputs([
203
+ toProofData(left),
204
+ toProofData(right)
112
205
  ]);
113
206
  }
114
- async getBlockRootRollupTypeAndInputs(proverId) {
115
- if (!this.rootParityProvingOutput) {
116
- throw new Error('Root parity is not ready.');
117
- }
118
- const proofs = this.#getChildProofsForBlockRoot();
119
- const nonEmptyProofs = proofs.filter((p)=>!!p);
120
- if (proofs.length !== nonEmptyProofs.length) {
121
- throw new Error('At lease one child is not ready for the block root.');
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.');
122
211
  }
123
- const data = this.#getBlockRootRollupData(proverId);
124
- if (this.totalNumTxs === 0) {
125
- const constants = ConstantRollupData.from({
126
- lastArchive: this.lastArchiveSnapshot,
127
- globalVariables: this.globalVariables,
128
- vkTreeRoot: getVKTreeRoot(),
129
- protocolContractTreeRoot
130
- });
131
- return {
132
- rollupType: 'empty-block-root-rollup',
133
- inputs: EmptyBlockRootRollupInputs.from({
134
- data,
135
- constants,
136
- isPadding: false
137
- })
138
- };
212
+ const previousRollups = provingOutputs.map((p)=>toProofData(p));
213
+ if (this.isFirstBlock) {
214
+ return this.#getFirstBlockRootRollupTypeAndInputs(previousRollups);
139
215
  }
140
- const previousRollupData = await Promise.all(nonEmptyProofs.map((p)=>this.#getPreviousRollupData(p)));
141
- const blobData = await this.#getBlockRootRollupBlobData();
142
- if (previousRollupData.length === 1) {
216
+ const [leftRollup, rightRollup] = previousRollups;
217
+ if (!rightRollup) {
143
218
  return {
144
- rollupType: 'single-tx-block-root-rollup',
145
- inputs: new SingleTxBlockRootRollupInputs(previousRollupData, data, blobData)
219
+ rollupType: 'rollup-block-root-single-tx',
220
+ inputs: new BlockRootSingleTxRollupPrivateInputs(leftRollup, this.lastArchiveSiblingPath)
146
221
  };
147
222
  } else {
148
223
  return {
149
- rollupType: 'block-root-rollup',
150
- inputs: new BlockRootRollupInputs(previousRollupData, data, blobData)
224
+ rollupType: 'rollup-block-root',
225
+ inputs: new BlockRootRollupPrivateInputs([
226
+ leftRollup,
227
+ rightRollup
228
+ ], this.lastArchiveSiblingPath)
151
229
  };
152
230
  }
153
231
  }
154
- async getPaddingBlockRootInputs(proverId) {
155
- if (!this.rootParityProvingOutput) {
232
+ #getFirstBlockRootRollupTypeAndInputs([leftRollup, rightRollup]) {
233
+ if (!this.rootParityProof?.provingOutput) {
156
234
  throw new Error('Root parity is not ready.');
157
235
  }
158
- // Use the new block header and archive of the current block as the previous header and archiver of the next padding block.
159
- const newBlockHeader = await this.buildHeaderFromProvingOutputs();
160
- const newArchive = this.blockRootProvingOutput.inputs.newArchive;
161
- const data = BlockRootRollupData.from({
162
- l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput),
163
- l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
164
- newArchiveSiblingPath: this.newArchiveSiblingPath,
165
- previousBlockHeader: newBlockHeader,
166
- proverId
167
- });
168
- const constants = ConstantRollupData.from({
169
- lastArchive: newArchive,
170
- globalVariables: this.globalVariables,
171
- vkTreeRoot: getVKTreeRoot(),
172
- protocolContractTreeRoot
173
- });
174
- return EmptyBlockRootRollupInputs.from({
175
- data,
176
- constants,
177
- isPadding: true
178
- });
236
+ const l1ToL2Roots = toProofData(this.rootParityProof.provingOutput);
237
+ if (!leftRollup) {
238
+ return {
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)
246
+ };
247
+ } else {
248
+ return {
249
+ rollupType: 'rollup-block-root-first',
250
+ inputs: new BlockRootFirstRollupPrivateInputs(l1ToL2Roots, [
251
+ leftRollup,
252
+ rightRollup
253
+ ], this.lastL1ToL2MessageTreeSnapshot, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
254
+ };
255
+ }
179
256
  }
180
- getRootParityInputs() {
181
- 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) {
182
260
  throw new Error('At lease one base parity is not ready.');
183
261
  }
184
- const children = this.baseParityProvingOutputs.map((p)=>this.#getRootParityData(p));
185
- return new RootParityInputs(children);
262
+ const children = baseParityProvingOutputs.map((p)=>toProofData(p));
263
+ return new ParityRootPrivateInputs(assertLength(children, NUM_BASE_PARITY_PER_ROOT_PARITY));
186
264
  }
187
265
  // Returns a specific transaction proving state
188
266
  getTxProvingState(txIndex) {
189
267
  return this.txs[txIndex];
190
268
  }
191
- async buildHeaderFromProvingOutputs(logger) {
192
- const previousRollupData = this.totalNumTxs === 0 ? [] : await Promise.all(this.#getChildProofsForBlockRoot().map((p)=>this.#getPreviousRollupData(p)));
193
- let endPartialState = this.previousBlockHeader.state.partial;
194
- if (this.totalNumTxs !== 0) {
195
- const previousRollupData = this.#getChildProofsForBlockRoot();
196
- const lastRollup = previousRollupData[previousRollupData.length - 1];
197
- if (!lastRollup) {
198
- throw new Error('End state of the block is not available. Last rollup is not ready yet.');
199
- }
200
- endPartialState = lastRollup.inputs.end;
269
+ async buildHeaderFromProvingOutputs() {
270
+ if (!this.blockRootProof?.provingOutput) {
271
+ throw new Error('Block root rollup is not ready.');
201
272
  }
202
- const endState = new StateReference(this.l1ToL2MessageTreeSnapshotAfterInsertion, endPartialState);
203
- return buildHeaderFromCircuitOutputs(previousRollupData.map((d)=>d.baseOrMergeRollupPublicInputs), this.rootParityProvingOutput.inputs, this.blockRootProvingOutput.inputs, endState, logger);
273
+ return await buildHeaderFromCircuitOutputs(this.blockRootProof.provingOutput.inputs);
204
274
  }
205
275
  isReadyForMergeRollup(location) {
206
- return this.baseOrMergeProvingOutputs.getSibling(location) !== undefined;
276
+ return !!this.baseOrMergeProofs.getSibling(location)?.provingOutput;
207
277
  }
208
278
  // Returns true if we have sufficient inputs to execute the block root rollup
209
279
  isReadyForBlockRootRollup() {
210
- const childProofs = this.#getChildProofsForBlockRoot();
211
- return this.block !== undefined && this.rootParityProvingOutput !== undefined && childProofs.every((p)=>!!p);
280
+ const childProofs = this.#getChildProvingOutputsForBlockRoot();
281
+ return (!this.isFirstBlock || !!this.rootParityProof?.provingOutput) && childProofs.every((p)=>!!p);
212
282
  }
213
283
  // Returns true if we have sufficient root parity inputs to execute the root parity circuit
214
284
  isReadyForRootParity() {
215
- return this.baseParityProvingOutputs.every((p)=>!!p);
285
+ return this.baseParityProofs.every((p)=>!!p?.provingOutput);
216
286
  }
217
287
  isComplete() {
218
- return !!this.blockRootProvingOutput;
288
+ return !!this.blockRootProof;
219
289
  }
220
- // Returns whether the proving state is still valid
221
290
  verifyState() {
222
- return this.parentEpoch.verifyState();
291
+ return this.parentCheckpoint.verifyState();
292
+ }
293
+ getError() {
294
+ return this.error;
223
295
  }
224
296
  reject(reason) {
225
297
  this.error = reason;
226
- this.parentEpoch.reject(reason);
227
- }
228
- #getBlockRootRollupData(proverId) {
229
- return BlockRootRollupData.from({
230
- l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput),
231
- l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
232
- newArchiveSiblingPath: this.newArchiveSiblingPath,
233
- previousBlockHeader: this.previousBlockHeader,
234
- proverId
235
- });
298
+ this.parentCheckpoint.reject(reason);
236
299
  }
237
- async #getBlockRootRollupBlobData() {
238
- const txEffects = this.txs.map((txProvingState)=>txProvingState.processedTx.txEffect);
239
- const { blobFields, blobCommitments, blobsHash } = await buildBlobHints(txEffects);
240
- return BlockRootRollupBlobData.from({
241
- blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK),
242
- blobCommitments: padArrayEnd(blobCommitments, [
243
- Fr.ZERO,
244
- Fr.ZERO
245
- ], BLOBS_PER_BLOCK),
246
- blobsHash
247
- });
248
- }
249
- #getChildProofsForBlockRoot() {
300
+ #getChildProvingOutputsForBlockRoot() {
250
301
  if (this.totalNumTxs === 0) {
251
302
  return [];
252
303
  }
@@ -256,14 +307,7 @@ import { buildBlobHints, buildHeaderFromCircuitOutputs } from './block-building-
256
307
  };
257
308
  // If there's only 1 tx, its base rollup proof will be stored at the root.
258
309
  return this.totalNumTxs === 1 ? [
259
- this.baseOrMergeProvingOutputs.getNode(rootLocation)
260
- ] : this.baseOrMergeProvingOutputs.getChildren(rootLocation);
261
- }
262
- #getPreviousRollupData({ inputs, proof, verificationKey }) {
263
- const leafIndex = getVKIndex(verificationKey.keyAsFields);
264
- return new PreviousRollupData(inputs, proof, verificationKey.keyAsFields, new MembershipWitness(VK_TREE_HEIGHT, BigInt(leafIndex), getVKSiblingPath(leafIndex)));
265
- }
266
- #getRootParityData({ inputs, proof, verificationKey }) {
267
- 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);
268
312
  }
269
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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"}