@aztec/merkle-tree 0.20.0 → 0.22.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 (41) hide show
  1. package/dest/index.d.ts +1 -1
  2. package/dest/index.d.ts.map +1 -1
  3. package/dest/index.js +2 -2
  4. package/dest/interfaces/indexed_tree.d.ts +31 -5
  5. package/dest/interfaces/indexed_tree.d.ts.map +1 -1
  6. package/dest/interfaces/merkle_tree.d.ts +3 -3
  7. package/dest/interfaces/merkle_tree.d.ts.map +1 -1
  8. package/dest/load_tree.d.ts +2 -2
  9. package/dest/load_tree.d.ts.map +1 -1
  10. package/dest/load_tree.js +6 -7
  11. package/dest/new_tree.d.ts +2 -2
  12. package/dest/new_tree.d.ts.map +1 -1
  13. package/dest/new_tree.js +3 -3
  14. package/dest/snapshots/append_only_snapshot.d.ts +2 -2
  15. package/dest/snapshots/append_only_snapshot.d.ts.map +1 -1
  16. package/dest/snapshots/append_only_snapshot.js +81 -92
  17. package/dest/snapshots/base_full_snapshot.d.ts +23 -11
  18. package/dest/snapshots/base_full_snapshot.d.ts.map +1 -1
  19. package/dest/snapshots/base_full_snapshot.js +65 -83
  20. package/dest/snapshots/full_snapshot.js +2 -2
  21. package/dest/snapshots/indexed_tree_snapshot.d.ts +5 -5
  22. package/dest/snapshots/indexed_tree_snapshot.d.ts.map +1 -1
  23. package/dest/snapshots/indexed_tree_snapshot.js +20 -18
  24. package/dest/snapshots/snapshot_builder.d.ts +7 -7
  25. package/dest/snapshots/snapshot_builder.d.ts.map +1 -1
  26. package/dest/snapshots/snapshot_builder_test_suite.js +8 -8
  27. package/dest/sparse_tree/sparse_tree.d.ts +1 -1
  28. package/dest/sparse_tree/sparse_tree.d.ts.map +1 -1
  29. package/dest/sparse_tree/sparse_tree.js +7 -6
  30. package/dest/standard_indexed_tree/standard_indexed_tree.d.ts +16 -39
  31. package/dest/standard_indexed_tree/standard_indexed_tree.d.ts.map +1 -1
  32. package/dest/standard_indexed_tree/standard_indexed_tree.js +52 -73
  33. package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.d.ts.map +1 -1
  34. package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.js +10 -9
  35. package/dest/standard_tree/standard_tree.d.ts +4 -4
  36. package/dest/standard_tree/standard_tree.d.ts.map +1 -1
  37. package/dest/standard_tree/standard_tree.js +12 -11
  38. package/dest/tree_base.d.ts +13 -11
  39. package/dest/tree_base.d.ts.map +1 -1
  40. package/dest/tree_base.js +42 -36
  41. package/package.json +5 -8
package/dest/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export * from './pedersen.js';
6
6
  export * from './sparse_tree/sparse_tree.js';
7
7
  export { StandardIndexedTree } from './standard_indexed_tree/standard_indexed_tree.js';
8
8
  export * from './standard_tree/standard_tree.js';
9
- export { INITIAL_LEAF } from './tree_base.js';
9
+ export { INITIAL_LEAF, getTreeMeta } from './tree_base.js';
10
10
  export { newTree } from './new_tree.js';
11
11
  export { loadTree } from './load_tree.js';
12
12
  export * from './snapshots/snapshot_builder.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC"}
package/dest/index.js CHANGED
@@ -6,11 +6,11 @@ export * from './pedersen.js';
6
6
  export * from './sparse_tree/sparse_tree.js';
7
7
  export { StandardIndexedTree } from './standard_indexed_tree/standard_indexed_tree.js';
8
8
  export * from './standard_tree/standard_tree.js';
9
- export { INITIAL_LEAF } from './tree_base.js';
9
+ export { INITIAL_LEAF, getTreeMeta } from './tree_base.js';
10
10
  export { newTree } from './new_tree.js';
11
11
  export { loadTree } from './load_tree.js';
12
12
  export * from './snapshots/snapshot_builder.js';
13
13
  export * from './snapshots/full_snapshot.js';
14
14
  export * from './snapshots/append_only_snapshot.js';
