@aztec/merkle-tree 0.7.10 → 0.8.5
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/standard_indexed_tree/standard_indexed_tree.js +2 -2
- package/package.json +57 -5
- package/src/standard_indexed_tree/standard_indexed_tree.ts +2 -2
- package/.eslintrc.cjs +0 -1
- package/.tsbuildinfo +0 -1
- package/dest/sparse_tree/sparse_tree.test.d.ts +0 -2
- package/dest/sparse_tree/sparse_tree.test.d.ts.map +0 -1
- package/dest/sparse_tree/sparse_tree.test.js +0 -133
- package/dest/standard_indexed_tree/test/standard_indexed_tree.test.d.ts +0 -2
- package/dest/standard_indexed_tree/test/standard_indexed_tree.test.d.ts.map +0 -1
- package/dest/standard_indexed_tree/test/standard_indexed_tree.test.js +0 -336
- package/dest/standard_tree/standard_tree.test.d.ts +0 -2
- package/dest/standard_tree/standard_tree.test.d.ts.map +0 -1
- package/dest/standard_tree/standard_tree.test.js +0 -58
- package/dest/test/standard_based_test_suite.d.ts +0 -6
- package/dest/test/standard_based_test_suite.d.ts.map +0 -1
- package/dest/test/standard_based_test_suite.js +0 -87
- package/dest/test/test_suite.d.ts +0 -6
- package/dest/test/test_suite.d.ts.map +0 -1
- package/dest/test/test_suite.js +0 -119
- package/dest/test/utils/append_leaves.d.ts +0 -5
- package/dest/test/utils/append_leaves.d.ts.map +0 -1
- package/dest/test/utils/append_leaves.js +0 -14
- package/dest/test/utils/create_mem_down.d.ts +0 -3
- package/dest/test/utils/create_mem_down.d.ts.map +0 -1
- package/dest/test/utils/create_mem_down.js +0 -3
- package/dest/test/utils/pedersen_with_counter.d.ts +0 -24
- package/dest/test/utils/pedersen_with_counter.d.ts.map +0 -1
- package/dest/test/utils/pedersen_with_counter.js +0 -31
- package/package.local.json +0 -3
- package/src/sparse_tree/sparse_tree.test.ts +0 -179
- package/src/standard_indexed_tree/test/standard_indexed_tree.test.ts +0 -476
- package/src/standard_tree/standard_tree.test.ts +0 -76
- package/src/test/standard_based_test_suite.ts +0 -142
- package/src/test/test_suite.ts +0 -165
- package/src/test/utils/append_leaves.ts +0 -15
- package/src/test/utils/create_mem_down.ts +0 -3
- package/src/test/utils/pedersen_with_counter.ts +0 -30
- package/tsconfig.json +0 -20
package/dest/test/test_suite.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { CircuitsWasm } from '@aztec/circuits.js';
|
|
2
|
-
import { SiblingPath } from '@aztec/types';
|
|
3
|
-
import { default as levelup } from 'levelup';
|
|
4
|
-
import { Pedersen } from '../index.js';
|
|
5
|
-
import { appendLeaves } from './utils/append_leaves.js';
|
|
6
|
-
import { createMemDown } from './utils/create_mem_down.js';
|
|
7
|
-
const expectSameTrees = async (tree1, tree2, includeUncommitted = true) => {
|
|
8
|
-
const size = tree1.getNumLeaves(includeUncommitted);
|
|
9
|
-
expect(size).toBe(tree2.getNumLeaves(includeUncommitted));
|
|
10
|
-
expect(tree1.getRoot(includeUncommitted).toString('hex')).toBe(tree2.getRoot(includeUncommitted).toString('hex'));
|
|
11
|
-
for (let i = 0; i < size; ++i) {
|
|
12
|
-
const siblingPath1 = await tree1.getSiblingPath(BigInt(i), includeUncommitted);
|
|
13
|
-
const siblingPath2 = await tree2.getSiblingPath(BigInt(i), includeUncommitted);
|
|
14
|
-
expect(siblingPath2).toStrictEqual(siblingPath1);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
export const treeTestSuite = (testName, createDb, createFromName) => {
|
|
18
|
-
describe(testName, () => {
|
|
19
|
-
const values = [];
|
|
20
|
-
let wasm;
|
|
21
|
-
let pedersen;
|
|
22
|
-
beforeAll(() => {
|
|
23
|
-
for (let i = 0; i < 32; ++i) {
|
|
24
|
-
const v = Buffer.alloc(32, i + 1);
|
|
25
|
-
v.writeUInt32BE(i, 28);
|
|
26
|
-
values[i] = v;
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
beforeEach(async () => {
|
|
30
|
-
wasm = await CircuitsWasm.get();
|
|
31
|
-
pedersen = new Pedersen(wasm);
|
|
32
|
-
});
|
|
33
|
-
it('should revert changes on rollback', async () => {
|
|
34
|
-
const levelDownEmpty = createMemDown();
|
|
35
|
-
const dbEmpty = levelup(levelDownEmpty);
|
|
36
|
-
const emptyTree = await createDb(dbEmpty, pedersen, 'test', 10);
|
|
37
|
-
const levelDown = createMemDown();
|
|
38
|
-
const db = levelup(levelDown);
|
|
39
|
-
const tree = await createDb(db, pedersen, 'test2', 10);
|
|
40
|
-
await appendLeaves(tree, values.slice(0, 4));
|
|
41
|
-
const firstRoot = tree.getRoot(true);
|
|
42
|
-
expect(firstRoot).not.toEqual(emptyTree.getRoot(true));
|
|
43
|
-
// committed root should still be the empty root
|
|
44
|
-
expect(tree.getRoot(false)).toEqual(emptyTree.getRoot(false));
|
|
45
|
-
await tree.rollback();
|
|
46
|
-
// both committed and uncommitted trees should be equal to the empty tree
|
|
47
|
-
await expectSameTrees(tree, emptyTree, true);
|
|
48
|
-
await expectSameTrees(tree, emptyTree, false);
|
|
49
|
-
// append the leaves again
|
|
50
|
-
await appendLeaves(tree, values.slice(0, 4));
|
|
51
|
-
expect(tree.getRoot(true)).toEqual(firstRoot);
|
|
52
|
-
// committed root should still be the empty root
|
|
53
|
-
expect(tree.getRoot(false)).toEqual(emptyTree.getRoot(false));
|
|
54
|
-
expect(firstRoot).not.toEqual(emptyTree.getRoot(true));
|
|
55
|
-
await tree.rollback();
|
|
56
|
-
// both committed and uncommitted trees should be equal to the empty tree
|
|
57
|
-
await expectSameTrees(tree, emptyTree, true);
|
|
58
|
-
await expectSameTrees(tree, emptyTree, false);
|
|
59
|
-
});
|
|
60
|
-
it('should not revert changes after commit', async () => {
|
|
61
|
-
const levelDownEmpty = createMemDown();
|
|
62
|
-
const dbEmpty = levelup(levelDownEmpty);
|
|
63
|
-
const emptyTree = await createDb(dbEmpty, pedersen, 'test', 10);
|
|
64
|
-
const levelDown = createMemDown();
|
|
65
|
-
const db = levelup(levelDown);
|
|
66
|
-
const tree = await createDb(db, pedersen, 'test2', 10);
|
|
67
|
-
await appendLeaves(tree, values.slice(0, 4));
|
|
68
|
-
expect(tree.getRoot(true)).not.toEqual(emptyTree.getRoot(true));
|
|
69
|
-
// committed root should still be the empty root
|
|
70
|
-
expect(tree.getRoot(false)).toEqual(emptyTree.getRoot(false));
|
|
71
|
-
await tree.commit();
|
|
72
|
-
await tree.rollback();
|
|
73
|
-
expect(tree.getRoot(true)).not.toEqual(emptyTree.getRoot(true));
|
|
74
|
-
expect(tree.getRoot(false)).not.toEqual(emptyTree.getRoot(true));
|
|
75
|
-
});
|
|
76
|
-
it('should be able to restore from previous committed data', async () => {
|
|
77
|
-
const levelDown = createMemDown();
|
|
78
|
-
const db = levelup(levelDown);
|
|
79
|
-
const tree = await createDb(db, pedersen, 'test', 10);
|
|
80
|
-
await appendLeaves(tree, values.slice(0, 4));
|
|
81
|
-
await tree.commit();
|
|
82
|
-
const db2 = levelup(levelDown);
|
|
83
|
-
const tree2 = await createFromName(db2, pedersen, 'test');
|
|
84
|
-
// both committed and uncommitted should be equal to the restored data
|
|
85
|
-
expect(tree.getRoot(true)).toEqual(tree2.getRoot(true));
|
|
86
|
-
expect(tree.getRoot(false)).toEqual(tree2.getRoot(false));
|
|
87
|
-
for (let i = 0; i < 4; ++i) {
|
|
88
|
-
expect(await tree.getSiblingPath(BigInt(i), true)).toEqual(await tree2.getSiblingPath(BigInt(i), true));
|
|
89
|
-
expect(await tree.getSiblingPath(BigInt(i), false)).toEqual(await tree2.getSiblingPath(BigInt(i), false));
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
it('should throw an error if previous data does not exist for the given name', async () => {
|
|
93
|
-
const db = levelup(createMemDown());
|
|
94
|
-
await expect((async () => {
|
|
95
|
-
await createFromName(db, pedersen, 'a_whole_new_tree');
|
|
96
|
-
})()).rejects.toThrow();
|
|
97
|
-
});
|
|
98
|
-
it('should serialize sibling path data to a buffer and be able to deserialize it back', async () => {
|
|
99
|
-
const db = levelup(createMemDown());
|
|
100
|
-
const tree = await createDb(db, pedersen, 'test', 10);
|
|
101
|
-
await appendLeaves(tree, values.slice(0, 1));
|
|
102
|
-
const siblingPath = await tree.getSiblingPath(0n, true);
|
|
103
|
-
const buf = siblingPath.toBuffer();
|
|
104
|
-
const recovered = SiblingPath.fromBuffer(buf);
|
|
105
|
-
expect(recovered).toEqual(siblingPath);
|
|
106
|
-
const deserialized = SiblingPath.deserialize(buf);
|
|
107
|
-
expect(deserialized.elem).toEqual(siblingPath);
|
|
108
|
-
expect(deserialized.adv).toBe(4 + 10 * 32);
|
|
109
|
-
const dummyData = Buffer.alloc(23, 1);
|
|
110
|
-
const paddedBuf = Buffer.concat([dummyData, buf]);
|
|
111
|
-
const recovered2 = SiblingPath.fromBuffer(paddedBuf, 23);
|
|
112
|
-
expect(recovered2).toEqual(siblingPath);
|
|
113
|
-
const deserialized2 = SiblingPath.deserialize(buf);
|
|
114
|
-
expect(deserialized2.elem).toEqual(siblingPath);
|
|
115
|
-
expect(deserialized2.adv).toBe(4 + 10 * 32);
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
};
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9zdWl0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE9BQU8sRUFBVSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkQsT0FBTyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE1BQU0sZUFBZSxHQUFHLEtBQUssRUFDM0IsS0FBc0MsRUFDdEMsS0FBc0MsRUFDdEMsa0JBQWtCLEdBQUcsSUFBSSxFQUN6QixFQUFFO0lBQ0YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRWxILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDN0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sWUFBWSxHQUFHLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUMvRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ2xEO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQzNCLFFBQWdCLEVBQ2hCLFFBSzZDLEVBQzdDLGNBQW9ILEVBQ3BILEVBQUU7SUFDRixRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN0QixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFpQixDQUFDO1FBQ3RCLElBQUksUUFBa0IsQ0FBQztRQUV2QixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDM0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNmO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRCxNQUFNLGNBQWMsR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFaEUsTUFBTSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELGdEQUFnRDtZQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFOUQsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFdEIseUVBQXlFO1lBQ3pFLE1BQU0sZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsTUFBTSxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUU5QywwQkFBMEI7WUFDMUIsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsZ0RBQWdEO1lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUU5RCxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFdkQsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFdEIseUVBQXlFO1lBQ3pFLE1BQU0sZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsTUFBTSxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RCxNQUFNLGNBQWMsR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFaEUsTUFBTSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEUsZ0RBQWdEO1lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUU5RCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUV0QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEUsTUFBTSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRXBCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQixNQUFNLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTFELHNFQUFzRTtZQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQzFCLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQzNHO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMEVBQTBFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDeEYsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDcEMsTUFBTSxNQUFNLENBQ1YsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDVixNQUFNLGNBQWMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRkFBbUYsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RCxNQUFNLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU3QyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hELE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIn0=
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { AppendOnlyTree } from '../../interfaces/append_only_tree.js';
|
|
3
|
-
import { UpdateOnlyTree } from '../../interfaces/update_only_tree.js';
|
|
4
|
-
export declare const appendLeaves: (tree: AppendOnlyTree | UpdateOnlyTree, leaves: Buffer[]) => Promise<void>;
|
|
5
|
-
//# sourceMappingURL=append_leaves.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"append_leaves.d.ts","sourceRoot":"","sources":["../../../src/test/utils/append_leaves.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,eAAO,MAAM,YAAY,SAAgB,cAAc,GAAG,cAAc,UAAU,MAAM,EAAE,kBAWzF,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export const appendLeaves = async (tree, leaves) => {
|
|
2
|
-
if ('appendLeaves' in tree) {
|
|
3
|
-
// This branch is used by the standard tree test suite, which implements appendLeaves
|
|
4
|
-
await tree.appendLeaves(leaves);
|
|
5
|
-
}
|
|
6
|
-
else {
|
|
7
|
-
// This branch is used by the sparse tree test suite, which does not implement appendLeaves
|
|
8
|
-
for (const value of leaves) {
|
|
9
|
-
const index = tree.getNumLeaves(true);
|
|
10
|
-
await tree.updateLeaf(value, index);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZW5kX2xlYXZlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0L3V0aWxzL2FwcGVuZF9sZWF2ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxJQUFxQyxFQUFFLE1BQWdCLEVBQUUsRUFBRTtJQUM1RixJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7UUFDMUIscUZBQXFGO1FBQ3JGLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNqQztTQUFNO1FBQ0wsMkZBQTJGO1FBQzNGLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO1lBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNyQztLQUNGO0FBQ0gsQ0FBQyxDQUFDIn0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create_mem_down.d.ts","sourceRoot":"","sources":["../../../src/test/utils/create_mem_down.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAsB,MAAM,SAAS,CAAC;AAE3D,eAAO,MAAM,aAAa,yBAAgD,CAAC"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { default as memdown } from 'memdown';
|
|
2
|
-
export const createMemDown = () => memdown();
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX21lbV9kb3duLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3QvdXRpbHMvY3JlYXRlX21lbV9kb3duLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUUsT0FBZSxFQUF1QixDQUFDIn0=
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { Pedersen } from '../../index.js';
|
|
3
|
-
/**
|
|
4
|
-
* A test utility allowing us to count the number of times the compress function has been called.
|
|
5
|
-
*/
|
|
6
|
-
export declare class PedersenWithCounter extends Pedersen {
|
|
7
|
-
/**
|
|
8
|
-
* The number of times the compress function has been called.
|
|
9
|
-
*/
|
|
10
|
-
compressCounter: number;
|
|
11
|
-
/**
|
|
12
|
-
* Compresses two 32-byte hashes.
|
|
13
|
-
* @param lhs - The first hash.
|
|
14
|
-
* @param rhs - The second hash.
|
|
15
|
-
* @returns The new 32-byte hash.
|
|
16
|
-
*/
|
|
17
|
-
compress(lhs: Uint8Array, rhs: Uint8Array): Buffer;
|
|
18
|
-
/**
|
|
19
|
-
* Resets the compress counter.
|
|
20
|
-
* @returns void
|
|
21
|
-
*/
|
|
22
|
-
resetCounter(): void;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=pedersen_with_counter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pedersen_with_counter.d.ts","sourceRoot":"","sources":["../../../src/test/utils/pedersen_with_counter.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;IAC/C;;OAEG;IACI,eAAe,SAAK;IAE3B;;;;;OAKG;IACI,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM;IAKzD;;;OAGG;IACI,YAAY;CAGpB"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Pedersen } from '../../index.js';
|
|
2
|
-
/**
|
|
3
|
-
* A test utility allowing us to count the number of times the compress function has been called.
|
|
4
|
-
*/
|
|
5
|
-
export class PedersenWithCounter extends Pedersen {
|
|
6
|
-
constructor() {
|
|
7
|
-
super(...arguments);
|
|
8
|
-
/**
|
|
9
|
-
* The number of times the compress function has been called.
|
|
10
|
-
*/
|
|
11
|
-
this.compressCounter = 0;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Compresses two 32-byte hashes.
|
|
15
|
-
* @param lhs - The first hash.
|
|
16
|
-
* @param rhs - The second hash.
|
|
17
|
-
* @returns The new 32-byte hash.
|
|
18
|
-
*/
|
|
19
|
-
compress(lhs, rhs) {
|
|
20
|
-
this.compressCounter++;
|
|
21
|
-
return super.compress(lhs, rhs);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Resets the compress counter.
|
|
25
|
-
* @returns void
|
|
26
|
-
*/
|
|
27
|
-
resetCounter() {
|
|
28
|
-
this.compressCounter = 0;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVkZXJzZW5fd2l0aF9jb3VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3QvdXRpbHMvcGVkZXJzZW5fd2l0aF9jb3VudGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQzs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxRQUFRO0lBQWpEOztRQUNFOztXQUVHO1FBQ0ksb0JBQWUsR0FBRyxDQUFDLENBQUM7SUFvQjdCLENBQUM7SUFsQkM7Ozs7O09BS0c7SUFDSSxRQUFRLENBQUMsR0FBZSxFQUFFLEdBQWU7UUFDOUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFlBQVk7UUFDakIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztDQUNGIn0=
|
package/package.local.json
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import { CircuitsWasm } from '@aztec/circuits.js';
|
|
2
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { IWasmModule } from '@aztec/foundation/wasm';
|
|
4
|
-
import { Hasher, SiblingPath } from '@aztec/types';
|
|
5
|
-
|
|
6
|
-
import { randomBytes } from 'crypto';
|
|
7
|
-
import { default as levelup } from 'levelup';
|
|
8
|
-
|
|
9
|
-
import { INITIAL_LEAF, newTree } from '../index.js';
|
|
10
|
-
import { UpdateOnlyTree } from '../interfaces/update_only_tree.js';
|
|
11
|
-
import { loadTree } from '../load_tree.js';
|
|
12
|
-
import { Pedersen } from '../pedersen.js';
|
|
13
|
-
import { standardBasedTreeTestSuite } from '../test/standard_based_test_suite.js';
|
|
14
|
-
import { treeTestSuite } from '../test/test_suite.js';
|
|
15
|
-
import { createMemDown } from '../test/utils/create_mem_down.js';
|
|
16
|
-
import { SparseTree } from './sparse_tree.js';
|
|
17
|
-
|
|
18
|
-
const log = createDebugLogger('aztec:sparse_tree_test');
|
|
19
|
-
|
|
20
|
-
const createDb = async (
|
|
21
|
-
levelUp: levelup.LevelUp,
|
|
22
|
-
hasher: Hasher,
|
|
23
|
-
name: string,
|
|
24
|
-
depth: number,
|
|
25
|
-
): Promise<UpdateOnlyTree> => {
|
|
26
|
-
return await newTree(SparseTree, levelUp, hasher, name, depth);
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const createFromName = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string): Promise<UpdateOnlyTree> => {
|
|
30
|
-
return await loadTree(SparseTree, levelUp, hasher, name);
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const TEST_TREE_DEPTH = 3;
|
|
34
|
-
|
|
35
|
-
treeTestSuite('SparseTree', createDb, createFromName);
|
|
36
|
-
standardBasedTreeTestSuite('SparseTree', createDb);
|
|
37
|
-
|
|
38
|
-
describe('SparseTreeSpecific', () => {
|
|
39
|
-
let wasm: IWasmModule;
|
|
40
|
-
let pedersen: Pedersen;
|
|
41
|
-
|
|
42
|
-
beforeEach(async () => {
|
|
43
|
-
wasm = await CircuitsWasm.get();
|
|
44
|
-
pedersen = new Pedersen(wasm);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('throws when index is bigger than (2^DEPTH - 1) ', async () => {
|
|
48
|
-
const db = levelup(createMemDown());
|
|
49
|
-
const depth = 32;
|
|
50
|
-
const tree = await createDb(db, pedersen, 'test', depth);
|
|
51
|
-
|
|
52
|
-
const index = 2n ** BigInt(depth);
|
|
53
|
-
await expect(tree.updateLeaf(Buffer.alloc(32), index)).rejects.toThrow();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('updating non-empty leaf does not change tree size', async () => {
|
|
57
|
-
const depth = 32;
|
|
58
|
-
const maxIndex = 2 ** depth - 1;
|
|
59
|
-
|
|
60
|
-
const db = levelup(createMemDown());
|
|
61
|
-
const tree = await createDb(db, pedersen, 'test', depth);
|
|
62
|
-
|
|
63
|
-
const randomIndex = BigInt(Math.floor(Math.random() * maxIndex));
|
|
64
|
-
expect(tree.getNumLeaves(false)).toEqual(0n);
|
|
65
|
-
|
|
66
|
-
// Insert a leaf
|
|
67
|
-
await tree.updateLeaf(randomBytes(32), randomIndex);
|
|
68
|
-
expect(tree.getNumLeaves(true)).toEqual(1n);
|
|
69
|
-
|
|
70
|
-
// Update a leaf
|
|
71
|
-
await tree.updateLeaf(randomBytes(32), randomIndex);
|
|
72
|
-
expect(tree.getNumLeaves(true)).toEqual(1n);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('deleting leaf decrements tree size', async () => {
|
|
76
|
-
const depth = 254;
|
|
77
|
-
const maxIndex = 2 ** depth - 1;
|
|
78
|
-
|
|
79
|
-
const db = levelup(createMemDown());
|
|
80
|
-
const tree = await createDb(db, pedersen, 'test', depth);
|
|
81
|
-
|
|
82
|
-
const randomIndex = BigInt(Math.floor(Math.random() * maxIndex));
|
|
83
|
-
expect(tree.getNumLeaves(false)).toEqual(0n);
|
|
84
|
-
|
|
85
|
-
// Insert a leaf
|
|
86
|
-
await tree.updateLeaf(randomBytes(32), randomIndex);
|
|
87
|
-
expect(tree.getNumLeaves(true)).toEqual(1n);
|
|
88
|
-
|
|
89
|
-
// Delete a leaf
|
|
90
|
-
await tree.updateLeaf(INITIAL_LEAF, randomIndex);
|
|
91
|
-
expect(tree.getNumLeaves(true)).toEqual(0n);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('should have correct root and sibling path after in a "non-append-only" way', async () => {
|
|
95
|
-
const db = levelup(createMemDown());
|
|
96
|
-
const tree = await createDb(db, pedersen, 'test', 3);
|
|
97
|
-
|
|
98
|
-
const level2ZeroHash = pedersen.compress(INITIAL_LEAF, INITIAL_LEAF);
|
|
99
|
-
const level1ZeroHash = pedersen.compress(level2ZeroHash, level2ZeroHash);
|
|
100
|
-
|
|
101
|
-
expect(tree.getNumLeaves(false)).toEqual(0n);
|
|
102
|
-
expect(tree.getRoot(false)).toEqual(pedersen.compress(level1ZeroHash, level1ZeroHash));
|
|
103
|
-
|
|
104
|
-
// Insert leaf at index 3
|
|
105
|
-
let level1LeftHash: Buffer;
|
|
106
|
-
const leafAtIndex3 = randomBytes(32);
|
|
107
|
-
{
|
|
108
|
-
await tree.updateLeaf(leafAtIndex3, 3n);
|
|
109
|
-
expect(tree.getNumLeaves(true)).toEqual(1n);
|
|
110
|
-
const level2Hash = pedersen.compress(INITIAL_LEAF, leafAtIndex3);
|
|
111
|
-
level1LeftHash = pedersen.compress(level2ZeroHash, level2Hash);
|
|
112
|
-
const root = pedersen.compress(level1LeftHash, level1ZeroHash);
|
|
113
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
114
|
-
expect(await tree.getSiblingPath(3n, true)).toEqual(
|
|
115
|
-
new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level2ZeroHash, level1ZeroHash]),
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Insert leaf at index 6
|
|
120
|
-
let level1RightHash: Buffer;
|
|
121
|
-
{
|
|
122
|
-
const leafAtIndex6 = randomBytes(32);
|
|
123
|
-
await tree.updateLeaf(leafAtIndex6, 6n);
|
|
124
|
-
expect(tree.getNumLeaves(true)).toEqual(2n);
|
|
125
|
-
const level2Hash = pedersen.compress(leafAtIndex6, INITIAL_LEAF);
|
|
126
|
-
level1RightHash = pedersen.compress(level2ZeroHash, level2Hash);
|
|
127
|
-
const root = pedersen.compress(level1LeftHash, level1RightHash);
|
|
128
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
129
|
-
expect(await tree.getSiblingPath(6n, true)).toEqual(
|
|
130
|
-
new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level2ZeroHash, level1LeftHash]),
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Insert leaf at index 2
|
|
135
|
-
const leafAtIndex2 = randomBytes(32);
|
|
136
|
-
{
|
|
137
|
-
await tree.updateLeaf(leafAtIndex2, 2n);
|
|
138
|
-
expect(tree.getNumLeaves(true)).toEqual(3n);
|
|
139
|
-
const level2Hash = pedersen.compress(leafAtIndex2, leafAtIndex3);
|
|
140
|
-
level1LeftHash = pedersen.compress(level2ZeroHash, level2Hash);
|
|
141
|
-
const root = pedersen.compress(level1LeftHash, level1RightHash);
|
|
142
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
143
|
-
expect(await tree.getSiblingPath(2n, true)).toEqual(
|
|
144
|
-
new SiblingPath(TEST_TREE_DEPTH, [leafAtIndex3, level2ZeroHash, level1RightHash]),
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Updating leaf at index 3
|
|
149
|
-
{
|
|
150
|
-
const updatedLeafAtIndex3 = randomBytes(32);
|
|
151
|
-
await tree.updateLeaf(updatedLeafAtIndex3, 3n);
|
|
152
|
-
expect(tree.getNumLeaves(true)).toEqual(3n);
|
|
153
|
-
const level2Hash = pedersen.compress(leafAtIndex2, updatedLeafAtIndex3);
|
|
154
|
-
level1LeftHash = pedersen.compress(level2ZeroHash, level2Hash);
|
|
155
|
-
const root = pedersen.compress(level1LeftHash, level1RightHash);
|
|
156
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
157
|
-
expect(await tree.getSiblingPath(3n, true)).toEqual(
|
|
158
|
-
new SiblingPath(TEST_TREE_DEPTH, [leafAtIndex2, level2ZeroHash, level1RightHash]),
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// This one is a performance measurement and is enabled only to check regression in performance.
|
|
164
|
-
it.skip('measures time of inserting 1000 leaves at random positions for depth 254', async () => {
|
|
165
|
-
const depth = 254;
|
|
166
|
-
const maxIndex = 2 ** depth - 1;
|
|
167
|
-
|
|
168
|
-
const db = levelup(createMemDown());
|
|
169
|
-
const tree = await createDb(db, pedersen, 'test', depth);
|
|
170
|
-
|
|
171
|
-
const leaves = Array.from({ length: 1000 }).map(() => randomBytes(32));
|
|
172
|
-
const indices = Array.from({ length: 1000 }).map(() => BigInt(Math.floor(Math.random() * maxIndex)));
|
|
173
|
-
|
|
174
|
-
const start = Date.now();
|
|
175
|
-
await Promise.all(leaves.map((leaf, i) => tree.updateLeaf(leaf, indices[i])));
|
|
176
|
-
const end = Date.now();
|
|
177
|
-
log(`Inserting 1000 leaves at random positions for depth 254 took ${end - start}ms`);
|
|
178
|
-
}, 300_000);
|
|
179
|
-
});
|