@aztec/merkle-tree 0.31.0 → 0.32.1

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 (69) hide show
  1. package/dest/hasher_with_stats.d.ts +1 -1
  2. package/dest/hasher_with_stats.d.ts.map +1 -1
  3. package/dest/interfaces/append_only_tree.d.ts +5 -4
  4. package/dest/interfaces/append_only_tree.d.ts.map +1 -1
  5. package/dest/interfaces/indexed_tree.d.ts +6 -4
  6. package/dest/interfaces/indexed_tree.d.ts.map +1 -1
  7. package/dest/interfaces/merkle_tree.d.ts +6 -5
  8. package/dest/interfaces/merkle_tree.d.ts.map +1 -1
  9. package/dest/interfaces/update_only_tree.d.ts +5 -4
  10. package/dest/interfaces/update_only_tree.d.ts.map +1 -1
  11. package/dest/load_tree.d.ts +5 -4
  12. package/dest/load_tree.d.ts.map +1 -1
  13. package/dest/load_tree.js +3 -3
  14. package/dest/new_tree.d.ts +5 -4
  15. package/dest/new_tree.d.ts.map +1 -1
  16. package/dest/new_tree.js +3 -3
  17. package/dest/pedersen.d.ts +1 -1
  18. package/dest/pedersen.d.ts.map +1 -1
  19. package/dest/sha_256.d.ts +1 -1
  20. package/dest/sha_256.d.ts.map +1 -1
  21. package/dest/snapshots/append_only_snapshot.d.ts +11 -9
  22. package/dest/snapshots/append_only_snapshot.d.ts.map +1 -1
  23. package/dest/snapshots/append_only_snapshot.js +13 -8
  24. package/dest/snapshots/base_full_snapshot.d.ts +12 -10
  25. package/dest/snapshots/base_full_snapshot.d.ts.map +1 -1
  26. package/dest/snapshots/base_full_snapshot.js +7 -4
  27. package/dest/snapshots/full_snapshot.d.ts +8 -4
  28. package/dest/snapshots/full_snapshot.d.ts.map +1 -1
  29. package/dest/snapshots/full_snapshot.js +6 -2
  30. package/dest/snapshots/indexed_tree_snapshot.d.ts +6 -6
  31. package/dest/snapshots/indexed_tree_snapshot.d.ts.map +1 -1
  32. package/dest/snapshots/indexed_tree_snapshot.js +2 -2
  33. package/dest/snapshots/snapshot_builder.d.ts +9 -8
  34. package/dest/snapshots/snapshot_builder.d.ts.map +1 -1
  35. package/dest/snapshots/snapshot_builder_test_suite.d.ts +4 -3
  36. package/dest/snapshots/snapshot_builder_test_suite.d.ts.map +1 -1
  37. package/dest/snapshots/snapshot_builder_test_suite.js +5 -2
  38. package/dest/sparse_tree/sparse_tree.d.ts +9 -9
  39. package/dest/sparse_tree/sparse_tree.d.ts.map +1 -1
  40. package/dest/sparse_tree/sparse_tree.js +6 -4
  41. package/dest/standard_indexed_tree/standard_indexed_tree.d.ts +8 -6
  42. package/dest/standard_indexed_tree/standard_indexed_tree.d.ts.map +1 -1
  43. package/dest/standard_indexed_tree/standard_indexed_tree.js +5 -2
  44. package/dest/standard_tree/standard_tree.d.ts +9 -8
  45. package/dest/standard_tree/standard_tree.d.ts.map +1 -1
  46. package/dest/standard_tree/standard_tree.js +5 -3
  47. package/dest/tree_base.d.ts +19 -10
  48. package/dest/tree_base.d.ts.map +1 -1
  49. package/dest/tree_base.js +20 -3
  50. package/package.json +5 -5
  51. package/src/hasher_with_stats.ts +1 -1
  52. package/src/interfaces/append_only_tree.ts +8 -4
  53. package/src/interfaces/indexed_tree.ts +13 -4
  54. package/src/interfaces/merkle_tree.ts +6 -5
  55. package/src/interfaces/update_only_tree.ts +8 -4
  56. package/src/load_tree.ts +16 -6
  57. package/src/new_tree.ts +8 -6
  58. package/src/pedersen.ts +1 -1
  59. package/src/sha_256.ts +1 -1
  60. package/src/snapshots/append_only_snapshot.ts +28 -16
  61. package/src/snapshots/base_full_snapshot.ts +14 -11
  62. package/src/snapshots/full_snapshot.ts +14 -7
  63. package/src/snapshots/indexed_tree_snapshot.ts +10 -10
  64. package/src/snapshots/snapshot_builder.ts +9 -8
  65. package/src/snapshots/snapshot_builder_test_suite.ts +14 -8
  66. package/src/sparse_tree/sparse_tree.ts +13 -10
  67. package/src/standard_indexed_tree/standard_indexed_tree.ts +19 -9
  68. package/src/standard_tree/standard_tree.ts +13 -11
  69. package/src/tree_base.ts +27 -10