15
15
  export * from './snapshots/indexed_tree_snapshot.js';
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLDhCQUE4QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZGLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsc0NBQXNDLENBQUMifQ==
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLDhCQUE4QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZGLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLHNDQUFzQyxDQUFDIn0=
@@ -1,7 +1,33 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
- import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
3
- import { SiblingPath } from '@aztec/types/membership';
2
+ import { SiblingPath } from '@aztec/circuit-types';
3
+ import { IndexedTreeLeaf, IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
4
4
  import { AppendOnlyTree } from './append_only_tree.js';
5
+ /**
6
+ * Factory for creating leaf preimages.
7
+ */
8
+ export interface PreimageFactory {
9
+ /**
10
+ * Creates a new preimage from a leaf.
11
+ * @param leaf - Leaf to create a preimage from.
12
+ * @param nextKey - Next key of the leaf.
13
+ * @param nextIndex - Next index of the leaf.
14
+ */
15
+ fromLeaf(leaf: IndexedTreeLeaf, nextKey: bigint, nextIndex: bigint): IndexedTreeLeafPreimage;
16
+ /**
17
+ * Creates a new preimage from a buffer.
18
+ * @param buffer - Buffer to create a preimage from.
19
+ */
20
+ fromBuffer(buffer: Buffer): IndexedTreeLeafPreimage;
21
+ /**
22
+ * Creates an empty preimage.
23
+ */
24
+ empty(): IndexedTreeLeafPreimage;
25
+ /**
26
+ * Creates a copy of a preimage.
27
+ * @param preimage - Preimage to be cloned.
28
+ */
29
+ clone(preimage: IndexedTreeLeafPreimage): IndexedTreeLeafPreimage;
30
+ }
5
31
  /**
6
32
  * All of the data to be return during batch insertion.
7
33
  */
@@ -50,7 +76,7 @@ export interface IndexedTree extends AppendOnlyTree {
50
76
  * @param includeUncommitted - If true, the uncommitted changes are included in the search.
51
77
  * @returns The found leaf index and a flag indicating if the corresponding leaf's value is equal to `newValue`.
52
78
  */
53
- findIndexOfPreviousKey(newValue: bigint, includeUncommitted: boolean): Promise<{
79
+ findIndexOfPreviousKey(newValue: bigint, includeUncommitted: boolean): {
54
80
  /**
55
81
  * The index of the found leaf.
56
82
  */
@@ -59,14 +85,14 @@ export interface IndexedTree extends AppendOnlyTree {
59
85
  * A flag indicating if the corresponding leaf's value is equal to `newValue`.
60
86
  */
61
87
  alreadyPresent: boolean;
62
- } | undefined>;
88
+ } | undefined;
63
89
  /**
64
90
  * Gets the latest LeafPreimage copy.
65
91
  * @param index - Index of the leaf of which to obtain the LeafPreimage copy.
66
92
  * @param includeUncommitted - If true, the uncommitted changes are included in the search.
67
93
  * @returns A copy of the leaf preimage at the given index or undefined if the leaf was not found.
68
94
  */
69
- getLatestLeafPreimageCopy(index: bigint, includeUncommitted: boolean): Promise<IndexedTreeLeafPreimage | undefined>;
95
+ getLatestLeafPreimageCopy(index: bigint, includeUncommitted: boolean): IndexedTreeLeafPreimage | undefined;
70
96
  /**
71
97
  * Batch insert multiple leaves into the tree.
72
98
  * @param leaves - Leaves to insert into the tree.
@@ -1 +1 @@
1
- {"version":3,"file":"indexed_tree.d.ts","sourceRoot":"","sources":["../../src/interfaces/indexed_tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD;;OAEG;IACH,YAAY,EAAE,uBAAuB,CAAC;IACtC;;OAEG;IACH,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,UAAU,SAAS,MAAM,EAAE,wBAAwB,SAAS,MAAM;IACtG;;OAEG;IACH,oBAAoB,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;IACxD;;OAEG;IACH,qBAAqB,EAAE,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC7D;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B;;OAEG;IACH,sBAAsB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD;;;;;OAKG;IACH,sBAAsB,CACpB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CACN;QACE;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd;;WAEG;QACH,cAAc,EAAE,OAAO,CAAC;KACzB,GACD,SAAS,CACZ,CAAC;IAEF;;;;;OAKG;IACH,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC;IAEpH;;;;;OAKG;IACH,WAAW,CAAC,UAAU,SAAS,MAAM,EAAE,aAAa,SAAS,MAAM,EAAE,wBAAwB,SAAS,MAAM,EAC1G,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,oBAAoB,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC;CACxE"}
1
+ {"version":3,"file":"indexed_tree.d.ts","sourceRoot":"","sources":["../../src/interfaces/indexed_tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAC7F;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAAC;IACpD;;OAEG;IACH,KAAK,IAAI,uBAAuB,CAAC;IACjC;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,uBAAuB,GAAG,uBAAuB,CAAC;CACnE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD;;OAEG;IACH,YAAY,EAAE,uBAAuB,CAAC;IACtC;;OAEG;IACH,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,UAAU,SAAS,MAAM,EAAE,wBAAwB,SAAS,MAAM;IACtG;;OAEG;IACH,oBAAoB,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;IACxD;;OAEG;IACH,qBAAqB,EAAE,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC7D;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B;;OAEG;IACH,sBAAsB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD;;;;;OAKG;IACH,sBAAsB,CACpB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,OAAO,GAEzB;QACE;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd;;WAEG;QACH,cAAc,EAAE,OAAO,CAAC;KACzB,GACD,SAAS,CAAC;IAEd;;;;;OAKG;IACH,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,uBAAuB,GAAG,SAAS,CAAC;IAE3G;;;;;OAKG;IACH,WAAW,CAAC,UAAU,SAAS,MAAM,EAAE,aAAa,SAAS,MAAM,EAAE,wBAAwB,SAAS,MAAM,EAC1G,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,oBAAoB,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAC;CACxE"}
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
- import { SiblingPath } from '@aztec/types/membership';
2
+ import { SiblingPath } from '@aztec/circuit-types';
3
3
  /**
4
4
  * Defines the interface for a source of sibling paths.
5
5
  */
@@ -42,13 +42,13 @@ export interface MerkleTree extends SiblingPathSource {
42
42
  * @param index - The index of the leaf value to be returned.
43
43
  * @param includeUncommitted - Set to true to include uncommitted updates in the data set.
44
44
  */
45
- getLeafValue(index: bigint, includeUncommitted: boolean): Promise<Buffer | undefined>;
45
+ getLeafValue(index: bigint, includeUncommitted: boolean): Buffer | undefined;
46
46
  /**
47
47
  * Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
48
48
  * @param leaf - The leaf value to look for.
49
49
  * @param includeUncommitted - Indicates whether to include uncommitted data.
50
50
  * @returns The index of the first leaf found with a given value (undefined if not found).
51
51
  */
52
- findLeafIndex(leaf: Buffer, includeUncommitted: boolean): Promise<bigint | undefined>;
52
+ findLeafIndex(leaf: Buffer, includeUncommitted: boolean): bigint | undefined;
53
53
  }
54
54
  //# sourceMappingURL=merkle_tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merkle_tree.d.ts","sourceRoot":"","sources":["../../src/interfaces/merkle_tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CACvG;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,iBAAiB;IACnD;;;OAGG;IACH,OAAO,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAC;IAE7C;;;OAGG;IACH,YAAY,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAC;IAElD;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IAEnB;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEtF;;;;;OAKG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvF"}
1
+ {"version":3,"file":"merkle_tree.d.ts","sourceRoot":"","sources":["../../src/interfaces/merkle_tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CACvG;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,iBAAiB;IACnD;;;OAGG;IACH,OAAO,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAC;IAE7C;;;OAGG;IACH,YAAY,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAAC;IAElD;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IAEnB;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAE7E;;;;;OAKG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CAC9E"}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
+ import { AztecKVStore } from '@aztec/kv-store';
2
3
  import { Hasher } from '@aztec/types/interfaces';
3
- import { LevelUp } from 'levelup';
4
4
  import { TreeBase } from './tree_base.js';
5
5
  /**
6
6
  * Creates a new tree and sets its root, depth and size based on the meta data which are associated with the name.
@@ -10,5 +10,5 @@ import { TreeBase } from './tree_base.js';
10
10
  * @param name - Name of the tree.
11
11
  * @returns The newly created tree.
12
12
  */
13
- export declare function loadTree<T extends TreeBase>(c: new (db: LevelUp, hasher: Hasher, name: string, depth: number, size: bigint, root: Buffer) => T, db: LevelUp, hasher: Hasher, name: string): Promise<T>;
13
+ export declare function loadTree<T extends TreeBase>(c: new (store: AztecKVStore, hasher: Hasher, name: string, depth: number, size: bigint, root: Buffer) => T, store: AztecKVStore, hasher: Hasher, name: string): Promise<T>;
14
14
  //# sourceMappingURL=load_tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"load_tree.d.ts","sourceRoot":"","sources":["../src/load_tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AAEtD;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,CAAC,SAAS,QAAQ,EAC/C,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,EAClG,EAAE,EAAE,OAAO,EACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,CAAC,CAMZ"}
1
+ {"version":3,"file":"load_tree.d.ts","sourceRoot":"","sources":["../src/load_tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,QAAQ,EACzC,CAAC,EAAE,KAAK,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,EAC1G,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,CAAC,CAIZ"}
package/dest/load_tree.js CHANGED
@@ -1,4 +1,4 @@
1
- import { decodeMeta } from './tree_base.js';
1
+ import { getTreeMeta } from './tree_base.js';
2
2
  /**
3
3
  * Creates a new tree and sets its root, depth and size based on the meta data which are associated with the name.
4
4
  * @param c - The class of the tree to be instantiated.
@@ -7,10 +7,9 @@ import { decodeMeta } from './tree_base.js';
7
7
  * @param name - Name of the tree.
8
8
  * @returns The newly created tree.
9
9
  */
10
- export async function loadTree(c, db, hasher, name) {
11
- const meta = await db.get(name);
12
- const { root, depth, size } = decodeMeta(meta);
13
- const tree = new c(db, hasher, name, depth, size, root);
14
- return tree;
10
+ export function loadTree(c, store, hasher, name) {
11
+ const { root, depth, size } = getTreeMeta(store, name);
12
+ const tree = new c(store, hasher, name, depth, size, root);
13
+ return Promise.resolve(tree);
15
14
  }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRfdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQVksVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUM1QixDQUFrRyxFQUNsRyxFQUFXLEVBQ1gsTUFBYyxFQUNkLElBQVk7SUFFWixNQUFNLElBQUksR0FBVyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRS9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIn0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRfdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQVksV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLENBQTBHLEVBQzFHLEtBQW1CLEVBQ25CLE1BQWMsRUFDZCxJQUFZO0lBRVosTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDIn0=
@@ -1,5 +1,5 @@
1
+ import { AztecKVStore } from '@aztec/kv-store';
1
2
  import { Hasher } from '@aztec/types/interfaces';
2
- import { LevelUp } from 'levelup';
3
3
  import { TreeBase } from './tree_base.js';
4
4
  /**
5
5
  * Creates a new tree.
@@ -11,5 +11,5 @@ import { TreeBase } from './tree_base.js';
11
11
  * @param prefilledSize - A number of leaves that are prefilled with values.
12
12
  * @returns The newly created tree.
13
13
  */
14
- export declare function newTree<T extends TreeBase>(c: new (db: LevelUp, hasher: Hasher, name: string, depth: number, size: bigint) => T, db: LevelUp, hasher: Hasher, name: string, depth: number, prefilledSize?: number): Promise<T>;
14
+ export declare function newTree<T extends TreeBase>(c: new (store: AztecKVStore, hasher: Hasher, name: string, depth: number, size: bigint) => T, store: AztecKVStore, hasher: Hasher, name: string, depth: number, prefilledSize?: number): Promise<T>;
15
15
  //# sourceMappingURL=new_tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"new_tree.d.ts","sourceRoot":"","sources":["../src/new_tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS,QAAQ,EAC9C,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,EACpF,EAAE,EAAE,OAAO,EACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,SAAI,GAChB,OAAO,CAAC,CAAC,CAAC,CAIZ"}
1
+ {"version":3,"file":"new_tree.d.ts","sourceRoot":"","sources":["../src/new_tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS,QAAQ,EAC9C,CAAC,EAAE,KAAK,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,EAC5F,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,SAAI,GAChB,OAAO,CAAC,CAAC,CAAC,CAIZ"}
package/dest/new_tree.js CHANGED
@@ -8,9 +8,9 @@
8
8
  * @param prefilledSize - A number of leaves that are prefilled with values.
9
9
  * @returns The newly created tree.
10
10
  */
11
- export async function newTree(c, db, hasher, name, depth, prefilledSize = 1) {
12
- const tree = new c(db, hasher, name, depth, 0n);
11
+ export async function newTree(c, store, hasher, name, depth, prefilledSize = 1) {
12
+ const tree = new c(store, hasher, name, depth, 0n);
13
13
  await tree.init(prefilledSize);
14
14
  return tree;
15
15
  }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3X3RyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV3X3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUE7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQzNCLENBQW9GLEVBQ3BGLEVBQVcsRUFDWCxNQUFjLEVBQ2QsSUFBWSxFQUNaLEtBQWEsRUFDYixhQUFhLEdBQUcsQ0FBQztJQUVqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyJ9
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3X3RyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV3X3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0E7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQzNCLENBQTRGLEVBQzVGLEtBQW1CLEVBQ25CLE1BQWMsRUFDZCxJQUFZLEVBQ1osS0FBYSxFQUNiLGFBQWEsR0FBRyxDQUFDO0lBRWpCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDL0IsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIn0=
@@ -1,5 +1,5 @@
1
+ import { AztecKVStore } from '@aztec/kv-store';
1
2
  import { Hasher } from '@aztec/types/interfaces';
2
- import { LevelUp } from 'levelup';
3
3
  import { AppendOnlyTree } from '../interfaces/append_only_tree.js';
4
4
  import { TreeBase } from '../tree_base.js';
5
5
  import { TreeSnapshot, TreeSnapshotBuilder } from './snapshot_builder.js';
@@ -23,7 +23,7 @@ export declare class AppendOnlySnapshotBuilder implements TreeSnapshotBuilder {
23
23
  private db;
24
24
  private tree;
25
25
  private hasher;
26
- constructor(db: LevelUp, tree: TreeBase & AppendOnlyTree, hasher: Hasher);
26
+ constructor(db: AztecKVStore, tree: TreeBase & AppendOnlyTree, hasher: Hasher);
27
27
  getSnapshot(block: number): Promise<TreeSnapshot>;
28
28
  snapshot(block: number): Promise<TreeSnapshot>;
29
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"append_only_snapshot.d.ts","sourceRoot":"","sources":["../../src/snapshots/append_only_snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAc1E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;;IACvD,OAAO,CAAC,EAAE;IAAW,OAAO,CAAC,IAAI;IAA6B,OAAO,CAAC,MAAM;gBAApE,EAAE,EAAE,OAAO,EAAU,IAAI,EAAE,QAAQ,GAAG,cAAc,EAAU,MAAM,EAAE,MAAM;IAC1F,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAUjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CA2ErD"}
1
+ {"version":3,"file":"append_only_snapshot.d.ts","sourceRoot":"","sources":["../../src/snapshots/append_only_snapshot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAY,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAkB1E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;;IAKvD,OAAO,CAAC,EAAE;IAAgB,OAAO,CAAC,IAAI;IAA6B,OAAO,CAAC,MAAM;gBAAzE,EAAE,EAAE,YAAY,EAAU,IAAI,EAAE,QAAQ,GAAG,cAAc,EAAU,MAAM,EAAE,MAAM;IAOrG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CA0E/C"}
@@ -1,13 +1,10 @@
1
- var _AppendOnlySnapshotBuilder_instances, _AppendOnlySnapshotBuilder_getSnapshotMeta, _AppendOnlySnapshot_instances, _AppendOnlySnapshot_getHistoricalNodeValue, _AppendOnlySnapshot_getBlockNumberThatModifiedNode;
2
- import { __classPrivateFieldGet } from "tslib";
3
- import { SiblingPath } from '@aztec/types/membership';
1
+ var _AppendOnlySnapshotBuilder_instances, _AppendOnlySnapshotBuilder_nodeValue, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, _AppendOnlySnapshotBuilder_snapshotMetadata, _AppendOnlySnapshotBuilder_getSnapshotMeta, _AppendOnlySnapshot_instances, _AppendOnlySnapshot_getHistoricalNodeValue, _AppendOnlySnapshot_getBlockNumberThatModifiedNode;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { SiblingPath } from '@aztec/circuit-types';
4
4
  // stores the last block that modified this node
5
- const nodeModifiedAtBlockKey = (treeName, level, index) => `snapshot:node:${treeName}:${level}:${index}:block`;
5
+ const nodeModifiedAtBlockKey = (level, index) => `node:${level}:${index}:modifiedAtBlock`;
6
6
  // stores the value of the node at the above block
7
- const historicalNodeKey = (treeName, level, index) => `snapshot:node:${treeName}:${level}:${index}:value`;
8
- // metadata for a snapshot
9
- const snapshotRootKey = (treeName, block) => `snapshot:root:${treeName}:${block}`;
10
- const snapshotNumLeavesKey = (treeName, block) => `snapshot:numLeaves:${treeName}:${block}`;
7
+ const historicalNodeKey = (level, index) => `node:${level}:${index}:value`;
11
8
  /**
12
9
  * A more space-efficient way of storing snapshots of AppendOnlyTrees that trades space need for slower
13
10
  * sibling path reads.
@@ -29,95 +26,93 @@ export class AppendOnlySnapshotBuilder {
29
26
  this.db = db;
30
27
  this.tree = tree;
31
28
  this.hasher = hasher;
32
- }
33
- async getSnapshot(block) {
34
- const meta = await __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_instances, "m", _AppendOnlySnapshotBuilder_getSnapshotMeta).call(this, block);
29
+ _AppendOnlySnapshotBuilder_nodeValue.set(this, void 0);
30
+ _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock.set(this, void 0);
31
+ _AppendOnlySnapshotBuilder_snapshotMetadata.set(this, void 0);
32
+ const treeName = tree.getName();
33
+ __classPrivateFieldSet(this, _AppendOnlySnapshotBuilder_nodeValue, db.openMap(`append_only_snapshot:${treeName}:node`), "f");
34
+ __classPrivateFieldSet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, db.openMap(`append_ony_snapshot:${treeName}:block`), "f");
35
+ __classPrivateFieldSet(this, _AppendOnlySnapshotBuilder_snapshotMetadata, db.openMap(`append_only_snapshot:${treeName}:snapshot_metadata`), "f");
36
+ }
37
+ getSnapshot(block) {
38
+ const meta = __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_instances, "m", _AppendOnlySnapshotBuilder_getSnapshotMeta).call(this, block);
35
39
  if (typeof meta === 'undefined') {
36
- throw new Error(`Snapshot for tree ${this.tree.getName()} at block ${block} does not exist`);
37
- }
38
- return new AppendOnlySnapshot(this.db, block, meta.numLeaves, meta.root, this.tree, this.hasher);
39
- }
40
- async snapshot(block) {
41
- const meta = await __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_instances, "m", _AppendOnlySnapshotBuilder_getSnapshotMeta).call(this, block);
42
- if (typeof meta !== 'undefined') {
43
- // no-op, we already have a snapshot
44
- return new AppendOnlySnapshot(this.db, block, meta.numLeaves, meta.root, this.tree, this.hasher);
40
+ return Promise.reject(new Error(`Snapshot for tree ${this.tree.getName()} at block ${block} does not exist`));
45
41
  }
46
- const batch = this.db.batch();
47
- const root = this.tree.getRoot(false);
48
- const depth = this.tree.getDepth();
49
- const treeName = this.tree.getName();
50
- const queue = [[root, 0, 0n]];
51
- // walk the tree in BF and store latest nodes
52
- while (queue.length > 0) {
53
- const [node, level, index] = queue.shift();
54
- const historicalValue = await this.db.get(historicalNodeKey(treeName, level, index)).catch(() => undefined);
55
- if (!historicalValue || !node.equals(historicalValue)) {
56
- // we've never seen this node before or it's different than before
57
- // update the historical tree and tag it with the block that modified it
58
- batch.put(nodeModifiedAtBlockKey(treeName, level, index), String(block));
59
- batch.put(historicalNodeKey(treeName, level, index), node);
42
+ return Promise.resolve(new AppendOnlySnapshot(__classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f"), __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, "f"), block, meta.numLeaves, meta.root, this.tree, this.hasher));
43
+ }
44
+ snapshot(block) {
45
+ return this.db.transaction(() => {
46
+ const meta = __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_instances, "m", _AppendOnlySnapshotBuilder_getSnapshotMeta).call(this, block);
47
+ if (typeof meta !== 'undefined') {
48
+ // no-op, we already have a snapshot
49
+ return new AppendOnlySnapshot(__classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f"), __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, "f"), block, meta.numLeaves, meta.root, this.tree, this.hasher);
60
50
  }
61
- else {
62
- // if this node hasn't changed, that means, nothing below it has changed either
63
- continue;
51
+ const root = this.tree.getRoot(false);
52
+ const depth = this.tree.getDepth();
53
+ const queue = [[root, 0, 0n]];
54
+ // walk the tree in BF and store latest nodes
55
+ while (queue.length > 0) {
56
+ const [node, level, index] = queue.shift();
57
+ const historicalValue = __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f").get(historicalNodeKey(level, index));
58
+ if (!historicalValue || !node.equals(historicalValue)) {
59
+ // we've never seen this node before or it's different than before
60
+ // update the historical tree and tag it with the block that modified it
61
+ void __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, "f").set(nodeModifiedAtBlockKey(level, index), block);
62
+ void __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f").set(historicalNodeKey(level, index), node);
63
+ }
64
+ else {
65
+ // if this node hasn't changed, that means, nothing below it has changed either
66
+ continue;
67
+ }
68
+ if (level + 1 > depth) {
69
+ // short circuit if we've reached the leaf level
70
+ // otherwise getNode might throw if we ask for the children of a leaf
71
+ continue;
72
+ }
73
+ // these could be undefined because zero hashes aren't stored in the tree
74
+ const [lhs, rhs] = [this.tree.getNode(level + 1, 2n * index), this.tree.getNode(level + 1, 2n * index + 1n)];
75
+ if (lhs) {
76
+ queue.push([lhs, level + 1, 2n * index]);
77
+ }
78
+ if (rhs) {
79
+ queue.push([rhs, level + 1, 2n * index + 1n]);
80
+ }
64
81
  }
65
- if (level + 1 > depth) {
66
- // short circuit if we've reached the leaf level
67
- // otherwise getNode might throw if we ask for the children of a leaf
68
- continue;
69
- }
70
- // these could be undefined because zero hashes aren't stored in the tree
71
- const [lhs, rhs] = await Promise.all([
72
- this.tree.getNode(level + 1, 2n * index),
73
- this.tree.getNode(level + 1, 2n * index + 1n),
74
- ]);
75
- if (lhs) {
76
- queue.push([lhs, level + 1, 2n * index]);
77
- }
78
- if (rhs) {
79
- queue.push([rhs, level + 1, 2n * index + 1n]);
80
- }
81
- }
82
- const numLeaves = this.tree.getNumLeaves(false);
83
- batch.put(snapshotNumLeavesKey(treeName, block), String(numLeaves));
84
- batch.put(snapshotRootKey(treeName, block), root);
85
- await batch.write();
86
- return new AppendOnlySnapshot(this.db, block, numLeaves, root, this.tree, this.hasher);
82
+ const numLeaves = this.tree.getNumLeaves(false);
83
+ void __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_snapshotMetadata, "f").set(block, {
84
+ numLeaves,
85
+ root,
86
+ });
87
+ return new AppendOnlySnapshot(__classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f"), __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, "f"), block, numLeaves, root, this.tree, this.hasher);
88
+ });
87
89
  }
88
90
  }
89
- _AppendOnlySnapshotBuilder_instances = new WeakSet(), _AppendOnlySnapshotBuilder_getSnapshotMeta = async function _AppendOnlySnapshotBuilder_getSnapshotMeta(block) {
90
- try {
91
- const treeName = this.tree.getName();
92
- const root = await this.db.get(snapshotRootKey(treeName, block));
93
- const numLeaves = BigInt(await this.db.get(snapshotNumLeavesKey(treeName, block)));
94
- return { root, numLeaves };
95
- }
96
- catch (err) {
97
- return undefined;
98
- }
91
+ _AppendOnlySnapshotBuilder_nodeValue = new WeakMap(), _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock = new WeakMap(), _AppendOnlySnapshotBuilder_snapshotMetadata = new WeakMap(), _AppendOnlySnapshotBuilder_instances = new WeakSet(), _AppendOnlySnapshotBuilder_getSnapshotMeta = function _AppendOnlySnapshotBuilder_getSnapshotMeta(block) {
92
+ return __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_snapshotMetadata, "f").get(block);
99
93
  };
100
94
  /**
101
95
  * a
102
96
  */
103
97
  class AppendOnlySnapshot {
104
- constructor(db, block, leafCount, historicalRoot, tree, hasher) {
98
+ constructor(nodes, nodeHistory, block, leafCount, historicalRoot, tree, hasher) {
105
99
  _AppendOnlySnapshot_instances.add(this);
106
- this.db = db;
100
+ this.nodes = nodes;
101
+ this.nodeHistory = nodeHistory;
107
102
  this.block = block;
108
103
  this.leafCount = leafCount;
109
104
  this.historicalRoot = historicalRoot;
110
105
  this.tree = tree;
111
106
  this.hasher = hasher;
112
107
  }
113
- async getSiblingPath(index) {
108
+ getSiblingPath(index) {
114
109
  const path = [];
115
110
  const depth = this.tree.getDepth();
116
111
  let level = depth;
117
112
  while (level > 0) {
118
113
  const isRight = index & 0x01n;
119
114
  const siblingIndex = isRight ? index - 1n : index + 1n;
120
- const sibling = await __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getHistoricalNodeValue).call(this, level, siblingIndex);
115
+ const sibling = __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getHistoricalNodeValue).call(this, level, siblingIndex);
121
116
  path.push(sibling);
122
117
  level -= 1;
123
118
  index >>= 1n;
@@ -134,24 +129,24 @@ class AppendOnlySnapshot {
134
129
  // we could recompute it, but it's way cheaper to just store the root
135
130
  return this.historicalRoot;
136
131
  }
137
- async getLeafValue(index) {
132
+ getLeafValue(index) {
138
133
  const leafLevel = this.getDepth();
139
- const blockNumber = await __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getBlockNumberThatModifiedNode).call(this, leafLevel, index);
134
+ const blockNumber = __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getBlockNumberThatModifiedNode).call(this, leafLevel, index);
140
135
  // leaf hasn't been set yet
141
136
  if (typeof blockNumber === 'undefined') {
142
137
  return undefined;
143
138
  }
144
139
  // leaf was set some time in the past
145
140
  if (blockNumber <= this.block) {
146
- return this.db.get(historicalNodeKey(this.tree.getName(), leafLevel, index));
141
+ return this.nodes.get(historicalNodeKey(leafLevel, index));
147
142
  }
148
143
  // leaf has been set but in a block in the future
149
144
  return undefined;
150
145
  }
151
- async findLeafIndex(value) {
146
+ findLeafIndex(value) {
152
147
  const numLeaves = this.getNumLeaves();
153
148
  for (let i = 0n; i < numLeaves; i++) {
154
- const currentValue = await this.getLeafValue(i);
149
+ const currentValue = this.getLeafValue(i);
155
150
  if (currentValue && currentValue.equals(value)) {
156
151
  return i;
157
152
  }
@@ -159,15 +154,15 @@ class AppendOnlySnapshot {
159
154
  return undefined;
160
155
  }
161
156
  }
162
- _AppendOnlySnapshot_instances = new WeakSet(), _AppendOnlySnapshot_getHistoricalNodeValue = async function _AppendOnlySnapshot_getHistoricalNodeValue(level, index) {
163
- const blockNumber = await __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getBlockNumberThatModifiedNode).call(this, level, index);
157
+ _AppendOnlySnapshot_instances = new WeakSet(), _AppendOnlySnapshot_getHistoricalNodeValue = function _AppendOnlySnapshot_getHistoricalNodeValue(level, index) {
158
+ const blockNumber = __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getBlockNumberThatModifiedNode).call(this, level, index);
164
159
  // node has never been set
165
160
  if (typeof blockNumber === 'undefined') {
166
161
  return this.tree.getZeroHash(level);
167
162
  }
168
163
  // node was set some time in the past
169
164
  if (blockNumber <= this.block) {
170
- return this.db.get(historicalNodeKey(this.tree.getName(), level, index));
165
+ return this.nodes.get(historicalNodeKey(level, index));
171
166
  }
172
167
  // the node has been modified since this snapshot was taken
173
168
  // because we're working with an AppendOnly tree, historical leaves never change
@@ -183,18 +178,12 @@ _AppendOnlySnapshot_instances = new WeakSet(), _AppendOnlySnapshot_getHistorical
183
178
  if (leafStart >= this.leafCount) {
184
179
  return this.tree.getZeroHash(level);
185
180
  }
186
- const [lhs, rhs] = await Promise.all([
181
+ const [lhs, rhs] = [
187
182
  __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getHistoricalNodeValue).call(this, level + 1, 2n * index),
188
183
  __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getHistoricalNodeValue).call(this, level + 1, 2n * index + 1n),
189
- ]);
184
+ ];
190
185
  return this.hasher.hash(lhs, rhs);
191
- }, _AppendOnlySnapshot_getBlockNumberThatModifiedNode = async function _AppendOnlySnapshot_getBlockNumberThatModifiedNode(level, index) {
192
- try {
193
- const value = await this.db.get(nodeModifiedAtBlockKey(this.tree.getName(), level, index));
194
- return parseInt(value.toString(), 10);
195
- }
196
- catch (err) {
197
- return undefined;
198
- }
186
+ }, _AppendOnlySnapshot_getBlockNumberThatModifiedNode = function _AppendOnlySnapshot_getBlockNumberThatModifiedNode(level, index) {
187
+ return this.nodeHistory.get(nodeModifiedAtBlockKey(level, index));
199
188
  };
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZW5kX29ubHlfc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc25hcHNob3RzL2FwcGVuZF9vbmx5X3NuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBUXRELGdEQUFnRDtBQUNoRCxNQUFNLHNCQUFzQixHQUFHLENBQUMsUUFBZ0IsRUFBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLEVBQUUsQ0FDaEYsaUJBQWlCLFFBQVEsSUFBSSxLQUFLLElBQUksS0FBSyxRQUFRLENBQUM7QUFFdEQsa0RBQWtEO0FBQ2xELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUMzRSxpQkFBaUIsUUFBUSxJQUFJLEtBQUssSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUV0RCwwQkFBMEI7QUFDMUIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsaUJBQWlCLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNsRyxNQUFNLG9CQUFvQixHQUFHLENBQUMsUUFBZ0IsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7QUFFNUc7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE9BQU8seUJBQXlCO0lBQ3BDLFlBQW9CLEVBQVcsRUFBVSxJQUErQixFQUFVLE1BQWM7O1FBQTVFLE9BQUUsR0FBRixFQUFFLENBQVM7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUEyQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7SUFBRyxDQUFDO0lBQ3BHLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBYTtRQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLHVCQUFBLElBQUksd0ZBQWlCLE1BQXJCLElBQUksRUFBa0IsS0FBSyxD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
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZW5kX29ubHlfc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc25hcHNob3RzL2FwcGVuZF9vbmx5X3NuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBUW5ELGdEQUFnRDtBQUNoRCxNQUFNLHNCQUFzQixHQUFHLENBQUMsS0FBYSxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxLQUFLLElBQUksS0FBSyxrQkFBa0IsQ0FBQztBQUUxRyxrREFBa0Q7QUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsS0FBSyxJQUFJLEtBQUssUUFBUSxDQUFDO0FBWTNGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFPLHlCQUF5QjtJQUtwQyxZQUFvQixFQUFnQixFQUFVLElBQStCLEVBQVUsTUFBYzs7UUFBakYsT0FBRSxHQUFGLEVBQUUsQ0FBYztRQUFVLFNBQUksR0FBSixJQUFJLENBQTJCO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUpyRyx1REFBbUU7UUFDbkUscUVBQXNGO1FBQ3RGLDhEQUFzRDtRQUdwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsdUJBQUEsSUFBSSx3Q0FBYyxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixRQUFRLE9BQU8sQ0FBQyxNQUFBLENBQUM7UUFDdEUsdUJBQUEsSUFBSSxzREFBNEIsRUFBRSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsUUFBUSxRQUFRLENBQUMsTUFBQSxDQUFDO1FBQ3BGLHVCQUFBLElBQUksK0NBQXFCLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLFFBQVEsb0JBQW9CLENBQUMsTUFBQSxDQUFDO0lBQzVGLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixNQUFNLElBQUksR0FBRyx1QkFBQSxJQUFJLHdGQUFpQixNQUFyQixJQUFJLEVBQWtCLEtBQUssQ0FBQyxDQUFDO1FBRTFDLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQ2hILENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQ3BCLElBQUksa0JBQWtCLENBQ3BCLHVCQUFBLElBQUksNENBQVcsRUFDZix1QkFBQSxJQUFJLDBEQUF5QixFQUM3QixLQUFLLEVBQ0wsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEdBQUcsdUJBQUEsSUFBSSx3RkFBaUIsTUFBckIsSUFBSSxFQUFrQixLQUFLLENBQUMsQ0FBQztZQUMxQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNoQyxvQ0FBb0M7Z0JBQ3BDLE9BQU8sSUFBSSxrQkFBa0IsQ0FDM0IsdUJBQUEsSUFBSSw0Q0FBVyxFQUNmLHVCQUFBLElBQUksMERBQXlCLEVBQzdCLEtBQUssRUFDTCxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsTUFBTSxDQUNaLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBK0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUxRCw2Q0FBNkM7WUFDN0MsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFHLENBQUM7Z0JBRTVDLE1BQU0sZUFBZSxHQUFHLHVCQUFBLElBQUksNENBQVcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQ3RELGtFQUFrRTtvQkFDbEUsd0VBQXdFO29CQUN4RSxLQUFLLHVCQUFBLElBQUksMERBQXlCLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDcEYsS0FBSyx1QkFBQSxJQUFJLDRDQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbEUsQ0FBQztxQkFBTSxDQUFDO29CQUNOLCtFQUErRTtvQkFDL0UsU0FBUztnQkFDWCxDQUFDO2dCQUVELElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztvQkFDdEIsZ0RBQWdEO29CQUNoRCxxRUFBcUU7b0JBQ3JFLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCx5RUFBeUU7Z0JBQ3pFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFN0csSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDUixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUM7Z0JBRUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDUixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELEtBQUssdUJBQUEsSUFBSSxtREFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFO2dCQUNyQyxTQUFTO2dCQUNULElBQUk7YUFDTCxDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksa0JBQWtCLENBQzNCLHVCQUFBLElBQUksNENBQVcsRUFDZix1QkFBQSxJQUFJLDBEQUF5QixFQUM3QixLQUFLLEVBQ0wsU0FBUyxFQUNULElBQUksRUFDSixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxNQUFNLENBQ1osQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUtGOzhVQUhrQixLQUFhO0lBQzVCLE9BQU8sdUJBQUEsSUFBSSxtREFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUdIOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0I7SUFDdEIsWUFDVSxLQUErQixFQUMvQixXQUFxQyxFQUNyQyxLQUFhLEVBQ2IsU0FBaUIsRUFDakIsY0FBc0IsRUFDdEIsSUFBK0IsRUFDL0IsTUFBYzs7UUFOZCxVQUFLLEdBQUwsS0FBSyxDQUEwQjtRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBMEI7UUFDckMsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFDL0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUNyQixDQUFDO0lBRUcsY0FBYyxDQUFtQixLQUFhO1FBQ25ELE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25DLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVsQixPQUFPLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQixNQUFNLE9BQU8sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQzlCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUV2RCxNQUFNLE9BQU8sR0FBRyx1QkFBQSxJQUFJLGlGQUF3QixNQUE1QixJQUFJLEVBQXlCLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRW5CLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDWCxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sSUFBSSxXQUFXLENBQUksS0FBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxPQUFPO1FBQ0wscUVBQXFFO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLHVCQUFBLElBQUkseUZBQWdDLE1BQXBDLElBQUksRUFBaUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTNFLDJCQUEyQjtRQUMzQixJQUFJLE9BQU8sV0FBVyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBMENELGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7Z0pBbER5QixLQUFhLEVBQUUsS0FBYTtJQUNsRCxNQUFNLFdBQVcsR0FBRyx1QkFBQSxJQUFJLHlGQUFnQyxNQUFwQyxJQUFJLEVBQWlDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV2RSwwQkFBMEI7SUFDMUIsSUFBSSxPQUFPLFdBQVcsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxnRkFBZ0Y7SUFDaEYsbUZBQW1GO0lBQ25GLHNDQUFzQztJQUN0QyxFQUFFO0lBQ0YsMERBQTBEO0lBQzFELGdGQUFnRjtJQUNoRixvRUFBb0U7SUFDcEUscURBQXFEO0lBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsTUFBTSxTQUFTLEdBQUcsS0FBSyxHQUFHLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3RELElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2pCLHVCQUFBLElBQUksaUZBQXdCLE1BQTVCLElBQUksRUFBeUIsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ25ELHVCQUFBLElBQUksaUZBQXdCLE1BQTVCLElBQUksRUFBeUIsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztLQUN6RCxDQUFDO0lBRUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxtSEFFK0IsS0FBYSxFQUFFLEtBQWE7SUFDMUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDIn0=
@@ -1,8 +1,17 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
- import { SiblingPath } from '@aztec/types/membership';
3
- import { LevelUp, LevelUpChain } from 'levelup';
2
+ import { SiblingPath } from '@aztec/circuit-types';
3
+ import { AztecKVStore, AztecMap } from '@aztec/kv-store';
4
4
  import { TreeBase } from '../tree_base.js';
5
5
  import { TreeSnapshot, TreeSnapshotBuilder } from './snapshot_builder.js';
6
+ /**
7
+ * Metadata for a snapshot, per block
8
+ */
9
+ type SnapshotMetadata = {
10
+ /** The tree root at the time */
11
+ root: Buffer;
12
+ /** The number of filled leaves */
13
+ numLeaves: bigint;
14
+ };
6
15
  /**
7
16
  * Builds a full snapshot of a tree. This implementation works for any Merkle tree and stores
8
17
  * it in a database in a similar way to how a tree is stored in memory, using pointers.
@@ -21,11 +30,13 @@ import { TreeSnapshot, TreeSnapshotBuilder } from './snapshot_builder.js';
21
30
  */
22
31
  export declare abstract class BaseFullTreeSnapshotBuilder<T extends TreeBase, S extends TreeSnapshot> implements TreeSnapshotBuilder<S> {
23
32
  #private;
24
- protected db: LevelUp;
33
+ protected db: AztecKVStore;
25
34
  protected tree: T;
26
- constructor(db: LevelUp, tree: T);
35
+ protected nodes: AztecMap<string, [Buffer, Buffer]>;
36
+ protected snapshotMetadata: AztecMap<number, SnapshotMetadata>;
37
+ constructor(db: AztecKVStore, tree: T);
27
38
  snapshot(block: number): Promise<S>;
28
- protected handleLeaf(_index: bigint, _node: Buffer, _batch: LevelUpChain): Promise<void>;
39
+ protected handleLeaf(_index: bigint, _node: Buffer): void;
29
40
  getSnapshot(version: number): Promise<S>;
30
41
  protected abstract openSnapshot(root: Buffer, numLeaves: bigint): S;
31
42
  }
@@ -34,17 +45,18 @@ export declare abstract class BaseFullTreeSnapshotBuilder<T extends TreeBase, S
34
45
  */
35
46
  export declare class BaseFullTreeSnapshot implements TreeSnapshot {
36
47
  #private;
37
- protected db: LevelUp;
48
+ protected db: AztecMap<string, [Buffer, Buffer]>;
38
49
  protected historicRoot: Buffer;
39
50
  protected numLeaves: bigint;
40
51
  protected tree: TreeBase;
41
- constructor(db: LevelUp, historicRoot: Buffer, numLeaves: bigint, tree: TreeBase);
42
- getSiblingPath<N extends number>(index: bigint): Promise<SiblingPath<N>>;
43
- getLeafValue(index: bigint): Promise<Buffer | undefined>;
52
+ constructor(db: AztecMap<string, [Buffer, Buffer]>, historicRoot: Buffer, numLeaves: bigint, tree: TreeBase);
53
+ getSiblingPath<N extends number>(index: bigint): SiblingPath<N>;
54
+ getLeafValue(index: bigint): Buffer | undefined;
44
55
  getDepth(): number;
45
56
  getRoot(): Buffer;
46
57
  getNumLeaves(): bigint;
47
- protected pathFromRootToLeaf(leafIndex: bigint): AsyncGenerator<Buffer[], void, unknown>;
48
- findLeafIndex(value: Buffer): Promise<bigint | undefined>;
58
+ protected pathFromRootToLeaf(leafIndex: bigint): Generator<Buffer[], void, unknown>;
59
+ findLeafIndex(value: Buffer): bigint | undefined;
49
60
  }
61
+ export {};
50
62
  //# sourceMappingURL=base_full_snapshot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base_full_snapshot.d.ts","sourceRoot":"","sources":["../../src/snapshots/base_full_snapshot.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAU1E;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,2BAA2B,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,YAAY,CAC1F,YAAW,mBAAmB,CAAC,CAAC,CAAC;;IAErB,SAAS,CAAC,EAAE,EAAE,OAAO;IAAE,SAAS,CAAC,IAAI,EAAE,CAAC;gBAA9B,EAAE,EAAE,OAAO,EAAY,IAAI,EAAE,CAAC;IAE9C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IA+DzC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;IAIlE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAU9C,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;CAoBpE;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,YAAY;;IAErD,SAAS,CAAC,EAAE,EAAE,OAAO;IACrB,SAAS,CAAC,YAAY,EAAE,MAAM;IAC9B,SAAS,CAAC,SAAS,EAAE,MAAM;IAC3B,SAAS,CAAC,IAAI,EAAE,QAAQ;gBAHd,EAAE,EAAE,OAAO,EACX,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ;IAGpB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAcxE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAS9D,QAAQ,IAAI,MAAM;IAIlB,OAAO,IAAI,MAAM;IAIjB,YAAY,IAAI,MAAM;cAIL,kBAAkB,CAAC,SAAS,EAAE,MAAM;IAwC/C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAUhE"}
1
+ {"version":3,"file":"base_full_snapshot.d.ts","sourceRoot":"","sources":["../../src/snapshots/base_full_snapshot.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE1E;;GAEG;AACH,KAAK,gBAAgB,GAAG;IACtB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,2BAA2B,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,YAAY,CAC1F,YAAW,mBAAmB,CAAC,CAAC,CAAC;;IAKrB,SAAS,CAAC,EAAE,EAAE,YAAY;IAAE,SAAS,CAAC,IAAI,EAAE,CAAC;IAHzD,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,SAAS,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;gBAEzC,EAAE,EAAE,YAAY,EAAY,IAAI,EAAE,CAAC;IAKzD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAwDnC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAEzD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAUxC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;CAKpE;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,YAAY;;IAErD,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,SAAS,CAAC,YAAY,EAAE,MAAM;IAC9B,SAAS,CAAC,SAAS,EAAE,MAAM;IAC3B,SAAS,CAAC,IAAI,EAAE,QAAQ;gBAHd,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ;IAG1B,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAc/D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAS/C,QAAQ,IAAI,MAAM;IAIlB,OAAO,IAAI,MAAM;IAIjB,YAAY,IAAI,MAAM;IAItB,SAAS,CAAE,kBAAkB,CAAC,SAAS,EAAE,MAAM;IAwC/C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAUjD"}