@aztec/sequencer-client 0.30.1 → 0.31.0

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 (104) hide show
  1. package/dest/client/sequencer-client.d.ts +5 -1
  2. package/dest/client/sequencer-client.d.ts.map +1 -1
  3. package/dest/client/sequencer-client.js +5 -34
  4. package/dest/index.d.ts +0 -7
  5. package/dest/index.d.ts.map +1 -1
  6. package/dest/index.js +1 -8
  7. package/dest/publisher/viem-tx-sender.d.ts.map +1 -1
  8. package/dest/publisher/viem-tx-sender.js +2 -3
  9. package/dest/sequencer/abstract_phase_manager.d.ts +1 -3
  10. package/dest/sequencer/abstract_phase_manager.d.ts.map +1 -1
  11. package/dest/sequencer/abstract_phase_manager.js +13 -17
  12. package/dest/sequencer/app_logic_phase_manager.d.ts +1 -3
  13. package/dest/sequencer/app_logic_phase_manager.d.ts.map +1 -1
  14. package/dest/sequencer/app_logic_phase_manager.js +3 -4
  15. package/dest/sequencer/phase_manager_factory.d.ts +2 -3
  16. package/dest/sequencer/phase_manager_factory.d.ts.map +1 -1
  17. package/dest/sequencer/phase_manager_factory.js +9 -9
  18. package/dest/sequencer/public_processor.d.ts +3 -7
  19. package/dest/sequencer/public_processor.d.ts.map +1 -1
  20. package/dest/sequencer/public_processor.js +6 -9
  21. package/dest/sequencer/sequencer.d.ts +4 -5
  22. package/dest/sequencer/sequencer.d.ts.map +1 -1
  23. package/dest/sequencer/sequencer.js +13 -12
  24. package/dest/sequencer/setup_phase_manager.d.ts +1 -3
  25. package/dest/sequencer/setup_phase_manager.d.ts.map +1 -1
  26. package/dest/sequencer/setup_phase_manager.js +3 -4
  27. package/dest/sequencer/tail_phase_manager.d.ts +1 -3
  28. package/dest/sequencer/tail_phase_manager.d.ts.map +1 -1
  29. package/dest/sequencer/tail_phase_manager.js +3 -4
  30. package/dest/sequencer/teardown_phase_manager.d.ts +1 -3
  31. package/dest/sequencer/teardown_phase_manager.d.ts.map +1 -1
  32. package/dest/sequencer/teardown_phase_manager.js +3 -4
  33. package/dest/sequencer/tx_validator.d.ts +1 -2
  34. package/dest/sequencer/tx_validator.d.ts.map +1 -1
  35. package/dest/sequencer/tx_validator.js +15 -2
  36. package/dest/simulator/index.d.ts +1 -37
  37. package/dest/simulator/index.d.ts.map +1 -1
  38. package/dest/simulator/index.js +2 -2
  39. package/dest/simulator/public_executor.d.ts +1 -1
  40. package/dest/simulator/public_executor.d.ts.map +1 -1
  41. package/dest/simulator/public_executor.js +22 -12
  42. package/dest/simulator/public_kernel.d.ts +1 -1
  43. package/dest/simulator/public_kernel.d.ts.map +1 -1
  44. package/dest/simulator/public_kernel.js +2 -2
  45. package/package.json +13 -13
  46. package/src/client/sequencer-client.ts +7 -42
  47. package/src/index.ts +0 -9
  48. package/src/publisher/viem-tx-sender.ts +1 -2
  49. package/src/sequencer/abstract_phase_manager.ts +14 -16
  50. package/src/sequencer/app_logic_phase_manager.ts +1 -3
  51. package/src/sequencer/phase_manager_factory.ts +0 -9
  52. package/src/sequencer/public_processor.ts +12 -17
  53. package/src/sequencer/sequencer.ts +12 -13
  54. package/src/sequencer/setup_phase_manager.ts +1 -3
  55. package/src/sequencer/tail_phase_manager.ts +1 -3
  56. package/src/sequencer/teardown_phase_manager.ts +1 -3
  57. package/src/sequencer/tx_validator.ts +17 -2
  58. package/src/simulator/index.ts +0 -45
  59. package/src/simulator/public_executor.ts +32 -11
  60. package/src/simulator/public_kernel.ts +2 -2
  61. package/dest/block_builder/index.d.ts +0 -19
  62. package/dest/block_builder/index.d.ts.map +0 -1
  63. package/dest/block_builder/index.js +0 -2
  64. package/dest/block_builder/solo_block_builder.d.ts +0 -78
  65. package/dest/block_builder/solo_block_builder.d.ts.map +0 -1
  66. package/dest/block_builder/solo_block_builder.js +0 -489
  67. package/dest/block_builder/types.d.ts +0 -10
  68. package/dest/block_builder/types.d.ts.map +0 -1
  69. package/dest/block_builder/types.js +0 -2
  70. package/dest/mocks/verification_keys.d.ts +0 -28
  71. package/dest/mocks/verification_keys.d.ts.map +0 -1
  72. package/dest/mocks/verification_keys.js +0 -14
  73. package/dest/prover/empty.d.ts +0 -53
  74. package/dest/prover/empty.d.ts.map +0 -1
  75. package/dest/prover/empty.js +0 -75
  76. package/dest/prover/index.d.ts +0 -52
  77. package/dest/prover/index.d.ts.map +0 -1
  78. package/dest/prover/index.js +0 -2
  79. package/dest/sequencer/processed_tx.d.ts +0 -81
  80. package/dest/sequencer/processed_tx.d.ts.map +0 -1
  81. package/dest/sequencer/processed_tx.js +0 -98
  82. package/dest/simulator/acvm_native.d.ts +0 -20
  83. package/dest/simulator/acvm_native.d.ts.map +0 -1
  84. package/dest/simulator/acvm_native.js +0 -96
  85. package/dest/simulator/acvm_wasm.d.ts +0 -7
  86. package/dest/simulator/acvm_wasm.d.ts.map +0 -1
  87. package/dest/simulator/acvm_wasm.js +0 -23
  88. package/dest/simulator/rollup.d.ts +0 -43
  89. package/dest/simulator/rollup.d.ts.map +0 -1
  90. package/dest/simulator/rollup.js +0 -78
  91. package/dest/simulator/simulation_provider.d.ts +0 -9
  92. package/dest/simulator/simulation_provider.d.ts.map +0 -1
  93. package/dest/simulator/simulation_provider.js +0 -2
  94. package/src/block_builder/index.ts +0 -20
  95. package/src/block_builder/solo_block_builder.ts +0 -812
  96. package/src/block_builder/types.ts +0 -8
  97. package/src/mocks/verification_keys.ts +0 -36
  98. package/src/prover/empty.ts +0 -97
  99. package/src/prover/index.ts +0 -70
  100. package/src/sequencer/processed_tx.ts +0 -210
  101. package/src/simulator/acvm_native.ts +0 -112
  102. package/src/simulator/acvm_wasm.ts +0 -31
  103. package/src/simulator/rollup.ts +0 -127
  104. package/src/simulator/simulation_provider.ts +0 -10