@@ -1,10 +1,11 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  import { SiblingPath } from '@aztec/circuit-types';
3
- import { DebugLogger } from '@aztec/foundation/log';
4
- import { AztecKVStore } from '@aztec/kv-store';
5
- import { Hasher } from '@aztec/types/interfaces';
3
+ import { type DebugLogger } from '@aztec/foundation/log';
4
+ import { type Bufferable, type FromBuffer } from '@aztec/foundation/serialize';
5
+ import { type AztecKVStore } from '@aztec/kv-store';
6
+ import { type Hasher } from '@aztec/types/interfaces';
6
7
  import { HasherWithStats } from './hasher_with_stats.js';
7
- import { MerkleTree } from './interfaces/merkle_tree.js';
8
+ import { type MerkleTree } from './interfaces/merkle_tree.js';
8
9
  export declare const getTreeMeta: (store: AztecKVStore, treeName: string) => {
9
10
  root: Buffer;
10
11
  depth: number;
@@ -14,11 +15,12 @@ export declare const INITIAL_LEAF: Buffer;
14
15
  /**
15
16
  * A Merkle tree implementation that uses a LevelDB database to store the tree.
16
17
  */
17
- export declare abstract class TreeBase implements MerkleTree {
18
+ export declare abstract class TreeBase<T extends Bufferable> implements MerkleTree<T> {
18
19
  protected store: AztecKVStore;
19
20
  private name;
20
21
  private depth;
21
22
  protected size: bigint;
23
+ protected deserializer: FromBuffer<T>;
22
24
  protected readonly maxIndex: bigint;
23
25
  protected cachedSize?: bigint;
24
26
  private root;
@@ -28,7 +30,7 @@ export declare abstract class TreeBase implements MerkleTree {
28
30
  protected hasher: HasherWithStats;
29
31
  private nodes;
30
32
  private meta;
31
- constructor(store: AztecKVStore, hasher: Hasher, name: string, depth: number, size?: bigint, root?: Buffer);
33
+ constructor(store: AztecKVStore, hasher: Hasher, name: string, depth: number, size: bigint, deserializer: FromBuffer<T>, root?: Buffer);
32
34
  /**
33
35
  * Returns the root of the tree.
34
36
  * @param includeUncommitted - If true, root incorporating uncommitted changes is returned.
@@ -75,7 +77,14 @@ export declare abstract class TreeBase implements MerkleTree {
75
77
  * @param includeUncommitted - Indicates whether to include uncommitted changes.
76
78
  * @returns Leaf value at the given index or undefined.
77
79
  */
78
- getLeafValue(index: bigint, includeUncommitted: boolean): Buffer | undefined;
80
+ getLeafValue(index: bigint, includeUncommitted: boolean): T | undefined;
81
+ /**
82
+ * Gets the value at the given index.
83
+ * @param index - The index of the leaf.
84
+ * @param includeUncommitted - Indicates whether to include uncommitted changes.
85
+ * @returns Leaf value at the given index or undefined.
86
+ */
87
+ getLeafBuffer(index: bigint, includeUncommitted: boolean): Buffer | undefined;
79
88
  getNode(level: number, index: bigint): Buffer | undefined;
80
89
  getZeroHash(level: number): Buffer;
81
90
  /**
@@ -129,14 +138,14 @@ export declare abstract class TreeBase implements MerkleTree {
129
138
  * `getLatestValueAtIndex` will return a value from cache (because at least one of the 2 children was
130
139
  * touched in previous iteration).
131
140
  */
132
- protected appendLeaves(leaves: Buffer[]): void;
141
+ protected appendLeaves(leaves: T[]): void;
133
142
  /**
134
143
  * Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
135
144
  * @param value - The leaf value to look for.
136
145
  * @param includeUncommitted - Indicates whether to include uncommitted data.
137
146
  * @returns The index of the first leaf found with a given value (undefined if not found).
138
147
  */
139
- abstract findLeafIndex(value: Buffer, includeUncommitted: boolean): bigint | undefined;
148
+ abstract findLeafIndex(value: T, includeUncommitted: boolean): bigint | undefined;
140
149
  /**
141
150
  * Returns the first index containing a leaf value after `startIndex`.
142
151
  * @param leaf - The leaf value to look for.
@@ -144,6 +153,6 @@ export declare abstract class TreeBase implements MerkleTree {
144
153
  * @param includeUncommitted - Indicates whether to include uncommitted data.
145
154
  * @returns The index of the first leaf found with a given value (undefined if not found).
146
155
  */
147
- abstract findLeafIndexAfter(leaf: Buffer, startIndex: bigint, includeUncommitted: boolean): bigint | undefined;
156
+ abstract findLeafIndexAfter(leaf: T, startIndex: bigint, includeUncommitted: boolean): bigint | undefined;
148
157
  }
149
158
  //# sourceMappingURL=tree_base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tree_base.d.ts","sourceRoot":"","sources":["../src/tree_base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree_base.d.ts","sourceRoot":"","sources":["../src/tree_base.ts"],"names":[],"mappings":"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"}
package/dest/tree_base.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { SiblingPath } from '@aztec/circuit-types';
2
2
  import { toBigIntLE, toBufferLE } from '@aztec/foundation/bigint-buffer';
3
3
  import { createDebugLogger } from '@aztec/foundation/log';
4
+ import { serializeToBuffer } from '@aztec/foundation/serialize';
4
5
  import { HasherWithStats } from './hasher_with_stats.js';
5
6
  const MAX_DEPTH = 254;
6
7
  const indexToKeyHash = (name, level, index) => `${name}:${level}:${index}`;
@@ -34,11 +35,12 @@ export const INITIAL_LEAF = Buffer.from('000000000000000000000000000000000000000
34
35
  * A Merkle tree implementation that uses a LevelDB database to store the tree.
35
36
  */
36
37
  export class TreeBase {
37
- constructor(store, hasher, name, depth, size = 0n, root) {
38
+ constructor(store, hasher, name, depth, size = 0n, deserializer, root) {
38
39
  this.store = store;
39
40
  this.name = name;
40
41
  this.depth = depth;
41
42
  this.size = size;
43
+ this.deserializer = deserializer;
42
44
  this.zeroHashes = [];
43
45
  this.cache = {};
44
46
  if (!(depth >= 1 && depth <= MAX_DEPTH)) {
@@ -137,6 +139,21 @@ export class TreeBase {
137
139
  * @returns Leaf value at the given index or undefined.
138
140
  */
139
141
  getLeafValue(index, includeUncommitted) {
142
+ const buf = this.getLatestValueAtIndex(this.depth, index, includeUncommitted);
143
+ if (buf) {
144
+ return this.deserializer.fromBuffer(buf);
145
+ }
146
+ else {
147
+ return undefined;
148
+ }
149
+ }
150
+ /**
151
+ * Gets the value at the given index.
152
+ * @param index - The index of the leaf.
153
+ * @param includeUncommitted - Indicates whether to include uncommitted changes.
154
+ * @returns Leaf value at the given index or undefined.
155
+ */
156
+ getLeafBuffer(index, includeUncommitted) {
140
157
  return this.getLatestValueAtIndex(this.depth, index, includeUncommitted);
141
158
  }
142
159
  getNode(level, index) {
@@ -253,7 +270,7 @@ export class TreeBase {
253
270
  let level = this.depth;
254
271
  for (let i = 0; i < leaves.length; i++) {
255
272
  const cacheKey = indexToKeyHash(this.name, level, firstIndex + BigInt(i));
256
- this.cache[cacheKey] = leaves[i];
273
+ this.cache[cacheKey] = serializeToBuffer(leaves[i]);
257
274
  }
258
275
  let lastIndex = firstIndex + BigInt(leaves.length);
259
276
  // 2. Iterate over all the levels from the bottom up
@@ -272,4 +289,4 @@ export class TreeBase {
272
289
  this.cachedSize = numLeaves + BigInt(leaves.length);
273
290
  }
274
291
  }
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZV9iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RyZWVfYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RSxPQUFPLEVBQWUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUl2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHekQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBRXRCLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNuRyxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFDRixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFD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
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZV9iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RyZWVfYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RSxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFvQyxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSWxHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUd6RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7QUFFdEIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ25HLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxJQUFZLEVBQUUsRUFBRTtJQUMvRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUNGLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7SUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/merkle-tree",
3
- "version": "0.31.0",
3
+ "version": "0.32.1",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -32,10 +32,10 @@
32
32
  "testTimeout": 15000
33
33
  },
34
34
  "dependencies": {
35
- "@aztec/circuit-types": "0.31.0",
36
- "@aztec/foundation": "0.31.0",
37
- "@aztec/kv-store": "0.31.0",
38
- "@aztec/types": "0.31.0",
35
+ "@aztec/circuit-types": "0.32.1",
36
+ "@aztec/foundation": "0.32.1",
37
+ "@aztec/kv-store": "0.32.1",
38
+ "@aztec/types": "0.32.1",
39
39
  "sha256": "^0.2.0",
40
40
  "tslib": "^2.4.0"
41
41
  },
@@ -1,4 +1,4 @@
1
- import { Hasher } from '@aztec/types/interfaces';
1
+ import { type Hasher } from '@aztec/types/interfaces';
2
2
 
3
3
  import { createHistogram, performance } from 'perf_hooks';
4
4
 
@@ -1,13 +1,17 @@
1
- import { TreeSnapshotBuilder } from '../snapshots/snapshot_builder.js';
2
- import { MerkleTree } from './merkle_tree.js';
1
+ import { type Bufferable } from '@aztec/foundation/serialize';
2
+
3
+ import { type TreeSnapshot, type TreeSnapshotBuilder } from '../snapshots/snapshot_builder.js';
4
+ import { type MerkleTree } from './merkle_tree.js';
3
5
 
4
6
  /**
5
7
  * A Merkle tree that supports only appending leaves and not updating existing leaves.
6
8
  */
7
- export interface AppendOnlyTree extends MerkleTree, TreeSnapshotBuilder {
9
+ export interface AppendOnlyTree<T extends Bufferable = Buffer>
10
+ extends MerkleTree<T>,
11
+ TreeSnapshotBuilder<TreeSnapshot<T>> {
8
12
  /**
9
13
  * Appends a set of leaf values to the tree.
10
14
  * @param leaves - The set of leaves to be appended.
11
15
  */
12
- appendLeaves(leaves: Buffer[]): Promise<void>;
16
+ appendLeaves(leaves: T[]): Promise<void>;
13
17
  }
@@ -1,7 +1,13 @@
1
- import { SiblingPath } from '@aztec/circuit-types';
2
- import { IndexedTreeLeaf, IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
1
+ import { type SiblingPath } from '@aztec/circuit-types';
2
+ import { type IndexedTreeLeaf, type IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
3
3
 
4
- import { AppendOnlyTree } from './append_only_tree.js';
4
+ import {
5
+ type IndexedTreeSnapshot,
6
+ type TreeSnapshot,
7
+ type TreeSnapshotBuilder,
8
+ } from '../snapshots/snapshot_builder.js';
9
+ import { type AppendOnlyTree } from './append_only_tree.js';
10
+ import { type MerkleTree } from './merkle_tree.js';
5
11
 
6
12
  /**
7
13
  * Factory for creating leaf preimages.
@@ -73,7 +79,10 @@ export interface BatchInsertionResult<TreeHeight extends number, SubtreeSiblingP
73
79
  /**
74
80
  * Indexed merkle tree.
75
81
  */
76
- export interface IndexedTree extends AppendOnlyTree {
82
+ export interface IndexedTree
83
+ extends MerkleTree<Buffer>,
84
+ TreeSnapshotBuilder<IndexedTreeSnapshot>,
85
+ Omit<AppendOnlyTree<Buffer>, keyof TreeSnapshotBuilder<TreeSnapshot<Buffer>>> {
77
86
  /**
78
87
  * Finds the index of the largest leaf whose value is less than or equal to the provided value.
79
88
  * @param newValue - The new value to be inserted into the tree.
@@ -1,4 +1,5 @@
1
- import { SiblingPath } from '@aztec/circuit-types';
1
+ import { type SiblingPath } from '@aztec/circuit-types';
2
+ import { type Bufferable } from '@aztec/foundation/serialize';
2
3
 
3
4
  /**
4
5
  * Defines the interface for a source of sibling paths.
@@ -15,7 +16,7 @@ export interface SiblingPathSource {
15
16
  /**
16
17
  * Defines the interface for a Merkle tree.
17
18
  */
18
- export interface MerkleTree extends SiblingPathSource {
19
+ export interface MerkleTree<T extends Bufferable = Buffer> extends SiblingPathSource {
19
20
  /**
20
21
  * Returns the current root of the tree.
21
22
  * @param includeUncommitted - Set to true to include uncommitted updates in the calculated root.
@@ -48,7 +49,7 @@ export interface MerkleTree extends SiblingPathSource {
48
49
  * @param index - The index of the leaf value to be returned.
49
50
  * @param includeUncommitted - Set to true to include uncommitted updates in the data set.
50
51
  */
51
- getLeafValue(index: bigint, includeUncommitted: boolean): Buffer | undefined;
52
+ getLeafValue(index: bigint, includeUncommitted: boolean): T | undefined;
52
53
 
53
54
  /**
54
55
  * Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
@@ -56,7 +57,7 @@ export interface MerkleTree extends SiblingPathSource {
56
57
  * @param includeUncommitted - Indicates whether to include uncommitted data.
57
58
  * @returns The index of the first leaf found with a given value (undefined if not found).
58
59
  */
59
- findLeafIndex(leaf: Buffer, includeUncommitted: boolean): bigint | undefined;
60
+ findLeafIndex(leaf: T, includeUncommitted: boolean): bigint | undefined;
60
61
 
61
62
  /**
62
63
  * Returns the first index containing a leaf value after `startIndex`.
@@ -65,5 +66,5 @@ export interface MerkleTree extends SiblingPathSource {
65
66
  * @param includeUncommitted - Indicates whether to include uncommitted data.
66
67
  * @returns The index of the first leaf found with a given value (undefined if not found).
67
68
  */
68
- findLeafIndexAfter(leaf: Buffer, startIndex: bigint, includeUncommitted: boolean): bigint | undefined;
69
+ findLeafIndexAfter(leaf: T, startIndex: bigint, includeUncommitted: boolean): bigint | undefined;
69
70
  }
@@ -1,14 +1,18 @@
1
- import { TreeSnapshotBuilder } from '../snapshots/snapshot_builder.js';
2
- import { MerkleTree } from './merkle_tree.js';
1
+ import { type Bufferable } from '@aztec/foundation/serialize';
2
+
3
+ import { type TreeSnapshot, type TreeSnapshotBuilder } from '../snapshots/snapshot_builder.js';
4
+ import { type MerkleTree } from './merkle_tree.js';
3
5
 
4
6
  /**
5
7
  * A Merkle tree that supports updates at arbitrary indices but not appending.
6
8
  */
7
- export interface UpdateOnlyTree extends MerkleTree, TreeSnapshotBuilder {
9
+ export interface UpdateOnlyTree<T extends Bufferable = Buffer>
10
+ extends MerkleTree<T>,
11
+ TreeSnapshotBuilder<TreeSnapshot<T>> {
8
12
  /**
9
13
  * Updates a leaf at a given index in the tree.
10
14
  * @param leaf - The leaf value to be updated.
11
15
  * @param index - The leaf to be updated.
12
16
  */
13
- updateLeaf(leaf: Buffer, index: bigint): Promise<void>;
17
+ updateLeaf(leaf: T, index: bigint): Promise<void>;
14
18
  }
package/src/load_tree.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { AztecKVStore } from '@aztec/kv-store';
2
- import { Hasher } from '@aztec/types/interfaces';
1
+ import { type Bufferable, type FromBuffer } from '@aztec/foundation/serialize';
2
+ import { type AztecKVStore } from '@aztec/kv-store';
3
+ import { type Hasher } from '@aztec/types/interfaces';
3
4
 
4
- import { TreeBase, getTreeMeta } from './tree_base.js';
5
+ import { type TreeBase, getTreeMeta } from './tree_base.js';
5
6
 
6
7
  /**
7
8
  * Creates a new tree and sets its root, depth and size based on the meta data which are associated with the name.
@@ -11,13 +12,22 @@ import { TreeBase, getTreeMeta } from './tree_base.js';
11
12
  * @param name - Name of the tree.
12
13
  * @returns The newly created tree.
13
14
  */
14
- export function loadTree<T extends TreeBase>(
15
- c: new (store: AztecKVStore, hasher: Hasher, name: string, depth: number, size: bigint, root: Buffer) => T,
15
+ export function loadTree<T extends TreeBase<Bufferable>, D extends FromBuffer<Bufferable>>(
16
+ c: new (
17
+ store: AztecKVStore,
18
+ hasher: Hasher,
19
+ name: string,
20
+ depth: number,
21
+ size: bigint,
22
+ deserializer: D,
23
+ root: Buffer,
24
+ ) => T,
16
25
  store: AztecKVStore,
17
26
  hasher: Hasher,
18
27
  name: string,
28
+ deserializer: D,
19
29
  ): Promise<T> {
20
30
  const { root, depth, size } = getTreeMeta(store, name);
21
- const tree = new c(store, hasher, name, depth, size, root);
31
+ const tree = new c(store, hasher, name, depth, size, deserializer, root);
22
32
  return Promise.resolve(tree);
23
33
  }
package/src/new_tree.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { AztecKVStore } from '@aztec/kv-store';
2
- import { Hasher } from '@aztec/types/interfaces';
1
+ import { type Bufferable, type FromBuffer } from '@aztec/foundation/serialize';
2
+ import { type AztecKVStore } from '@aztec/kv-store';
3
+ import { type Hasher } from '@aztec/types/interfaces';
3
4
 
4
- import { TreeBase } from './tree_base.js';
5
+ import { type TreeBase } from './tree_base.js';
5
6
 
6
7
  /**
7
8
  * Creates a new tree.
@@ -13,15 +14,16 @@ import { TreeBase } from './tree_base.js';
13
14
  * @param prefilledSize - A number of leaves that are prefilled with values.
14
15
  * @returns The newly created tree.
15
16
  */
16
- export async function newTree<T extends TreeBase>(
17
- c: new (store: AztecKVStore, hasher: Hasher, name: string, depth: number, size: bigint) => T,
17
+ export async function newTree<T extends TreeBase<Bufferable>, D extends FromBuffer<Bufferable>>(
18
+ c: new (store: AztecKVStore, hasher: Hasher, name: string, depth: number, size: bigint, deserializer: D) => T,
18
19
  store: AztecKVStore,
19
20
  hasher: Hasher,
20
21
  name: string,
22
+ deserializer: D,
21
23
  depth: number,
22
24
  prefilledSize = 1,
23
25
  ): Promise<T> {
24
- const tree = new c(store, hasher, name, depth, 0n);
26
+ const tree = new c(store, hasher, name, depth, 0n, deserializer);
25
27
  await tree.init(prefilledSize);
26
28
  return tree;
27
29
  }
package/src/pedersen.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { pedersenHash } from '@aztec/foundation/crypto';
2
- import { Hasher } from '@aztec/types/interfaces';
2
+ import { type Hasher } from '@aztec/types/interfaces';
3
3
 
4
4
  /**
5
5
  * A helper class encapsulating Pedersen hash functionality.
package/src/sha_256.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { sha256 } from '@aztec/foundation/crypto';
2
2
  import { truncateAndPad } from '@aztec/foundation/serialize';
3
- import { Hasher } from '@aztec/types/interfaces';
3
+ import { type Hasher } from '@aztec/types/interfaces';
4
4
 
5
5
  /**
6
6
  * A helper class encapsulating SHA256 hash functionality.
@@ -1,10 +1,11 @@
1
1
  import { SiblingPath } from '@aztec/circuit-types';
2
- import { AztecKVStore, AztecMap } from '@aztec/kv-store';
3
- import { Hasher } from '@aztec/types/interfaces';
2
+ import { type Bufferable, type FromBuffer, serializeToBuffer } from '@aztec/foundation/serialize';
3
+ import { type AztecKVStore, type AztecMap } from '@aztec/kv-store';
4
+ import { type Hasher } from '@aztec/types/interfaces';
4
5
 
5
- import { AppendOnlyTree } from '../interfaces/append_only_tree.js';
6
- import { TreeBase } from '../tree_base.js';
7
- import { TreeSnapshot, TreeSnapshotBuilder } from './snapshot_builder.js';
6
+ import { type AppendOnlyTree } from '../interfaces/append_only_tree.js';
7
+ import { type TreeBase } from '../tree_base.js';
8
+ import { type TreeSnapshot, type TreeSnapshotBuilder } from './snapshot_builder.js';
8
9
 
9
10
  // stores the last block that modified this node
10
11
  const nodeModifiedAtBlockKey = (level: number, index: bigint) => `node:${level}:${index}:modifiedAtBlock`;
@@ -37,19 +38,24 @@ type SnapshotMetadata = {
37
38
  * Best case: O(H) database reads + O(1) hashes
38
39
  * Worst case: O(H) database reads + O(H) hashes
39
40
  */
40
- export class AppendOnlySnapshotBuilder implements TreeSnapshotBuilder {
41
+ export class AppendOnlySnapshotBuilder<T extends Bufferable> implements TreeSnapshotBuilder<TreeSnapshot<T>> {
41
42
  #nodeValue: AztecMap<ReturnType<typeof historicalNodeKey>, Buffer>;
42
43
  #nodeLastModifiedByBlock: AztecMap<ReturnType<typeof nodeModifiedAtBlockKey>, number>;
43
44
  #snapshotMetadata: AztecMap<number, SnapshotMetadata>;
44
45
 
45
- constructor(private db: AztecKVStore, private tree: TreeBase & AppendOnlyTree, private hasher: Hasher) {
46
+ constructor(
47
+ private db: AztecKVStore,
48
+ private tree: TreeBase<T> & AppendOnlyTree<T>,
49
+ private hasher: Hasher,
50
+ private deserializer: FromBuffer<T>,
51
+ ) {
46
52
  const treeName = tree.getName();
47
53
  this.#nodeValue = db.openMap(`append_only_snapshot:${treeName}:node`);
48
54
  this.#nodeLastModifiedByBlock = db.openMap(`append_ony_snapshot:${treeName}:block`);
49
55
  this.#snapshotMetadata = db.openMap(`append_only_snapshot:${treeName}:snapshot_metadata`);
50
56
  }
51
57
 
52
- getSnapshot(block: number): Promise<TreeSnapshot> {
58
+ getSnapshot(block: number): Promise<TreeSnapshot<T>> {
53
59
  const meta = this.#getSnapshotMeta(block);
54
60
 
55
61
  if (typeof meta === 'undefined') {
@@ -65,11 +71,12 @@ export class AppendOnlySnapshotBuilder implements TreeSnapshotBuilder {
65
71
  meta.root,
66
72
  this.tree,
67
73
  this.hasher,
74
+ this.deserializer,
68
75
  ),
69
76
  );
70
77
  }
71
78
 
72
- snapshot(block: number): Promise<TreeSnapshot> {
79
+ snapshot(block: number): Promise<TreeSnapshot<T>> {
73
80
  return this.db.transaction(() => {
74
81
  const meta = this.#getSnapshotMeta(block);
75
82
  if (typeof meta !== 'undefined') {
@@ -82,6 +89,7 @@ export class AppendOnlySnapshotBuilder implements TreeSnapshotBuilder {
82
89
  meta.root,
83
90
  this.tree,
84
91
  this.hasher,
92
+ this.deserializer,
85
93
  );
86
94
  }
87
95
 
@@ -136,6 +144,7 @@ export class AppendOnlySnapshotBuilder implements TreeSnapshotBuilder {
136
144
  root,
137
145
  this.tree,
138
146
  this.hasher,
147
+ this.deserializer,
139
148
  );
140
149
  });
141
150
  }
@@ -148,15 +157,16 @@ export class AppendOnlySnapshotBuilder implements TreeSnapshotBuilder {
148
157
  /**
149
158
  * a
150
159
  */
151
- class AppendOnlySnapshot implements TreeSnapshot {
160
+ class AppendOnlySnapshot<T extends Bufferable> implements TreeSnapshot<T> {
152
161
  constructor(
153
162
  private nodes: AztecMap<string, Buffer>,
154
163
  private nodeHistory: AztecMap<string, number>,
155
164
  private block: number,
156
165
  private leafCount: bigint,
157
166
  private historicalRoot: Buffer,
158
- private tree: TreeBase & AppendOnlyTree,
167
+ private tree: TreeBase<T> & AppendOnlyTree<T>,
159
168
  private hasher: Hasher,
169
+ private deserializer: FromBuffer<T>,
160
170
  ) {}
161
171
 
162
172
  public getSiblingPath<N extends number>(index: bigint): SiblingPath<N> {
@@ -191,7 +201,7 @@ class AppendOnlySnapshot implements TreeSnapshot {
191
201
  return this.historicalRoot;
192
202
  }
193
203
 
194
- getLeafValue(index: bigint): Buffer | undefined {
204
+ getLeafValue(index: bigint): T | undefined {
195
205
  const leafLevel = this.getDepth();
196
206
  const blockNumber = this.#getBlockNumberThatModifiedNode(leafLevel, index);
197
207
 
@@ -202,7 +212,8 @@ class AppendOnlySnapshot implements TreeSnapshot {
202
212
 
203
213
  // leaf was set some time in the past
204
214
  if (blockNumber <= this.block) {
205
- return this.nodes.get(historicalNodeKey(leafLevel, index));
215
+ const val = this.nodes.get(historicalNodeKey(leafLevel, index));
216
+ return val ? this.deserializer.fromBuffer(val) : undefined;
206
217
  }
207
218
 
208
219
  // leaf has been set but in a block in the future
@@ -249,15 +260,16 @@ class AppendOnlySnapshot implements TreeSnapshot {
249
260
  return this.nodeHistory.get(nodeModifiedAtBlockKey(level, index));
250
261
  }
251
262
 
252
- findLeafIndex(value: Buffer): bigint | undefined {
263
+ findLeafIndex(value: T): bigint | undefined {
253
264
  return this.findLeafIndexAfter(value, 0n);
254
265
  }
255
266
 
256
- findLeafIndexAfter(value: Buffer, startIndex: bigint): bigint | undefined {
267
+ findLeafIndexAfter(value: T, startIndex: bigint): bigint | undefined {
268
+ const valueBuffer = serializeToBuffer(value);
257
269
  const numLeaves = this.getNumLeaves();
258
270
  for (let i = startIndex; i < numLeaves; i++) {
259
271
  const currentValue = this.getLeafValue(i);
260
- if (currentValue && currentValue.equals(value)) {
272
+ if (currentValue && serializeToBuffer(currentValue).equals(valueBuffer)) {
261
273
  return i;
262
274
  }
263
275
  }
@@ -1,8 +1,9 @@
1
1
  import { SiblingPath } from '@aztec/circuit-types';
2
- import { AztecKVStore, AztecMap } from '@aztec/kv-store';
2
+ import { type Bufferable, type FromBuffer, serializeToBuffer } from '@aztec/foundation/serialize';
3
+ import { type AztecKVStore, type AztecMap } from '@aztec/kv-store';
3
4
 
4
- import { TreeBase } from '../tree_base.js';
5
- import { TreeSnapshot, TreeSnapshotBuilder } from './snapshot_builder.js';
5
+ import { type TreeBase } from '../tree_base.js';
6
+ import { type TreeSnapshot, type TreeSnapshotBuilder } from './snapshot_builder.js';
6
7
 
7
8
  /**
8
9
  * Metadata for a snapshot, per block
@@ -30,7 +31,7 @@ type SnapshotMetadata = {
30
31
  * Worst case space complexity: O(N * M)
31
32
  * Sibling path access: O(H) database reads
32
33
  */
33
- export abstract class BaseFullTreeSnapshotBuilder<T extends TreeBase, S extends TreeSnapshot>
34
+ export abstract class BaseFullTreeSnapshotBuilder<T extends TreeBase<Bufferable>, S extends TreeSnapshot<Bufferable>>
34
35
  implements TreeSnapshotBuilder<S>
35
36
  {
36
37
  protected nodes: AztecMap<string, [Buffer, Buffer]>;
@@ -119,12 +120,13 @@ export abstract class BaseFullTreeSnapshotBuilder<T extends TreeBase, S extends
119
120
  /**
120
121
  * A source of sibling paths from a snapshot tree
121
122
  */
122
- export class BaseFullTreeSnapshot implements TreeSnapshot {
123
+ export class BaseFullTreeSnapshot<T extends Bufferable> implements TreeSnapshot<T> {
123
124
  constructor(
124
125
  protected db: AztecMap<string, [Buffer, Buffer]>,
125
126
  protected historicRoot: Buffer,
126
127
  protected numLeaves: bigint,
127
- protected tree: TreeBase,
128
+ protected tree: TreeBase<T>,
129
+ protected deserializer: FromBuffer<T>,
128
130
  ) {}
129
131
 
130
132
  getSiblingPath<N extends number>(index: bigint): SiblingPath<N> {
@@ -141,13 +143,13 @@ export class BaseFullTreeSnapshot implements TreeSnapshot {
141
143
  return new SiblingPath<N>(this.tree.getDepth() as N, siblings);
142
144
  }
143
145
 
144
- getLeafValue(index: bigint): Buffer | undefined {
146
+ getLeafValue(index: bigint): T | undefined {
145
147
  let leafNode: Buffer | undefined = undefined;
146
148
  for (const [node, _sibling] of this.pathFromRootToLeaf(index)) {
147
149
  leafNode = node;
148
150
  }
149
151
 
150
- return leafNode;
152
+ return leafNode ? this.deserializer.fromBuffer(leafNode) : undefined;
151
153
  }
152
154
 
153
155
  getDepth(): number {
@@ -202,15 +204,16 @@ export class BaseFullTreeSnapshot implements TreeSnapshot {
202
204
  return path;
203
205
  }
204
206
 
205
- findLeafIndex(value: Buffer): bigint | undefined {
207
+ findLeafIndex(value: T): bigint | undefined {
206
208
  return this.findLeafIndexAfter(value, 0n);
207
209
  }
208
210
 
209
- public findLeafIndexAfter(value: Buffer, startIndex: bigint): bigint | undefined {
211
+ public findLeafIndexAfter(value: T, startIndex: bigint): bigint | undefined {
210
212
  const numLeaves = this.getNumLeaves();
213
+ const buffer = serializeToBuffer(value);
211
214
  for (let i = startIndex; i < numLeaves; i++) {
212
215
  const currentValue = this.getLeafValue(i);
213
- if (currentValue && currentValue.equals(value)) {
216
+ if (currentValue && serializeToBuffer(currentValue).equals(buffer)) {
214
217
  return i;
215
218
  }
216
219
  }