@aztec/merkle-tree 0.1.0-alpha17 → 0.1.0-alpha21
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/.tsbuildinfo +1 -1
- package/dest/interfaces/indexed_tree.d.ts +1 -8
- package/dest/interfaces/indexed_tree.d.ts.map +1 -1
- package/dest/new_tree.js +1 -1
- package/dest/standard_indexed_tree/standard_indexed_tree.d.ts +37 -22
- package/dest/standard_indexed_tree/standard_indexed_tree.d.ts.map +1 -1
- package/dest/standard_indexed_tree/standard_indexed_tree.js +78 -87
- package/dest/standard_indexed_tree/test/standard_indexed_tree.test.d.ts.map +1 -0
- package/dest/standard_indexed_tree/test/standard_indexed_tree.test.js +337 -0
- package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.d.ts +23 -0
- package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.d.ts.map +1 -0
- package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.js +59 -0
- package/dest/standard_tree/standard_tree.d.ts +0 -10
- package/dest/standard_tree/standard_tree.d.ts.map +1 -1
- package/dest/standard_tree/standard_tree.js +3 -38
- package/dest/tree_base.d.ts +22 -9
- package/dest/tree_base.d.ts.map +1 -1
- package/dest/tree_base.js +48 -5
- package/package.json +3 -3
- package/src/interfaces/indexed_tree.ts +0 -10
- package/src/new_tree.ts +1 -1
- package/src/standard_indexed_tree/standard_indexed_tree.ts +86 -96
- package/src/standard_indexed_tree/{standard_indexed_tree.test.ts → test/standard_indexed_tree.test.ts} +35 -9
- package/src/standard_indexed_tree/test/standard_indexed_tree_with_append.ts +63 -0
- package/src/standard_tree/standard_tree.ts +2 -40
- package/src/tree_base.ts +55 -8
- package/dest/standard_indexed_tree/standard_indexed_tree.test.d.ts.map +0 -1
- package/dest/standard_indexed_tree/standard_indexed_tree.test.js +0 -316
- /package/dest/standard_indexed_tree/{standard_indexed_tree.test.d.ts → test/standard_indexed_tree.test.d.ts} +0 -0
|
@@ -23,14 +23,17 @@ export interface LowLeafWitnessData<N extends number> {
|
|
|
23
23
|
* Indexed merkle tree.
|
|
24
24
|
*/
|
|
25
25
|
export declare class StandardIndexedTree extends TreeBase implements IndexedTree {
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
protected leaves: LeafData[];
|
|
27
|
+
protected cachedLeaves: {
|
|
28
|
+
[key: number]: LeafData;
|
|
29
|
+
};
|
|
28
30
|
/**
|
|
29
31
|
* Appends the given leaves to the tree.
|
|
30
|
-
* @param
|
|
32
|
+
* @param _leaves - The leaves to append.
|
|
31
33
|
* @returns Empty promise.
|
|
34
|
+
* @remarks Use batchInsert method instead.
|
|
32
35
|
*/
|
|
33
|
-
appendLeaves(
|
|
36
|
+
appendLeaves(_leaves: Buffer[]): Promise<void>;
|
|
34
37
|
/**
|
|
35
38
|
* Commits the changes to the database.
|
|
36
39
|
* @returns Empty promise.
|
|
@@ -71,12 +74,6 @@ export declare class StandardIndexedTree extends TreeBase implements IndexedTree
|
|
|
71
74
|
* @returns A copy of the leaf data at the given index or undefined if the leaf was not found.
|
|
72
75
|
*/
|
|
73
76
|
getLatestLeafDataCopy(index: number, includeUncommitted: boolean): LeafData | undefined;
|
|
74
|
-
/**
|
|
75
|
-
* Appends the given leaf to the tree.
|
|
76
|
-
* @param leaf - The leaf to append.
|
|
77
|
-
* @returns Empty promise.
|
|
78
|
-
*/
|
|
79
|
-
private appendLeaf;
|
|
80
77
|
/**
|
|
81
78
|
* Finds the index of the minimum value in an array.
|
|
82
79
|
* @param values - The collection of values to be searched.
|
|
@@ -87,6 +84,15 @@ export declare class StandardIndexedTree extends TreeBase implements IndexedTree
|
|
|
87
84
|
* Initializes the tree.
|
|
88
85
|
* @param prefilledSize - A number of leaves that are prefilled with values.
|
|
89
86
|
* @returns Empty promise.
|
|
87
|
+
*
|
|
88
|
+
* @remarks Explanation of pre-filling:
|
|
89
|
+
* There needs to be an initial (0,0,0) leaf in the tree, so that when we insert the first 'proper' leaf, we can
|
|
90
|
+
* prove that any value greater than 0 doesn't exist in the tree yet. We prefill/pad the tree with "the number of
|
|
91
|
+
* leaves that are added by one block" so that the first 'proper' block can insert a full subtree.
|
|
92
|
+
*
|
|
93
|
+
* Without this padding, there would be a leaf (0,0,0) at leaf index 0, making it really difficult to insert e.g.
|
|
94
|
+
* 1024 leaves for the first block, because there's only neat space for 1023 leaves after 0. By padding with 1023
|
|
95
|
+
* more leaves, we can then insert the first block of 1024 leaves into indices 1024:2047.
|
|
90
96
|
*/
|
|
91
97
|
init(prefilledSize: number): Promise<void>;
|
|
92
98
|
/**
|
|
@@ -106,13 +112,7 @@ export declare class StandardIndexedTree extends TreeBase implements IndexedTree
|
|
|
106
112
|
* @param leaf - New contents of the leaf.
|
|
107
113
|
* @param index - Index of the leaf to be updated.
|
|
108
114
|
*/
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Exposes the underlying tree's update leaf method.
|
|
112
|
-
* @param leaf - The hash to set at the leaf.
|
|
113
|
-
* @param index - The index of the element.
|
|
114
|
-
*/
|
|
115
|
-
updateLeaf(leaf: LeafData, index: bigint): Promise<void>;
|
|
115
|
+
protected updateLeaf(leaf: LeafData, index: bigint): Promise<void>;
|
|
116
116
|
/**
|
|
117
117
|
*
|
|
118
118
|
* Each base rollup needs to provide non membership / inclusion proofs for each of the nullifier.
|
|
@@ -132,8 +132,8 @@ export declare class StandardIndexedTree extends TreeBase implements IndexedTree
|
|
|
132
132
|
*
|
|
133
133
|
* Algorithm overview
|
|
134
134
|
*
|
|
135
|
-
* In general, if we want to batch insert items, we first to update their low nullifier to point to them,
|
|
136
|
-
* then batch insert all of the values
|
|
135
|
+
* In general, if we want to batch insert items, we first need to update their low nullifier to point to them,
|
|
136
|
+
* then batch insert all of the values at once in the final step.
|
|
137
137
|
* To update a low nullifier, we provide an insertion proof that the low nullifier currently exists to the
|
|
138
138
|
* circuit, then update the low nullifier.
|
|
139
139
|
* Updating this low nullifier will in turn change the root of the tree. Therefore future low nullifier insertion proofs
|
|
@@ -188,7 +188,7 @@ export declare class StandardIndexedTree extends TreeBase implements IndexedTree
|
|
|
188
188
|
* nextVal 2 10 15 0 3 5 - -
|
|
189
189
|
*
|
|
190
190
|
* Inserting 20: (happy path)
|
|
191
|
-
* 1. Find the low nullifier (15) - provide
|
|
191
|
+
* 1. Find the low nullifier (15) - provide inclusion proof
|
|
192
192
|
* 2. Update its pointers
|
|
193
193
|
* 3. Insert 20 into the pending subtree
|
|
194
194
|
*
|
|
@@ -220,11 +220,26 @@ export declare class StandardIndexedTree extends TreeBase implements IndexedTree
|
|
|
220
220
|
*
|
|
221
221
|
* TODO: this implementation will change once the zero value is changed from h(0,0,0). Changes incoming over the next sprint
|
|
222
222
|
* @param leaves - Values to insert into the tree.
|
|
223
|
-
* @param treeHeight - Height of the tree.
|
|
224
223
|
* @param subtreeHeight - Height of the subtree.
|
|
225
224
|
* @returns The data for the leaves to be updated when inserting the new ones.
|
|
226
225
|
*/
|
|
227
|
-
batchInsert<TreeHeight extends number, SubtreeHeight extends number, SubtreeSiblingPathHeight extends number>(leaves: Buffer[],
|
|
226
|
+
batchInsert<TreeHeight extends number, SubtreeHeight extends number, SubtreeSiblingPathHeight extends number>(leaves: Buffer[], subtreeHeight: SubtreeHeight): Promise<[LowLeafWitnessData<TreeHeight>[], SiblingPath<SubtreeSiblingPathHeight>] | [undefined, SiblingPath<SubtreeSiblingPathHeight>]>;
|
|
228
227
|
getSubtreeSiblingPath<SubtreeHeight extends number, SubtreeSiblingPathHeight extends number>(subtreeHeight: SubtreeHeight, includeUncommitted: boolean): Promise<SiblingPath<SubtreeSiblingPathHeight>>;
|
|
228
|
+
/**
|
|
229
|
+
* Encodes leaves and appends them to a tree.
|
|
230
|
+
* @param leaves - Leaves to encode.
|
|
231
|
+
* @param hash0Leaf - Indicates whether 0 value leaf should be hashed. See {@link encodeLeaf}.
|
|
232
|
+
* @returns Empty promise
|
|
233
|
+
*/
|
|
234
|
+
private encodeAndAppendLeaves;
|
|
235
|
+
/**
|
|
236
|
+
* Encode a leaf into a buffer.
|
|
237
|
+
* @param leaf - Leaf to encode.
|
|
238
|
+
* @param hash0Leaf - Indicates whether 0 value leaf should be hashed. Not hashing 0 value can represent a forced
|
|
239
|
+
* null leaf insertion. Detecting this case by checking for 0 value is safe as in the case of
|
|
240
|
+
* nullifier it is improbable that a valid nullifier would be 0.
|
|
241
|
+
* @returns Leaf encoded in a buffer.
|
|
242
|
+
*/
|
|
243
|
+
private encodeLeaf;
|
|
229
244
|
}
|
|
230
245
|
//# sourceMappingURL=standard_indexed_tree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard_indexed_tree.d.ts","sourceRoot":"","sources":["../../src/standard_indexed_tree/standard_indexed_tree.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"standard_indexed_tree.d.ts","sourceRoot":"","sources":["../../src/standard_indexed_tree/standard_indexed_tree.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc1C;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;IACnB;;OAEG;IACH,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAkCD;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAS,YAAW,WAAW;IACtE,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAM;IAClC,SAAS,CAAC,YAAY,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,CAAM;IAEzD;;;;;OAKG;IACI,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;;OAGG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAKpC;;;OAGG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtC;;;;;OAKG;IACI,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAM5F;;;;;OAKG;IACH,wBAAwB,CACtB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,OAAO,GAC1B;QACD;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd;;WAEG;QACH,cAAc,EAAE,OAAO,CAAC;KACzB;IAuBD;;;;;OAKG;IACI,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS;IAW9F;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;;;;;;;;;OAaG;IACU,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BvD;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BxC;;OAEG;YACW,YAAY;IAY1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;;OAIG;cACa,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM;IAgBxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6GG;IACU,WAAW,CACtB,UAAU,SAAS,MAAM,EACzB,aAAa,SAAS,MAAM,EAC5B,wBAAwB,SAAS,MAAM,EAEvC,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,EAAE,aAAa,GAC3B,OAAO,CACN,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,wBAAwB,CAAC,CAAC,GACzE,CAAC,SAAS,EAAE,WAAW,CAAC,wBAAwB,CAAC,CAAC,CACrD;IA8GK,qBAAqB,CAAC,aAAa,SAAS,MAAM,EAAE,wBAAwB,SAAS,MAAM,EAC/F,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAQjD;;;;;OAKG;YACW,qBAAqB;IAWnC;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;CAWnB"}
|
|
@@ -30,9 +30,6 @@ const encodeTreeValue = (leafData) => {
|
|
|
30
30
|
const nextValueAsBuffer = toBufferBE(leafData.nextValue, 32);
|
|
31
31
|
return Buffer.concat([valueAsBuffer, indexAsBuffer, nextValueAsBuffer]);
|
|
32
32
|
};
|
|
33
|
-
const hashEncodedTreeValue = (leaf, hasher) => {
|
|
34
|
-
return hasher.compressInputs([leaf.value, leaf.nextIndex, leaf.nextValue].map(val => toBufferBE(val, 32)));
|
|
35
|
-
};
|
|
36
33
|
const decodeTreeValue = (buf) => {
|
|
37
34
|
const value = toBigIntBE(buf.subarray(0, 32));
|
|
38
35
|
const nextIndex = toBigIntBE(buf.subarray(32, 64));
|
|
@@ -43,11 +40,6 @@ const decodeTreeValue = (buf) => {
|
|
|
43
40
|
nextValue,
|
|
44
41
|
};
|
|
45
42
|
};
|
|
46
|
-
const initialLeaf = {
|
|
47
|
-
value: 0n,
|
|
48
|
-
nextIndex: 0n,
|
|
49
|
-
nextValue: 0n,
|
|
50
|
-
};
|
|
51
43
|
/**
|
|
52
44
|
* Indexed merkle tree.
|
|
53
45
|
*/
|
|
@@ -59,13 +51,12 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
59
51
|
}
|
|
60
52
|
/**
|
|
61
53
|
* Appends the given leaves to the tree.
|
|
62
|
-
* @param
|
|
54
|
+
* @param _leaves - The leaves to append.
|
|
63
55
|
* @returns Empty promise.
|
|
56
|
+
* @remarks Use batchInsert method instead.
|
|
64
57
|
*/
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
await this.appendLeaf(leaf);
|
|
68
|
-
}
|
|
58
|
+
appendLeaves(_leaves) {
|
|
59
|
+
throw new Error('Not implemented');
|
|
69
60
|
}
|
|
70
61
|
/**
|
|
71
62
|
* Commits the changes to the database.
|
|
@@ -140,44 +131,6 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
140
131
|
}
|
|
141
132
|
: undefined;
|
|
142
133
|
}
|
|
143
|
-
/**
|
|
144
|
-
* Appends the given leaf to the tree.
|
|
145
|
-
* @param leaf - The leaf to append.
|
|
146
|
-
* @returns Empty promise.
|
|
147
|
-
*/
|
|
148
|
-
async appendLeaf(leaf) {
|
|
149
|
-
const newValue = toBigIntBE(leaf);
|
|
150
|
-
// Special case when appending zero
|
|
151
|
-
if (newValue === 0n) {
|
|
152
|
-
const newSize = (this.cachedSize ?? this.size) + 1n;
|
|
153
|
-
if (newSize - 1n > this.maxIndex) {
|
|
154
|
-
throw Error(`Can't append beyond max index. Max index: ${this.maxIndex}`);
|
|
155
|
-
}
|
|
156
|
-
this.cachedSize = newSize;
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
const indexOfPrevious = this.findIndexOfPreviousValue(newValue, true);
|
|
160
|
-
const previousLeafCopy = this.getLatestLeafDataCopy(indexOfPrevious.index, true);
|
|
161
|
-
if (previousLeafCopy === undefined) {
|
|
162
|
-
throw new Error(`Previous leaf not found!`);
|
|
163
|
-
}
|
|
164
|
-
const newLeaf = {
|
|
165
|
-
value: newValue,
|
|
166
|
-
nextIndex: previousLeafCopy.nextIndex,
|
|
167
|
-
nextValue: previousLeafCopy.nextValue,
|
|
168
|
-
};
|
|
169
|
-
if (indexOfPrevious.alreadyPresent) {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
// insert a new leaf at the highest index and update the values of our previous leaf copy
|
|
173
|
-
const currentSize = this.getNumLeaves(true);
|
|
174
|
-
previousLeafCopy.nextIndex = BigInt(currentSize);
|
|
175
|
-
previousLeafCopy.nextValue = newLeaf.value;
|
|
176
|
-
this.cachedLeaves[Number(currentSize)] = newLeaf;
|
|
177
|
-
this.cachedLeaves[Number(indexOfPrevious.index)] = previousLeafCopy;
|
|
178
|
-
await this._updateLeaf(hashEncodedTreeValue(previousLeafCopy, this.hasher), BigInt(indexOfPrevious.index));
|
|
179
|
-
await this._updateLeaf(hashEncodedTreeValue(newLeaf, this.hasher), this.getNumLeaves(true));
|
|
180
|
-
}
|
|
181
134
|
/**
|
|
182
135
|
* Finds the index of the minimum value in an array.
|
|
183
136
|
* @param values - The collection of values to be searched.
|
|
@@ -199,13 +152,35 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
199
152
|
* Initializes the tree.
|
|
200
153
|
* @param prefilledSize - A number of leaves that are prefilled with values.
|
|
201
154
|
* @returns Empty promise.
|
|
155
|
+
*
|
|
156
|
+
* @remarks Explanation of pre-filling:
|
|
157
|
+
* There needs to be an initial (0,0,0) leaf in the tree, so that when we insert the first 'proper' leaf, we can
|
|
158
|
+
* prove that any value greater than 0 doesn't exist in the tree yet. We prefill/pad the tree with "the number of
|
|
159
|
+
* leaves that are added by one block" so that the first 'proper' block can insert a full subtree.
|
|
160
|
+
*
|
|
161
|
+
* Without this padding, there would be a leaf (0,0,0) at leaf index 0, making it really difficult to insert e.g.
|
|
162
|
+
* 1024 leaves for the first block, because there's only neat space for 1023 leaves after 0. By padding with 1023
|
|
163
|
+
* more leaves, we can then insert the first block of 1024 leaves into indices 1024:2047.
|
|
202
164
|
*/
|
|
203
165
|
async init(prefilledSize) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
166
|
+
if (prefilledSize < 1) {
|
|
167
|
+
throw new Error(`Prefilled size must be at least 1!`);
|
|
168
|
+
}
|
|
169
|
+
const leaves = [];
|
|
170
|
+
for (let i = 0n; i < prefilledSize; i++) {
|
|
171
|
+
const newLeaf = {
|
|
172
|
+
value: toBigIntBE(Buffer.from([Number(i)])),
|
|
173
|
+
nextIndex: i + 1n,
|
|
174
|
+
nextValue: i + 1n,
|
|
175
|
+
};
|
|
176
|
+
leaves.push(newLeaf);
|
|
208
177
|
}
|
|
178
|
+
// Make the first leaf have 0 value
|
|
179
|
+
leaves[0].value = 0n;
|
|
180
|
+
// Make the last leaf point to the first leaf
|
|
181
|
+
leaves[prefilledSize - 1].nextIndex = 0n;
|
|
182
|
+
leaves[prefilledSize - 1].nextValue = 0n;
|
|
183
|
+
await this.encodeAndAppendLeaves(leaves, true);
|
|
209
184
|
await this.commit();
|
|
210
185
|
}
|
|
211
186
|
/**
|
|
@@ -261,34 +236,17 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
261
236
|
* @param leaf - New contents of the leaf.
|
|
262
237
|
* @param index - Index of the leaf to be updated.
|
|
263
238
|
*/
|
|
264
|
-
|
|
265
|
-
async _updateLeaf(leaf, index) {
|
|
239
|
+
async updateLeaf(leaf, index) {
|
|
266
240
|
if (index > this.maxIndex) {
|
|
267
241
|
throw Error(`Index out of bounds. Index ${index}, max index: ${this.maxIndex}.`);
|
|
268
242
|
}
|
|
269
|
-
|
|
243
|
+
const encodedLeaf = this.encodeLeaf(leaf, true);
|
|
244
|
+
await this.addLeafToCacheAndHashToRoot(encodedLeaf, index);
|
|
270
245
|
const numLeaves = this.getNumLeaves(true);
|
|
271
246
|
if (index >= numLeaves) {
|
|
272
247
|
this.cachedSize = index + 1n;
|
|
273
248
|
}
|
|
274
249
|
}
|
|
275
|
-
/**
|
|
276
|
-
* Exposes the underlying tree's update leaf method.
|
|
277
|
-
* @param leaf - The hash to set at the leaf.
|
|
278
|
-
* @param index - The index of the element.
|
|
279
|
-
*/
|
|
280
|
-
// TODO: remove once the batch insertion functionality is moved here from circuit_block_builder.ts
|
|
281
|
-
async updateLeaf(leaf, index) {
|
|
282
|
-
let encodedLeaf;
|
|
283
|
-
if (leaf.value == 0n) {
|
|
284
|
-
encodedLeaf = toBufferBE(0n, 32);
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
encodedLeaf = hashEncodedTreeValue(leaf, this.hasher);
|
|
288
|
-
}
|
|
289
|
-
this.cachedLeaves[Number(index)] = leaf;
|
|
290
|
-
await this._updateLeaf(encodedLeaf, index);
|
|
291
|
-
}
|
|
292
250
|
/* eslint-disable jsdoc/require-description-complete-sentence */
|
|
293
251
|
/* The following doc block messes up with complete-sentence, so we just disable it */
|
|
294
252
|
/**
|
|
@@ -310,8 +268,8 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
310
268
|
*
|
|
311
269
|
* Algorithm overview
|
|
312
270
|
*
|
|
313
|
-
* In general, if we want to batch insert items, we first to update their low nullifier to point to them,
|
|
314
|
-
* then batch insert all of the values
|
|
271
|
+
* In general, if we want to batch insert items, we first need to update their low nullifier to point to them,
|
|
272
|
+
* then batch insert all of the values at once in the final step.
|
|
315
273
|
* To update a low nullifier, we provide an insertion proof that the low nullifier currently exists to the
|
|
316
274
|
* circuit, then update the low nullifier.
|
|
317
275
|
* Updating this low nullifier will in turn change the root of the tree. Therefore future low nullifier insertion proofs
|
|
@@ -366,7 +324,7 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
366
324
|
* nextVal 2 10 15 0 3 5 - -
|
|
367
325
|
*
|
|
368
326
|
* Inserting 20: (happy path)
|
|
369
|
-
* 1. Find the low nullifier (15) - provide
|
|
327
|
+
* 1. Find the low nullifier (15) - provide inclusion proof
|
|
370
328
|
* 2. Update its pointers
|
|
371
329
|
* 3. Insert 20 into the pending subtree
|
|
372
330
|
*
|
|
@@ -398,14 +356,13 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
398
356
|
*
|
|
399
357
|
* TODO: this implementation will change once the zero value is changed from h(0,0,0). Changes incoming over the next sprint
|
|
400
358
|
* @param leaves - Values to insert into the tree.
|
|
401
|
-
* @param treeHeight - Height of the tree.
|
|
402
359
|
* @param subtreeHeight - Height of the subtree.
|
|
403
360
|
* @returns The data for the leaves to be updated when inserting the new ones.
|
|
404
361
|
*/
|
|
405
|
-
async batchInsert(leaves,
|
|
362
|
+
async batchInsert(leaves, subtreeHeight) {
|
|
406
363
|
// Keep track of touched low leaves
|
|
407
364
|
const touched = new Map();
|
|
408
|
-
const emptyLowLeafWitness = getEmptyLowLeafWitness(
|
|
365
|
+
const emptyLowLeafWitness = getEmptyLowLeafWitness(this.getDepth());
|
|
409
366
|
// Accumulators
|
|
410
367
|
const lowLeavesWitnesses = [];
|
|
411
368
|
const pendingInsertionSubtree = [];
|
|
@@ -421,7 +378,7 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
421
378
|
continue;
|
|
422
379
|
}
|
|
423
380
|
const indexOfPrevious = this.findIndexOfPreviousValue(newValue, true);
|
|
424
|
-
// If a touched node has a value that is less
|
|
381
|
+
// If a touched node has a value that is less than the current value
|
|
425
382
|
const prevNodes = touched.get(indexOfPrevious.index);
|
|
426
383
|
if (prevNodes && prevNodes.some(v => v < newValue)) {
|
|
427
384
|
// check the pending low nullifiers for a low nullifier that works
|
|
@@ -477,14 +434,16 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
477
434
|
pendingInsertionSubtree.push(currentLowLeaf);
|
|
478
435
|
lowLeaf.nextValue = newValue;
|
|
479
436
|
lowLeaf.nextIndex = startInsertionIndex + BigInt(i);
|
|
480
|
-
|
|
437
|
+
const lowLeafIndex = indexOfPrevious.index;
|
|
438
|
+
this.cachedLeaves[lowLeafIndex] = lowLeaf;
|
|
439
|
+
await this.updateLeaf(lowLeaf, BigInt(lowLeafIndex));
|
|
481
440
|
}
|
|
482
441
|
}
|
|
483
442
|
const newSubtreeSiblingPath = await this.getSubtreeSiblingPath(subtreeHeight, true);
|
|
484
443
|
// Perform batch insertion of new pending values
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
444
|
+
// Note: In this case we set `hash0Leaf` param to false because batch insertion algorithm use forced null leaf
|
|
445
|
+
// inclusion. See {@link encodeLeaf} for a more through param explanation.
|
|
446
|
+
await this.encodeAndAppendLeaves(pendingInsertionSubtree, false);
|
|
488
447
|
return [lowLeavesWitnesses, newSubtreeSiblingPath];
|
|
489
448
|
}
|
|
490
449
|
async getSubtreeSiblingPath(subtreeHeight, includeUncommitted) {
|
|
@@ -493,5 +452,37 @@ export class StandardIndexedTree extends TreeBase {
|
|
|
493
452
|
// Drop the first subtreeHeight items since we only care about the path to the subtree root
|
|
494
453
|
return fullSiblingPath.getSubtreeSiblingPath(subtreeHeight);
|
|
495
454
|
}
|
|
455
|
+
/**
|
|
456
|
+
* Encodes leaves and appends them to a tree.
|
|
457
|
+
* @param leaves - Leaves to encode.
|
|
458
|
+
* @param hash0Leaf - Indicates whether 0 value leaf should be hashed. See {@link encodeLeaf}.
|
|
459
|
+
* @returns Empty promise
|
|
460
|
+
*/
|
|
461
|
+
async encodeAndAppendLeaves(leaves, hash0Leaf) {
|
|
462
|
+
const startInsertionIndex = Number(this.getNumLeaves(true));
|
|
463
|
+
const serialisedLeaves = leaves.map((leaf, i) => {
|
|
464
|
+
this.cachedLeaves[startInsertionIndex + i] = leaf;
|
|
465
|
+
return this.encodeLeaf(leaf, hash0Leaf);
|
|
466
|
+
});
|
|
467
|
+
await super.appendLeaves(serialisedLeaves);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Encode a leaf into a buffer.
|
|
471
|
+
* @param leaf - Leaf to encode.
|
|
472
|
+
* @param hash0Leaf - Indicates whether 0 value leaf should be hashed. Not hashing 0 value can represent a forced
|
|
473
|
+
* null leaf insertion. Detecting this case by checking for 0 value is safe as in the case of
|
|
474
|
+
* nullifier it is improbable that a valid nullifier would be 0.
|
|
475
|
+
* @returns Leaf encoded in a buffer.
|
|
476
|
+
*/
|
|
477
|
+
encodeLeaf(leaf, hash0Leaf) {
|
|
478
|
+
let encodedLeaf;
|
|
479
|
+
if (!hash0Leaf && leaf.value == 0n) {
|
|
480
|
+
encodedLeaf = toBufferBE(0n, 32);
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
encodedLeaf = this.hasher.compressInputs([leaf.value, leaf.nextIndex, leaf.nextValue].map(val => toBufferBE(val, 32)));
|
|
484
|
+
}
|
|
485
|
+
return encodedLeaf;
|
|
486
|
+
}
|
|
496
487
|
}
|
|
497
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRfaW5kZXhlZF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YW5kYXJkX2luZGV4ZWRfdHJlZS9zdGFuZGFyZF9pbmRleGVkX3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFFeEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEVBQUU7SUFDckQsT0FBTyxHQUFHLElBQUksU0FBUyxLQUFLLEVBQUUsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBYTtJQUN6QixLQUFLLEVBQUUsRUFBRTtJQUNULFNBQVMsRUFBRSxFQUFFO0lBQ2IsU0FBUyxFQUFFLEVBQUU7Q0FDZCxDQUFDO0FBb0JGOzs7O0dBSUc7QUFDSCxTQUFTLHNCQUFzQixDQUFtQixVQUFhO0lBQzdELE9BQU87UUFDTCxRQUFRLEVBQUUsUUFBUTtRQUNsQixLQUFLLEVBQUUsRUFBRTtRQUNULFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDckYsQ0FBQztBQUNKLENBQUM7QUFFRCw2REFBNkQ7QUFDN0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFrQixFQUFFLEVBQUU7SUFDN0MsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFFB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
|
|
488
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRfaW5kZXhlZF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YW5kYXJkX2luZGV4ZWRfdHJlZS9zdGFuZGFyZF9pbmRleGVkX3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFFeEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEVBQUU7SUFDckQsT0FBTyxHQUFHLElBQUksU0FBUyxLQUFLLEVBQUUsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBYTtJQUN6QixLQUFLLEVBQUUsRUFBRTtJQUNULFNBQVMsRUFBRSxFQUFFO0lBQ2IsU0FBUyxFQUFFLEVBQUU7Q0FDZCxDQUFDO0FBb0JGOzs7O0dBSUc7QUFDSCxTQUFTLHNCQUFzQixDQUFtQixVQUFhO0lBQzdELE9BQU87UUFDTCxRQUFRLEVBQUUsUUFBUTtRQUNsQixLQUFLLEVBQUUsRUFBRTtRQUNULFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDckYsQ0FBQztBQUNKLENBQUM7QUFFRCw2REFBNkQ7QUFDN0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFrQixFQUFFLEVBQUU7SUFDN0MsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFFB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard_indexed_tree.test.d.ts","sourceRoot":"","sources":["../../../src/standard_indexed_tree/test/standard_indexed_tree.test.ts"],"names":[],"mappings":""}
|