@feelyourprotocol/mpt 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 (204) hide show
  1. package/README.md +448 -0
  2. package/dist/cjs/constructors.d.ts +12 -0
  3. package/dist/cjs/constructors.d.ts.map +1 -0
  4. package/dist/cjs/constructors.js +57 -0
  5. package/dist/cjs/constructors.js.map +1 -0
  6. package/dist/cjs/db/checkpointDB.d.ts +87 -0
  7. package/dist/cjs/db/checkpointDB.d.ts.map +1 -0
  8. package/dist/cjs/db/checkpointDB.js +258 -0
  9. package/dist/cjs/db/checkpointDB.js.map +1 -0
  10. package/dist/cjs/db/index.d.ts +2 -0
  11. package/dist/cjs/db/index.d.ts.map +1 -0
  12. package/dist/cjs/db/index.js +18 -0
  13. package/dist/cjs/db/index.js.map +1 -0
  14. package/dist/cjs/index.d.ts +8 -0
  15. package/dist/cjs/index.d.ts.map +1 -0
  16. package/dist/cjs/index.js +24 -0
  17. package/dist/cjs/index.js.map +1 -0
  18. package/dist/cjs/mpt.d.ts +261 -0
  19. package/dist/cjs/mpt.d.ts.map +1 -0
  20. package/dist/cjs/mpt.js +900 -0
  21. package/dist/cjs/mpt.js.map +1 -0
  22. package/dist/cjs/node/branch.d.ts +14 -0
  23. package/dist/cjs/node/branch.d.ts.map +1 -0
  24. package/dist/cjs/node/branch.js +52 -0
  25. package/dist/cjs/node/branch.js.map +1 -0
  26. package/dist/cjs/node/extension.d.ts +7 -0
  27. package/dist/cjs/node/extension.d.ts.map +1 -0
  28. package/dist/cjs/node/extension.js +14 -0
  29. package/dist/cjs/node/extension.js.map +1 -0
  30. package/dist/cjs/node/extensionOrLeafNodeBase.d.ts +15 -0
  31. package/dist/cjs/node/extensionOrLeafNodeBase.d.ts.map +1 -0
  32. package/dist/cjs/node/extensionOrLeafNodeBase.js +42 -0
  33. package/dist/cjs/node/extensionOrLeafNodeBase.js.map +1 -0
  34. package/dist/cjs/node/index.d.ts +5 -0
  35. package/dist/cjs/node/index.d.ts.map +1 -0
  36. package/dist/cjs/node/index.js +21 -0
  37. package/dist/cjs/node/index.js.map +1 -0
  38. package/dist/cjs/node/leaf.d.ts +7 -0
  39. package/dist/cjs/node/leaf.d.ts.map +1 -0
  40. package/dist/cjs/node/leaf.js +14 -0
  41. package/dist/cjs/node/leaf.js.map +1 -0
  42. package/dist/cjs/node/util.d.ts +8 -0
  43. package/dist/cjs/node/util.d.ts.map +1 -0
  44. package/dist/cjs/node/util.js +38 -0
  45. package/dist/cjs/node/util.js.map +1 -0
  46. package/dist/cjs/package.json +3 -0
  47. package/dist/cjs/proof/index.d.ts +3 -0
  48. package/dist/cjs/proof/index.d.ts.map +1 -0
  49. package/dist/cjs/proof/index.js +19 -0
  50. package/dist/cjs/proof/index.js.map +1 -0
  51. package/dist/cjs/proof/proof.d.ts +41 -0
  52. package/dist/cjs/proof/proof.d.ts.map +1 -0
  53. package/dist/cjs/proof/proof.js +119 -0
  54. package/dist/cjs/proof/proof.js.map +1 -0
  55. package/dist/cjs/proof/range.d.ts +35 -0
  56. package/dist/cjs/proof/range.d.ts.map +1 -0
  57. package/dist/cjs/proof/range.js +456 -0
  58. package/dist/cjs/proof/range.js.map +1 -0
  59. package/dist/cjs/types.d.ts +110 -0
  60. package/dist/cjs/types.d.ts.map +1 -0
  61. package/dist/cjs/types.js +6 -0
  62. package/dist/cjs/types.js.map +1 -0
  63. package/dist/cjs/util/asyncWalk.d.ts +20 -0
  64. package/dist/cjs/util/asyncWalk.d.ts.map +1 -0
  65. package/dist/cjs/util/asyncWalk.js +50 -0
  66. package/dist/cjs/util/asyncWalk.js.map +1 -0
  67. package/dist/cjs/util/encoding.d.ts +31 -0
  68. package/dist/cjs/util/encoding.d.ts.map +1 -0
  69. package/dist/cjs/util/encoding.js +200 -0
  70. package/dist/cjs/util/encoding.js.map +1 -0
  71. package/dist/cjs/util/genesisState.d.ts +6 -0
  72. package/dist/cjs/util/genesisState.d.ts.map +1 -0
  73. package/dist/cjs/util/genesisState.js +45 -0
  74. package/dist/cjs/util/genesisState.js.map +1 -0
  75. package/dist/cjs/util/hex.d.ts +20 -0
  76. package/dist/cjs/util/hex.d.ts.map +1 -0
  77. package/dist/cjs/util/hex.js +48 -0
  78. package/dist/cjs/util/hex.js.map +1 -0
  79. package/dist/cjs/util/index.d.ts +4 -0
  80. package/dist/cjs/util/index.d.ts.map +1 -0
  81. package/dist/cjs/util/index.js +20 -0
  82. package/dist/cjs/util/index.js.map +1 -0
  83. package/dist/cjs/util/nibbles.d.ts +30 -0
  84. package/dist/cjs/util/nibbles.d.ts.map +1 -0
  85. package/dist/cjs/util/nibbles.js +79 -0
  86. package/dist/cjs/util/nibbles.js.map +1 -0
  87. package/dist/cjs/util/walkController.d.ts +72 -0
  88. package/dist/cjs/util/walkController.d.ts.map +1 -0
  89. package/dist/cjs/util/walkController.js +138 -0
  90. package/dist/cjs/util/walkController.js.map +1 -0
  91. package/dist/esm/constructors.d.ts +12 -0
  92. package/dist/esm/constructors.d.ts.map +1 -0
  93. package/dist/esm/constructors.js +53 -0
  94. package/dist/esm/constructors.js.map +1 -0
  95. package/dist/esm/db/checkpointDB.d.ts +87 -0
  96. package/dist/esm/db/checkpointDB.d.ts.map +1 -0
  97. package/dist/esm/db/checkpointDB.js +254 -0
  98. package/dist/esm/db/checkpointDB.js.map +1 -0
  99. package/dist/esm/db/index.d.ts +2 -0
  100. package/dist/esm/db/index.d.ts.map +1 -0
  101. package/dist/esm/db/index.js +2 -0
  102. package/dist/esm/db/index.js.map +1 -0
  103. package/dist/esm/index.d.ts +8 -0
  104. package/dist/esm/index.d.ts.map +1 -0
  105. package/dist/esm/index.js +8 -0
  106. package/dist/esm/index.js.map +1 -0
  107. package/dist/esm/mpt.d.ts +261 -0
  108. package/dist/esm/mpt.d.ts.map +1 -0
  109. package/dist/esm/mpt.js +897 -0
  110. package/dist/esm/mpt.js.map +1 -0
  111. package/dist/esm/node/branch.d.ts +14 -0
  112. package/dist/esm/node/branch.d.ts.map +1 -0
  113. package/dist/esm/node/branch.js +48 -0
  114. package/dist/esm/node/branch.js.map +1 -0
  115. package/dist/esm/node/extension.d.ts +7 -0
  116. package/dist/esm/node/extension.d.ts.map +1 -0
  117. package/dist/esm/node/extension.js +10 -0
  118. package/dist/esm/node/extension.js.map +1 -0
  119. package/dist/esm/node/extensionOrLeafNodeBase.d.ts +15 -0
  120. package/dist/esm/node/extensionOrLeafNodeBase.d.ts.map +1 -0
  121. package/dist/esm/node/extensionOrLeafNodeBase.js +38 -0
  122. package/dist/esm/node/extensionOrLeafNodeBase.js.map +1 -0
  123. package/dist/esm/node/index.d.ts +5 -0
  124. package/dist/esm/node/index.d.ts.map +1 -0
  125. package/dist/esm/node/index.js +5 -0
  126. package/dist/esm/node/index.js.map +1 -0
  127. package/dist/esm/node/leaf.d.ts +7 -0
  128. package/dist/esm/node/leaf.d.ts.map +1 -0
  129. package/dist/esm/node/leaf.js +10 -0
  130. package/dist/esm/node/leaf.js.map +1 -0
  131. package/dist/esm/node/util.d.ts +8 -0
  132. package/dist/esm/node/util.d.ts.map +1 -0
  133. package/dist/esm/node/util.js +33 -0
  134. package/dist/esm/node/util.js.map +1 -0
  135. package/dist/esm/package.json +3 -0
  136. package/dist/esm/proof/index.d.ts +3 -0
  137. package/dist/esm/proof/index.d.ts.map +1 -0
  138. package/dist/esm/proof/index.js +3 -0
  139. package/dist/esm/proof/index.js.map +1 -0
  140. package/dist/esm/proof/proof.d.ts +41 -0
  141. package/dist/esm/proof/proof.d.ts.map +1 -0
  142. package/dist/esm/proof/proof.js +113 -0
  143. package/dist/esm/proof/proof.js.map +1 -0
  144. package/dist/esm/proof/range.d.ts +35 -0
  145. package/dist/esm/proof/range.d.ts.map +1 -0
  146. package/dist/esm/proof/range.js +453 -0
  147. package/dist/esm/proof/range.js.map +1 -0
  148. package/dist/esm/types.d.ts +110 -0
  149. package/dist/esm/types.d.ts.map +1 -0
  150. package/dist/esm/types.js +3 -0
  151. package/dist/esm/types.js.map +1 -0
  152. package/dist/esm/util/asyncWalk.d.ts +20 -0
  153. package/dist/esm/util/asyncWalk.d.ts.map +1 -0
  154. package/dist/esm/util/asyncWalk.js +47 -0
  155. package/dist/esm/util/asyncWalk.js.map +1 -0
  156. package/dist/esm/util/encoding.d.ts +31 -0
  157. package/dist/esm/util/encoding.d.ts.map +1 -0
  158. package/dist/esm/util/encoding.js +188 -0
  159. package/dist/esm/util/encoding.js.map +1 -0
  160. package/dist/esm/util/genesisState.d.ts +6 -0
  161. package/dist/esm/util/genesisState.d.ts.map +1 -0
  162. package/dist/esm/util/genesisState.js +42 -0
  163. package/dist/esm/util/genesisState.js.map +1 -0
  164. package/dist/esm/util/hex.d.ts +20 -0
  165. package/dist/esm/util/hex.d.ts.map +1 -0
  166. package/dist/esm/util/hex.js +43 -0
  167. package/dist/esm/util/hex.js.map +1 -0
  168. package/dist/esm/util/index.d.ts +4 -0
  169. package/dist/esm/util/index.d.ts.map +1 -0
  170. package/dist/esm/util/index.js +4 -0
  171. package/dist/esm/util/index.js.map +1 -0
  172. package/dist/esm/util/nibbles.d.ts +30 -0
  173. package/dist/esm/util/nibbles.d.ts.map +1 -0
  174. package/dist/esm/util/nibbles.js +73 -0
  175. package/dist/esm/util/nibbles.js.map +1 -0
  176. package/dist/esm/util/walkController.d.ts +72 -0
  177. package/dist/esm/util/walkController.d.ts.map +1 -0
  178. package/dist/esm/util/walkController.js +134 -0
  179. package/dist/esm/util/walkController.js.map +1 -0
  180. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
  181. package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
  182. package/package.json +85 -0
  183. package/src/constructors.ts +71 -0
  184. package/src/db/checkpointDB.ts +298 -0
  185. package/src/db/index.ts +1 -0
  186. package/src/index.ts +7 -0
  187. package/src/mpt.ts +1090 -0
  188. package/src/node/branch.ts +60 -0
  189. package/src/node/extension.ts +13 -0
  190. package/src/node/extensionOrLeafNodeBase.ts +54 -0
  191. package/src/node/index.ts +4 -0
  192. package/src/node/leaf.ts +13 -0
  193. package/src/node/util.ts +35 -0
  194. package/src/proof/index.ts +2 -0
  195. package/src/proof/proof.ts +135 -0
  196. package/src/proof/range.ts +542 -0
  197. package/src/types.ts +151 -0
  198. package/src/util/asyncWalk.ts +60 -0
  199. package/src/util/encoding.ts +209 -0
  200. package/src/util/genesisState.ts +52 -0
  201. package/src/util/hex.ts +47 -0
  202. package/src/util/index.ts +3 -0
  203. package/src/util/nibbles.ts +80 -0
  204. package/src/util/walkController.ts +172 -0
