@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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2025 EthereumJS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # @ethereumjs/binarytree `v10` (EXPERIMENTAL)
2
+
3
+ [![NPM Package][binarytree-npm-badge]][binarytree-npm-link]
4
+ [![GitHub Issues][binarytree-issues-badge]][binarytree-issues-link]
5
+ [![Actions Status][binarytree-actions-badge]][binarytree-actions-link]
6
+ [![Code Coverage][binarytree-coverage-badge]][binarytree-coverage-link]
7
+ [![Discord][discord-badge]][discord-link]
8
+
9
+ | Implementation of Binary Trees as specified in [EIP-7864](https://eips.ethereum.org/EIPS/eip-7864) |
10
+ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
11
+
12
+ > Binary Trees are a novel cryptographic data structure proposed for use in Ethereum to optimize state storage and proof verification. Unlike Merkle Patricia Tries, Binary Trees use a strict binary branching structure, allowing smaller proof sizes. By reducing storage overhead and improving proof efficiency, Binary Trees aim to enhance Ethereum’s scalability while maintaining robust security guarantees.
13
+
14
+ **Note:** This library is in an **experimental** stage and should not be used in production!
15
+
16
+ ## Table of Contents
17
+
18
+ - [Installation](#installation)
19
+ - [EthereumJS](#ethereumjs)
20
+ - [License](#license)
21
+
22
+ ## Installation
23
+
24
+ To obtain the latest version, simply install the project using `npm`:
25
+
26
+ ```shell
27
+ npm install @ethereumjs/binarytree
28
+ ```
29
+ ## EthereumJS
30
+
31
+ The `EthereumJS` GitHub organization and its repositories are managed by members of the former Ethereum Foundation JavaScript team and the broader Ethereum community. If you want to join for work or carry out improvements on the libraries see the [developer docs](../../DEVELOPER.md) for an overview of current standards and tools and review our [code of conduct](../../CODE_OF_CONDUCT.md).
32
+
33
+ ## License
34
+
35
+ [MIT](https://opensource.org/licenses/MIT)
36
+
37
+ [discord-badge]: https://img.shields.io/static/v1?logo=discord&label=discord&message=Join&color=blue
38
+ [discord-link]: https://discord.gg/TNwARpR
39
+ [binarytree-npm-badge]: https://img.shields.io/npm/v/@ethereumjs/binarytree.svg
40
+ [binarytree-npm-link]: https://www.npmjs.com/package/@ethereumjs/binarytree
41
+ [binarytree-issues-badge]: https://img.shields.io/github/issues/ethereumjs/ethereumjs-monorepo/package:%20binarytree?label=issues
42
+ [binarytree-issues-link]: https://github.com/ethereumjs/ethereumjs-monorepo/issues?q=is%3Aopen+is%3Aissue+label%3A"package%3A+binarytree"
43
+ [binarytree-actions-badge]: https://github.com/ethereumjs/ethereumjs-monorepo/workflows/binarytree/badge.svg
44
+ [binarytree-actions-link]: https://github.com/ethereumjs/ethereumjs-monorepo/actions?query=workflow%3A%22binarytree%22
45
+ [binarytree-coverage-badge]: https://codecov.io/gh/ethereumjs/ethereumjs-monorepo/branch/master/graph/badge.svg?flag=binarytree
46
+ [binarytree-coverage-link]: https://codecov.io/gh/ethereumjs/ethereumjs-monorepo/tree/master/packages/binarytree
@@ -0,0 +1,167 @@
1
+ import { Lock } from '@feelyourprotocol/util';
2
+ import { CheckpointDB } from './db/index.ts';
3
+ import { StemBinaryNode } from './node/stemNode.ts';
4
+ import { type BinaryTreeOpts } from './types.ts';
5
+ import type { Debugger } from 'debug';
6
+ import type { BinaryNode } from './node/types.ts';
7
+ interface Path {
8
+ node: BinaryNode | null;
9
+ remaining: number[];
10
+ stack: Array<[BinaryNode, number[]]>;
11
+ }
12
+ /**
13
+ * The basic binary tree interface, use with `import { BinaryTree } from '@feelyourprotocol/binarytree'`.
14
+ *
15
+ * A BinaryTree object can be created with the constructor method:
16
+ *
17
+ * - {@link createBinaryTree}
18
+ */
19
+ export declare class BinaryTree {
20
+ /** The options for instantiating the binary tree */
21
+ protected _opts: BinaryTreeOpts;
22
+ /** The root for an empty tree */
23
+ EMPTY_TREE_ROOT: Uint8Array;
24
+ protected _db: CheckpointDB;
25
+ protected _hashLen: number;
26
+ protected _lock: Lock;
27
+ protected _root: Uint8Array;
28
+ protected DEBUG: boolean;
29
+ protected _debug: Debugger;
30
+ protected debug: (...args: any) => void;
31
+ /**
32
+ * Creates a new binary tree.
33
+ * @param opts Options for instantiating the binary tree
34
+ *
35
+ * Note: in most cases, the static {@link createBinaryTree} constructor should be used. It uses the same API but provides sensible defaults
36
+ */
37
+ constructor(opts: BinaryTreeOpts);
38
+ /**
39
+ * Gets and/or Sets the current root of the `tree`
40
+ */
41
+ root(value?: Uint8Array | null): Uint8Array;
42
+ /**
43
+ * Checks if a given root exists.
44
+ */
45
+ checkRoot(root: Uint8Array): Promise<boolean>;
46
+ /**
47
+ * Gets values at a given binary tree `stem` and set of suffixes
48
+ * @param stem - the stem of the stem node where we're seeking values
49
+ * @param suffixes - an array of suffixes corresponding to the values desired
50
+ * @returns A Promise that resolves to an array of `Uint8Array`s or `null` depending on if values were found.
51
+ * If the stem is not found, will return an empty array.
52
+ */
53
+ get(stem: Uint8Array, suffixes: number[]): Promise<(Uint8Array | null)[]>;
54
+ /**
55
+ * Stores a given `value` at the given `key` or performs a deletion if `value` is null.
56
+ * @param stem - the stem (must be 31 bytes) to store the value at.
57
+ * @param suffixes - array of suffixes at which to store individual values.
58
+ * @param values - the value(s) to store (or null for deletion).
59
+ * @returns A Promise that resolves once the value is stored.
60
+ */
61
+ put(stem: Uint8Array, suffixes: number[], values: (Uint8Array | null)[]): Promise<void>;
62
+ /**
63
+ * Helper method for updating or creating the parent internal node for a given stem node.
64
+ * If the nearest node is a stem node with a different stem, a new internal node is created
65
+ * to branch at the first differing bit.
66
+ * If the nearest node is an internal node, its child reference is updated.
67
+ *
68
+ * @param stemNode - The child stem node that will be referenced by the new/updated internal node.
69
+ * @param nearestNode - The nearest node to the new stem node.
70
+ * @param pathToNode - The path (in bits) to `nearestNode` as known from the trie.
71
+ * @returns An array of nodes and their partial paths from the new stem node to the branch parent node
72
+ * or `undefined` if no changes were made.
73
+ */
74
+ updateBranch(stemNode: StemBinaryNode, nearestNode: BinaryNode, pathToNode: number[], pathToParent: number[]): {
75
+ node: BinaryNode;
76
+ parentPath: number[];
77
+ }[] | undefined;
78
+ /**
79
+ * Tries to find a path to the node for the given key.
80
+ * It returns a `Path` object containing:
81
+ * - `node`: the found node (if any),
82
+ * - `stack`: an array of tuples [node, path] representing the nodes encountered,
83
+ * - `remaining`: the bits of the key that were not matched.
84
+ *
85
+ * @param keyInBytes - the search key as a byte array.
86
+ * @returns A Promise that resolves to a Path object.
87
+ */
88
+ findPath(keyInBytes: Uint8Array): Promise<Path>;
89
+ /**
90
+ * Deletes a given `key` from the tree.
91
+ * @param stem - the stem of the stem node to delete from
92
+ * @param suffixes - the suffixes to delete
93
+ * @returns A Promise that resolves once the key is deleted.
94
+ */
95
+ del(stem: Uint8Array, suffixes: number[]): Promise<void>;
96
+ /**
97
+ * Create empty root node for initializing an empty tree.
98
+ */
99
+ createRootNode(): Promise<void>;
100
+ /**
101
+ * Creates the initial node from an empty tree.
102
+ * @private
103
+ */
104
+ protected _createInitialNode(stem: Uint8Array, indexes: number[], values: (Uint8Array | null)[]): Promise<void>;
105
+ /**
106
+ * Saves a stack of nodes to the database.
107
+ *
108
+ * @param putStack - an array of tuples of keys (the partial path of the node in the trie) and nodes (BinaryNodes)
109
+ */
110
+ saveStack(putStack: [Uint8Array, BinaryNode | null][]): Promise<void>;
111
+ /**
112
+ * Creates a proof from a tree and key that can be verified using {@link BinaryTree.verifyBinaryProof}.
113
+ * @param key a 32 byte binary tree key (31 byte stem + 1 byte suffix)
114
+ */
115
+ createBinaryProof(key: Uint8Array): Promise<Uint8Array[]>;
116
+ /**
117
+ * The `data` event is given an `Object` that has two properties; the `key` and the `value`. Both should be Uint8Arrays.
118
+ * @return Returns a [stream](https://nodejs.org/dist/latest-v12.x/docs/api/stream.html#stream_class_stream_readable) of the contents of the `tree`
119
+ */
120
+ createReadStream(): any;
121
+ /**
122
+ * Returns a copy of the underlying tree.
123
+ *
124
+ * Note on db: the copy will create a reference to the
125
+ * same underlying database.
126
+ *
127
+ * Note on cache: for memory reasons a copy will not
128
+ * recreate a new LRU cache but initialize with cache
129
+ * being deactivated.
130
+ *
131
+ * @param includeCheckpoints - If true and during a checkpoint, the copy will contain the checkpointing metadata and will use the same scratch as underlying db.
132
+ */
133
+ shallowCopy(includeCheckpoints?: boolean): BinaryTree;
134
+ /**
135
+ * Persists the root hash in the underlying database
136
+ */
137
+ persistRoot(): Promise<void>;
138
+ /**
139
+ * Is the tree during a checkpoint phase?
140
+ */
141
+ hasCheckpoints(): boolean;
142
+ /**
143
+ * Creates a checkpoint that can later be reverted to or committed.
144
+ * After this is called, all changes can be reverted until `commit` is called.
145
+ */
146
+ checkpoint(): void;
147
+ /**
148
+ * Commits a checkpoint to disk, if current checkpoint is not nested.
149
+ * If nested, only sets the parent checkpoint as current checkpoint.
150
+ * @throws If not during a checkpoint phase
151
+ */
152
+ commit(): Promise<void>;
153
+ /**
154
+ * Reverts the tree to the state it was at when `checkpoint` was first called.
155
+ * If during a nested checkpoint, sets root to most recent checkpoint, and sets
156
+ * parent checkpoint as current.
157
+ */
158
+ revert(): Promise<void>;
159
+ /**
160
+ * Flushes all checkpoints, restoring the initial checkpoint state.
161
+ */
162
+ flushCheckpoints(): void;
163
+ protected hash(msg: Uint8Array | null): Uint8Array;
164
+ protected merkelize(node: BinaryNode | null): Uint8Array;
165
+ }
166
+ export {};
167
+ //# sourceMappingURL=binaryTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binaryTree.d.ts","sourceRoot":"","sources":["../../src/binaryTree.ts"],"names":[],"mappings":"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"}