@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.
- package/README.md +448 -0
- package/dist/cjs/constructors.d.ts +12 -0
- package/dist/cjs/constructors.d.ts.map +1 -0
- package/dist/cjs/constructors.js +57 -0
- package/dist/cjs/constructors.js.map +1 -0
- package/dist/cjs/db/checkpointDB.d.ts +87 -0
- package/dist/cjs/db/checkpointDB.d.ts.map +1 -0
- package/dist/cjs/db/checkpointDB.js +258 -0
- package/dist/cjs/db/checkpointDB.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 +8 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/mpt.d.ts +261 -0
- package/dist/cjs/mpt.d.ts.map +1 -0
- package/dist/cjs/mpt.js +900 -0
- package/dist/cjs/mpt.js.map +1 -0
- package/dist/cjs/node/branch.d.ts +14 -0
- package/dist/cjs/node/branch.d.ts.map +1 -0
- package/dist/cjs/node/branch.js +52 -0
- package/dist/cjs/node/branch.js.map +1 -0
- package/dist/cjs/node/extension.d.ts +7 -0
- package/dist/cjs/node/extension.d.ts.map +1 -0
- package/dist/cjs/node/extension.js +14 -0
- package/dist/cjs/node/extension.js.map +1 -0
- package/dist/cjs/node/extensionOrLeafNodeBase.d.ts +15 -0
- package/dist/cjs/node/extensionOrLeafNodeBase.d.ts.map +1 -0
- package/dist/cjs/node/extensionOrLeafNodeBase.js +42 -0
- package/dist/cjs/node/extensionOrLeafNodeBase.js.map +1 -0
- package/dist/cjs/node/index.d.ts +5 -0
- package/dist/cjs/node/index.d.ts.map +1 -0
- package/dist/cjs/node/index.js +21 -0
- package/dist/cjs/node/index.js.map +1 -0
- package/dist/cjs/node/leaf.d.ts +7 -0
- package/dist/cjs/node/leaf.d.ts.map +1 -0
- package/dist/cjs/node/leaf.js +14 -0
- package/dist/cjs/node/leaf.js.map +1 -0
- package/dist/cjs/node/util.d.ts +8 -0
- package/dist/cjs/node/util.d.ts.map +1 -0
- package/dist/cjs/node/util.js +38 -0
- package/dist/cjs/node/util.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/proof/index.d.ts +3 -0
- package/dist/cjs/proof/index.d.ts.map +1 -0
- package/dist/cjs/proof/index.js +19 -0
- package/dist/cjs/proof/index.js.map +1 -0
- package/dist/cjs/proof/proof.d.ts +41 -0
- package/dist/cjs/proof/proof.d.ts.map +1 -0
- package/dist/cjs/proof/proof.js +119 -0
- package/dist/cjs/proof/proof.js.map +1 -0
- package/dist/cjs/proof/range.d.ts +35 -0
- package/dist/cjs/proof/range.d.ts.map +1 -0
- package/dist/cjs/proof/range.js +456 -0
- package/dist/cjs/proof/range.js.map +1 -0
- package/dist/cjs/types.d.ts +110 -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/asyncWalk.d.ts +20 -0
- package/dist/cjs/util/asyncWalk.d.ts.map +1 -0
- package/dist/cjs/util/asyncWalk.js +50 -0
- package/dist/cjs/util/asyncWalk.js.map +1 -0
- package/dist/cjs/util/encoding.d.ts +31 -0
- package/dist/cjs/util/encoding.d.ts.map +1 -0
- package/dist/cjs/util/encoding.js +200 -0
- package/dist/cjs/util/encoding.js.map +1 -0
- package/dist/cjs/util/genesisState.d.ts +6 -0
- package/dist/cjs/util/genesisState.d.ts.map +1 -0
- package/dist/cjs/util/genesisState.js +45 -0
- package/dist/cjs/util/genesisState.js.map +1 -0
- package/dist/cjs/util/hex.d.ts +20 -0
- package/dist/cjs/util/hex.d.ts.map +1 -0
- package/dist/cjs/util/hex.js +48 -0
- package/dist/cjs/util/hex.js.map +1 -0
- package/dist/cjs/util/index.d.ts +4 -0
- package/dist/cjs/util/index.d.ts.map +1 -0
- package/dist/cjs/util/index.js +20 -0
- package/dist/cjs/util/index.js.map +1 -0
- package/dist/cjs/util/nibbles.d.ts +30 -0
- package/dist/cjs/util/nibbles.d.ts.map +1 -0
- package/dist/cjs/util/nibbles.js +79 -0
- package/dist/cjs/util/nibbles.js.map +1 -0
- package/dist/cjs/util/walkController.d.ts +72 -0
- package/dist/cjs/util/walkController.d.ts.map +1 -0
- package/dist/cjs/util/walkController.js +138 -0
- package/dist/cjs/util/walkController.js.map +1 -0
- package/dist/esm/constructors.d.ts +12 -0
- package/dist/esm/constructors.d.ts.map +1 -0
- package/dist/esm/constructors.js +53 -0
- package/dist/esm/constructors.js.map +1 -0
- package/dist/esm/db/checkpointDB.d.ts +87 -0
- package/dist/esm/db/checkpointDB.d.ts.map +1 -0
- package/dist/esm/db/checkpointDB.js +254 -0
- package/dist/esm/db/checkpointDB.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 +8 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/mpt.d.ts +261 -0
- package/dist/esm/mpt.d.ts.map +1 -0
- package/dist/esm/mpt.js +897 -0
- package/dist/esm/mpt.js.map +1 -0
- package/dist/esm/node/branch.d.ts +14 -0
- package/dist/esm/node/branch.d.ts.map +1 -0
- package/dist/esm/node/branch.js +48 -0
- package/dist/esm/node/branch.js.map +1 -0
- package/dist/esm/node/extension.d.ts +7 -0
- package/dist/esm/node/extension.d.ts.map +1 -0
- package/dist/esm/node/extension.js +10 -0
- package/dist/esm/node/extension.js.map +1 -0
- package/dist/esm/node/extensionOrLeafNodeBase.d.ts +15 -0
- package/dist/esm/node/extensionOrLeafNodeBase.d.ts.map +1 -0
- package/dist/esm/node/extensionOrLeafNodeBase.js +38 -0
- package/dist/esm/node/extensionOrLeafNodeBase.js.map +1 -0
- package/dist/esm/node/index.d.ts +5 -0
- package/dist/esm/node/index.d.ts.map +1 -0
- package/dist/esm/node/index.js +5 -0
- package/dist/esm/node/index.js.map +1 -0
- package/dist/esm/node/leaf.d.ts +7 -0
- package/dist/esm/node/leaf.d.ts.map +1 -0
- package/dist/esm/node/leaf.js +10 -0
- package/dist/esm/node/leaf.js.map +1 -0
- package/dist/esm/node/util.d.ts +8 -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/index.d.ts +3 -0
- package/dist/esm/proof/index.d.ts.map +1 -0
- package/dist/esm/proof/index.js +3 -0
- package/dist/esm/proof/index.js.map +1 -0
- package/dist/esm/proof/proof.d.ts +41 -0
- package/dist/esm/proof/proof.d.ts.map +1 -0
- package/dist/esm/proof/proof.js +113 -0
- package/dist/esm/proof/proof.js.map +1 -0
- package/dist/esm/proof/range.d.ts +35 -0
- package/dist/esm/proof/range.d.ts.map +1 -0
- package/dist/esm/proof/range.js +453 -0
- package/dist/esm/proof/range.js.map +1 -0
- package/dist/esm/types.d.ts +110 -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/asyncWalk.d.ts +20 -0
- package/dist/esm/util/asyncWalk.d.ts.map +1 -0
- package/dist/esm/util/asyncWalk.js +47 -0
- package/dist/esm/util/asyncWalk.js.map +1 -0
- package/dist/esm/util/encoding.d.ts +31 -0
- package/dist/esm/util/encoding.d.ts.map +1 -0
- package/dist/esm/util/encoding.js +188 -0
- package/dist/esm/util/encoding.js.map +1 -0
- package/dist/esm/util/genesisState.d.ts +6 -0
- package/dist/esm/util/genesisState.d.ts.map +1 -0
- package/dist/esm/util/genesisState.js +42 -0
- package/dist/esm/util/genesisState.js.map +1 -0
- package/dist/esm/util/hex.d.ts +20 -0
- package/dist/esm/util/hex.d.ts.map +1 -0
- package/dist/esm/util/hex.js +43 -0
- package/dist/esm/util/hex.js.map +1 -0
- package/dist/esm/util/index.d.ts +4 -0
- package/dist/esm/util/index.d.ts.map +1 -0
- package/dist/esm/util/index.js +4 -0
- package/dist/esm/util/index.js.map +1 -0
- package/dist/esm/util/nibbles.d.ts +30 -0
- package/dist/esm/util/nibbles.d.ts.map +1 -0
- package/dist/esm/util/nibbles.js +73 -0
- package/dist/esm/util/nibbles.js.map +1 -0
- package/dist/esm/util/walkController.d.ts +72 -0
- package/dist/esm/util/walkController.d.ts.map +1 -0
- package/dist/esm/util/walkController.js +134 -0
- package/dist/esm/util/walkController.js.map +1 -0
- package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
- package/package.json +85 -0
- package/src/constructors.ts +71 -0
- package/src/db/checkpointDB.ts +298 -0
- package/src/db/index.ts +1 -0
- package/src/index.ts +7 -0
- package/src/mpt.ts +1090 -0
- package/src/node/branch.ts +60 -0
- package/src/node/extension.ts +13 -0
- package/src/node/extensionOrLeafNodeBase.ts +54 -0
- package/src/node/index.ts +4 -0
- package/src/node/leaf.ts +13 -0
- package/src/node/util.ts +35 -0
- package/src/proof/index.ts +2 -0
- package/src/proof/proof.ts +135 -0
- package/src/proof/range.ts +542 -0
- package/src/types.ts +151 -0
- package/src/util/asyncWalk.ts +60 -0
- package/src/util/encoding.ts +209 -0
- package/src/util/genesisState.ts +52 -0
- package/src/util/hex.ts +47 -0
- package/src/util/index.ts +3 -0
- package/src/util/nibbles.ts +80 -0
- package/src/util/walkController.ts +172 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyMerkleRangeProof = verifyMerkleRangeProof;
|
|
4
|
+
const util_1 = require("@feelyourprotocol/util");
|
|
5
|
+
const sha3_js_1 = require("@noble/hashes/sha3.js");
|
|
6
|
+
const index_ts_1 = require("../index.js");
|
|
7
|
+
const mpt_ts_1 = require("../mpt.js");
|
|
8
|
+
const index_ts_2 = require("../node/index.js");
|
|
9
|
+
const nibbles_ts_1 = require("../util/nibbles.js");
|
|
10
|
+
// reference: https://github.com/ethereum/go-ethereum/blob/20356e57b119b4e70ce47665a71964434e15200d/trie/proof.go
|
|
11
|
+
/**
|
|
12
|
+
* unset will remove all nodes to the left or right of the target key(decided by `removeLeft`).
|
|
13
|
+
* @param trie - trie object.
|
|
14
|
+
* @param parent - parent node, it can be `null`.
|
|
15
|
+
* @param child - child node.
|
|
16
|
+
* @param key - target nibbles.
|
|
17
|
+
* @param pos - key position.
|
|
18
|
+
* @param removeLeft - remove all nodes to the left or right of the target key.
|
|
19
|
+
* @param stack - a stack of modified nodes.
|
|
20
|
+
* @returns The end position of key.
|
|
21
|
+
*/
|
|
22
|
+
async function unset(trie, parent, child, key, pos, removeLeft, stack) {
|
|
23
|
+
if (child instanceof index_ts_2.BranchMPTNode) {
|
|
24
|
+
/**
|
|
25
|
+
* This node is a branch node,
|
|
26
|
+
* remove all branches on the left or right
|
|
27
|
+
*/
|
|
28
|
+
if (removeLeft) {
|
|
29
|
+
for (let i = 0; i < key[pos]; i++) {
|
|
30
|
+
child.setBranch(i, null);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
for (let i = key[pos] + 1; i < 16; i++) {
|
|
35
|
+
child.setBranch(i, null);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// record this node on the stack
|
|
39
|
+
stack.push(child);
|
|
40
|
+
// continue to the next node
|
|
41
|
+
const next = child.getBranch(key[pos]);
|
|
42
|
+
const _child = next && (await trie.lookupNode(next));
|
|
43
|
+
return unset(trie, child, _child, key, pos + 1, removeLeft, stack);
|
|
44
|
+
}
|
|
45
|
+
else if (child instanceof index_ts_2.ExtensionMPTNode || child instanceof index_ts_2.LeafMPTNode) {
|
|
46
|
+
/**
|
|
47
|
+
* This node is an extension node or lead node,
|
|
48
|
+
* if node._nibbles is less or greater than the target key,
|
|
49
|
+
* remove self from parent
|
|
50
|
+
*/
|
|
51
|
+
if (key.length - pos < child.keyLength() ||
|
|
52
|
+
(0, nibbles_ts_1.nibblesCompare)(child._nibbles, key.slice(pos, pos + child.keyLength())) !== 0) {
|
|
53
|
+
if (removeLeft) {
|
|
54
|
+
if ((0, nibbles_ts_1.nibblesCompare)(child._nibbles, key.slice(pos)) < 0) {
|
|
55
|
+
;
|
|
56
|
+
parent.setBranch(key[pos - 1], null);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
if ((0, nibbles_ts_1.nibblesCompare)(child._nibbles, key.slice(pos)) > 0) {
|
|
61
|
+
;
|
|
62
|
+
parent.setBranch(key[pos - 1], null);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return pos - 1;
|
|
66
|
+
}
|
|
67
|
+
if (child instanceof index_ts_2.LeafMPTNode) {
|
|
68
|
+
// This node is a leaf node, directly remove it from parent
|
|
69
|
+
;
|
|
70
|
+
parent.setBranch(key[pos - 1], null);
|
|
71
|
+
return pos - 1;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const _child = await trie.lookupNode(child.value());
|
|
75
|
+
if (_child instanceof index_ts_2.LeafMPTNode) {
|
|
76
|
+
// The child of this node is leaf node, remove it from parent too
|
|
77
|
+
;
|
|
78
|
+
parent.setBranch(key[pos - 1], null);
|
|
79
|
+
return pos - 1;
|
|
80
|
+
}
|
|
81
|
+
// record this node on the stack
|
|
82
|
+
stack.push(child);
|
|
83
|
+
// continue to the next node
|
|
84
|
+
return unset(trie, child, _child, key, pos + child.keyLength(), removeLeft, stack);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (child === null) {
|
|
88
|
+
return pos - 1;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid node');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* unsetInternal will remove all nodes between `left` and `right` (including `left` and `right`)
|
|
96
|
+
* @param trie - trie object.
|
|
97
|
+
* @param left - left nibbles.
|
|
98
|
+
* @param right - right nibbles.
|
|
99
|
+
* @returns Is it an empty trie.
|
|
100
|
+
*/
|
|
101
|
+
async function unsetInternal(trie, left, right) {
|
|
102
|
+
// Key position
|
|
103
|
+
let pos = 0;
|
|
104
|
+
// Parent node
|
|
105
|
+
let parent = null;
|
|
106
|
+
// Current node
|
|
107
|
+
let node = await trie.lookupNode(trie.root());
|
|
108
|
+
let shortForkLeft;
|
|
109
|
+
let shortForkRight;
|
|
110
|
+
// A stack of modified nodes.
|
|
111
|
+
const stack = [];
|
|
112
|
+
// 1. Find the fork point of `left` and `right`
|
|
113
|
+
while (true) {
|
|
114
|
+
if (node instanceof index_ts_2.ExtensionMPTNode || node instanceof index_ts_2.LeafMPTNode) {
|
|
115
|
+
// record this node on the stack
|
|
116
|
+
stack.push(node);
|
|
117
|
+
if (left.length - pos < node.keyLength()) {
|
|
118
|
+
shortForkLeft = (0, nibbles_ts_1.nibblesCompare)(left.slice(pos), node._nibbles);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
shortForkLeft = (0, nibbles_ts_1.nibblesCompare)(left.slice(pos, pos + node.keyLength()), node._nibbles);
|
|
122
|
+
}
|
|
123
|
+
if (right.length - pos < node.keyLength()) {
|
|
124
|
+
shortForkRight = (0, nibbles_ts_1.nibblesCompare)(right.slice(pos), node._nibbles);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
shortForkRight = (0, nibbles_ts_1.nibblesCompare)(right.slice(pos, pos + node.keyLength()), node._nibbles);
|
|
128
|
+
}
|
|
129
|
+
// If one of `left` and `right` is not equal to node._nibbles, it means we found the fork point
|
|
130
|
+
if (shortForkLeft !== 0 || shortForkRight !== 0) {
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
if (node instanceof index_ts_2.LeafMPTNode) {
|
|
134
|
+
// it shouldn't happen
|
|
135
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid node');
|
|
136
|
+
}
|
|
137
|
+
// continue to the next node
|
|
138
|
+
parent = node;
|
|
139
|
+
pos += node.keyLength();
|
|
140
|
+
node = await trie.lookupNode(node.value());
|
|
141
|
+
}
|
|
142
|
+
else if (node instanceof index_ts_2.BranchMPTNode) {
|
|
143
|
+
// record this node on the stack
|
|
144
|
+
stack.push(node);
|
|
145
|
+
const leftNode = node.getBranch(left[pos]);
|
|
146
|
+
const rightNode = node.getBranch(right[pos]);
|
|
147
|
+
// One of `left` and `right` is `null`, stop searching
|
|
148
|
+
if (leftNode === null || rightNode === null) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
// Stop searching if `left` and `right` are not equal
|
|
152
|
+
if (!(leftNode instanceof Uint8Array)) {
|
|
153
|
+
if (rightNode instanceof Uint8Array) {
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
if (leftNode.length !== rightNode.length) {
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
let abort = false;
|
|
160
|
+
for (let i = 0; i < leftNode.length; i++) {
|
|
161
|
+
if (!(0, util_1.equalsBytes)(leftNode[i], rightNode[i])) {
|
|
162
|
+
abort = true;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (abort) {
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
if (!(rightNode instanceof Uint8Array)) {
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
if (!(0, util_1.equalsBytes)(leftNode, rightNode)) {
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// continue to the next node
|
|
179
|
+
parent = node;
|
|
180
|
+
node = await trie.lookupNode(leftNode);
|
|
181
|
+
pos += 1;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid node');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// 2. Starting from the fork point, delete all nodes between `left` and `right`
|
|
188
|
+
const saveStack = (key, stack) => {
|
|
189
|
+
return trie.saveStack(key, stack, []);
|
|
190
|
+
};
|
|
191
|
+
if (node instanceof index_ts_2.ExtensionMPTNode || node instanceof index_ts_2.LeafMPTNode) {
|
|
192
|
+
/**
|
|
193
|
+
* There can have these five scenarios:
|
|
194
|
+
* - both proofs are less than the trie path => no valid range
|
|
195
|
+
* - both proofs are greater than the trie path => no valid range
|
|
196
|
+
* - left proof is less and right proof is greater => valid range, unset the entire trie
|
|
197
|
+
* - left proof points to the trie node, but right proof is greater => valid range, unset left node
|
|
198
|
+
* - right proof points to the trie node, but left proof is less => valid range, unset right node
|
|
199
|
+
*/
|
|
200
|
+
const removeSelfFromParentAndSaveStack = async (key) => {
|
|
201
|
+
if (parent === null) {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
stack.pop();
|
|
205
|
+
parent.setBranch(key[pos - 1], null);
|
|
206
|
+
await saveStack(key.slice(0, pos - 1), stack);
|
|
207
|
+
return false;
|
|
208
|
+
};
|
|
209
|
+
if (shortForkLeft === -1 && shortForkRight === -1) {
|
|
210
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid range');
|
|
211
|
+
}
|
|
212
|
+
if (shortForkLeft === 1 && shortForkRight === 1) {
|
|
213
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid range');
|
|
214
|
+
}
|
|
215
|
+
if (shortForkLeft !== 0 && shortForkRight !== 0) {
|
|
216
|
+
// Unset the entire trie
|
|
217
|
+
return removeSelfFromParentAndSaveStack(left);
|
|
218
|
+
}
|
|
219
|
+
// Unset left node
|
|
220
|
+
if (shortForkRight !== 0) {
|
|
221
|
+
if (node instanceof index_ts_2.LeafMPTNode) {
|
|
222
|
+
return removeSelfFromParentAndSaveStack(left);
|
|
223
|
+
}
|
|
224
|
+
const child = await trie.lookupNode(node._value);
|
|
225
|
+
if (child instanceof index_ts_2.LeafMPTNode) {
|
|
226
|
+
return removeSelfFromParentAndSaveStack(left);
|
|
227
|
+
}
|
|
228
|
+
const endPos = await unset(trie, node, child, left.slice(pos), node.keyLength(), false, stack);
|
|
229
|
+
await saveStack(left.slice(0, pos + endPos), stack);
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
// Unset right node
|
|
233
|
+
if (shortForkLeft !== 0) {
|
|
234
|
+
if (node instanceof index_ts_2.LeafMPTNode) {
|
|
235
|
+
return removeSelfFromParentAndSaveStack(right);
|
|
236
|
+
}
|
|
237
|
+
const child = await trie.lookupNode(node._value);
|
|
238
|
+
if (child instanceof index_ts_2.LeafMPTNode) {
|
|
239
|
+
return removeSelfFromParentAndSaveStack(right);
|
|
240
|
+
}
|
|
241
|
+
const endPos = await unset(trie, node, child, right.slice(pos), node.keyLength(), true, stack);
|
|
242
|
+
await saveStack(right.slice(0, pos + endPos), stack);
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
else if (node instanceof index_ts_2.BranchMPTNode) {
|
|
248
|
+
// Unset all internal nodes in the forkPoint
|
|
249
|
+
for (let i = left[pos] + 1; i < right[pos]; i++) {
|
|
250
|
+
node.setBranch(i, null);
|
|
251
|
+
}
|
|
252
|
+
{
|
|
253
|
+
/**
|
|
254
|
+
* `stack` records the path from root to fork point.
|
|
255
|
+
* Since we need to unset both left and right nodes once,
|
|
256
|
+
* we need to make a copy here.
|
|
257
|
+
*/
|
|
258
|
+
const _stack = [...stack];
|
|
259
|
+
const next = node.getBranch(left[pos]);
|
|
260
|
+
const child = next && (await trie.lookupNode(next));
|
|
261
|
+
const endPos = await unset(trie, node, child, left.slice(pos), 1, false, _stack);
|
|
262
|
+
await saveStack(left.slice(0, pos + endPos), _stack);
|
|
263
|
+
}
|
|
264
|
+
{
|
|
265
|
+
const _stack = [...stack];
|
|
266
|
+
const next = node.getBranch(right[pos]);
|
|
267
|
+
const child = next && (await trie.lookupNode(next));
|
|
268
|
+
const endPos = await unset(trie, node, child, right.slice(pos), 1, true, _stack);
|
|
269
|
+
await saveStack(right.slice(0, pos + endPos), _stack);
|
|
270
|
+
}
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid node');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Verifies a proof and return the verified trie.
|
|
279
|
+
* @param rootHash - root hash.
|
|
280
|
+
* @param key - target key.
|
|
281
|
+
* @param proof - proof node list.
|
|
282
|
+
* @throws If proof is found to be invalid.
|
|
283
|
+
* @returns The value from the key, or null if valid proof of non-existence.
|
|
284
|
+
*/
|
|
285
|
+
async function verifyMPTWithMerkleProof(rootHash, key, proof, useKeyHashingFunction) {
|
|
286
|
+
const proofTrie = await (0, index_ts_1.createMPTFromProof)(proof, {
|
|
287
|
+
root: rootHash,
|
|
288
|
+
useKeyHashingFunction,
|
|
289
|
+
});
|
|
290
|
+
try {
|
|
291
|
+
const value = await proofTrie.get(key, true);
|
|
292
|
+
return {
|
|
293
|
+
trie: proofTrie,
|
|
294
|
+
value,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
if (err.message === 'Missing node in DB') {
|
|
299
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('Invalid proof provided');
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
throw err;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* hasRightElement returns the indicator whether there exists more elements
|
|
308
|
+
* on the right side of the given path
|
|
309
|
+
* @param trie - trie object.
|
|
310
|
+
* @param key - given path.
|
|
311
|
+
*/
|
|
312
|
+
async function hasRightElement(trie, key) {
|
|
313
|
+
let pos = 0;
|
|
314
|
+
let node = await trie.lookupNode(trie.root());
|
|
315
|
+
while (node !== null) {
|
|
316
|
+
if (node instanceof index_ts_2.BranchMPTNode) {
|
|
317
|
+
for (let i = key[pos] + 1; i < 16; i++) {
|
|
318
|
+
if (node.getBranch(i) !== null) {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const next = node.getBranch(key[pos]);
|
|
323
|
+
node = next && (await trie.lookupNode(next));
|
|
324
|
+
pos += 1;
|
|
325
|
+
}
|
|
326
|
+
else if (node instanceof index_ts_2.ExtensionMPTNode) {
|
|
327
|
+
if (key.length - pos < node.keyLength() ||
|
|
328
|
+
(0, nibbles_ts_1.nibblesCompare)(node._nibbles, key.slice(pos, pos + node.keyLength())) !== 0) {
|
|
329
|
+
return (0, nibbles_ts_1.nibblesCompare)(node._nibbles, key.slice(pos)) > 0;
|
|
330
|
+
}
|
|
331
|
+
pos += node.keyLength();
|
|
332
|
+
node = await trie.lookupNode(node._value);
|
|
333
|
+
}
|
|
334
|
+
else if (node instanceof index_ts_2.LeafMPTNode) {
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid node');
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Checks whether the given leaf nodes and edge proof can prove the given trie leaves range is matched with the specific root.
|
|
345
|
+
*
|
|
346
|
+
* 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,
|
|
347
|
+
* allowing an entire range of leaf nodes to be validated. This is useful in applications such as snap sync where contiguous ranges
|
|
348
|
+
* of state trie data is received and validated for constructing world state, locally.
|
|
349
|
+
*
|
|
350
|
+
* There are four situations:
|
|
351
|
+
*
|
|
352
|
+
* - All elements proof. In this case the proof can be null, but the range should
|
|
353
|
+
* be all the leaves in the trie.
|
|
354
|
+
*
|
|
355
|
+
* - One element proof. In this case no matter the edge proof is a non-existent
|
|
356
|
+
* proof or not, we can always verify the correctness of the proof.
|
|
357
|
+
*
|
|
358
|
+
* - Zero element proof. In this case a single non-existent proof is enough to prove.
|
|
359
|
+
* Besides, if there are still some other leaves available on the right side, then
|
|
360
|
+
* an error will be returned.
|
|
361
|
+
*
|
|
362
|
+
* - Two edge elements proof. In this case two existent or non-existent proof(first and last) should be provided.
|
|
363
|
+
*
|
|
364
|
+
* NOTE: Currently only supports verification when the length of firstKey and lastKey are the same.
|
|
365
|
+
*
|
|
366
|
+
* @param rootHash - root hash of state trie this proof is being verified against.
|
|
367
|
+
* @param firstKey - first key of range being proven.
|
|
368
|
+
* @param lastKey - last key of range being proven.
|
|
369
|
+
* @param keys - key list of leaf data being proven.
|
|
370
|
+
* @param values - value list of leaf data being proven, one-to-one correspondence with keys.
|
|
371
|
+
* @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
|
|
372
|
+
* @param opts - optional, the opts may include a custom hashing function to use with the trie for proof verification
|
|
373
|
+
* @returns a flag to indicate whether there exists more trie node in the trie
|
|
374
|
+
*/
|
|
375
|
+
async function verifyMerkleRangeProof(rootHash, firstKeyRaw, lastKeyRaw, keysRaw, values, proof, useKeyHashingFunction = sha3_js_1.keccak_256) {
|
|
376
|
+
// Convert Uint8Array keys to nibbles
|
|
377
|
+
const firstKey = firstKeyRaw !== null ? (0, nibbles_ts_1.bytesToNibbles)(firstKeyRaw) : null;
|
|
378
|
+
const lastKey = lastKeyRaw !== null ? (0, nibbles_ts_1.bytesToNibbles)(lastKeyRaw) : null;
|
|
379
|
+
const keys = keysRaw.map(nibbles_ts_1.bytesToNibbles);
|
|
380
|
+
if (keys.length !== values.length) {
|
|
381
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid keys length or values length');
|
|
382
|
+
}
|
|
383
|
+
// Make sure the keys are in order
|
|
384
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
385
|
+
if ((0, nibbles_ts_1.nibblesCompare)(keys[i], keys[i + 1]) >= 0) {
|
|
386
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid keys order');
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// Make sure all values are present
|
|
390
|
+
for (const value of values) {
|
|
391
|
+
if (value.length === 0) {
|
|
392
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid values');
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// All elements proof
|
|
396
|
+
if (proof === null && firstKey === null && lastKey === null) {
|
|
397
|
+
const trie = new mpt_ts_1.MerklePatriciaTrie({ useKeyHashingFunction });
|
|
398
|
+
for (let i = 0; i < keys.length; i++) {
|
|
399
|
+
await trie.put((0, nibbles_ts_1.nibblesTypeToPackedBytes)(keys[i]), values[i]);
|
|
400
|
+
}
|
|
401
|
+
if (!(0, util_1.equalsBytes)(rootHash, trie.root())) {
|
|
402
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid all elements proof: root mismatch');
|
|
403
|
+
}
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
if (proof !== null && firstKey !== null && lastKey === null) {
|
|
407
|
+
// Zero element proof
|
|
408
|
+
if (keys.length === 0) {
|
|
409
|
+
const { trie, value } = await verifyMPTWithMerkleProof(rootHash, (0, nibbles_ts_1.nibblesTypeToPackedBytes)(firstKey), proof, useKeyHashingFunction);
|
|
410
|
+
if (value !== null || (await hasRightElement(trie, firstKey))) {
|
|
411
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid zero element proof: value mismatch');
|
|
412
|
+
}
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
if (proof === null || firstKey === null || lastKey === null) {
|
|
417
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid all elements proof: proof, firstKey, lastKey must be null at the same time');
|
|
418
|
+
}
|
|
419
|
+
// One element proof
|
|
420
|
+
if (keys.length === 1 && (0, nibbles_ts_1.nibblesCompare)(firstKey, lastKey) === 0) {
|
|
421
|
+
const { trie, value } = await verifyMPTWithMerkleProof(rootHash, (0, nibbles_ts_1.nibblesTypeToPackedBytes)(firstKey), proof, useKeyHashingFunction);
|
|
422
|
+
if ((0, nibbles_ts_1.nibblesCompare)(firstKey, keys[0]) !== 0) {
|
|
423
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid one element proof: firstKey should be equal to keys[0]');
|
|
424
|
+
}
|
|
425
|
+
if (value === null || !(0, util_1.equalsBytes)(value, values[0])) {
|
|
426
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid one element proof: value mismatch');
|
|
427
|
+
}
|
|
428
|
+
return hasRightElement(trie, firstKey);
|
|
429
|
+
}
|
|
430
|
+
// Two edge elements proof
|
|
431
|
+
if ((0, nibbles_ts_1.nibblesCompare)(firstKey, lastKey) >= 0) {
|
|
432
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid two edge elements proof: firstKey should be less than lastKey');
|
|
433
|
+
}
|
|
434
|
+
if (firstKey.length !== lastKey.length) {
|
|
435
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid two edge elements proof: the length of firstKey should be equal to the length of lastKey');
|
|
436
|
+
}
|
|
437
|
+
const trie = await (0, index_ts_1.createMPTFromProof)(proof, {
|
|
438
|
+
useKeyHashingFunction,
|
|
439
|
+
root: rootHash,
|
|
440
|
+
});
|
|
441
|
+
// Remove all nodes between two edge proofs
|
|
442
|
+
const empty = await unsetInternal(trie, firstKey, lastKey);
|
|
443
|
+
if (empty) {
|
|
444
|
+
trie.root(trie.EMPTY_TRIE_ROOT);
|
|
445
|
+
}
|
|
446
|
+
// Put all elements to the trie
|
|
447
|
+
for (let i = 0; i < keys.length; i++) {
|
|
448
|
+
await trie.put((0, nibbles_ts_1.nibblesTypeToPackedBytes)(keys[i]), values[i]);
|
|
449
|
+
}
|
|
450
|
+
// Compare rootHash
|
|
451
|
+
if (!(0, util_1.equalsBytes)(trie.root(), rootHash)) {
|
|
452
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('invalid two edge elements proof: root mismatch');
|
|
453
|
+
}
|
|
454
|
+
return hasRightElement(trie, keys[keys.length - 1]);
|
|
455
|
+
}
|
|
456
|
+
//# sourceMappingURL=range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range.js","sourceRoot":"","sources":["../../../src/proof/range.ts"],"names":[],"mappings":";;AAmaA,wDA0HC;AA7hBD,2CAA0E;AAC1E,mDAAkD;AAElD,0CAAgD;AAChD,sCAA8C;AAC9C,+CAA+E;AAC/E,mDAA6F;AAI7F,iHAAiH;AAEjH;;;;;;;;;;GAUG;AACH,KAAK,UAAU,KAAK,CAClB,IAAwB,EACxB,MAAe,EACf,KAAqB,EACrB,GAAY,EACZ,GAAW,EACX,UAAmB,EACnB,KAAgB;IAEhB,IAAI,KAAK,YAAY,wBAAa,EAAE,CAAC;QACnC;;;WAGG;QACH,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEjB,4BAA4B;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QACpD,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;IACpE,CAAC;SAAM,IAAI,KAAK,YAAY,2BAAgB,IAAI,KAAK,YAAY,sBAAW,EAAE,CAAC;QAC7E;;;;WAIG;QACH,IACE,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE;YACpC,IAAA,2BAAc,EAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,EAC7E,CAAC;YACD,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,IAAA,2BAAc,EAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvD,CAAC;oBAAC,MAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;gBAC1D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAA,2BAAc,EAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvD,CAAC;oBAAC,MAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;gBAC1D,CAAC;YACH,CAAC;YACD,OAAO,GAAG,GAAG,CAAC,CAAA;QAChB,CAAC;QAED,IAAI,KAAK,YAAY,sBAAW,EAAE,CAAC;YACjC,2DAA2D;YAC3D,CAAC;YAAC,MAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YACxD,OAAO,GAAG,GAAG,CAAC,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;YACnD,IAAI,MAAM,YAAY,sBAAW,EAAE,CAAC;gBAClC,iEAAiE;gBACjE,CAAC;gBAAC,MAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;gBACxD,OAAO,GAAG,GAAG,CAAC,CAAA;YAChB,CAAC;YAED,gCAAgC;YAChC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAEjB,4BAA4B;YAC5B,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;QACpF,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,GAAG,GAAG,CAAC,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,MAAM,IAAA,iCAA0B,EAAC,cAAc,CAAC,CAAA;IAClD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,aAAa,CAC1B,IAAwB,EACxB,IAAa,EACb,KAAc;IAEd,eAAe;IACf,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,cAAc;IACd,IAAI,MAAM,GAAmB,IAAI,CAAA;IACjC,eAAe;IACf,IAAI,IAAI,GAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7D,IAAI,aAAsB,CAAA;IAC1B,IAAI,cAAuB,CAAA;IAC3B,6BAA6B;IAC7B,MAAM,KAAK,GAAc,EAAE,CAAA;IAE3B,+CAA+C;IAE/C,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,YAAY,2BAAgB,IAAI,IAAI,YAAY,sBAAW,EAAE,CAAC;YACpE,gCAAgC;YAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEhB,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;gBACzC,aAAa,GAAG,IAAA,2BAAc,EAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAChE,CAAC;iBAAM,CAAC;gBACN,aAAa,GAAG,IAAA,2BAAc,EAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YACxF,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC1C,cAAc,GAAG,IAAA,2BAAc,EAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClE,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,IAAA,2BAAc,EAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1F,CAAC;YAED,+FAA+F;YAC/F,IAAI,aAAa,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;gBAChD,MAAK;YACP,CAAC;YAED,IAAI,IAAI,YAAY,sBAAW,EAAE,CAAC;gBAChC,sBAAsB;gBACtB,MAAM,IAAA,iCAA0B,EAAC,cAAc,CAAC,CAAA;YAClD,CAAC;YAED,4BAA4B;YAC5B,MAAM,GAAG,IAAI,CAAA;YACb,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAA;YACvB,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;QAC5C,CAAC;aAAM,IAAI,IAAI,YAAY,wBAAa,EAAE,CAAC;YACzC,gCAAgC;YAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;YAE5C,sDAAsD;YACtD,IAAI,QAAQ,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC5C,MAAK;YACP,CAAC;YAED,qDAAqD;YACrD,IAAI,CAAC,CAAC,QAAQ,YAAY,UAAU,CAAC,EAAE,CAAC;gBACtC,IAAI,SAAS,YAAY,UAAU,EAAE,CAAC;oBACpC,MAAK;gBACP,CAAC;gBAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;oBACzC,MAAK;gBACP,CAAC;gBAED,IAAI,KAAK,GAAG,KAAK,CAAA;gBACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,IAAI,CAAC,IAAA,kBAAW,EAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC5C,KAAK,GAAG,IAAI,CAAA;wBACZ,MAAK;oBACP,CAAC;gBACH,CAAC;gBACD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAK;gBACP,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,CAAC,SAAS,YAAY,UAAU,CAAC,EAAE,CAAC;oBACvC,MAAK;gBACP,CAAC;gBAED,IAAI,CAAC,IAAA,kBAAW,EAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;oBACtC,MAAK;gBACP,CAAC;YACH,CAAC;YAED,4BAA4B;YAC5B,MAAM,GAAG,IAAI,CAAA;YACb,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;YACtC,GAAG,IAAI,CAAC,CAAA;QACV,CAAC;aAAM,CAAC;YACN,MAAM,IAAA,iCAA0B,EAAC,cAAc,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAED,+EAA+E;IAE/E,MAAM,SAAS,GAAG,CAAC,GAAY,EAAE,KAAgB,EAAE,EAAE;QACnD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,IAAI,IAAI,YAAY,2BAAgB,IAAI,IAAI,YAAY,sBAAW,EAAE,CAAC;QACpE;;;;;;;WAOG;QACH,MAAM,gCAAgC,GAAG,KAAK,EAAE,GAAY,EAAE,EAAE;YAC9D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAA;YACb,CAAC;YAED,KAAK,CAAC,GAAG,EAAE,CACV;YAAC,MAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YACxD,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YAC7C,OAAO,KAAK,CAAA;QACd,CAAC,CAAA;QAED,IAAI,aAAa,KAAK,CAAC,CAAC,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,IAAA,iCAA0B,EAAC,eAAe,CAAC,CAAA;QACnD,CAAC;QAED,IAAI,aAAa,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,IAAA,iCAA0B,EAAC,eAAe,CAAC,CAAA;QACnD,CAAC;QAED,IAAI,aAAa,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YAChD,wBAAwB;YACxB,OAAO,gCAAgC,CAAC,IAAI,CAAC,CAAA;QAC/C,CAAC;QAED,kBAAkB;QAClB,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,IAAI,YAAY,sBAAW,EAAE,CAAC;gBAChC,OAAO,gCAAgC,CAAC,IAAI,CAAC,CAAA;YAC/C,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAChD,IAAI,KAAK,YAAY,sBAAW,EAAE,CAAC;gBACjC,OAAO,gCAAgC,CAAC,IAAI,CAAC,CAAA;YAC/C,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;YAC9F,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,EAAE,KAAK,CAAC,CAAA;YAEnD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,IAAI,YAAY,sBAAW,EAAE,CAAC;gBAChC,OAAO,gCAAgC,CAAC,KAAK,CAAC,CAAA;YAChD,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAChD,IAAI,KAAK,YAAY,sBAAW,EAAE,CAAC;gBACjC,OAAO,gCAAgC,CAAC,KAAK,CAAC,CAAA;YAChD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;YAC9F,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,EAAE,KAAK,CAAC,CAAA;YAEpD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,IAAI,YAAY,wBAAa,EAAE,CAAC;QACzC,4CAA4C;QAC5C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;QAED,CAAC;YACC;;;;eAIG;YACH,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YACtC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;YACnD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;YAChF,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;QACtD,CAAC;QAED,CAAC;YACC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;YACvC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;YACnD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;YAChF,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;QACvD,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,CAAC;QACN,MAAM,IAAA,iCAA0B,EAAC,cAAc,CAAC,CAAA;IAClD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,wBAAwB,CACrC,QAAoB,EACpB,GAAe,EACf,KAAmB,EACnB,qBAAuC;IAEvC,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAkB,EAAC,KAAK,EAAE;QAChD,IAAI,EAAE,QAAQ;QACd,qBAAqB;KACtB,CAAC,CAAA;IACF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC5C,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK;SACN,CAAA;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;YACzC,MAAM,IAAA,iCAA0B,EAAC,wBAAwB,CAAC,CAAA;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAAC,IAAwB,EAAE,GAAY;IACnE,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,IAAI,IAAI,GAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7D,OAAO,IAAI,KAAK,IAAI,EAAE,CAAC;QACrB,IAAI,IAAI,YAAY,wBAAa,EAAE,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC/B,OAAO,IAAI,CAAA;gBACb,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACrC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;YAC5C,GAAG,IAAI,CAAC,CAAA;QACV,CAAC;aAAM,IAAI,IAAI,YAAY,2BAAgB,EAAE,CAAC;YAC5C,IACE,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;gBACnC,IAAA,2BAAc,EAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,EAC3E,CAAC;gBACD,OAAO,IAAA,2BAAc,EAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YAC1D,CAAC;YAED,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAA;YACvB,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3C,CAAC;aAAM,IAAI,IAAI,YAAY,sBAAW,EAAE,CAAC;YACvC,OAAO,KAAK,CAAA;QACd,CAAC;aAAM,CAAC;YACN,MAAM,IAAA,iCAA0B,EAAC,cAAc,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACI,KAAK,UAAU,sBAAsB,CAC1C,QAAoB,EACpB,WAA8B,EAC9B,UAA6B,EAC7B,OAAqB,EACrB,MAAoB,EACpB,KAA0B,EAC1B,wBAA0C,oBAAU;IAEpD,qCAAqC;IACrC,MAAM,QAAQ,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAA,2BAAc,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1E,MAAM,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAA,2BAAc,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACvE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,2BAAc,CAAC,CAAA;IAExC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAA,iCAA0B,EAAC,sCAAsC,CAAC,CAAA;IAC1E,CAAC;IAED,kCAAkC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,IAAA,2BAAc,EAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAA,iCAA0B,EAAC,oBAAoB,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IACD,mCAAmC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAA,iCAA0B,EAAC,gBAAgB,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,2BAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAA;QAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAA,qCAAwB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,CAAC;QACD,IAAI,CAAC,IAAA,kBAAW,EAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,IAAA,iCAA0B,EAAC,2CAA2C,CAAC,CAAA;QAC/E,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5D,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,wBAAwB,CACpD,QAAQ,EACR,IAAA,qCAAwB,EAAC,QAAQ,CAAC,EAClC,KAAK,EACL,qBAAqB,CACtB,CAAA;YAED,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAA,iCAA0B,EAAC,4CAA4C,CAAC,CAAA;YAChF,CAAC;YAED,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5D,MAAM,IAAA,iCAA0B,EAC9B,oFAAoF,CACrF,CAAA;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAA,2BAAc,EAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,wBAAwB,CACpD,QAAQ,EACR,IAAA,qCAAwB,EAAC,QAAQ,CAAC,EAClC,KAAK,EACL,qBAAqB,CACtB,CAAA;QAED,IAAI,IAAA,2BAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAA,iCAA0B,EAC9B,gEAAgE,CACjE,CAAA;QACH,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAA,kBAAW,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,IAAA,iCAA0B,EAAC,2CAA2C,CAAC,CAAA;QAC/E,CAAC;QAED,OAAO,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAA,2BAAc,EAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAA,iCAA0B,EAC9B,uEAAuE,CACxE,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,IAAA,iCAA0B,EAC9B,kGAAkG,CACnG,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAkB,EAAC,KAAK,EAAE;QAC3C,qBAAqB;QACrB,IAAI,EAAE,QAAQ;KACf,CAAC,CAAA;IAEF,2CAA2C;IAC3C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1D,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACjC,CAAC;IAED,+BAA+B;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAA,qCAAwB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,IAAA,kBAAW,EAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,IAAA,iCAA0B,EAAC,gDAAgD,CAAC,CAAA;IACpF,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAsJjC,QAAA,WAAW,GAAG,IAAA,kBAAW,EAAC,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"}
|