@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,47 @@
|
|
|
1
|
+
import { RLP } from '@feelyourprotocol/rlp';
|
|
2
|
+
import { bytesToHex, equalsBytes } from '@feelyourprotocol/util';
|
|
3
|
+
import { BranchMPTNode } from "../node/branch.js";
|
|
4
|
+
import { ExtensionMPTNode } from "../node/extension.js";
|
|
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 async function* _walkTrie(nodeHash, currentKey = [], onFound = async (_trieNode, _key) => { }, filter = async (_trieNode, _key) => true, visited = new Set()) {
|
|
17
|
+
if (equalsBytes(nodeHash, this.EMPTY_TRIE_ROOT)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const node = await this.lookupNode(nodeHash);
|
|
22
|
+
if (node === undefined || visited.has(bytesToHex(this.hash(node.serialize())))) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
visited.add(bytesToHex(this.hash(node.serialize())));
|
|
26
|
+
await onFound(node, currentKey);
|
|
27
|
+
if (await filter(node, currentKey)) {
|
|
28
|
+
yield { node: node, currentKey };
|
|
29
|
+
}
|
|
30
|
+
if (node instanceof BranchMPTNode) {
|
|
31
|
+
for (const [nibble, childNode] of node._branches.entries()) {
|
|
32
|
+
const nextKey = [...currentKey, nibble];
|
|
33
|
+
const _childNode = childNode instanceof Uint8Array ? childNode : this.hash(RLP.encode(childNode));
|
|
34
|
+
yield* _walkTrie.bind(this)(_childNode, nextKey, onFound, filter, visited);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (node instanceof ExtensionMPTNode) {
|
|
38
|
+
const childNode = node.value();
|
|
39
|
+
const nextKey = [...currentKey, ...node._nibbles];
|
|
40
|
+
yield* _walkTrie.bind(this)(childNode, nextKey, onFound, filter, visited);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=asyncWalk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asyncWalk.js","sourceRoot":"","sources":["../../../src/util/asyncWalk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAQvD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAE9B,QAAoB,EACpB,aAAuB,EAAE,EACzB,UAAmB,KAAK,EAAE,SAAkB,EAAE,IAAc,EAAE,EAAE,GAAE,CAAC,EACnE,SAAqB,KAAK,EAAE,SAAkB,EAAE,IAAc,EAAE,EAAE,CAAC,IAAI,EACvE,UAAuB,IAAI,GAAG,EAAU;IAExC,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QAChD,OAAM;IACR,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,OAAM;QACR,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAA;QACrD,MAAM,OAAO,CAAC,IAAK,EAAE,UAAU,CAAC,CAAA;QAChC,IAAI,MAAM,MAAM,CAAC,IAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,EAAE,IAAI,EAAE,IAAK,EAAE,UAAU,EAAE,CAAA;QACnC,CAAC;QACD,IAAI,IAAI,YAAY,aAAa,EAAE,CAAC;YAClC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,EAAE,MAAM,CAAC,CAAA;gBACvC,MAAM,UAAU,GACd,SAAS,YAAY,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;gBAChF,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;YAC5E,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,YAAY,gBAAgB,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;YAC9B,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;YACjD,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAM;IACR,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Nibbles } from '../types.ts';
|
|
2
|
+
export declare const nibblesToBytes: (nibbles: Uint8Array) => Uint8Array<ArrayBuffer>;
|
|
3
|
+
export declare const hexToKeybytes: (hex: Uint8Array) => Uint8Array<ArrayBuffer>;
|
|
4
|
+
export declare const nibblesToCompactBytes: (nibbles: Uint8Array) => Uint8Array<ArrayBuffer>;
|
|
5
|
+
export declare const bytesToNibbles: (str: Uint8Array) => Uint8Array<ArrayBuffer>;
|
|
6
|
+
export declare const compactBytesToNibbles: (compact: Uint8Array) => Uint8Array<ArrayBufferLike>;
|
|
7
|
+
/**
|
|
8
|
+
* Converts each nibble into a single byte
|
|
9
|
+
*
|
|
10
|
+
* @param arr Nibble typed nibble array
|
|
11
|
+
* @returns Uint8Array typed byte array
|
|
12
|
+
*/
|
|
13
|
+
export declare const nibbleTypeToByteType: (arr: Nibbles) => Uint8Array;
|
|
14
|
+
/**
|
|
15
|
+
* Turns each byte into a single nibble, only extracting the lower nibble of each byte
|
|
16
|
+
*
|
|
17
|
+
* @param key Uint8Array typed byte array
|
|
18
|
+
* @returns Nibble typed nibble array
|
|
19
|
+
*/
|
|
20
|
+
export declare const byteTypeToNibbleType: (key: Uint8Array) => Nibbles;
|
|
21
|
+
/**
|
|
22
|
+
* Takes a string path and extends it by the given extension nibbles
|
|
23
|
+
*
|
|
24
|
+
* @param path String node path
|
|
25
|
+
* @param extension nibbles to extend by
|
|
26
|
+
* @param retType string indicating whether to return the key in "keybyte" or "hex" encoding
|
|
27
|
+
* @returns hex-encoded key
|
|
28
|
+
*/
|
|
29
|
+
export declare const pathToHexKey: (path: string, extension: Nibbles, retType: string) => Uint8Array;
|
|
30
|
+
export declare const mergeAndFormatKeyPaths: (pathStrings: string[]) => Uint8Array<ArrayBuffer>[][];
|
|
31
|
+
//# sourceMappingURL=encoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../../src/util/encoding.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAgC1C,eAAO,MAAM,cAAc,GAAI,SAAS,UAAU,4BAOjD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,UAAU,4BAS5C,CAAA;AAGD,eAAO,MAAM,qBAAqB,GAAI,SAAS,UAAU,4BAoBxD,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,KAAK,UAAU,4BAY7C,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,UAAU,gCAaxD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,KAAK,OAAO,KAAG,UAQnD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,KAAK,UAAU,KAAG,OAStD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,WAAW,OAAO,EAAE,SAAS,MAAM,KAAG,UAShF,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,aAAa,MAAM,EAAE,gCAgD3D,CAAA"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { concatBytes, hexToBytes, unprefixedHexToBytes } from '@feelyourprotocol/util';
|
|
2
|
+
import { nibblesTypeToPackedBytes } from "./nibbles.js";
|
|
3
|
+
// Reference: https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/
|
|
4
|
+
//
|
|
5
|
+
// MerklePatriciaTrie keys are dealt with in three distinct encodings:
|
|
6
|
+
//
|
|
7
|
+
// KEYBYTES encoding contains the actual key and nothing else. This encoding is the
|
|
8
|
+
// input to most API functions.
|
|
9
|
+
//
|
|
10
|
+
// HEX encoding contains one byte for each nibble of the key and an optional trailing
|
|
11
|
+
// 'terminator' byte of value 0x10 which indicates whether or not the node at the key
|
|
12
|
+
// contains a value. Hex key encoding is used for nodes loaded in memory because it's
|
|
13
|
+
// convenient to access.
|
|
14
|
+
//
|
|
15
|
+
// COMPACT encoding is defined by the Ethereum Yellow Paper (it's called "hex prefix
|
|
16
|
+
// encoding" there) and contains the bytes of the key and a flag. The high nibble of the
|
|
17
|
+
// first byte contains the flag; the lowest bit encoding the oddness of the length and
|
|
18
|
+
// the second-lowest encoding whether the node at the key is a value node. The low nibble
|
|
19
|
+
// of the first byte is zero in the case of an even number of nibbles and the first nibble
|
|
20
|
+
// in the case of an odd number. All remaining nibbles (now an even number) fit properly
|
|
21
|
+
// into the remaining bytes. Compact encoding is used for nodes stored on disk.
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @param nibbles byte sequence
|
|
25
|
+
* @returns boolean indicating if input hex nibble sequence has terminator indicating leaf-node
|
|
26
|
+
* terminator is represented with 16 because a nibble ranges from 0 - 15(f)
|
|
27
|
+
*/
|
|
28
|
+
const hasTerminator = (nibbles) => {
|
|
29
|
+
return nibbles.length > 0 && nibbles[nibbles.length - 1] === 16;
|
|
30
|
+
};
|
|
31
|
+
export const nibblesToBytes = (nibbles) => {
|
|
32
|
+
const bytes = new Uint8Array(nibbles.length / 2);
|
|
33
|
+
for (let bi = 0, ni = 0; ni < nibbles.length; bi += 1, ni += 2) {
|
|
34
|
+
bytes[bi] = (nibbles[ni] << 4) | nibbles[ni + 1];
|
|
35
|
+
}
|
|
36
|
+
return bytes;
|
|
37
|
+
};
|
|
38
|
+
export const hexToKeybytes = (hex) => {
|
|
39
|
+
if (hasTerminator(hex)) {
|
|
40
|
+
hex = hex.subarray(0, hex.length - 1);
|
|
41
|
+
}
|
|
42
|
+
if (hex.length % 2 === 1) {
|
|
43
|
+
throw Error("Can't convert hex key of odd length");
|
|
44
|
+
}
|
|
45
|
+
return nibblesToBytes(hex);
|
|
46
|
+
};
|
|
47
|
+
// hex to compact
|
|
48
|
+
export const nibblesToCompactBytes = (nibbles) => {
|
|
49
|
+
let terminator = 0;
|
|
50
|
+
if (hasTerminator(nibbles)) {
|
|
51
|
+
terminator = 1;
|
|
52
|
+
// Remove the terminator from the sequence
|
|
53
|
+
nibbles = nibbles.subarray(0, nibbles.length - 1);
|
|
54
|
+
}
|
|
55
|
+
const buf = new Uint8Array(nibbles.length / 2 + 1);
|
|
56
|
+
// Shift the terminator info into the first nibble of buf[0]
|
|
57
|
+
buf[0] = terminator << 5;
|
|
58
|
+
// If odd length, then add that flag into the first nibble and put the odd nibble to
|
|
59
|
+
// second part of buf[0] which otherwise will be left padded with a 0
|
|
60
|
+
if ((nibbles.length & 1) === 1) {
|
|
61
|
+
buf[0] |= 1 << 4;
|
|
62
|
+
buf[0] |= nibbles[0];
|
|
63
|
+
nibbles = nibbles.subarray(1);
|
|
64
|
+
}
|
|
65
|
+
// create bytes out of the rest even nibbles
|
|
66
|
+
return concatBytes(buf.subarray(0, 1), nibblesToBytes(nibbles));
|
|
67
|
+
};
|
|
68
|
+
export const bytesToNibbles = (str) => {
|
|
69
|
+
const l = str.length * 2 + 1;
|
|
70
|
+
const nibbles = new Uint8Array(l);
|
|
71
|
+
for (let i = 0; i < str.length; i++) {
|
|
72
|
+
const b = str[i];
|
|
73
|
+
nibbles[i * 2] = b / 16;
|
|
74
|
+
nibbles[i * 2 + 1] = b % 16;
|
|
75
|
+
}
|
|
76
|
+
// This will get removed from calling function if the first nibble
|
|
77
|
+
// indicates that terminator is not present
|
|
78
|
+
nibbles[l - 1] = 16;
|
|
79
|
+
return nibbles;
|
|
80
|
+
};
|
|
81
|
+
export const compactBytesToNibbles = (compact) => {
|
|
82
|
+
if (compact.length === 0) {
|
|
83
|
+
return compact;
|
|
84
|
+
}
|
|
85
|
+
let base = bytesToNibbles(compact);
|
|
86
|
+
// delete terminator flag if terminator flag was not in first nibble
|
|
87
|
+
if (base[0] < 2) {
|
|
88
|
+
base = base.subarray(0, base.length - 1);
|
|
89
|
+
}
|
|
90
|
+
// chop the terminator nibble and the even padding (if there is one)
|
|
91
|
+
// i.e. chop 2 left nibbles when even else 1 when odd
|
|
92
|
+
const chop = 2 - (base[0] & 1);
|
|
93
|
+
return base.subarray(chop);
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Converts each nibble into a single byte
|
|
97
|
+
*
|
|
98
|
+
* @param arr Nibble typed nibble array
|
|
99
|
+
* @returns Uint8Array typed byte array
|
|
100
|
+
*/
|
|
101
|
+
export const nibbleTypeToByteType = (arr) => {
|
|
102
|
+
const l = arr.length;
|
|
103
|
+
const buf = new Uint8Array(l);
|
|
104
|
+
for (let i = 0; i < buf.length; i++) {
|
|
105
|
+
buf[i] = arr[i];
|
|
106
|
+
}
|
|
107
|
+
return buf;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Turns each byte into a single nibble, only extracting the lower nibble of each byte
|
|
111
|
+
*
|
|
112
|
+
* @param key Uint8Array typed byte array
|
|
113
|
+
* @returns Nibble typed nibble array
|
|
114
|
+
*/
|
|
115
|
+
export const byteTypeToNibbleType = (key) => {
|
|
116
|
+
const nibbles = [];
|
|
117
|
+
for (let i = 0; i < key.length; i++) {
|
|
118
|
+
const q = i;
|
|
119
|
+
nibbles[q] = key[i] % 16;
|
|
120
|
+
}
|
|
121
|
+
return nibbles;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Takes a string path and extends it by the given extension nibbles
|
|
125
|
+
*
|
|
126
|
+
* @param path String node path
|
|
127
|
+
* @param extension nibbles to extend by
|
|
128
|
+
* @param retType string indicating whether to return the key in "keybyte" or "hex" encoding
|
|
129
|
+
* @returns hex-encoded key
|
|
130
|
+
*/
|
|
131
|
+
export const pathToHexKey = (path, extension, retType) => {
|
|
132
|
+
const b = hexToBytes(`0x${path}`);
|
|
133
|
+
const n = byteTypeToNibbleType(b);
|
|
134
|
+
if (retType === 'hex') {
|
|
135
|
+
return nibbleTypeToByteType(n.concat(extension));
|
|
136
|
+
}
|
|
137
|
+
else if (retType === 'keybyte') {
|
|
138
|
+
return nibblesTypeToPackedBytes(n.concat(extension));
|
|
139
|
+
}
|
|
140
|
+
throw Error('retType must be either "keybyte" or "hex"');
|
|
141
|
+
};
|
|
142
|
+
export const mergeAndFormatKeyPaths = (pathStrings) => {
|
|
143
|
+
const ret = [];
|
|
144
|
+
let paths = [];
|
|
145
|
+
let i = 0;
|
|
146
|
+
while (i < pathStrings.length) {
|
|
147
|
+
const outerPathString = pathStrings[i].split('/');
|
|
148
|
+
const outerAccountPath = outerPathString[0];
|
|
149
|
+
const outerStoragePath = outerPathString[1];
|
|
150
|
+
paths.push(outerAccountPath);
|
|
151
|
+
if (outerStoragePath !== undefined) {
|
|
152
|
+
paths.push(outerStoragePath);
|
|
153
|
+
}
|
|
154
|
+
let j = ++i;
|
|
155
|
+
while (j < pathStrings.length) {
|
|
156
|
+
const innerPathString = pathStrings[j].split('/');
|
|
157
|
+
const innerAccountPath = innerPathString[0];
|
|
158
|
+
const innerStoragePath = innerPathString[1];
|
|
159
|
+
if (innerAccountPath === outerAccountPath) {
|
|
160
|
+
paths.push(innerStoragePath);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
ret.push(paths);
|
|
164
|
+
paths = [];
|
|
165
|
+
i = j;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
j++;
|
|
169
|
+
}
|
|
170
|
+
if (paths.length > 0) {
|
|
171
|
+
ret.push(paths);
|
|
172
|
+
paths = [];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (paths.length > 0)
|
|
176
|
+
ret.push(paths);
|
|
177
|
+
return ret.map((pathStrings) => pathStrings.map((s) => {
|
|
178
|
+
if (s.length < 64) {
|
|
179
|
+
// partial path is compact encoded
|
|
180
|
+
return nibblesToCompactBytes(unprefixedHexToBytes(s));
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
// full path is keybyte encoded
|
|
184
|
+
return hexToKeybytes(unprefixedHexToBytes(s));
|
|
185
|
+
}
|
|
186
|
+
}));
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../../src/util/encoding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GenesisState } from '@feelyourprotocol/common';
|
|
2
|
+
/**
|
|
3
|
+
* Derives the stateRoot of the genesis block based on genesis allocations
|
|
4
|
+
*/
|
|
5
|
+
export declare function genesisMPTStateRoot(genesisState: GenesisState): Promise<Uint8Array<ArrayBufferLike>>;
|
|
6
|
+
//# sourceMappingURL=genesisState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesisState.d.ts","sourceRoot":"","sources":["../../../src/util/genesisState.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAgB,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEpE;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,YAAY,wCAkCnE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { RLP } from '@feelyourprotocol/rlp';
|
|
2
|
+
import { Account, hexToBytes, isHexString, unpadBytes, unprefixedHexToBytes, } from '@feelyourprotocol/util';
|
|
3
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
4
|
+
import { MerklePatriciaTrie } from "../mpt.js";
|
|
5
|
+
/**
|
|
6
|
+
* Derives the stateRoot of the genesis block based on genesis allocations
|
|
7
|
+
*/
|
|
8
|
+
export async function genesisMPTStateRoot(genesisState) {
|
|
9
|
+
const trie = new MerklePatriciaTrie({ useKeyHashing: true });
|
|
10
|
+
for (const [key, value] of Object.entries(genesisState)) {
|
|
11
|
+
const address = isHexString(key) ? hexToBytes(key) : unprefixedHexToBytes(key);
|
|
12
|
+
const account = new Account();
|
|
13
|
+
if (typeof value === 'string') {
|
|
14
|
+
account.balance = BigInt(value);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
const [balance, code, storage, nonce] = value;
|
|
18
|
+
if (balance !== undefined) {
|
|
19
|
+
account.balance = BigInt(balance);
|
|
20
|
+
}
|
|
21
|
+
if (code !== undefined) {
|
|
22
|
+
const codeBytes = isHexString(code) ? hexToBytes(code) : unprefixedHexToBytes(code);
|
|
23
|
+
account.codeHash = keccak_256(codeBytes);
|
|
24
|
+
}
|
|
25
|
+
if (storage !== undefined) {
|
|
26
|
+
const storageTrie = new MerklePatriciaTrie({ useKeyHashing: true });
|
|
27
|
+
for (const [k, val] of storage) {
|
|
28
|
+
const storageKey = isHexString(k) ? hexToBytes(k) : unprefixedHexToBytes(k);
|
|
29
|
+
const storageVal = RLP.encode(unpadBytes(isHexString(val) ? hexToBytes(val) : unprefixedHexToBytes(val)));
|
|
30
|
+
await storageTrie.put(storageKey, storageVal);
|
|
31
|
+
}
|
|
32
|
+
account.storageRoot = storageTrie.root();
|
|
33
|
+
}
|
|
34
|
+
if (nonce !== undefined) {
|
|
35
|
+
account.nonce = BigInt(nonce);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
await trie.put(address, account.serialize());
|
|
39
|
+
}
|
|
40
|
+
return trie.root();
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=genesisState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesisState.js","sourceRoot":"","sources":["../../../src/util/genesisState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AACrC,OAAO,EACL,OAAO,EACP,UAAU,EACV,WAAW,EACX,UAAU,EACV,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAI9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,YAA0B;IAClE,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;QAC9E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,KAA8B,CAAA;YACtE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;YACnC,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;gBACnF,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;YAC1C,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;gBACnE,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;oBAC/B,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAA;oBAC3E,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAC3B,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAC3E,CAAA;oBACD,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;gBAC/C,CAAC;gBACD,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;YAC1C,CAAC;YACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAA;AACpB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Nibbles } from '../types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Prepends hex prefix to an array of nibbles.
|
|
4
|
+
* @param key - Array of nibbles
|
|
5
|
+
* @returns returns buffer of encoded data
|
|
6
|
+
**/
|
|
7
|
+
export declare function addHexPrefix(key: Nibbles, terminator: boolean): Nibbles;
|
|
8
|
+
/**
|
|
9
|
+
* Removes hex prefix of an array of nibbles.
|
|
10
|
+
* @param val - Array of nibbles
|
|
11
|
+
* @private
|
|
12
|
+
*/
|
|
13
|
+
export declare function removeHexPrefix(val: Nibbles): Nibbles;
|
|
14
|
+
/**
|
|
15
|
+
* Returns true if hex-prefixed path is for a terminating (leaf) node.
|
|
16
|
+
* @param key - a hex-prefixed array of nibbles
|
|
17
|
+
* @private
|
|
18
|
+
*/
|
|
19
|
+
export declare function isTerminator(key: Nibbles): boolean;
|
|
20
|
+
//# sourceMappingURL=hex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../../src/util/hex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C;;;;IAII;AACJ,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAevE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAElD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prepends hex prefix to an array of nibbles.
|
|
3
|
+
* @param key - Array of nibbles
|
|
4
|
+
* @returns returns buffer of encoded data
|
|
5
|
+
**/
|
|
6
|
+
export function addHexPrefix(key, terminator) {
|
|
7
|
+
// odd
|
|
8
|
+
if (key.length % 2) {
|
|
9
|
+
key.unshift(1);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
// even
|
|
13
|
+
key.unshift(0);
|
|
14
|
+
key.unshift(0);
|
|
15
|
+
}
|
|
16
|
+
if (terminator) {
|
|
17
|
+
key[0] += 2;
|
|
18
|
+
}
|
|
19
|
+
return key;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Removes hex prefix of an array of nibbles.
|
|
23
|
+
* @param val - Array of nibbles
|
|
24
|
+
* @private
|
|
25
|
+
*/
|
|
26
|
+
export function removeHexPrefix(val) {
|
|
27
|
+
if (val[0] % 2) {
|
|
28
|
+
val = val.slice(1);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
val = val.slice(2);
|
|
32
|
+
}
|
|
33
|
+
return val;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns true if hex-prefixed path is for a terminating (leaf) node.
|
|
37
|
+
* @param key - a hex-prefixed array of nibbles
|
|
38
|
+
* @private
|
|
39
|
+
*/
|
|
40
|
+
export function isTerminator(key) {
|
|
41
|
+
return key[0] > 1;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=hex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../src/util/hex.ts"],"names":[],"mappings":"AAEA;;;;IAII;AACJ,MAAM,UAAU,YAAY,CAAC,GAAY,EAAE,UAAmB;IAC5D,MAAM;IACN,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACd,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACb,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Nibbles } from '../types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a bytes to a nibble array.
|
|
4
|
+
* @private
|
|
5
|
+
* @param key
|
|
6
|
+
*/
|
|
7
|
+
export declare function bytesToNibbles(key: Uint8Array): Nibbles;
|
|
8
|
+
/**
|
|
9
|
+
* Converts a nibble array into bytes.
|
|
10
|
+
* @private
|
|
11
|
+
* @param arr - Nibble array
|
|
12
|
+
*/
|
|
13
|
+
export declare function nibblesTypeToPackedBytes(arr: Nibbles): Uint8Array;
|
|
14
|
+
/**
|
|
15
|
+
* Compare two nibble array.
|
|
16
|
+
* * `0` is returned if `n2` === `n1`.
|
|
17
|
+
* * `1` is returned if `n2` > `n1`.
|
|
18
|
+
* * `-1` is returned if `n2` < `n1`.
|
|
19
|
+
* @param n1 - Nibble array
|
|
20
|
+
* @param n2 - Nibble array
|
|
21
|
+
*/
|
|
22
|
+
export declare function nibblesCompare(n1: Nibbles, n2: Nibbles): number;
|
|
23
|
+
/**
|
|
24
|
+
* Returns the number of in order matching nibbles of two give nibble arrays.
|
|
25
|
+
* @private
|
|
26
|
+
* @param nib1
|
|
27
|
+
* @param nib2
|
|
28
|
+
*/
|
|
29
|
+
export declare function matchingNibbleLength(nib1: Nibbles, nib2: Nibbles): number;
|
|
30
|
+
//# sourceMappingURL=nibbles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nibbles.d.ts","sourceRoot":"","sources":["../../../src/util/nibbles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAWvD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAOjE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,UAuBtD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAMzE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a bytes to a nibble array.
|
|
3
|
+
* @private
|
|
4
|
+
* @param key
|
|
5
|
+
*/
|
|
6
|
+
export function bytesToNibbles(key) {
|
|
7
|
+
const nibbles = [];
|
|
8
|
+
for (let i = 0; i < key.length; i++) {
|
|
9
|
+
let q = i * 2;
|
|
10
|
+
nibbles[q] = key[i] >> 4;
|
|
11
|
+
++q;
|
|
12
|
+
nibbles[q] = key[i] % 16;
|
|
13
|
+
}
|
|
14
|
+
return nibbles;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Converts a nibble array into bytes.
|
|
18
|
+
* @private
|
|
19
|
+
* @param arr - Nibble array
|
|
20
|
+
*/
|
|
21
|
+
export function nibblesTypeToPackedBytes(arr) {
|
|
22
|
+
const buf = new Uint8Array(arr.length / 2);
|
|
23
|
+
for (let i = 0; i < buf.length; i++) {
|
|
24
|
+
let q = i * 2;
|
|
25
|
+
buf[i] = (arr[q] << 4) + arr[++q];
|
|
26
|
+
}
|
|
27
|
+
return buf;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Compare two nibble array.
|
|
31
|
+
* * `0` is returned if `n2` === `n1`.
|
|
32
|
+
* * `1` is returned if `n2` > `n1`.
|
|
33
|
+
* * `-1` is returned if `n2` < `n1`.
|
|
34
|
+
* @param n1 - Nibble array
|
|
35
|
+
* @param n2 - Nibble array
|
|
36
|
+
*/
|
|
37
|
+
export function nibblesCompare(n1, n2) {
|
|
38
|
+
const cmpLength = Math.min(n1.length, n2.length);
|
|
39
|
+
let res = 0;
|
|
40
|
+
for (let i = 0; i < cmpLength; i++) {
|
|
41
|
+
if (n1[i] < n2[i]) {
|
|
42
|
+
res = -1;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
else if (n1[i] > n2[i]) {
|
|
46
|
+
res = 1;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (res === 0) {
|
|
51
|
+
if (n1.length < n2.length) {
|
|
52
|
+
res = -1;
|
|
53
|
+
}
|
|
54
|
+
else if (n1.length > n2.length) {
|
|
55
|
+
res = 1;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return res;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns the number of in order matching nibbles of two give nibble arrays.
|
|
62
|
+
* @private
|
|
63
|
+
* @param nib1
|
|
64
|
+
* @param nib2
|
|
65
|
+
*/
|
|
66
|
+
export function matchingNibbleLength(nib1, nib2) {
|
|
67
|
+
let i = 0;
|
|
68
|
+
while (nib1[i] === nib2[i] && nib1.length > i) {
|
|
69
|
+
i++;
|
|
70
|
+
}
|
|
71
|
+
return i;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=nibbles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nibbles.js","sourceRoot":"","sources":["../../../src/util/nibbles.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAe;IAC5C,MAAM,OAAO,GAAG,EAAa,CAAA;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACxB,EAAE,CAAC,CAAA;QACH,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,EAAW,EAAE,EAAW;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;IAEhD,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,GAAG,GAAG,CAAC,CAAC,CAAA;YACR,MAAK;QACP,CAAC;aAAM,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,GAAG,CAAC,CAAA;YACP,MAAK;QACP,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;YAC1B,GAAG,GAAG,CAAC,CAAC,CAAA;QACV,CAAC;aAAM,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;YACjC,GAAG,GAAG,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAa,EAAE,IAAa;IAC/D,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { PrioritizedTaskExecutor } from '@feelyourprotocol/util';
|
|
2
|
+
import { BranchMPTNode } from '../node/index.ts';
|
|
3
|
+
import type { MerklePatriciaTrie } from '../mpt.ts';
|
|
4
|
+
import type { FoundNodeFunction, MPTNode, Nibbles, NodeReferenceOrRawMPTNode } from '../types.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Interface to control how the trie is being traversed. Schedules node visits via a
|
|
7
|
+
* prioritized task queue and invokes the provided callback for each node.
|
|
8
|
+
*
|
|
9
|
+
* Used by {@link MerklePatriciaTrie.findPath}, {@link MerklePatriciaTrie.walkTrie}, etc.
|
|
10
|
+
*/
|
|
11
|
+
export declare class WalkController {
|
|
12
|
+
/** The {@link FoundNodeFunction} to call when a node is found. */
|
|
13
|
+
readonly onNode: FoundNodeFunction;
|
|
14
|
+
/** Task executor that prioritizes node visits (shorter paths first). */
|
|
15
|
+
readonly taskExecutor: PrioritizedTaskExecutor;
|
|
16
|
+
/** The trie being walked. */
|
|
17
|
+
readonly trie: MerklePatriciaTrie;
|
|
18
|
+
private _resolvePromise;
|
|
19
|
+
private _rejectPromise;
|
|
20
|
+
/**
|
|
21
|
+
* @param onNode - The {@link FoundNodeFunction} to call when a node is found.
|
|
22
|
+
* @param trie - The trie to walk on.
|
|
23
|
+
* @param poolSize - The size of the task queue.
|
|
24
|
+
*/
|
|
25
|
+
private constructor();
|
|
26
|
+
/**
|
|
27
|
+
* Creates and starts an async walk over a trie from the given root.
|
|
28
|
+
* Resolves when all reachable nodes have been visited and no new tasks were scheduled.
|
|
29
|
+
*
|
|
30
|
+
* @param onNode - The {@link FoundNodeFunction} to call when a node is found.
|
|
31
|
+
* @param trie - The trie to walk on.
|
|
32
|
+
* @param rootHash - The root hash (32-byte keccak) to start walking from.
|
|
33
|
+
* @param poolSize - Task execution pool size to prevent OOM errors. Defaults to 500.
|
|
34
|
+
* @returns A Promise that resolves when the walk is finished.
|
|
35
|
+
*/
|
|
36
|
+
static newWalk(onNode: FoundNodeFunction, trie: MerklePatriciaTrie, rootHash: Uint8Array, poolSize?: number): Promise<void>;
|
|
37
|
+
private _startWalk;
|
|
38
|
+
/**
|
|
39
|
+
* Runs all children of a node. Priority of these nodes is the key length of the children.
|
|
40
|
+
* Used when walking an Extension or when exploring all branches of a Branch node.
|
|
41
|
+
*
|
|
42
|
+
* @param node - Node to get all children of and call onNode on.
|
|
43
|
+
* @param currentKeyNibbles - The current key (nibbles) which would yield the `node` when
|
|
44
|
+
* trying to get this node with a `get` operation. Defaults to `[]`.
|
|
45
|
+
* @returns `void`
|
|
46
|
+
*/
|
|
47
|
+
allChildren(node: MPTNode, currentKeyNibbles?: Nibbles): void;
|
|
48
|
+
/**
|
|
49
|
+
* Pushes a node to the queue. If the queue has capacity, the node is executed immediately,
|
|
50
|
+
* otherwise it is queued for later execution.
|
|
51
|
+
*
|
|
52
|
+
* @param nodeRef - A node reference (32-byte keccak hash or raw encoding) to enqueue.
|
|
53
|
+
* @param currentKeyNibbles - The current key (nibbles) corresponding to this node. Defaults to `[]`.
|
|
54
|
+
* @param priority - Optional priority. Defaults to key length.
|
|
55
|
+
* @returns `void`
|
|
56
|
+
*/
|
|
57
|
+
pushNodeToQueue(nodeRef: NodeReferenceOrRawMPTNode, currentKeyNibbles?: Nibbles, priority?: number): void;
|
|
58
|
+
/**
|
|
59
|
+
* Pushes a branch of a certain BranchMPTNode to the event queue.
|
|
60
|
+
* Used by findPath when following a specific key (only one child index is traversed).
|
|
61
|
+
*
|
|
62
|
+
* @param node - The BranchMPTNode to select a branch on.
|
|
63
|
+
* @param currentKeyNibbles - The current key which leads to the corresponding node. Defaults to `[]`.
|
|
64
|
+
* @param childIndex - The child index (0–15) to add to the event queue.
|
|
65
|
+
* @param priority - Optional priority of the event. Defaults to the total key length.
|
|
66
|
+
* @returns `void`
|
|
67
|
+
* @throws If `node` is not a BranchMPTNode or if the branch at `childIndex` is empty.
|
|
68
|
+
*/
|
|
69
|
+
onlyBranchIndex(node: BranchMPTNode, currentKeyNibbles: Nibbles | undefined, childIndex: number, priority?: number): void;
|
|
70
|
+
private _processNode;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=walkController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walkController.d.ts","sourceRoot":"","sources":["../../../src/util/walkController.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAEtF,OAAO,EAAE,aAAa,EAAiC,MAAM,kBAAkB,CAAA;AAE/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEjG;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAElC,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAA;IAE9C,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IAEjC,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,cAAc,CAA0B;IAEhD;;;;OAIG;IACH,OAAO;IAQP;;;;;;;;;OASG;WACU,OAAO,CAClB,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,UAAU,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;YAKF,UAAU;IAexB;;;;;;;;OAQG;IACH,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAE,OAAY,GAAG,IAAI;IAqBjE;;;;;;;;OAQG;IACH,eAAe,CACb,OAAO,EAAE,yBAAyB,EAClC,iBAAiB,GAAE,OAAY,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAeP;;;;;;;;;;OAUG;IACH,eAAe,CACb,IAAI,EAAE,aAAa,EACnB,iBAAiB,EAAE,OAAO,YAAK,EAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAaP,OAAO,CAAC,YAAY;CAUrB"}
|