@@ -1,489 +0,0 @@
1
- import { Body, L2Block, MerkleTreeId } from '@aztec/circuit-types';
2
- import { ARCHIVE_HEIGHT, AppendOnlyTreeSnapshot, BaseParityInputs, BaseRollupInputs, ConstantRollupData, L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, MAX_NEW_NULLIFIERS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MembershipWitness, MergeRollupInputs, NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NUM_BASE_PARITY_PER_ROOT_PARITY, NullifierLeafPreimage, PUBLIC_DATA_SUBTREE_HEIGHT, PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, PUBLIC_DATA_TREE_HEIGHT, PartialStateReference, PreviousRollupData, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, ROLLUP_VK_TREE_HEIGHT, RollupKernelCircuitPublicInputs, RollupKernelData, RollupTypes, RootParityInput, RootParityInputs, RootRollupInputs, StateDiffHints, VK_TREE_HEIGHT, } from '@aztec/circuits.js';
3
- import { assertPermutation, makeTuple } from '@aztec/foundation/array';
4
- import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
5
- import { padArrayEnd } from '@aztec/foundation/collection';
6
- import { Fr } from '@aztec/foundation/fields';
7
- import { createDebugLogger } from '@aztec/foundation/log';
8
- import { assertLength, toFriendlyJSON } from '@aztec/foundation/serialize';
9
- import { elapsed } from '@aztec/foundation/timer';
10
- import chunk from 'lodash.chunk';
11
- import { inspect } from 'util';
12
- import { toTxEffect } from '../sequencer/processed_tx.js';
13
- const frToBigInt = (fr) => toBigIntBE(fr.toBuffer());
14
- // Denotes fields that are not used now, but will be in the future
15
- const FUTURE_FR = new Fr(0n);
16
- const FUTURE_NUM = 0;
17
- // Denotes fields that should be deleted
18
- const DELETE_FR = new Fr(0n);
19
- /**
20
- * Builds an L2 block out of a set of ProcessedTx's,
21
- * using the base, merge, and root rollup circuits.
22
- */
23
- export class SoloBlockBuilder {
24
- constructor(db, vks, simulator, prover, debug = createDebugLogger('aztec:sequencer:solo-block-builder')) {
25
- this.db = db;
26
- this.vks = vks;
27
- this.simulator = simulator;
28
- this.prover = prover;
29
- this.debug = debug;
30
- }
31
- /**
32
- * Builds an L2 block with the given number containing the given txs, updating state trees.
33
- * @param globalVariables - Global variables to be used in the block.
34
- * @param txs - Processed transactions to include in the block.
35
- * @param l1ToL2Messages - L1 to L2 messages to be part of the block.
36
- * @param timestamp - Timestamp of the block.
37
- * @returns The new L2 block and a correctness proof as returned by the root rollup circuit.
38
- */
39
- async buildL2Block(globalVariables, txs, l1ToL2Messages) {
40
- // Check txs are good for processing by checking if all the tree snapshots in header are non-empty
41
- this.validateTxs(txs);
42
- // We pad the messages as the circuits expect that.
43
- const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
44
- // We fill the tx batch with empty txs, we process only one tx at a time for now
45
- const [circuitsOutput, proof] = await this.runCircuits(globalVariables, txs, l1ToL2MessagesPadded);
46
- // Collect all new nullifiers, commitments, and contracts from all txs in this block
47
- const txEffects = txs.map(tx => toTxEffect(tx));
48
- const blockBody = new Body(l1ToL2MessagesPadded, txEffects);
49
- const l2Block = L2Block.fromFields({
50
- archive: circuitsOutput.archive,
51
- header: circuitsOutput.header,
52
- body: blockBody,
53
- });
54
- if (!l2Block.body.getTxsEffectsHash().equals(circuitsOutput.header.contentCommitment.txsEffectsHash)) {
55
- this.debug(inspect(blockBody));
56
- throw new Error(`Txs effects hash mismatch, ${l2Block.body
57
- .getTxsEffectsHash()
58
- .toString('hex')} == ${circuitsOutput.header.contentCommitment.txsEffectsHash.toString('hex')} `);
59
- }
60
- return [l2Block, proof];
61
- }
62
- validateTxs(txs) {
63
- for (const tx of txs) {
64
- const txHeader = tx.data.constants.historicalHeader;
65
- if (txHeader.state.l1ToL2MessageTree.isZero()) {
66
- throw new Error(`Empty L1 to L2 messages tree in tx: ${toFriendlyJSON(tx)}`);
67
- }
68
- if (txHeader.state.partial.noteHashTree.isZero()) {
69
- throw new Error(`Empty note hash tree in tx: ${toFriendlyJSON(tx)}`);
70
- }
71
- if (txHeader.state.partial.nullifierTree.isZero()) {
72
- throw new Error(`Empty nullifier tree in tx: ${toFriendlyJSON(tx)}`);
73
- }
74
- if (txHeader.state.partial.publicDataTree.isZero()) {
75
- throw new Error(`Empty public data tree in tx: ${toFriendlyJSON(tx)}`);
76
- }
77
- }
78
- }
79
- async getTreeSnapshot(id) {
80
- const treeInfo = await this.db.getTreeInfo(id);
81
- return new AppendOnlyTreeSnapshot(Fr.fromBuffer(treeInfo.root), Number(treeInfo.size));
82
- }
83
- async runCircuits(globalVariables, txs, l1ToL2Messages) {
84
- // Check that the length of the array of txs is a power of two
85
- // See https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2
86
- if (txs.length < 2 || (txs.length & (txs.length - 1)) !== 0) {
87
- throw new Error(`Length of txs for the block should be a power of two and at least two (got ${txs.length})`);
88
- }
89
- // BASE PARITY CIRCUIT (run in parallel)
90
- // Note: In the future we will want to cache the results of empty base and root parity circuits so that we don't
91
- // have to run them. (It will most likely be quite common that some base parity circuits will be "empty")
92
- let baseParityInputs = [];
93
- let elapsedBaseParityOutputsPromise;
94
- {
95
- baseParityInputs = Array.from({ length: NUM_BASE_PARITY_PER_ROOT_PARITY }, (_, i) => BaseParityInputs.fromSlice(l1ToL2Messages, i));
96
- const baseParityOutputs = [];
97
- for (const inputs of baseParityInputs) {
98
- baseParityOutputs.push(this.baseParityCircuit(inputs));
99
- }
100
- elapsedBaseParityOutputsPromise = elapsed(() => Promise.all(baseParityOutputs));
101
- }
102
- // BASE ROLLUP CIRCUIT (run in parallel)
103
- let elapsedBaseRollupOutputsPromise;
104
- const baseRollupInputs = [];
105
- {
106
- // Perform all tree insertions and retrieve snapshots for all base rollups
107
- const treeSnapshots = [];
108
- for (const tx of txs) {
109
- const input = await this.buildBaseRollupInput(tx, globalVariables);
110
- baseRollupInputs.push(input);
111
- const promises = [MerkleTreeId.NOTE_HASH_TREE, MerkleTreeId.NULLIFIER_TREE, MerkleTreeId.PUBLIC_DATA_TREE].map(async (id) => {
112
- return { key: id, value: await this.getTreeSnapshot(id) };
113
- });
114
- const snapshots = new Map((await Promise.all(promises)).map(obj => [obj.key, obj.value]));
115
- treeSnapshots.push(snapshots);
116
- }
117
- // Run the base rollup circuits for the txs in parallel
118
- const baseRollupOutputs = [];
119
- for (let i = 0; i < txs.length; i++) {
120
- baseRollupOutputs.push(this.baseRollupCircuit(txs[i], baseRollupInputs[i], treeSnapshots[i]));
121
- }
122
- elapsedBaseRollupOutputsPromise = elapsed(() => Promise.all(baseRollupOutputs));
123
- }
124
- // ROOT PARITY CIRCUIT
125
- let elapsedRootParityOutputPromise;
126
- let rootParityInputs;
127
- {
128
- // First we await the base parity outputs
129
- const [duration, baseParityOutputs] = await elapsedBaseParityOutputsPromise;
130
- // We emit stats for base parity circuits
131
- for (let i = 0; i < baseParityOutputs.length; i++) {
132
- this.debug(`Simulated base parity circuit`, {
133
- eventName: 'circuit-simulation',
134
- circuitName: 'base-parity',
135
- duration: duration / baseParityOutputs.length,
136
- inputSize: baseParityInputs[i].toBuffer().length,
137
- outputSize: baseParityOutputs[i].toBuffer().length,
138
- });
139
- }
140
- rootParityInputs = new RootParityInputs(baseParityOutputs);
141
- elapsedRootParityOutputPromise = elapsed(() => this.rootParityCircuit(rootParityInputs));
142
- }
143
- // MERGE ROLLUP CIRCUIT (each layer run in parallel)
144
- let mergeOutputLeft;
145
- let mergeOutputRight;
146
- {
147
- // Run merge rollups in layers until we have only two outputs
148
- const [duration, mergeInputs] = await elapsedBaseRollupOutputsPromise;
149
- // We emit stats for base rollup circuits
150
- for (let i = 0; i < mergeInputs.length; i++) {
151
- this.debug(`Simulated base rollup circuit`, {
152
- eventName: 'circuit-simulation',
153
- circuitName: 'base-rollup',
154
- duration: duration / mergeInputs.length,
155
- inputSize: baseRollupInputs[i].toBuffer().length,
156
- outputSize: mergeInputs[i][0].toBuffer().length,
157
- });
158
- }
159
- let mergeRollupInputs = mergeInputs;
160
- while (mergeRollupInputs.length > 2) {
161
- const mergeInputStructs = [];
162
- for (const pair of chunk(mergeRollupInputs, 2)) {
163
- const [r1, r2] = pair;
164
- mergeInputStructs.push(this.createMergeRollupInputs(r1, r2));
165
- }
166
- const [duration, mergeOutputs] = await elapsed(() => Promise.all(mergeInputStructs.map(async (input) => await this.mergeRollupCircuit(input))));
167
- // We emit stats for merge rollup circuits
168
- for (let i = 0; i < mergeOutputs.length; i++) {
169
- this.debug(`Simulated merge rollup circuit`, {
170
- eventName: 'circuit-simulation',
171
- circuitName: 'merge-rollup',
172
- duration: duration / mergeOutputs.length,
173
- inputSize: mergeInputStructs[i].toBuffer().length,
174
- outputSize: mergeOutputs[i][0].toBuffer().length,
175
- });
176
- }
177
- mergeRollupInputs = mergeOutputs;
178
- }
179
- // Run the root rollup with the last two merge rollups (or base, if no merge layers)
180
- [mergeOutputLeft, mergeOutputRight] = mergeRollupInputs;
181
- }
182
- // Finally, we emit stats for root parity circuit
183
- const [duration, rootParityOutput] = await elapsedRootParityOutputPromise;
184
- this.debug(`Simulated root parity circuit`, {
185
- eventName: 'circuit-simulation',
186
- circuitName: 'root-parity',
187
- duration: duration,
188
- inputSize: rootParityInputs.toBuffer().length,
189
- outputSize: rootParityOutput.toBuffer().length,
190
- });
191
- return this.rootRollupCircuit(mergeOutputLeft, mergeOutputRight, rootParityOutput, l1ToL2Messages);
192
- }
193
- async baseParityCircuit(inputs) {
194
- this.debug(`Running base parity circuit`);
195
- const parityPublicInputs = await this.simulator.baseParityCircuit(inputs);
196
- const proof = await this.prover.getBaseParityProof(inputs, parityPublicInputs);
197
- return new RootParityInput(proof, parityPublicInputs);
198
- }
199
- async rootParityCircuit(inputs) {
200
- this.debug(`Running root parity circuit`);
201
- const parityPublicInputs = await this.simulator.rootParityCircuit(inputs);
202
- const proof = await this.prover.getRootParityProof(inputs, parityPublicInputs);
203
- return new RootParityInput(proof, parityPublicInputs);
204
- }
205
- async baseRollupCircuit(tx, inputs, treeSnapshots) {
206
- this.debug(`Running base rollup for ${tx.hash}`);
207
- const rollupOutput = await this.simulator.baseRollupCircuit(inputs);
208
- this.validatePartialState(rollupOutput.end, treeSnapshots);
209
- const proof = await this.prover.getBaseRollupProof(inputs, rollupOutput);
210
- return [rollupOutput, proof];
211
- }
212
- createMergeRollupInputs(left, right) {
213
- const vk = this.getVerificationKey(left[0].rollupType);
214
- const mergeInputs = new MergeRollupInputs([
215
- this.getPreviousRollupDataFromPublicInputs(left[0], left[1], vk),
216
- this.getPreviousRollupDataFromPublicInputs(right[0], right[1], vk),
217
- ]);
218
- return mergeInputs;
219
- }
220
- async mergeRollupCircuit(mergeInputs) {
221
- this.debug(`Running merge rollup circuit`);
222
- const output = await this.simulator.mergeRollupCircuit(mergeInputs);
223
- const proof = await this.prover.getMergeRollupProof(mergeInputs, output);
224
- return [output, proof];
225
- }
226
- getVerificationKey(type) {
227
- switch (type) {
228
- case RollupTypes.Base:
229
- return this.vks.baseRollupCircuit;
230
- case RollupTypes.Merge:
231
- return this.vks.mergeRollupCircuit;
232
- default:
233
- throw new Error(`No verification key available for ${type}`);
234
- }
235
- }
236
- async rootRollupCircuit(left, right, l1ToL2Roots, l1ToL2Messages) {
237
- this.debug(`Running root rollup circuit`);
238
- const rootInput = await this.getRootRollupInput(...left, ...right, l1ToL2Roots, l1ToL2Messages);
239
- // Update the local trees to include the l1 to l2 messages
240
- await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2Messages.map(m => m.toBuffer()));
241
- // Simulate and get proof for the root circuit
242
- const rootOutput = await this.simulator.rootRollupCircuit(rootInput);
243
- const rootProof = await this.prover.getRootRollupProof(rootInput, rootOutput);
244
- // Update the archive with the latest block header
245
- this.debug(`Updating and validating root trees`);
246
- await this.db.updateArchive(rootOutput.header);
247
- await this.validateRootOutput(rootOutput);
248
- return [rootOutput, rootProof];
249
- }
250
- validatePartialState(partialState, treeSnapshots) {
251
- this.validateSimulatedTree(treeSnapshots.get(MerkleTreeId.NOTE_HASH_TREE), partialState.noteHashTree, 'NoteHashTree');
252
- this.validateSimulatedTree(treeSnapshots.get(MerkleTreeId.NULLIFIER_TREE), partialState.nullifierTree, 'NullifierTree');
253
- this.validateSimulatedTree(treeSnapshots.get(MerkleTreeId.PUBLIC_DATA_TREE), partialState.publicDataTree, 'PublicDataTree');
254
- }
255
- async validateState(state) {
256
- const promises = [MerkleTreeId.NOTE_HASH_TREE, MerkleTreeId.NULLIFIER_TREE, MerkleTreeId.PUBLIC_DATA_TREE].map(async (id) => {
257
- return { key: id, value: await this.getTreeSnapshot(id) };
258
- });
259
- const snapshots = new Map((await Promise.all(promises)).map(obj => [obj.key, obj.value]));
260
- this.validatePartialState(state.partial, snapshots);
261
- this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE), state.l1ToL2MessageTree, 'L1ToL2MessageTree');
262
- }
263
- // Validate that the roots of all local trees match the output of the root circuit simulation
264
- async validateRootOutput(rootOutput) {
265
- await Promise.all([
266
- this.validateState(rootOutput.header.state),
267
- this.validateSimulatedTree(await this.getTreeSnapshot(MerkleTreeId.ARCHIVE), rootOutput.archive, 'Archive'),
268
- ]);
269
- }
270
- // Helper for comparing two trees snapshots
271
- validateSimulatedTree(localTree, simulatedTree, name, label) {
272
- if (!simulatedTree.root.toBuffer().equals(localTree.root.toBuffer())) {
273
- throw new Error(`${label ?? name} tree root mismatch (local ${localTree.root}, simulated ${simulatedTree.root})`);
274
- }
275
- if (simulatedTree.nextAvailableLeafIndex !== localTree.nextAvailableLeafIndex) {
276
- throw new Error(`${label ?? name} tree next available leaf index mismatch (local ${localTree.nextAvailableLeafIndex}, simulated ${simulatedTree.nextAvailableLeafIndex})`);
277
- }
278
- }
279
- // Builds the inputs for the root rollup circuit, without making any changes to trees
280
- async getRootRollupInput(rollupOutputLeft, rollupProofLeft, rollupOutputRight, rollupProofRight, l1ToL2Roots, newL1ToL2Messages) {
281
- const vk = this.getVerificationKey(rollupOutputLeft.rollupType);
282
- const previousRollupData = [
283
- this.getPreviousRollupDataFromPublicInputs(rollupOutputLeft, rollupProofLeft, vk),
284
- this.getPreviousRollupDataFromPublicInputs(rollupOutputRight, rollupProofRight, vk),
285
- ];
286
- const getRootTreeSiblingPath = async (treeId) => {
287
- const { size } = await this.db.getTreeInfo(treeId);
288
- const path = await this.db.getSiblingPath(treeId, size);
289
- return path.toFields();
290
- };
291
- const newL1ToL2MessageTreeRootSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT);
292
- const newL1ToL2MessageTreeRootSiblingPath = makeTuple(L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, i => i < newL1ToL2MessageTreeRootSiblingPathArray.length ? newL1ToL2MessageTreeRootSiblingPathArray[i] : Fr.ZERO, 0);
293
- // Get tree snapshots
294
- const startL1ToL2MessageTreeSnapshot = await this.getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
295
- // Get blocks tree
296
- const startArchiveSnapshot = await this.getTreeSnapshot(MerkleTreeId.ARCHIVE);
297
- const newArchiveSiblingPathArray = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE);
298
- const newArchiveSiblingPath = makeTuple(ARCHIVE_HEIGHT, i => (i < newArchiveSiblingPathArray.length ? newArchiveSiblingPathArray[i] : Fr.ZERO), 0);
299
- return RootRollupInputs.from({
300
- previousRollupData,
301
- l1ToL2Roots,
302
- newL1ToL2Messages,
303
- newL1ToL2MessageTreeRootSiblingPath,
304
- startL1ToL2MessageTreeSnapshot,
305
- startArchiveSnapshot,
306
- newArchiveSiblingPath,
307
- });
308
- }
309
- getPreviousRollupDataFromPublicInputs(rollupOutput, rollupProof, vk) {
310
- return new PreviousRollupData(rollupOutput, rollupProof, vk,
311
- // MembershipWitness for a VK tree to be implemented in the future
312
- FUTURE_NUM, new MembershipWitness(ROLLUP_VK_TREE_HEIGHT, BigInt(FUTURE_NUM), makeTuple(ROLLUP_VK_TREE_HEIGHT, () => FUTURE_FR)));
313
- }
314
- getKernelDataFor(tx) {
315
- const inputs = new RollupKernelCircuitPublicInputs(tx.data.aggregationObject, tx.data.combinedData, tx.data.constants);
316
- return new RollupKernelData(inputs, tx.proof,
317
- // VK for the kernel circuit
318
- this.vks.privateKernelCircuit,
319
- // MembershipWitness for a VK tree to be implemented in the future
320
- FUTURE_NUM, assertLength(Array(VK_TREE_HEIGHT).fill(FUTURE_FR), VK_TREE_HEIGHT));
321
- }
322
- // Scan a tree searching for a specific value and return a membership witness proof for it
323
- async getMembershipWitnessFor(value, treeId, height) {
324
- // If this is an empty tx, then just return zeroes
325
- if (value.isZero()) {
326
- return this.makeEmptyMembershipWitness(height);
327
- }
328
- const index = await this.db.findLeafIndex(treeId, value.toBuffer());
329
- if (index === undefined) {
330
- throw new Error(`Leaf with value ${value} not found in tree ${MerkleTreeId[treeId]}`);
331
- }
332
- const path = await this.db.getSiblingPath(treeId, index);
333
- return new MembershipWitness(height, index, assertLength(path.toFields(), height));
334
- }
335
- async getConstantRollupData(globalVariables) {
336
- return ConstantRollupData.from({
337
- baseRollupVkHash: DELETE_FR,
338
- mergeRollupVkHash: DELETE_FR,
339
- privateKernelVkTreeRoot: FUTURE_FR,
340
- publicKernelVkTreeRoot: FUTURE_FR,
341
- lastArchive: await this.getTreeSnapshot(MerkleTreeId.ARCHIVE),
342
- globalVariables,
343
- });
344
- }
345
- async getLowNullifierInfo(nullifier) {
346
- // Return empty nullifier info for an empty tx
347
- if (nullifier.value === 0n) {
348
- return {
349
- index: 0,
350
- leafPreimage: NullifierLeafPreimage.empty(),
351
- witness: this.makeEmptyMembershipWitness(NULLIFIER_TREE_HEIGHT),
352
- };
353
- }
354
- const tree = MerkleTreeId.NULLIFIER_TREE;
355
- const prevValueIndex = await this.db.getPreviousValueIndex(tree, frToBigInt(nullifier));
356
- if (!prevValueIndex) {
357
- throw new Error(`Nullifier tree should have one initial leaf`);
358
- }
359
- const prevValuePreimage = (await this.db.getLeafPreimage(tree, prevValueIndex.index));
360
- const prevValueSiblingPath = await this.db.getSiblingPath(tree, BigInt(prevValueIndex.index));
361
- return {
362
- index: prevValueIndex,
363
- leafPreimage: prevValuePreimage,
364
- witness: new MembershipWitness(NULLIFIER_TREE_HEIGHT, BigInt(prevValueIndex.index), assertLength(prevValueSiblingPath.toFields(), NULLIFIER_TREE_HEIGHT)),
365
- };
366
- }
367
- async getSubtreeSiblingPath(treeId, subtreeHeight) {
368
- const nextAvailableLeafIndex = await this.db.getTreeInfo(treeId).then(t => t.size);
369
- const fullSiblingPath = await this.db.getSiblingPath(treeId, nextAvailableLeafIndex);
370
- // Drop the first subtreeHeight items since we only care about the path to the subtree root
371
- return fullSiblingPath.getSubtreeSiblingPath(subtreeHeight).toFields();
372
- }
373
- async processPublicDataUpdateRequests(tx) {
374
- const combinedPublicDataUpdateRequests = tx.data.combinedData.publicDataUpdateRequests.map(updateRequest => {
375
- return new PublicDataTreeLeaf(updateRequest.leafSlot, updateRequest.newValue);
376
- });
377
- const { lowLeavesWitnessData, newSubtreeSiblingPath, sortedNewLeaves, sortedNewLeavesIndexes } = await this.db.batchInsert(MerkleTreeId.PUBLIC_DATA_TREE, combinedPublicDataUpdateRequests.map(x => x.toBuffer()),
378
- // TODO(#3675) remove oldValue from update requests
379
- PUBLIC_DATA_SUBTREE_HEIGHT);
380
- if (lowLeavesWitnessData === undefined) {
381
- throw new Error(`Could not craft public data batch insertion proofs`);
382
- }
383
- const sortedPublicDataWrites = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
384
- return PublicDataTreeLeaf.fromBuffer(sortedNewLeaves[i]);
385
- });
386
- const sortedPublicDataWritesIndexes = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
387
- return sortedNewLeavesIndexes[i];
388
- });
389
- const subtreeSiblingPathAsFields = newSubtreeSiblingPath.toFields();
390
- const newPublicDataSubtreeSiblingPath = makeTuple(PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH, i => {
391
- return subtreeSiblingPathAsFields[i];
392
- });
393
- const lowPublicDataWritesMembershipWitnesses = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
394
- const witness = lowLeavesWitnessData[i];
395
- return MembershipWitness.fromBufferArray(witness.index, assertLength(witness.siblingPath.toBufferArray(), PUBLIC_DATA_TREE_HEIGHT));
396
- });
397
- const lowPublicDataWritesPreimages = makeTuple(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, i => {
398
- return lowLeavesWitnessData[i].leafPreimage;
399
- });
400
- // validate that the sortedPublicDataWrites and sortedPublicDataWritesIndexes are in the correct order
401
- // otherwise it will just fail in the circuit
402
- assertPermutation(combinedPublicDataUpdateRequests, sortedPublicDataWrites, sortedPublicDataWritesIndexes, (a, b) => a.equals(b));
403
- return {
404
- lowPublicDataWritesPreimages,
405
- lowPublicDataWritesMembershipWitnesses,
406
- newPublicDataSubtreeSiblingPath,
407
- sortedPublicDataWrites,
408
- sortedPublicDataWritesIndexes,
409
- };
410
- }
411
- async getPublicDataReadsInfo(tx) {
412
- const newPublicDataReadsWitnesses = makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, () => MembershipWitness.empty(PUBLIC_DATA_TREE_HEIGHT, 0n));
413
- const newPublicDataReadsPreimages = makeTuple(MAX_PUBLIC_DATA_READS_PER_TX, () => PublicDataTreeLeafPreimage.empty());
414
- for (const i in tx.data.validationRequests.publicDataReads) {
415
- const leafSlot = tx.data.validationRequests.publicDataReads[i].leafSlot.value;
416
- const lowLeafResult = await this.db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
417
- if (!lowLeafResult) {
418
- throw new Error(`Public data tree should have one initial leaf`);
419
- }
420
- const preimage = await this.db.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
421
- const path = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
422
- newPublicDataReadsWitnesses[i] = new MembershipWitness(PUBLIC_DATA_TREE_HEIGHT, BigInt(lowLeafResult.index), path.toTuple());
423
- newPublicDataReadsPreimages[i] = preimage;
424
- }
425
- return {
426
- newPublicDataReadsWitnesses,
427
- newPublicDataReadsPreimages,
428
- };
429
- }
430
- // Builds the base rollup inputs, updating the contract, nullifier, and data trees in the process
431
- async buildBaseRollupInput(tx, globalVariables) {
432
- // Get trees info before any changes hit
433
- const constants = await this.getConstantRollupData(globalVariables);
434
- const start = new PartialStateReference(await this.getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), await this.getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), await this.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE));
435
- // Get the subtree sibling paths for the circuit
436
- const noteHashSubtreeSiblingPathArray = await this.getSubtreeSiblingPath(MerkleTreeId.NOTE_HASH_TREE, NOTE_HASH_SUBTREE_HEIGHT);
437
- const noteHashSubtreeSiblingPath = makeTuple(NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, i => i < noteHashSubtreeSiblingPathArray.length ? noteHashSubtreeSiblingPathArray[i] : Fr.ZERO);
438
- // Update the note hash trees with the new items being inserted to get the new roots
439
- // that will be used by the next iteration of the base rollup circuit, skipping the empty ones
440
- const newNoteHashes = tx.data.combinedData.newNoteHashes.map(x => x.value.toBuffer());
441
- await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, newNoteHashes);
442
- // The read witnesses for a given TX should be generated before the writes of the same TX are applied.
443
- // All reads that refer to writes in the same tx are transient and can be simplified out.
444
- const txPublicDataReadsInfo = await this.getPublicDataReadsInfo(tx);
445
- const txPublicDataUpdateRequestInfo = await this.processPublicDataUpdateRequests(tx);
446
- // Update the nullifier tree, capturing the low nullifier info for each individual operation
447
- const { lowLeavesWitnessData: nullifierWitnessLeaves, newSubtreeSiblingPath: newNullifiersSubtreeSiblingPath, sortedNewLeaves: sortedNewNullifiers, sortedNewLeavesIndexes, } = await this.db.batchInsert(MerkleTreeId.NULLIFIER_TREE, tx.data.combinedData.newNullifiers.map(sideEffectLinkedToNoteHash => sideEffectLinkedToNoteHash.value.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
448
- if (nullifierWitnessLeaves === undefined) {
449
- throw new Error(`Could not craft nullifier batch insertion proofs`);
450
- }
451
- // Extract witness objects from returned data
452
- const nullifierPredecessorMembershipWitnessesWithoutPadding = nullifierWitnessLeaves.map(l => MembershipWitness.fromBufferArray(l.index, assertLength(l.siblingPath.toBufferArray(), NULLIFIER_TREE_HEIGHT)));
453
- const nullifierSubtreeSiblingPathArray = newNullifiersSubtreeSiblingPath.toFields();
454
- const nullifierSubtreeSiblingPath = makeTuple(NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, i => i < nullifierSubtreeSiblingPathArray.length ? nullifierSubtreeSiblingPathArray[i] : Fr.ZERO);
455
- const publicDataSiblingPath = txPublicDataUpdateRequestInfo.newPublicDataSubtreeSiblingPath;
456
- const stateDiffHints = StateDiffHints.from({
457
- nullifierPredecessorPreimages: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => i < nullifierWitnessLeaves.length
458
- ? nullifierWitnessLeaves[i].leafPreimage
459
- : NullifierLeafPreimage.empty()),
460
- nullifierPredecessorMembershipWitnesses: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => i < nullifierPredecessorMembershipWitnessesWithoutPadding.length
461
- ? nullifierPredecessorMembershipWitnessesWithoutPadding[i]
462
- : this.makeEmptyMembershipWitness(NULLIFIER_TREE_HEIGHT)),
463
- sortedNullifiers: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => Fr.fromBuffer(sortedNewNullifiers[i])),
464
- sortedNullifierIndexes: makeTuple(MAX_NEW_NULLIFIERS_PER_TX, i => sortedNewLeavesIndexes[i]),
465
- noteHashSubtreeSiblingPath,
466
- nullifierSubtreeSiblingPath,
467
- publicDataSiblingPath,
468
- });
469
- const blockHash = tx.data.constants.historicalHeader.hash();
470
- const archiveRootMembershipWitness = await this.getMembershipWitnessFor(blockHash, MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT);
471
- return BaseRollupInputs.from({
472
- kernelData: this.getKernelDataFor(tx),
473
- start,
474
- stateDiffHints,
475
- sortedPublicDataWrites: txPublicDataUpdateRequestInfo.sortedPublicDataWrites,
476
- sortedPublicDataWritesIndexes: txPublicDataUpdateRequestInfo.sortedPublicDataWritesIndexes,
477
- lowPublicDataWritesPreimages: txPublicDataUpdateRequestInfo.lowPublicDataWritesPreimages,
478
- lowPublicDataWritesMembershipWitnesses: txPublicDataUpdateRequestInfo.lowPublicDataWritesMembershipWitnesses,
479
- publicDataReadsPreimages: txPublicDataReadsInfo.newPublicDataReadsPreimages,
480
- publicDataReadsMembershipWitnesses: txPublicDataReadsInfo.newPublicDataReadsWitnesses,
481
- archiveRootMembershipWitness,
482
- constants,
483
- });
484
- }
485
- makeEmptyMembershipWitness(height) {
486
- return new MembershipWitness(height, 0n, makeTuple(height, () => Fr.ZERO));
487
- }
488
- }
489
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sb19ibG9ja19idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrX2J1aWxkZXIvc29sb19ibG9ja19idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLHNCQUFzQixDQUFDO0FBRTdFLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsc0JBQXNCLEVBRXRCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBRWxCLDJCQUEyQixFQUMzQix3Q0FBd0MsRUFDeEMseUJBQXlCLEVBQ3pCLDRCQUE0QixFQUM1QixzQ0FBc0MsRUFDdEMsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIscUNBQXFDLEVBQ3JDLHdCQUF3QixFQUN4QixxQ0FBcUMsRUFDckMscUJBQXFCLEVBQ3JCLG1DQUFtQyxFQUNuQywrQkFBK0IsRUFDL0IscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQix1Q0FBdUMsRUFDdkMsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFFbEIsa0JBQWtCLEVBQ2xCLDBCQUEwQixFQUMxQixxQkFBcUIsRUFDckIsK0JBQStCLEVBQy9CLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFFaEIsY0FBYyxFQUVkLGNBQWMsR0FFZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVB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
@@ -1,10 +0,0 @@
1
- /**
2
- * Type representing the names of the trees for the base rollup.
3
- */
4
- type BaseTreeNames = 'NoteHashTree' | 'ContractTree' | 'NullifierTree' | 'PublicDataTree';
5
- /**
6
- * Type representing the names of the trees.
7
- */
8
- export type TreeNames = BaseTreeNames | 'L1ToL2MessageTree' | 'Archive';
9
- export {};
10
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/block_builder/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,KAAK,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAC1F;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,mBAAmB,GAAG,SAAS,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvY2tfYnVpbGRlci90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -1,28 +0,0 @@
1
- import { VerificationKey } from '@aztec/circuits.js';
2
- /**
3
- * Well-known verification keys.
4
- */
5
- export interface VerificationKeys {
6
- /**
7
- * Verification key for the default public kernel circuit.
8
- */
9
- publicKernelCircuit: VerificationKey;
10
- /**
11
- * Verification key for the default private kernel circuit.
12
- */
13
- privateKernelCircuit: VerificationKey;
14
- /**
15
- * Verification key for the default base rollup circuit.
16
- */
17
- baseRollupCircuit: VerificationKey;
18
- /**
19
- * Verification key for the default merge rollup circuit.
20
- */
21
- mergeRollupCircuit: VerificationKey;
22
- }
23
- /**
24
- * Returns mock verification keys for each well known circuit.
25
- * @returns A VerificationKeys object with fake values.
26
- */
27
- export declare function getVerificationKeys(): VerificationKeys;
28
- //# sourceMappingURL=verification_keys.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verification_keys.d.ts","sourceRoot":"","sources":["../../src/mocks/verification_keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,mBAAmB,EAAE,eAAe,CAAC;IACrC;;OAEG;IACH,oBAAoB,EAAE,eAAe,CAAC;IACtC;;OAEG;IACH,iBAAiB,EAAE,eAAe,CAAC;IACnC;;OAEG;IACH,kBAAkB,EAAE,eAAe,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAOtD"}
@@ -1,14 +0,0 @@
1
- import { VerificationKey } from '@aztec/circuits.js';
2
- /**
3
- * Returns mock verification keys for each well known circuit.
4
- * @returns A VerificationKeys object with fake values.
5
- */
6
- export function getVerificationKeys() {
7
- return {
8
- privateKernelCircuit: VerificationKey.makeFake(),
9
- baseRollupCircuit: VerificationKey.makeFake(),
10
- mergeRollupCircuit: VerificationKey.makeFake(),
11
- publicKernelCircuit: VerificationKey.makeFake(),
12
- };
13
- }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZpY2F0aW9uX2tleXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9ja3MvdmVyaWZpY2F0aW9uX2tleXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBd0JyRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU87UUFDTCxvQkFBb0IsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO1FBQ2hELGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7UUFDN0Msa0JBQWtCLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtRQUM5QyxtQkFBbUIsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO0tBQ2hELENBQUM7QUFDSixDQUFDIn0=