@aztec/merkle-tree 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.
- package/dest/interfaces/append_only_tree.d.ts +4 -3
- package/dest/interfaces/append_only_tree.d.ts.map +1 -1
- package/dest/interfaces/indexed_tree.d.ts +3 -1
- package/dest/interfaces/indexed_tree.d.ts.map +1 -1
- package/dest/interfaces/merkle_tree.d.ts +5 -4
- package/dest/interfaces/merkle_tree.d.ts.map +1 -1
- package/dest/interfaces/update_only_tree.d.ts +4 -3
- package/dest/interfaces/update_only_tree.d.ts.map +1 -1
- package/dest/load_tree.d.ts +2 -1
- package/dest/load_tree.d.ts.map +1 -1
- package/dest/load_tree.js +3 -3
- package/dest/new_tree.d.ts +2 -1
- package/dest/new_tree.d.ts.map +1 -1
- package/dest/new_tree.js +3 -3
- package/dest/snapshots/append_only_snapshot.d.ts +6 -4
- package/dest/snapshots/append_only_snapshot.d.ts.map +1 -1
- package/dest/snapshots/append_only_snapshot.js +13 -8
- package/dest/snapshots/base_full_snapshot.d.ts +9 -7
- package/dest/snapshots/base_full_snapshot.d.ts.map +1 -1
- package/dest/snapshots/base_full_snapshot.js +7 -4
- package/dest/snapshots/full_snapshot.d.ts +6 -2
- package/dest/snapshots/full_snapshot.d.ts.map +1 -1
- package/dest/snapshots/full_snapshot.js +6 -2
- package/dest/snapshots/indexed_tree_snapshot.d.ts +2 -2
- package/dest/snapshots/indexed_tree_snapshot.d.ts.map +1 -1
- package/dest/snapshots/indexed_tree_snapshot.js +2 -2
- package/dest/snapshots/snapshot_builder.d.ts +7 -6
- package/dest/snapshots/snapshot_builder.d.ts.map +1 -1
- package/dest/snapshots/snapshot_builder_test_suite.d.ts +3 -2
- package/dest/snapshots/snapshot_builder_test_suite.d.ts.map +1 -1
- package/dest/snapshots/snapshot_builder_test_suite.js +5 -2
- package/dest/sparse_tree/sparse_tree.d.ts +7 -7
- package/dest/sparse_tree/sparse_tree.d.ts.map +1 -1
- package/dest/sparse_tree/sparse_tree.js +6 -4
- package/dest/standard_indexed_tree/standard_indexed_tree.d.ts +3 -1
- package/dest/standard_indexed_tree/standard_indexed_tree.d.ts.map +1 -1
- package/dest/standard_indexed_tree/standard_indexed_tree.js +5 -2
- package/dest/standard_tree/standard_tree.d.ts +7 -6
- package/dest/standard_tree/standard_tree.d.ts.map +1 -1
- package/dest/standard_tree/standard_tree.js +5 -3
- package/dest/tree_base.d.ts +15 -6
- package/dest/tree_base.d.ts.map +1 -1
- package/dest/tree_base.js +20 -3
- package/package.json +5 -5
- package/src/interfaces/append_only_tree.ts +7 -3
- package/src/interfaces/indexed_tree.ts +6 -1
- package/src/interfaces/merkle_tree.ts +5 -4
- package/src/interfaces/update_only_tree.ts +7 -3
- package/src/load_tree.ts +13 -3
- package/src/new_tree.ts +5 -3
- package/src/snapshots/append_only_snapshot.ts +23 -11
- package/src/snapshots/base_full_snapshot.ts +11 -8
- package/src/snapshots/full_snapshot.ts +12 -5
- package/src/snapshots/indexed_tree_snapshot.ts +5 -5
- package/src/snapshots/snapshot_builder.ts +7 -6
- package/src/snapshots/snapshot_builder_test_suite.ts +13 -7
- package/src/sparse_tree/sparse_tree.ts +11 -8
- package/src/standard_indexed_tree/standard_indexed_tree.ts +7 -2
- package/src/standard_tree/standard_tree.ts +10 -8
- package/src/tree_base.ts +23 -6
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZV9iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RyZWVfYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RSxPQUFPLEVBQWUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RSxPQUFPLEVBQTBCLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFJeEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3pELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUV0QixNQUFNLGNBQWMsR0FBRyxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7QUFDbkcsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFFO0lBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtJQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNs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S0FBSyxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2IsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztDQWtCRiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/merkle-tree",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
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.
|
|
36
|
-
"@aztec/foundation": "0.
|
|
37
|
-
"@aztec/kv-store": "0.
|
|
38
|
-
"@aztec/types": "0.
|
|
35
|
+
"@aztec/circuit-types": "0.32.0",
|
|
36
|
+
"@aztec/foundation": "0.32.0",
|
|
37
|
+
"@aztec/kv-store": "0.32.0",
|
|
38
|
+
"@aztec/types": "0.32.0",
|
|
39
39
|
"sha256": "^0.2.0",
|
|
40
40
|
"tslib": "^2.4.0"
|
|
41
41
|
},
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Bufferable } from '@aztec/foundation/serialize';
|
|
2
|
+
|
|
3
|
+
import { TreeSnapshot, TreeSnapshotBuilder } from '../snapshots/snapshot_builder.js';
|
|
2
4
|
import { 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
|
|
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:
|
|
16
|
+
appendLeaves(leaves: T[]): Promise<void>;
|
|
13
17
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { SiblingPath } from '@aztec/circuit-types';
|
|
2
2
|
import { IndexedTreeLeaf, IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
3
3
|
|
|
4
|
+
import { IndexedTreeSnapshot, TreeSnapshot, TreeSnapshotBuilder } from '../snapshots/snapshot_builder.js';
|
|
4
5
|
import { AppendOnlyTree } from './append_only_tree.js';
|
|
6
|
+
import { MerkleTree } from './merkle_tree.js';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* Factory for creating leaf preimages.
|
|
@@ -73,7 +75,10 @@ export interface BatchInsertionResult<TreeHeight extends number, SubtreeSiblingP
|
|
|
73
75
|
/**
|
|
74
76
|
* Indexed merkle tree.
|
|
75
77
|
*/
|
|
76
|
-
export interface IndexedTree
|
|
78
|
+
export interface IndexedTree
|
|
79
|
+
extends MerkleTree<Buffer>,
|
|
80
|
+
TreeSnapshotBuilder<IndexedTreeSnapshot>,
|
|
81
|
+
Omit<AppendOnlyTree<Buffer>, keyof TreeSnapshotBuilder<TreeSnapshot<Buffer>>> {
|
|
77
82
|
/**
|
|
78
83
|
* Finds the index of the largest leaf whose value is less than or equal to the provided value.
|
|
79
84
|
* @param newValue - The new value to be inserted into the tree.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SiblingPath } from '@aztec/circuit-types';
|
|
2
|
+
import { 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):
|
|
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:
|
|
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:
|
|
69
|
+
findLeafIndexAfter(leaf: T, startIndex: bigint, includeUncommitted: boolean): bigint | undefined;
|
|
69
70
|
}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Bufferable } from '@aztec/foundation/serialize';
|
|
2
|
+
|
|
3
|
+
import { TreeSnapshot, TreeSnapshotBuilder } from '../snapshots/snapshot_builder.js';
|
|
2
4
|
import { 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
|
|
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:
|
|
17
|
+
updateLeaf(leaf: T, index: bigint): Promise<void>;
|
|
14
18
|
}
|
package/src/load_tree.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Bufferable, FromBuffer } from '@aztec/foundation/serialize';
|
|
1
2
|
import { AztecKVStore } from '@aztec/kv-store';
|
|
2
3
|
import { Hasher } from '@aztec/types/interfaces';
|
|
3
4
|
|
|
@@ -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 (
|
|
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,3 +1,4 @@
|
|
|
1
|
+
import { Bufferable, FromBuffer } from '@aztec/foundation/serialize';
|
|
1
2
|
import { AztecKVStore } from '@aztec/kv-store';
|
|
2
3
|
import { Hasher } from '@aztec/types/interfaces';
|
|
3
4
|
|
|
@@ -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
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SiblingPath } from '@aztec/circuit-types';
|
|
2
|
+
import { Bufferable, FromBuffer, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
2
3
|
import { AztecKVStore, AztecMap } from '@aztec/kv-store';
|
|
3
4
|
import { Hasher } from '@aztec/types/interfaces';
|
|
4
5
|
|
|
@@ -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(
|
|
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):
|
|
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
|
-
|
|
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:
|
|
263
|
+
findLeafIndex(value: T): bigint | undefined {
|
|
253
264
|
return this.findLeafIndexAfter(value, 0n);
|
|
254
265
|
}
|
|
255
266
|
|
|
256
|
-
findLeafIndexAfter(value:
|
|
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(
|
|
272
|
+
if (currentValue && serializeToBuffer(currentValue).equals(valueBuffer)) {
|
|
261
273
|
return i;
|
|
262
274
|
}
|
|
263
275
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SiblingPath } from '@aztec/circuit-types';
|
|
2
|
+
import { Bufferable, FromBuffer, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
2
3
|
import { AztecKVStore, AztecMap } from '@aztec/kv-store';
|
|
3
4
|
|
|
4
5
|
import { TreeBase } from '../tree_base.js';
|
|
@@ -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
|
|
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):
|
|
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:
|
|
207
|
+
findLeafIndex(value: T): bigint | undefined {
|
|
206
208
|
return this.findLeafIndexAfter(value, 0n);
|
|
207
209
|
}
|
|
208
210
|
|
|
209
|
-
public findLeafIndexAfter(value:
|
|
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(
|
|
216
|
+
if (currentValue && serializeToBuffer(currentValue).equals(buffer)) {
|
|
214
217
|
return i;
|
|
215
218
|
}
|
|
216
219
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { Bufferable, FromBuffer } from '@aztec/foundation/serialize';
|
|
2
|
+
import { AztecKVStore } from '@aztec/kv-store';
|
|
3
|
+
|
|
1
4
|
import { TreeBase } from '../tree_base.js';
|
|
2
5
|
import { BaseFullTreeSnapshot, BaseFullTreeSnapshotBuilder } from './base_full_snapshot.js';
|
|
3
6
|
import { TreeSnapshot, TreeSnapshotBuilder } from './snapshot_builder.js';
|
|
@@ -16,11 +19,15 @@ import { TreeSnapshot, TreeSnapshotBuilder } from './snapshot_builder.js';
|
|
|
16
19
|
* Worst case space complexity: O(N * M)
|
|
17
20
|
* Sibling path access: O(H) database reads
|
|
18
21
|
*/
|
|
19
|
-
export class FullTreeSnapshotBuilder
|
|
20
|
-
extends BaseFullTreeSnapshotBuilder<TreeBase
|
|
21
|
-
implements TreeSnapshotBuilder<TreeSnapshot
|
|
22
|
+
export class FullTreeSnapshotBuilder<T extends Bufferable>
|
|
23
|
+
extends BaseFullTreeSnapshotBuilder<TreeBase<T>, TreeSnapshot<T>>
|
|
24
|
+
implements TreeSnapshotBuilder<TreeSnapshot<T>>
|
|
22
25
|
{
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
constructor(db: AztecKVStore, tree: TreeBase<T>, private deserializer: FromBuffer<T>) {
|
|
27
|
+
super(db, tree);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected openSnapshot(root: Buffer, numLeaves: bigint): TreeSnapshot<T> {
|
|
31
|
+
return new BaseFullTreeSnapshot(this.nodes, root, numLeaves, this.tree, this.deserializer);
|
|
25
32
|
}
|
|
26
33
|
}
|
|
@@ -10,11 +10,11 @@ const snapshotLeafValue = (node: Buffer, index: bigint) => 'snapshot:leaf:' + no
|
|
|
10
10
|
|
|
11
11
|
/** a */
|
|
12
12
|
export class IndexedTreeSnapshotBuilder
|
|
13
|
-
extends BaseFullTreeSnapshotBuilder<IndexedTree & TreeBase
|
|
13
|
+
extends BaseFullTreeSnapshotBuilder<IndexedTree & TreeBase<Buffer>, IndexedTreeSnapshot>
|
|
14
14
|
implements TreeSnapshotBuilder<IndexedTreeSnapshot>
|
|
15
15
|
{
|
|
16
16
|
leaves: AztecMap<string, Buffer>;
|
|
17
|
-
constructor(store: AztecKVStore, tree: IndexedTree & TreeBase
|
|
17
|
+
constructor(store: AztecKVStore, tree: IndexedTree & TreeBase<Buffer>, private leafPreimageBuilder: PreimageFactory) {
|
|
18
18
|
super(store, tree);
|
|
19
19
|
this.leaves = store.openMap('indexed_tree_snapshot:' + tree.getName());
|
|
20
20
|
}
|
|
@@ -32,16 +32,16 @@ export class IndexedTreeSnapshotBuilder
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
/** A snapshot of an indexed tree at a particular point in time */
|
|
35
|
-
class IndexedTreeSnapshotImpl extends BaseFullTreeSnapshot implements IndexedTreeSnapshot {
|
|
35
|
+
class IndexedTreeSnapshotImpl extends BaseFullTreeSnapshot<Buffer> implements IndexedTreeSnapshot {
|
|
36
36
|
constructor(
|
|
37
37
|
db: AztecMap<string, [Buffer, Buffer]>,
|
|
38
38
|
private leaves: AztecMap<string, Buffer>,
|
|
39
39
|
historicRoot: Buffer,
|
|
40
40
|
numLeaves: bigint,
|
|
41
|
-
tree: IndexedTree & TreeBase
|
|
41
|
+
tree: IndexedTree & TreeBase<Buffer>,
|
|
42
42
|
private leafPreimageBuilder: PreimageFactory,
|
|
43
43
|
) {
|
|
44
|
-
super(db, historicRoot, numLeaves, tree);
|
|
44
|
+
super(db, historicRoot, numLeaves, tree, { fromBuffer: buf => buf });
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
getLeafValue(index: bigint): Buffer | undefined {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { SiblingPath } from '@aztec/circuit-types';
|
|
2
|
+
import { Bufferable } from '@aztec/foundation/serialize';
|
|
2
3
|
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* An interface for a tree that can record snapshots of its contents.
|
|
6
7
|
*/
|
|
7
|
-
export interface TreeSnapshotBuilder<S extends TreeSnapshot
|
|
8
|
+
export interface TreeSnapshotBuilder<S extends TreeSnapshot<Bufferable>> {
|
|
8
9
|
/**
|
|
9
10
|
* Creates a snapshot of the tree at the given version.
|
|
10
11
|
* @param block - The version to snapshot the tree at.
|
|
@@ -21,7 +22,7 @@ export interface TreeSnapshotBuilder<S extends TreeSnapshot = TreeSnapshot> {
|
|
|
21
22
|
/**
|
|
22
23
|
* A tree snapshot
|
|
23
24
|
*/
|
|
24
|
-
export interface TreeSnapshot {
|
|
25
|
+
export interface TreeSnapshot<T extends Bufferable> {
|
|
25
26
|
/**
|
|
26
27
|
* Returns the current root of the tree.
|
|
27
28
|
*/
|
|
@@ -41,7 +42,7 @@ export interface TreeSnapshot {
|
|
|
41
42
|
* Returns the value of a leaf at the specified index.
|
|
42
43
|
* @param index - The index of the leaf value to be returned.
|
|
43
44
|
*/
|
|
44
|
-
getLeafValue(index: bigint):
|
|
45
|
+
getLeafValue(index: bigint): T | undefined;
|
|
45
46
|
|
|
46
47
|
/**
|
|
47
48
|
* Returns the sibling path for a requested leaf index.
|
|
@@ -55,7 +56,7 @@ export interface TreeSnapshot {
|
|
|
55
56
|
* @param value - The leaf value to look for.
|
|
56
57
|
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
57
58
|
*/
|
|
58
|
-
findLeafIndex(value:
|
|
59
|
+
findLeafIndex(value: T): bigint | undefined;
|
|
59
60
|
|
|
60
61
|
/**
|
|
61
62
|
* Returns the first index containing a leaf value after `startIndex`.
|
|
@@ -63,11 +64,11 @@ export interface TreeSnapshot {
|
|
|
63
64
|
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
64
65
|
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
65
66
|
*/
|
|
66
|
-
findLeafIndexAfter(leaf:
|
|
67
|
+
findLeafIndexAfter(leaf: T, startIndex: bigint): bigint | undefined;
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
/** A snapshot of an indexed tree */
|
|
70
|
-
export interface IndexedTreeSnapshot extends TreeSnapshot {
|
|
71
|
+
export interface IndexedTreeSnapshot extends TreeSnapshot<Buffer> {
|
|
71
72
|
/**
|
|
72
73
|
* Gets the historical data for a leaf
|
|
73
74
|
* @param index - The index of the leaf to get the data for
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { randomBigInt } from '@aztec/foundation/crypto';
|
|
2
|
+
import { Bufferable } from '@aztec/foundation/serialize';
|
|
3
|
+
|
|
4
|
+
import { jest } from '@jest/globals';
|
|
2
5
|
|
|
3
6
|
import { TreeBase } from '../tree_base.js';
|
|
4
|
-
import { TreeSnapshotBuilder } from './snapshot_builder.js';
|
|
7
|
+
import { TreeSnapshot, TreeSnapshotBuilder } from './snapshot_builder.js';
|
|
8
|
+
|
|
9
|
+
jest.setTimeout(50_000);
|
|
5
10
|
|
|
6
11
|
/** Creates a test suit for snapshots */
|
|
7
|
-
export function describeSnapshotBuilderTestSuite<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
) {
|
|
12
|
+
export function describeSnapshotBuilderTestSuite<
|
|
13
|
+
T extends TreeBase<Bufferable>,
|
|
14
|
+
S extends TreeSnapshotBuilder<TreeSnapshot<Bufferable>>,
|
|
15
|
+
>(getTree: () => T, getSnapshotBuilder: () => S, modifyTree: (tree: T) => Promise<void>) {
|
|
12
16
|
describe('SnapshotBuilder', () => {
|
|
13
17
|
let tree: T;
|
|
14
18
|
let snapshotBuilder: S;
|
|
@@ -34,7 +38,9 @@ export function describeSnapshotBuilderTestSuite<T extends TreeBase, S extends T
|
|
|
34
38
|
|
|
35
39
|
const block = 1;
|
|
36
40
|
const snapshot = await snapshotBuilder.snapshot(block);
|
|
37
|
-
await
|
|
41
|
+
const newSnapshot = await snapshotBuilder.snapshot(block);
|
|
42
|
+
|
|
43
|
+
expect(newSnapshot.getRoot()).toEqual(snapshot.getRoot());
|
|
38
44
|
});
|
|
39
45
|
|
|
40
46
|
it('returns the same path if tree has not diverged', async () => {
|