@@ -0,0 +1,453 @@
1
+ import { EthereumJSErrorWithoutCode, equalsBytes } from '@feelyourprotocol/util';
2
+ import { keccak_256 } from '@noble/hashes/sha3.js';
3
+ import { createMPTFromProof } from "../index.js";
4
+ import { MerklePatriciaTrie } from "../mpt.js";
5
+ import { BranchMPTNode, ExtensionMPTNode, LeafMPTNode } from "../node/index.js";
6
+ import { bytesToNibbles, nibblesCompare, nibblesTypeToPackedBytes } from "../util/nibbles.js";
7
+ // reference: https://github.com/ethereum/go-ethereum/blob/20356e57b119b4e70ce47665a71964434e15200d/trie/proof.go
8
+ /**
9
+ * unset will remove all nodes to the left or right of the target key(decided by `removeLeft`).
10
+ * @param trie - trie object.
11
+ * @param parent - parent node, it can be `null`.
12
+ * @param child - child node.
13
+ * @param key - target nibbles.
14
+ * @param pos - key position.
15
+ * @param removeLeft - remove all nodes to the left or right of the target key.
16
+ * @param stack - a stack of modified nodes.
17
+ * @returns The end position of key.
18
+ */
19
+ async function unset(trie, parent, child, key, pos, removeLeft, stack) {
20
+ if (child instanceof BranchMPTNode) {
21
+ /**
22
+ * This node is a branch node,
23
+ * remove all branches on the left or right
24
+ */
25
+ if (removeLeft) {
26
+ for (let i = 0; i < key[pos]; i++) {
27
+ child.setBranch(i, null);
28
+ }
29
+ }
30
+ else {
31
+ for (let i = key[pos] + 1; i < 16; i++) {
32
+ child.setBranch(i, null);
33
+ }
34
+ }
35
+ // record this node on the stack
36
+ stack.push(child);
37
+ // continue to the next node
38
+ const next = child.getBranch(key[pos]);
39
+ const _child = next && (await trie.lookupNode(next));
40
+ return unset(trie, child, _child, key, pos + 1, removeLeft, stack);
41
+ }
42
+ else if (child instanceof ExtensionMPTNode || child instanceof LeafMPTNode) {
43
+ /**
44
+ * This node is an extension node or lead node,
45
+ * if node._nibbles is less or greater than the target key,
46
+ * remove self from parent
47
+ */
48
+ if (key.length - pos < child.keyLength() ||
49
+ nibblesCompare(child._nibbles, key.slice(pos, pos + child.keyLength())) !== 0) {
50
+ if (removeLeft) {
51
+ if (nibblesCompare(child._nibbles, key.slice(pos)) < 0) {
52
+ ;
53
+ parent.setBranch(key[pos - 1], null);
54
+ }
55
+ }
56
+ else {
57
+ if (nibblesCompare(child._nibbles, key.slice(pos)) > 0) {
58
+ ;
59
+ parent.setBranch(key[pos - 1], null);
60
+ }
61
+ }
62
+ return pos - 1;
63
+ }
64
+ if (child instanceof LeafMPTNode) {
65
+ // This node is a leaf node, directly remove it from parent
66
+ ;
67
+ parent.setBranch(key[pos - 1], null);
68
+ return pos - 1;
69
+ }
70
+ else {
71
+ const _child = await trie.lookupNode(child.value());
72
+ if (_child instanceof LeafMPTNode) {
73
+ // The child of this node is leaf node, remove it from parent too
74
+ ;
75
+ parent.setBranch(key[pos - 1], null);
76
+ return pos - 1;
77
+ }
78
+ // record this node on the stack
79
+ stack.push(child);
80
+ // continue to the next node
81
+ return unset(trie, child, _child, key, pos + child.keyLength(), removeLeft, stack);
82
+ }
83
+ }
84
+ else if (child === null) {
85
+ return pos - 1;
86
+ }
87
+ else {
88
+ throw EthereumJSErrorWithoutCode('invalid node');
89
+ }
90
+ }
91
+ /**
92
+ * unsetInternal will remove all nodes between `left` and `right` (including `left` and `right`)
93
+ * @param trie - trie object.
94
+ * @param left - left nibbles.
95
+ * @param right - right nibbles.
96
+ * @returns Is it an empty trie.
97
+ */
98
+ async function unsetInternal(trie, left, right) {
99
+ // Key position
100
+ let pos = 0;
101
+ // Parent node
102
+ let parent = null;
103
+ // Current node
104
+ let node = await trie.lookupNode(trie.root());
105
+ let shortForkLeft;
106
+ let shortForkRight;
107
+ // A stack of modified nodes.
108
+ const stack = [];
109
+ // 1. Find the fork point of `left` and `right`
110
+ while (true) {
111
+ if (node instanceof ExtensionMPTNode || node instanceof LeafMPTNode) {
112
+ // record this node on the stack
113
+ stack.push(node);
114
+ if (left.length - pos < node.keyLength()) {
115
+ shortForkLeft = nibblesCompare(left.slice(pos), node._nibbles);
116
+ }
117
+ else {
118
+ shortForkLeft = nibblesCompare(left.slice(pos, pos + node.keyLength()), node._nibbles);
119
+ }
120
+ if (right.length - pos < node.keyLength()) {
121
+ shortForkRight = nibblesCompare(right.slice(pos), node._nibbles);
122
+ }
123
+ else {
124
+ shortForkRight = nibblesCompare(right.slice(pos, pos + node.keyLength()), node._nibbles);
125
+ }
126
+ // If one of `left` and `right` is not equal to node._nibbles, it means we found the fork point
127
+ if (shortForkLeft !== 0 || shortForkRight !== 0) {
128
+ break;
129
+ }
130
+ if (node instanceof LeafMPTNode) {
131
+ // it shouldn't happen
132
+ throw EthereumJSErrorWithoutCode('invalid node');
133
+ }
134
+ // continue to the next node
135
+ parent = node;
136
+ pos += node.keyLength();
137
+ node = await trie.lookupNode(node.value());
138
+ }
139
+ else if (node instanceof BranchMPTNode) {
140
+ // record this node on the stack
141
+ stack.push(node);
142
+ const leftNode = node.getBranch(left[pos]);
143
+ const rightNode = node.getBranch(right[pos]);
144
+ // One of `left` and `right` is `null`, stop searching
145
+ if (leftNode === null || rightNode === null) {
146
+ break;
147
+ }
148
+ // Stop searching if `left` and `right` are not equal
149
+ if (!(leftNode instanceof Uint8Array)) {
150
+ if (rightNode instanceof Uint8Array) {
151
+ break;
152
+ }
153
+ if (leftNode.length !== rightNode.length) {
154
+ break;
155
+ }
156
+ let abort = false;
157
+ for (let i = 0; i < leftNode.length; i++) {
158
+ if (!equalsBytes(leftNode[i], rightNode[i])) {
159
+ abort = true;
160
+ break;
161
+ }
162
+ }
163
+ if (abort) {
164
+ break;
165
+ }
166
+ }
167
+ else {
168
+ if (!(rightNode instanceof Uint8Array)) {
169
+ break;
170
+ }
171
+ if (!equalsBytes(leftNode, rightNode)) {
172
+ break;
173
+ }
174
+ }
175
+ // continue to the next node
176
+ parent = node;
177
+ node = await trie.lookupNode(leftNode);
178
+ pos += 1;
179
+ }
180
+ else {
181
+ throw EthereumJSErrorWithoutCode('invalid node');
182
+ }
183
+ }
184
+ // 2. Starting from the fork point, delete all nodes between `left` and `right`
185
+ const saveStack = (key, stack) => {
186
+ return trie.saveStack(key, stack, []);
187
+ };
188
+ if (node instanceof ExtensionMPTNode || node instanceof LeafMPTNode) {
189
+ /**
190
+ * There can have these five scenarios:
191
+ * - both proofs are less than the trie path => no valid range
192
+ * - both proofs are greater than the trie path => no valid range
193
+ * - left proof is less and right proof is greater => valid range, unset the entire trie
194
+ * - left proof points to the trie node, but right proof is greater => valid range, unset left node
195
+ * - right proof points to the trie node, but left proof is less => valid range, unset right node
196
+ */
197
+ const removeSelfFromParentAndSaveStack = async (key) => {
198
+ if (parent === null) {
199
+ return true;
200
+ }
201
+ stack.pop();
202
+ parent.setBranch(key[pos - 1], null);
203
+ await saveStack(key.slice(0, pos - 1), stack);
204
+ return false;
205
+ };
206
+ if (shortForkLeft === -1 && shortForkRight === -1) {
207
+ throw EthereumJSErrorWithoutCode('invalid range');
208
+ }
209
+ if (shortForkLeft === 1 && shortForkRight === 1) {
210
+ throw EthereumJSErrorWithoutCode('invalid range');
211
+ }
212
+ if (shortForkLeft !== 0 && shortForkRight !== 0) {
213
+ // Unset the entire trie
214
+ return removeSelfFromParentAndSaveStack(left);
215
+ }
216
+ // Unset left node
217
+ if (shortForkRight !== 0) {
218
+ if (node instanceof LeafMPTNode) {
219
+ return removeSelfFromParentAndSaveStack(left);
220
+ }
221
+ const child = await trie.lookupNode(node._value);
222
+ if (child instanceof LeafMPTNode) {
223
+ return removeSelfFromParentAndSaveStack(left);
224
+ }
225
+ const endPos = await unset(trie, node, child, left.slice(pos), node.keyLength(), false, stack);
226
+ await saveStack(left.slice(0, pos + endPos), stack);
227
+ return false;
228
+ }
229
+ // Unset right node
230
+ if (shortForkLeft !== 0) {
231
+ if (node instanceof LeafMPTNode) {
232
+ return removeSelfFromParentAndSaveStack(right);
233
+ }
234
+ const child = await trie.lookupNode(node._value);
235
+ if (child instanceof LeafMPTNode) {
236
+ return removeSelfFromParentAndSaveStack(right);
237
+ }
238
+ const endPos = await unset(trie, node, child, right.slice(pos), node.keyLength(), true, stack);
239
+ await saveStack(right.slice(0, pos + endPos), stack);
240
+ return false;
241
+ }
242
+ return false;
243
+ }
244
+ else if (node instanceof BranchMPTNode) {
245
+ // Unset all internal nodes in the forkPoint
246
+ for (let i = left[pos] + 1; i < right[pos]; i++) {
247
+ node.setBranch(i, null);
248
+ }
249
+ {
250
+ /**
251
+ * `stack` records the path from root to fork point.
252
+ * Since we need to unset both left and right nodes once,
253
+ * we need to make a copy here.
254
+ */
255
+ const _stack = [...stack];
256
+ const next = node.getBranch(left[pos]);
257
+ const child = next && (await trie.lookupNode(next));
258
+ const endPos = await unset(trie, node, child, left.slice(pos), 1, false, _stack);
259
+ await saveStack(left.slice(0, pos + endPos), _stack);
260
+ }
261
+ {
262
+ const _stack = [...stack];
263
+ const next = node.getBranch(right[pos]);
264
+ const child = next && (await trie.lookupNode(next));
265
+ const endPos = await unset(trie, node, child, right.slice(pos), 1, true, _stack);
266
+ await saveStack(right.slice(0, pos + endPos), _stack);
267
+ }
268
+ return false;
269
+ }
270
+ else {
271
+ throw EthereumJSErrorWithoutCode('invalid node');
272
+ }
273
+ }
274
+ /**
275
+ * Verifies a proof and return the verified trie.
276
+ * @param rootHash - root hash.
277
+ * @param key - target key.
278
+ * @param proof - proof node list.
279
+ * @throws If proof is found to be invalid.
280
+ * @returns The value from the key, or null if valid proof of non-existence.
281
+ */
282
+ async function verifyMPTWithMerkleProof(rootHash, key, proof, useKeyHashingFunction) {
283
+ const proofTrie = await createMPTFromProof(proof, {
284
+ root: rootHash,
285
+ useKeyHashingFunction,
286
+ });
287
+ try {
288
+ const value = await proofTrie.get(key, true);
289
+ return {
290
+ trie: proofTrie,
291
+ value,
292
+ };
293
+ }
294
+ catch (err) {
295
+ if (err.message === 'Missing node in DB') {
296
+ throw EthereumJSErrorWithoutCode('Invalid proof provided');
297
+ }
298
+ else {
299
+ throw err;
300
+ }
301
+ }
302
+ }
303
+ /**
304
+ * hasRightElement returns the indicator whether there exists more elements
305
+ * on the right side of the given path
306
+ * @param trie - trie object.
307
+ * @param key - given path.
308
+ */
309
+ async function hasRightElement(trie, key) {
310
+ let pos = 0;
311
+ let node = await trie.lookupNode(trie.root());
312
+ while (node !== null) {
313
+ if (node instanceof BranchMPTNode) {
314
+ for (let i = key[pos] + 1; i < 16; i++) {
315
+ if (node.getBranch(i) !== null) {
316
+ return true;
317
+ }
318
+ }
319
+ const next = node.getBranch(key[pos]);
320
+ node = next && (await trie.lookupNode(next));
321
+ pos += 1;
322
+ }
323
+ else if (node instanceof ExtensionMPTNode) {
324
+ if (key.length - pos < node.keyLength() ||
325
+ nibblesCompare(node._nibbles, key.slice(pos, pos + node.keyLength())) !== 0) {
326
+ return nibblesCompare(node._nibbles, key.slice(pos)) > 0;
327
+ }
328
+ pos += node.keyLength();
329
+ node = await trie.lookupNode(node._value);
330
+ }
331
+ else if (node instanceof LeafMPTNode) {
332
+ return false;
333
+ }
334
+ else {
335
+ throw EthereumJSErrorWithoutCode('invalid node');
336
+ }
337
+ }
338
+ return false;
339
+ }
340
+ /**
341
+ * Checks whether the given leaf nodes and edge proof can prove the given trie leaves range is matched with the specific root.
342
+ *
343
+ * A range proof is a proof that includes the encoded trie nodes from the root node to leaf node for one or more branches of a trie,
344
+ * allowing an entire range of leaf nodes to be validated. This is useful in applications such as snap sync where contiguous ranges
345
+ * of state trie data is received and validated for constructing world state, locally.
346
+ *
347
+ * There are four situations:
348
+ *
349
+ * - All elements proof. In this case the proof can be null, but the range should
350
+ * be all the leaves in the trie.
351
+ *
352
+ * - One element proof. In this case no matter the edge proof is a non-existent
353
+ * proof or not, we can always verify the correctness of the proof.
354
+ *
355
+ * - Zero element proof. In this case a single non-existent proof is enough to prove.
356
+ * Besides, if there are still some other leaves available on the right side, then
357
+ * an error will be returned.
358
+ *
359
+ * - Two edge elements proof. In this case two existent or non-existent proof(first and last) should be provided.
360
+ *
361
+ * NOTE: Currently only supports verification when the length of firstKey and lastKey are the same.
362
+ *
363
+ * @param rootHash - root hash of state trie this proof is being verified against.
364
+ * @param firstKey - first key of range being proven.
365
+ * @param lastKey - last key of range being proven.
366
+ * @param keys - key list of leaf data being proven.
367
+ * @param values - value list of leaf data being proven, one-to-one correspondence with keys.
368
+ * @param proof - proof node list, if all-elements-proof where no proof is needed, proof should be null, and both `firstKey` and `lastKey` must be null as well
369
+ * @param opts - optional, the opts may include a custom hashing function to use with the trie for proof verification
370
+ * @returns a flag to indicate whether there exists more trie node in the trie
371
+ */
372
+ export async function verifyMerkleRangeProof(rootHash, firstKeyRaw, lastKeyRaw, keysRaw, values, proof, useKeyHashingFunction = keccak_256) {
373
+ // Convert Uint8Array keys to nibbles
374
+ const firstKey = firstKeyRaw !== null ? bytesToNibbles(firstKeyRaw) : null;
375
+ const lastKey = lastKeyRaw !== null ? bytesToNibbles(lastKeyRaw) : null;
376
+ const keys = keysRaw.map(bytesToNibbles);
377
+ if (keys.length !== values.length) {
378
+ throw EthereumJSErrorWithoutCode('invalid keys length or values length');
379
+ }
380
+ // Make sure the keys are in order
381
+ for (let i = 0; i < keys.length - 1; i++) {
382
+ if (nibblesCompare(keys[i], keys[i + 1]) >= 0) {
383
+ throw EthereumJSErrorWithoutCode('invalid keys order');
384
+ }
385
+ }
386
+ // Make sure all values are present
387
+ for (const value of values) {
388
+ if (value.length === 0) {
389
+ throw EthereumJSErrorWithoutCode('invalid values');
390
+ }
391
+ }
392
+ // All elements proof
393
+ if (proof === null && firstKey === null && lastKey === null) {
394
+ const trie = new MerklePatriciaTrie({ useKeyHashingFunction });
395
+ for (let i = 0; i < keys.length; i++) {
396
+ await trie.put(nibblesTypeToPackedBytes(keys[i]), values[i]);
397
+ }
398
+ if (!equalsBytes(rootHash, trie.root())) {
399
+ throw EthereumJSErrorWithoutCode('invalid all elements proof: root mismatch');
400
+ }
401
+ return false;
402
+ }
403
+ if (proof !== null && firstKey !== null && lastKey === null) {
404
+ // Zero element proof
405
+ if (keys.length === 0) {
406
+ const { trie, value } = await verifyMPTWithMerkleProof(rootHash, nibblesTypeToPackedBytes(firstKey), proof, useKeyHashingFunction);
407
+ if (value !== null || (await hasRightElement(trie, firstKey))) {
408
+ throw EthereumJSErrorWithoutCode('invalid zero element proof: value mismatch');
409
+ }
410
+ return false;
411
+ }
412
+ }
413
+ if (proof === null || firstKey === null || lastKey === null) {
414
+ throw EthereumJSErrorWithoutCode('invalid all elements proof: proof, firstKey, lastKey must be null at the same time');
415
+ }
416
+ // One element proof
417
+ if (keys.length === 1 && nibblesCompare(firstKey, lastKey) === 0) {
418
+ const { trie, value } = await verifyMPTWithMerkleProof(rootHash, nibblesTypeToPackedBytes(firstKey), proof, useKeyHashingFunction);
419
+ if (nibblesCompare(firstKey, keys[0]) !== 0) {
420
+ throw EthereumJSErrorWithoutCode('invalid one element proof: firstKey should be equal to keys[0]');
421
+ }
422
+ if (value === null || !equalsBytes(value, values[0])) {
423
+ throw EthereumJSErrorWithoutCode('invalid one element proof: value mismatch');
424
+ }
425
+ return hasRightElement(trie, firstKey);
426
+ }
427
+ // Two edge elements proof
428
+ if (nibblesCompare(firstKey, lastKey) >= 0) {
429
+ throw EthereumJSErrorWithoutCode('invalid two edge elements proof: firstKey should be less than lastKey');
430
+ }
431
+ if (firstKey.length !== lastKey.length) {
432
+ throw EthereumJSErrorWithoutCode('invalid two edge elements proof: the length of firstKey should be equal to the length of lastKey');
433
+ }
434
+ const trie = await createMPTFromProof(proof, {
435
+ useKeyHashingFunction,
436
+ root: rootHash,
437
+ });
438
+ // Remove all nodes between two edge proofs
439
+ const empty = await unsetInternal(trie, firstKey, lastKey);
440
+ if (empty) {
441
+ trie.root(trie.EMPTY_TRIE_ROOT);
442
+ }
443
+ // Put all elements to the trie
444
+ for (let i = 0; i < keys.length; i++) {
445
+ await trie.put(nibblesTypeToPackedBytes(keys[i]), values[i]);
446
+ }
447
+ // Compare rootHash
448
+ if (!equalsBytes(trie.root(), rootHash)) {
449
+ throw EthereumJSErrorWithoutCode('invalid two edge elements proof: root mismatch');
450
+ }
451
+ return hasRightElement(trie, keys[keys.length - 1]);
452
+ }
453
+ //# sourceMappingURL=range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.js","sourceRoot":"","sources":["../../../src/proof/range.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import type { DB, ValueEncoding } from '@feelyourprotocol/util';
2
+ import type { BranchMPTNode, ExtensionMPTNode, LeafMPTNode } from './node/index.ts';
3
+ import type { WalkController } from './util/walkController.ts';
4
+ export type MPTNode = BranchMPTNode | ExtensionMPTNode | LeafMPTNode;
5
+ export type Nibbles = number[];
6
+ export type RawExtensionMPTNode = [Uint8Array, Uint8Array];
7
+ export type RawLeafMPTNode = [Uint8Array, Uint8Array];
8
+ export type NodeReferenceOrRawMPTNode = Uint8Array | RawExtensionMPTNode | RawLeafMPTNode;
9
+ export type BranchMPTNodeBranchValue = NodeReferenceOrRawMPTNode | null;
10
+ export type Proof = Uint8Array[];
11
+ export interface CommonInterface {
12
+ customCrypto: {
13
+ keccak256?: (msg: Uint8Array) => Uint8Array;
14
+ };
15
+ }
16
+ export interface Path {
17
+ node: MPTNode | null;
18
+ remaining: Nibbles;
19
+ stack: MPTNode[];
20
+ }
21
+ export type FoundNodeFunction = (nodeRef: NodeReferenceOrRawMPTNode, node: MPTNode | null, key: Nibbles, walkController: WalkController) => void;
22
+ export type HashKeysFunction = (msg: Uint8Array) => Uint8Array;
23
+ export interface MPTOpts {
24
+ /**
25
+ * A database instance.
26
+ */
27
+ db?: DB<string, string | Uint8Array>;
28
+ /**
29
+ * A `Uint8Array` for the root of a previously stored trie
30
+ */
31
+ root?: Uint8Array;
32
+ /**
33
+ * Create as a secure MerklePatriciaTrie where the keys are automatically hashed using the
34
+ * **keccak_256** hash function or alternatively the custom hash function provided.
35
+ * Default: `false`
36
+ *
37
+ * This is the flavor of the MerklePatriciaTrie which is used in production Ethereum networks
38
+ * like Ethereum Mainnet.
39
+ *
40
+ * Note: This functionality has been refactored along the v5 release and was before
41
+ * provided as a separate inherited class `SecureTrie`. Just replace with `Trie`
42
+ * instantiation with `useKeyHashing` set to `true`.
43
+ */
44
+ useKeyHashing?: boolean;
45
+ /**
46
+ * Hash function used for hashing trie node and securing key.
47
+ */
48
+ useKeyHashingFunction?: HashKeysFunction;
49
+ /**
50
+ * Add a prefix to the trie node keys
51
+ *
52
+ * (potential performance benefits if multiple tries are stored within the same DB,
53
+ * e.g. all storage tries being stored in the outer account state DB)
54
+ */
55
+ keyPrefix?: Uint8Array;
56
+ /**
57
+ * ValueEncoding of the database (the values which are `put`/`get` in the db are of this type). Defaults to `string`
58
+ */
59
+ valueEncoding?: ValueEncoding;
60
+ /**
61
+ * Store the root inside the database after every `write` operation
62
+ */
63
+ useRootPersistence?: boolean;
64
+ /**
65
+ * Flag to prune the trie. When set to `true`, each time a value is overridden,
66
+ * unreachable nodes will be pruned (deleted) from the trie
67
+ */
68
+ useNodePruning?: boolean;
69
+ /**
70
+ * LRU cache for trie nodes to allow for faster node retrieval.
71
+ *
72
+ * Default: 0 (deactivated)
73
+ */
74
+ cacheSize?: number;
75
+ /**
76
+ * @feelyourprotocol/common `Common` instance (an alternative to passing in a `customHashingFunction`)
77
+ */
78
+ common?: CommonInterface;
79
+ }
80
+ export type MPTOptsWithDefaults = MPTOpts & {
81
+ useKeyHashing: boolean;
82
+ useKeyHashingFunction: HashKeysFunction;
83
+ useRootPersistence: boolean;
84
+ useNodePruning: boolean;
85
+ cacheSize: number;
86
+ };
87
+ export interface TrieShallowCopyOpts {
88
+ keyPrefix?: Uint8Array;
89
+ cacheSize?: number;
90
+ }
91
+ export interface CheckpointDBOpts {
92
+ /**
93
+ * A database instance.
94
+ */
95
+ db: DB<string, string | Uint8Array>;
96
+ /**
97
+ * ValueEncoding of the database (the values which are `put`/`get` in the db are of this type). Defaults to `string`
98
+ */
99
+ valueEncoding?: ValueEncoding;
100
+ /**
101
+ * Cache size (default: 0)
102
+ */
103
+ cacheSize?: number;
104
+ }
105
+ export type Checkpoint = {
106
+ keyValueMap: Map<string, Uint8Array | undefined>;
107
+ root: Uint8Array;
108
+ };
109
+ export declare const ROOT_DB_KEY: Uint8Array<ArrayBufferLike>;
110
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { utf8ToBytes } from '@feelyourprotocol/util';
2
+ export const ROOT_DB_KEY = utf8ToBytes('__root__');
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAsJ9C,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA"}
@@ -0,0 +1,20 @@
1
+ import type { MerklePatriciaTrie } from '../mpt.ts';
2
+ import type { MPTNode } from '../types.ts';
3
+ export type NodeFilter = (node: MPTNode, key: number[]) => Promise<boolean>;
4
+ export type OnFound = (node: MPTNode, key: number[]) => Promise<any>;
5
+ /**
6
+ * Walk MerklePatriciaTrie via async generator
7
+ * @param nodeHash - The root key to walk on.
8
+ * @param currentKey - The current (partial) key.
9
+ * @param onFound - Called on every node found (before filter)
10
+ * @param filter - Filter nodes yielded by the generator.
11
+ * @param visited - Set of visited nodes
12
+ * @returns AsyncIterable<{ node: MPTNode; currentKey: number[] }>
13
+ * Iterate through nodes with
14
+ * `for await (const { node, currentKey } of trie._walkTrie(root)) { ... }`
15
+ */
16
+ export declare function _walkTrie(this: MerklePatriciaTrie, nodeHash: Uint8Array, currentKey?: number[], onFound?: OnFound, filter?: NodeFilter, visited?: Set<string>): AsyncIterable<{
17
+ node: MPTNode;
18
+ currentKey: number[];
19
+ }>;
20
+ //# sourceMappingURL=asyncWalk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncWalk.d.ts","sourceRoot":"","sources":["../../../src/util/asyncWalk.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAC3E,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;AAEpE;;;;;;;;;;GAUG;AACH,wBAAuB,SAAS,CAC9B,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,UAAU,EACpB,UAAU,GAAE,MAAM,EAAO,EACzB,OAAO,GAAE,OAA0D,EACnE,MAAM,GAAE,UAA+D,EACvE,OAAO,GAAE,GAAG,CAAC,MAAM,CAAqB,GACvC,aAAa,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA6BxD"}