@aztec/world-state 0.31.0 → 0.32.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 (24) hide show
  1. package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
  2. package/dest/synchronizer/server_world_state_synchronizer.js +4 -3
  3. package/dest/world-state-db/merkle_tree_db.d.ts +10 -1
  4. package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
  5. package/dest/world-state-db/merkle_tree_db.js +2 -1
  6. package/dest/world-state-db/merkle_tree_operations.d.ts +25 -9
  7. package/dest/world-state-db/merkle_tree_operations.d.ts.map +1 -1
  8. package/dest/world-state-db/merkle_tree_operations.js +2 -1
  9. package/dest/world-state-db/merkle_tree_operations_facade.d.ts +9 -9
  10. package/dest/world-state-db/merkle_tree_operations_facade.d.ts.map +1 -1
  11. package/dest/world-state-db/merkle_tree_operations_facade.js +1 -1
  12. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts +6 -7
  13. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts.map +1 -1
  14. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.js +8 -6
  15. package/dest/world-state-db/merkle_trees.d.ts +8 -8
  16. package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
  17. package/dest/world-state-db/merkle_trees.js +34 -17
  18. package/package.json +7 -7
  19. package/src/synchronizer/server_world_state_synchronizer.ts +3 -1
  20. package/src/world-state-db/merkle_tree_db.ts +11 -2
  21. package/src/world-state-db/merkle_tree_operations.ts +36 -11
  22. package/src/world-state-db/merkle_tree_operations_facade.ts +27 -12
  23. package/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +32 -17
  24. package/src/world-state-db/merkle_trees.ts +75 -32
@@ -40,10 +40,17 @@ import {
40
40
  } from '@aztec/merkle-tree';
41
41
  import { Hasher } from '@aztec/types/interfaces';
42
42
 
43
- import { INITIAL_NULLIFIER_TREE_SIZE, INITIAL_PUBLIC_DATA_TREE_SIZE, MerkleTreeDb } from './merkle_tree_db.js';
43
+ import {
44
+ INITIAL_NULLIFIER_TREE_SIZE,
45
+ INITIAL_PUBLIC_DATA_TREE_SIZE,
46
+ MerkleTreeDb,
47
+ TreeSnapshots,
48
+ } from './merkle_tree_db.js';
44
49
  import {
45
50
  HandleL2BlockAndMessagesResult,
46
51
  IndexedTreeId,
52
+ MerkleTreeLeafType,
53
+ MerkleTreeMap,
47
54
  MerkleTreeOperations,
48
55
  TreeInfo,
49
56
  } from './merkle_tree_operations.js';
@@ -53,7 +60,15 @@ import { MerkleTreeOperationsFacade } from './merkle_tree_operations_facade.js';
53
60
  * The nullifier tree is an indexed tree.
54
61
  */
