@feelyourprotocol/binarytree 8141.0.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/LICENSE +22 -0
- package/README.md +46 -0
- package/dist/cjs/binaryTree.d.ts +167 -0
- package/dist/cjs/binaryTree.d.ts.map +1 -0
- package/dist/cjs/binaryTree.js +606 -0
- package/dist/cjs/binaryTree.js.map +1 -0
- package/dist/cjs/constructors.d.ts +4 -0
- package/dist/cjs/constructors.d.ts.map +1 -0
- package/dist/cjs/constructors.js +44 -0
- package/dist/cjs/constructors.js.map +1 -0
- package/dist/cjs/db/checkpoint.d.ts +87 -0
- package/dist/cjs/db/checkpoint.d.ts.map +1 -0
- package/dist/cjs/db/checkpoint.js +257 -0
- package/dist/cjs/db/checkpoint.js.map +1 -0
- package/dist/cjs/db/index.d.ts +2 -0
- package/dist/cjs/db/index.d.ts.map +1 -0
- package/dist/cjs/db/index.js +18 -0
- package/dist/cjs/db/index.js.map +1 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +23 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/node/index.d.ts +4 -0
- package/dist/cjs/node/index.d.ts.map +1 -0
- package/dist/cjs/node/index.js +20 -0
- package/dist/cjs/node/index.js.map +1 -0
- package/dist/cjs/node/internalNode.d.ts +37 -0
- package/dist/cjs/node/internalNode.d.ts.map +1 -0
- package/dist/cjs/node/internalNode.js +92 -0
- package/dist/cjs/node/internalNode.js.map +1 -0
- package/dist/cjs/node/stemNode.d.ts +34 -0
- package/dist/cjs/node/stemNode.d.ts.map +1 -0
- package/dist/cjs/node/stemNode.js +75 -0
- package/dist/cjs/node/stemNode.js.map +1 -0
- package/dist/cjs/node/types.d.ts +35 -0
- package/dist/cjs/node/types.d.ts.map +1 -0
- package/dist/cjs/node/types.js +9 -0
- package/dist/cjs/node/types.js.map +1 -0
- package/dist/cjs/node/util.d.ts +9 -0
- package/dist/cjs/node/util.d.ts.map +1 -0
- package/dist/cjs/node/util.js +40 -0
- package/dist/cjs/node/util.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/proof.d.ts +16 -0
- package/dist/cjs/proof.d.ts.map +1 -0
- package/dist/cjs/proof.js +49 -0
- package/dist/cjs/proof.js.map +1 -0
- package/dist/cjs/types.d.ts +45 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/util.d.ts +17 -0
- package/dist/cjs/util.d.ts.map +1 -0
- package/dist/cjs/util.js +71 -0
- package/dist/cjs/util.js.map +1 -0
- package/dist/esm/binaryTree.d.ts +167 -0
- package/dist/esm/binaryTree.d.ts.map +1 -0
- package/dist/esm/binaryTree.js +602 -0
- package/dist/esm/binaryTree.js.map +1 -0
- package/dist/esm/constructors.d.ts +4 -0
- package/dist/esm/constructors.d.ts.map +1 -0
- package/dist/esm/constructors.js +41 -0
- package/dist/esm/constructors.js.map +1 -0
- package/dist/esm/db/checkpoint.d.ts +87 -0
- package/dist/esm/db/checkpoint.d.ts.map +1 -0
- package/dist/esm/db/checkpoint.js +253 -0
- package/dist/esm/db/checkpoint.js.map +1 -0
- package/dist/esm/db/index.d.ts +2 -0
- package/dist/esm/db/index.d.ts.map +1 -0
- package/dist/esm/db/index.js +2 -0
- package/dist/esm/db/index.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/node/index.d.ts +4 -0
- package/dist/esm/node/index.d.ts.map +1 -0
- package/dist/esm/node/index.js +4 -0
- package/dist/esm/node/index.js.map +1 -0
- package/dist/esm/node/internalNode.d.ts +37 -0
- package/dist/esm/node/internalNode.d.ts.map +1 -0
- package/dist/esm/node/internalNode.js +88 -0
- package/dist/esm/node/internalNode.js.map +1 -0
- package/dist/esm/node/stemNode.d.ts +34 -0
- package/dist/esm/node/stemNode.d.ts.map +1 -0
- package/dist/esm/node/stemNode.js +71 -0
- package/dist/esm/node/stemNode.js.map +1 -0
- package/dist/esm/node/types.d.ts +35 -0
- package/dist/esm/node/types.d.ts.map +1 -0
- package/dist/esm/node/types.js +6 -0
- package/dist/esm/node/types.js.map +1 -0
- package/dist/esm/node/util.d.ts +9 -0
- package/dist/esm/node/util.d.ts.map +1 -0
- package/dist/esm/node/util.js +33 -0
- package/dist/esm/node/util.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/proof.d.ts +16 -0
- package/dist/esm/proof.d.ts.map +1 -0
- package/dist/esm/proof.js +45 -0
- package/dist/esm/proof.js.map +1 -0
- package/dist/esm/types.d.ts +45 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +3 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/util.d.ts +17 -0
- package/dist/esm/util.d.ts.map +1 -0
- package/dist/esm/util.js +66 -0
- package/dist/esm/util.js.map +1 -0
- package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
- package/package.json +77 -0
- package/src/binaryTree.ts +742 -0
- package/src/constructors.ts +50 -0
- package/src/db/checkpoint.ts +297 -0
- package/src/db/index.ts +1 -0
- package/src/index.ts +6 -0
- package/src/node/index.ts +3 -0
- package/src/node/internalNode.ts +112 -0
- package/src/node/stemNode.ts +87 -0
- package/src/node/types.ts +41 -0
- package/src/node/util.ts +38 -0
- package/src/proof.ts +54 -0
- package/src/types.ts +58 -0
- package/src/util.ts +80 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { utf8ToBytes } from '@feelyourprotocol/util'
|
|
2
|
+
|
|
3
|
+
import type { DB, ValueEncoding } from '@feelyourprotocol/util'
|
|
4
|
+
|
|
5
|
+
export interface BinaryTreeOpts {
|
|
6
|
+
/**
|
|
7
|
+
* A database instance.
|
|
8
|
+
*/
|
|
9
|
+
db: DB<string, string | Uint8Array>
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A `Uint8Array` for the root of a previously stored tree
|
|
13
|
+
*/
|
|
14
|
+
root?: Uint8Array
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Store the root inside the database after every `write` operation
|
|
18
|
+
*/
|
|
19
|
+
useRootPersistence: boolean
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* LRU cache for tree nodes to allow for faster node retrieval.
|
|
23
|
+
*
|
|
24
|
+
* Default: 0 (deactivated)
|
|
25
|
+
*/
|
|
26
|
+
cacheSize: number
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Hash function used for hashing the tree nodes.
|
|
30
|
+
*/
|
|
31
|
+
hashFunction: (msg: Uint8Array) => Uint8Array
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface CheckpointDBOpts {
|
|
35
|
+
/**
|
|
36
|
+
* A database instance.
|
|
37
|
+
*/
|
|
38
|
+
db: DB<string, string | Uint8Array>
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* ValueEncoding of the database (the values which are `put`/`get` in the db are of this type). Defaults to `string`
|
|
42
|
+
*/
|
|
43
|
+
valueEncoding?: ValueEncoding
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Cache size (default: 0)
|
|
47
|
+
*/
|
|
48
|
+
cacheSize?: number
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type Checkpoint = {
|
|
52
|
+
// We cannot use a Uint8Array => Uint8Array map directly. If you create two Uint8Arrays with the same internal value,
|
|
53
|
+
// then when setting a value on the Map, it actually creates two indices.
|
|
54
|
+
keyValueMap: Map<string, Uint8Array | undefined>
|
|
55
|
+
root: Uint8Array
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const ROOT_DB_KEY = utf8ToBytes('__root__')
|
package/src/util.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type PrefixedHexString, bytesToHex, concatBytes, equalsBytes } from '@feelyourprotocol/util'
|
|
2
|
+
|
|
3
|
+
import { InternalBinaryNode } from './node/internalNode.ts'
|
|
4
|
+
import { StemBinaryNode } from './node/stemNode.ts'
|
|
5
|
+
import { decodeBinaryNode } from './node/util.ts'
|
|
6
|
+
|
|
7
|
+
import type { BinaryTree } from './binaryTree.ts'
|
|
8
|
+
import type { ChildBinaryNode } from './node/types.ts'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Recursively walks down the tree from a given starting node and returns all the leaf values
|
|
12
|
+
* @param tree - The binary tree
|
|
13
|
+
* @param startingNode - The starting node
|
|
14
|
+
* @returns An array of key-value pairs containing the tree keys and associated values
|
|
15
|
+
*/
|
|
16
|
+
export const dumpLeafValues = async (
|
|
17
|
+
tree: BinaryTree,
|
|
18
|
+
startingNode: Uint8Array,
|
|
19
|
+
): Promise<[PrefixedHexString, PrefixedHexString][] | undefined> => {
|
|
20
|
+
if (equalsBytes(startingNode, tree.EMPTY_TREE_ROOT) === true) return
|
|
21
|
+
// Retrieve starting node from DB
|
|
22
|
+
const rawNode = await tree['_db'].get(startingNode)
|
|
23
|
+
if (rawNode === undefined) return
|
|
24
|
+
const node = decodeBinaryNode(rawNode)
|
|
25
|
+
const entries: [PrefixedHexString, PrefixedHexString][] = []
|
|
26
|
+
if (node instanceof StemBinaryNode) {
|
|
27
|
+
for (const [idx, val] of node.values.entries()) {
|
|
28
|
+
if (val !== null) {
|
|
29
|
+
entries.push([bytesToHex(concatBytes(node.stem, Uint8Array.from([idx]))), bytesToHex(val)])
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return entries
|
|
33
|
+
} else {
|
|
34
|
+
const childPaths = node.children
|
|
35
|
+
.filter((value) => value !== null)
|
|
36
|
+
.map((value) => dumpLeafValues(tree, value!.hash))
|
|
37
|
+
|
|
38
|
+
const res = (await Promise.all(childPaths)).filter((val) => val !== undefined)
|
|
39
|
+
return res.flat(1) as [PrefixedHexString, PrefixedHexString][]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Recursively walks down the tree from a given starting node and returns all the node paths and hashes
|
|
44
|
+
* @param tree - The binary tree
|
|
45
|
+
* @param startingNode - The starting node
|
|
46
|
+
* @returns An array of key-value pairs containing the tree paths and associated hashes
|
|
47
|
+
*/
|
|
48
|
+
export const dumpNodeHashes = async (
|
|
49
|
+
tree: BinaryTree,
|
|
50
|
+
startingNode: Uint8Array,
|
|
51
|
+
): Promise<[string, PrefixedHexString][] | undefined> => {
|
|
52
|
+
let entries: [string, PrefixedHexString][] = []
|
|
53
|
+
// Retrieve starting node from DB
|
|
54
|
+
const rawNode = await tree['_db'].get(startingNode)
|
|
55
|
+
if (rawNode === undefined) return
|
|
56
|
+
|
|
57
|
+
const node = decodeBinaryNode(rawNode)
|
|
58
|
+
// If current node is root, push '0x' for path and node hash for commitment
|
|
59
|
+
equalsBytes(startingNode, tree.root()) && entries.push(['0x', bytesToHex(startingNode)])
|
|
60
|
+
if (node instanceof InternalBinaryNode) {
|
|
61
|
+
const children = node.children.filter((value) => value !== null) as ChildBinaryNode[]
|
|
62
|
+
|
|
63
|
+
// Push non-null children paths and hashes
|
|
64
|
+
for (const child of children) {
|
|
65
|
+
entries.push([child.path.join(''), bytesToHex(child.hash)])
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Recursively call dumpNodeHashes on each child node
|
|
69
|
+
const childPaths = (
|
|
70
|
+
await Promise.all(children.map((value) => dumpNodeHashes(tree, value.hash)))
|
|
71
|
+
)
|
|
72
|
+
.filter((val) => val !== undefined)
|
|
73
|
+
.flat(1)
|
|
74
|
+
|
|
75
|
+
// Add all child paths and hashes to entries
|
|
76
|
+
entries = [...entries, ...childPaths] as [string, PrefixedHexString][]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return entries
|
|
80
|
+
}
|