@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.
Files changed (124) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +46 -0
  3. package/dist/cjs/binaryTree.d.ts +167 -0
  4. package/dist/cjs/binaryTree.d.ts.map +1 -0
  5. package/dist/cjs/binaryTree.js +606 -0
  6. package/dist/cjs/binaryTree.js.map +1 -0
  7. package/dist/cjs/constructors.d.ts +4 -0
  8. package/dist/cjs/constructors.d.ts.map +1 -0
  9. package/dist/cjs/constructors.js +44 -0
  10. package/dist/cjs/constructors.js.map +1 -0
  11. package/dist/cjs/db/checkpoint.d.ts +87 -0
  12. package/dist/cjs/db/checkpoint.d.ts.map +1 -0
  13. package/dist/cjs/db/checkpoint.js +257 -0
  14. package/dist/cjs/db/checkpoint.js.map +1 -0
  15. package/dist/cjs/db/index.d.ts +2 -0
  16. package/dist/cjs/db/index.d.ts.map +1 -0
  17. package/dist/cjs/db/index.js +18 -0
  18. package/dist/cjs/db/index.js.map +1 -0
  19. package/dist/cjs/index.d.ts +7 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +23 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/node/index.d.ts +4 -0
  24. package/dist/cjs/node/index.d.ts.map +1 -0
  25. package/dist/cjs/node/index.js +20 -0
  26. package/dist/cjs/node/index.js.map +1 -0
  27. package/dist/cjs/node/internalNode.d.ts +37 -0
  28. package/dist/cjs/node/internalNode.d.ts.map +1 -0
  29. package/dist/cjs/node/internalNode.js +92 -0
  30. package/dist/cjs/node/internalNode.js.map +1 -0
  31. package/dist/cjs/node/stemNode.d.ts +34 -0
  32. package/dist/cjs/node/stemNode.d.ts.map +1 -0
  33. package/dist/cjs/node/stemNode.js +75 -0
  34. package/dist/cjs/node/stemNode.js.map +1 -0
  35. package/dist/cjs/node/types.d.ts +35 -0
  36. package/dist/cjs/node/types.d.ts.map +1 -0
  37. package/dist/cjs/node/types.js +9 -0
  38. package/dist/cjs/node/types.js.map +1 -0
  39. package/dist/cjs/node/util.d.ts +9 -0
  40. package/dist/cjs/node/util.d.ts.map +1 -0
  41. package/dist/cjs/node/util.js +40 -0
  42. package/dist/cjs/node/util.js.map +1 -0
  43. package/dist/cjs/package.json +3 -0
  44. package/dist/cjs/proof.d.ts +16 -0
  45. package/dist/cjs/proof.d.ts.map +1 -0
  46. package/dist/cjs/proof.js +49 -0
  47. package/dist/cjs/proof.js.map +1 -0
  48. package/dist/cjs/types.d.ts +45 -0
  49. package/dist/cjs/types.d.ts.map +1 -0
  50. package/dist/cjs/types.js +6 -0
  51. package/dist/cjs/types.js.map +1 -0
  52. package/dist/cjs/util.d.ts +17 -0
  53. package/dist/cjs/util.d.ts.map +1 -0
  54. package/dist/cjs/util.js +71 -0
  55. package/dist/cjs/util.js.map +1 -0
  56. package/dist/esm/binaryTree.d.ts +167 -0
  57. package/dist/esm/binaryTree.d.ts.map +1 -0
  58. package/dist/esm/binaryTree.js +602 -0
  59. package/dist/esm/binaryTree.js.map +1 -0
  60. package/dist/esm/constructors.d.ts +4 -0
  61. package/dist/esm/constructors.d.ts.map +1 -0
  62. package/dist/esm/constructors.js +41 -0
  63. package/dist/esm/constructors.js.map +1 -0
  64. package/dist/esm/db/checkpoint.d.ts +87 -0
  65. package/dist/esm/db/checkpoint.d.ts.map +1 -0
  66. package/dist/esm/db/checkpoint.js +253 -0
  67. package/dist/esm/db/checkpoint.js.map +1 -0
  68. package/dist/esm/db/index.d.ts +2 -0
  69. package/dist/esm/db/index.d.ts.map +1 -0
  70. package/dist/esm/db/index.js +2 -0
  71. package/dist/esm/db/index.js.map +1 -0
  72. package/dist/esm/index.d.ts +7 -0
  73. package/dist/esm/index.d.ts.map +1 -0
  74. package/dist/esm/index.js +7 -0
  75. package/dist/esm/index.js.map +1 -0
  76. package/dist/esm/node/index.d.ts +4 -0
  77. package/dist/esm/node/index.d.ts.map +1 -0
  78. package/dist/esm/node/index.js +4 -0
  79. package/dist/esm/node/index.js.map +1 -0
  80. package/dist/esm/node/internalNode.d.ts +37 -0
  81. package/dist/esm/node/internalNode.d.ts.map +1 -0
  82. package/dist/esm/node/internalNode.js +88 -0
  83. package/dist/esm/node/internalNode.js.map +1 -0
  84. package/dist/esm/node/stemNode.d.ts +34 -0
  85. package/dist/esm/node/stemNode.d.ts.map +1 -0
  86. package/dist/esm/node/stemNode.js +71 -0
  87. package/dist/esm/node/stemNode.js.map +1 -0
  88. package/dist/esm/node/types.d.ts +35 -0
  89. package/dist/esm/node/types.d.ts.map +1 -0
  90. package/dist/esm/node/types.js +6 -0
  91. package/dist/esm/node/types.js.map +1 -0
  92. package/dist/esm/node/util.d.ts +9 -0
  93. package/dist/esm/node/util.d.ts.map +1 -0
  94. package/dist/esm/node/util.js +33 -0
  95. package/dist/esm/node/util.js.map +1 -0
  96. package/dist/esm/package.json +3 -0
  97. package/dist/esm/proof.d.ts +16 -0
  98. package/dist/esm/proof.d.ts.map +1 -0
  99. package/dist/esm/proof.js +45 -0
  100. package/dist/esm/proof.js.map +1 -0
  101. package/dist/esm/types.d.ts +45 -0
  102. package/dist/esm/types.d.ts.map +1 -0
  103. package/dist/esm/types.js +3 -0
  104. package/dist/esm/types.js.map +1 -0
  105. package/dist/esm/util.d.ts +17 -0
  106. package/dist/esm/util.d.ts.map +1 -0
  107. package/dist/esm/util.js +66 -0
  108. package/dist/esm/util.js.map +1 -0
  109. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
  110. package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
  111. package/package.json +77 -0
  112. package/src/binaryTree.ts +742 -0
  113. package/src/constructors.ts +50 -0
  114. package/src/db/checkpoint.ts +297 -0
  115. package/src/db/index.ts +1 -0
  116. package/src/index.ts +6 -0
  117. package/src/node/index.ts +3 -0
  118. package/src/node/internalNode.ts +112 -0
  119. package/src/node/stemNode.ts +87 -0
  120. package/src/node/types.ts +41 -0
  121. package/src/node/util.ts +38 -0
  122. package/src/proof.ts +54 -0
  123. package/src/types.ts +58 -0
  124. 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
+ }