55
62
  class NullifierTree extends StandardIndexedTree {
56
- constructor(store: AztecKVStore, hasher: Hasher, name: string, depth: number, size: bigint = 0n, root?: Buffer) {
63
+ constructor(
64
+ store: AztecKVStore,
65
+ hasher: Hasher,
66
+ name: string,
67
+ depth: number,
68
+ size: bigint = 0n,
69
+ _noop: any,
70
+ root?: Buffer,
71
+ ) {
57
72
  super(store, hasher, name, depth, size, NullifierLeafPreimage, NullifierLeaf, root);
58
73
  }
59
74
  }
@@ -62,7 +77,15 @@ class NullifierTree extends StandardIndexedTree {
62
77
  * The public data tree is an indexed tree.
63
78
  */
64
79
  class PublicDataTree extends StandardIndexedTree {
65
- constructor(store: AztecKVStore, hasher: Hasher, name: string, depth: number, size: bigint = 0n, root?: Buffer) {
80
+ constructor(
81
+ store: AztecKVStore,
82
+ hasher: Hasher,
83
+ name: string,
84
+ depth: number,
85
+ size: bigint = 0n,
86
+ _noop: any,
87
+ root?: Buffer,
88
+ ) {
66
89
  super(store, hasher, name, depth, size, PublicDataTreeLeafPreimage, PublicDataTreeLeaf, root);
67
90
  }
68
91
  }
@@ -71,7 +94,8 @@ class PublicDataTree extends StandardIndexedTree {
71
94
  * A convenience class for managing multiple merkle trees.
72
95
  */
73
96
  export class MerkleTrees implements MerkleTreeDb {
74
- private trees: (AppendOnlyTree | UpdateOnlyTree)[] = [];
97
+ // gets initialized in #init
98
+ private trees: MerkleTreeMap = null as any;
75
99
  private jobQueue = new SerialQueue();
76
100
 
77
101
  private constructor(private store: AztecKVStore, private log: DebugLogger) {}
@@ -101,14 +125,16 @@ export class MerkleTrees implements MerkleTreeDb {
101
125
  this.store,
102
126
  hasher,
103
127
  `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`,
128
+ {},
104
129
  NULLIFIER_TREE_HEIGHT,
105
130
  INITIAL_NULLIFIER_TREE_SIZE,
106
131
  );
107
- const noteHashTree: AppendOnlyTree = await initializeTree(
132
+ const noteHashTree: AppendOnlyTree<Fr> = await initializeTree(
108
133
  StandardTree,
109
134
  this.store,
110
135
  hasher,
111
136
  `${MerkleTreeId[MerkleTreeId.NOTE_HASH_TREE]}`,
137
+ Fr,
112
138
  NOTE_HASH_TREE_HEIGHT,
113
139
  );
114
140
  const publicDataTree = await initializeTree(
@@ -116,21 +142,24 @@ export class MerkleTrees implements MerkleTreeDb {
116
142
  this.store,
117
143
  hasher,
118
144
  `${MerkleTreeId[MerkleTreeId.PUBLIC_DATA_TREE]}`,
145
+ {},
119
146
  PUBLIC_DATA_TREE_HEIGHT,
120
147
  INITIAL_PUBLIC_DATA_TREE_SIZE,
121
148
  );
122
- const l1Tol2MessageTree: AppendOnlyTree = await initializeTree(
149
+ const l1Tol2MessageTree: AppendOnlyTree<Fr> = await initializeTree(
123
150
  StandardTree,
124
151
  this.store,
125
152
  hasher,
126
153
  `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]}`,
154
+ Fr,
127
155
  L1_TO_L2_MSG_TREE_HEIGHT,
128
156
  );
129
- const archive: AppendOnlyTree = await initializeTree(
157
+ const archive: AppendOnlyTree<Fr> = await initializeTree(
130
158
  StandardTree,
131
159
  this.store,
132
160
  hasher,
133
161
  `${MerkleTreeId[MerkleTreeId.ARCHIVE]}`,
162
+ Fr,
134
163
  ARCHIVE_HEIGHT,
135
164
  );
136
165
  this.trees = [nullifierTree, noteHashTree, publicDataTree, l1Tol2MessageTree, archive];
@@ -230,7 +259,7 @@ export class MerkleTrees implements MerkleTreeDb {
230
259
  treeId: MerkleTreeId,
231
260
  index: bigint,
232
261
  includeUncommitted: boolean,
233
- ): Promise<Buffer | undefined> {
262
+ ): Promise<MerkleTreeLeafType<typeof treeId> | undefined> {
234
263
  return await this.synchronize(() => Promise.resolve(this.trees[treeId].getLeafValue(index, includeUncommitted)));
235
264
  }
236
265
 
@@ -255,7 +284,7 @@ export class MerkleTrees implements MerkleTreeDb {
255
284
  * @param leaves - The leaves to append.
256
285
  * @returns Empty promise.
257
286
  */
258
- public async appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]): Promise<void> {
287
+ public async appendLeaves<ID extends MerkleTreeId>(treeId: ID, leaves: MerkleTreeLeafType<ID>[]): Promise<void> {
259
288
  return await this.synchronize(() => this.#appendLeaves(treeId, leaves));
260
289
  }
261
290
 
@@ -328,14 +357,15 @@ export class MerkleTrees implements MerkleTreeDb {
328
357
  * @param includeUncommitted - Indicates whether to include uncommitted data.
329
358
  * @returns The index of the first leaf found with a given value (undefined if not found).
330
359
  */
331
- public async findLeafIndex(
332
- treeId: MerkleTreeId,
333
- value: Buffer,
360
+ public async findLeafIndex<ID extends MerkleTreeId>(
361
+ treeId: ID,
362
+ value: MerkleTreeLeafType<ID>,
334
363
  includeUncommitted: boolean,
335
364
  ): Promise<bigint | undefined> {
336
365
  return await this.synchronize(() => {
337
366
  const tree = this.trees[treeId];
338
- return Promise.resolve(tree.findLeafIndex(value, includeUncommitted));
367
+ // TODO #5448 fix "as any"
368
+ return Promise.resolve(tree.findLeafIndex(value as any, includeUncommitted));
339
369
  });
340
370
  }
341
371
 
@@ -346,15 +376,16 @@ export class MerkleTrees implements MerkleTreeDb {
346
376
  * @param startIndex - The index to start searching from (used when skipping nullified messages)
347
377
  * @param includeUncommitted - Indicates whether to include uncommitted data.
348
378
  */
349
- public async findLeafIndexAfter(
350
- treeId: MerkleTreeId,
351
- value: Buffer,
379
+ public async findLeafIndexAfter<ID extends MerkleTreeId>(
380
+ treeId: ID,
381
+ value: MerkleTreeLeafType<ID>,
352
382
  startIndex: bigint,
353
383
  includeUncommitted: boolean,
354
384
  ): Promise<bigint | undefined> {
355
385
  return await this.synchronize(() => {
356
386
  const tree = this.trees[treeId];
357
- return Promise.resolve(tree.findLeafIndexAfter(value, startIndex, includeUncommitted));
387
+ // TODO #5448 fix "as any"
388
+ return Promise.resolve(tree.findLeafIndexAfter(value as any, startIndex, includeUncommitted));
358
389
  });
359
390
  }
360
391
 
@@ -391,7 +422,7 @@ export class MerkleTrees implements MerkleTreeDb {
391
422
  SubtreeHeight extends number,
392
423
  SubtreeSiblingPathHeight extends number,
393
424
  >(
394
- treeId: MerkleTreeId,
425
+ treeId: IndexedTreeId,
395
426
  leaves: Buffer[],
396
427
  subtreeHeight: SubtreeHeight,
397
428
  ): Promise<BatchInsertionResult<TreeHeight, SubtreeSiblingPathHeight>> {
@@ -421,7 +452,7 @@ export class MerkleTrees implements MerkleTreeDb {
421
452
  }
422
453
 
423
454
  const blockHash = header.hash();
424
- await this.#appendLeaves(MerkleTreeId.ARCHIVE, [blockHash.toBuffer()]);
455
+ await this.#appendLeaves(MerkleTreeId.ARCHIVE, [blockHash]);
425
456
  }
426
457
 
427
458
  /**
@@ -455,20 +486,21 @@ export class MerkleTrees implements MerkleTreeDb {
455
486
  * @param leaves - Leaves to append.
456
487
  * @returns Empty promise.
457
488
  */
458
- async #appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]): Promise<void> {
489
+ async #appendLeaves<ID extends MerkleTreeId>(treeId: ID, leaves: MerkleTreeLeafType<typeof treeId>[]): Promise<void> {
459
490
  const tree = this.trees[treeId];
460
491
  if (!('appendLeaves' in tree)) {
461
492
  throw new Error('Tree does not support `appendLeaves` method');
462
493
  }
463
- return await tree.appendLeaves(leaves);
494
+ // TODO #5448 fix "as any"
495
+ return await tree.appendLeaves(leaves as any[]);
464
496
  }
465
497
 
466
- async #updateLeaf(treeId: IndexedTreeId, leaf: Buffer, index: bigint): Promise<void> {
498
+ async #updateLeaf(treeId: IndexedTreeId, leaf: MerkleTreeLeafType<typeof treeId>, index: bigint): Promise<void> {
467
499
  const tree = this.trees[treeId];
468
500
  if (!('updateLeaf' in tree)) {
469
501
  throw new Error('Tree does not support `updateLeaf` method');
470
502
  }
471
- return await tree.updateLeaf(leaf, index);
503
+ return await (tree as UpdateOnlyTree<typeof leaf>).updateLeaf(leaf, index);
472
504
  }
473
505
 
474
506
  /**
@@ -476,7 +508,7 @@ export class MerkleTrees implements MerkleTreeDb {
476
508
  * @returns Empty promise.
477
509
  */
478
510
  async #commit(): Promise<void> {
479
- for (const tree of this.trees) {
511
+ for (const tree of Object.values(this.trees)) {
480
512
  await tree.commit();
481
513
  }
482
514
  }
@@ -486,17 +518,31 @@ export class MerkleTrees implements MerkleTreeDb {
486
518
  * @returns Empty promise.
487
519
  */
488
520
  async #rollback(): Promise<void> {
489
- for (const tree of this.trees) {
521
+ for (const tree of Object.values(this.trees)) {
490
522
  await tree.rollback();
491
523
  }
492
524
  }
493
525
 
494
- public getSnapshot(blockNumber: number) {
495
- return Promise.all(this.trees.map(tree => tree.getSnapshot(blockNumber)));
526
+ public async getSnapshot(blockNumber: number): Promise<TreeSnapshots> {
527
+ const snapshots = await Promise.all([
528
+ this.trees[MerkleTreeId.NULLIFIER_TREE].getSnapshot(blockNumber),
529
+ this.trees[MerkleTreeId.NOTE_HASH_TREE].getSnapshot(blockNumber),
530
+ this.trees[MerkleTreeId.PUBLIC_DATA_TREE].getSnapshot(blockNumber),
531
+ this.trees[MerkleTreeId.L1_TO_L2_MESSAGE_TREE].getSnapshot(blockNumber),
532
+ this.trees[MerkleTreeId.ARCHIVE].getSnapshot(blockNumber),
533
+ ]);
534
+
535
+ return {
536
+ [MerkleTreeId.NULLIFIER_TREE]: snapshots[0],
537
+ [MerkleTreeId.NOTE_HASH_TREE]: snapshots[1],
538
+ [MerkleTreeId.PUBLIC_DATA_TREE]: snapshots[2],
539
+ [MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: snapshots[3],
540
+ [MerkleTreeId.ARCHIVE]: snapshots[4],
541
+ };
496
542
  }
497
543
 
498
544
  async #snapshot(blockNumber: number): Promise<void> {
499
- for (const tree of this.trees) {
545
+ for (const tree of Object.values(this.trees)) {
500
546
  await tree.snapshot(blockNumber);
501
547
  }
502
548
  }
@@ -535,10 +581,7 @@ export class MerkleTrees implements MerkleTreeDb {
535
581
  [MerkleTreeId.NOTE_HASH_TREE, l2Block.body.txEffects.flatMap(txEffect => txEffect.noteHashes)],
536
582
  [MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded],
537
583
  ] as const) {
538
- await this.#appendLeaves(
539
- tree,
540
- leaves.map(fr => fr.toBuffer()),
541
- );
584
+ await this.#appendLeaves(tree, leaves);
542
585
  }
543
586
 
544
587
  // Sync the indexed trees