@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,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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WalkController = void 0;
|
|
4
|
+
const util_1 = require("@feelyourprotocol/util");
|
|
5
|
+
const index_ts_1 = require("../node/index.js");
|
|
6
|
+
/**
|
|
7
|
+
* Interface to control how the trie is being traversed. Schedules node visits via a
|
|
8
|
+
* prioritized task queue and invokes the provided callback for each node.
|
|
9
|
+
*
|
|
10
|
+
* Used by {@link MerklePatriciaTrie.findPath}, {@link MerklePatriciaTrie.walkTrie}, etc.
|
|
11
|
+
*/
|
|
12
|
+
class WalkController {
|
|
13
|
+
/**
|
|
14
|
+
* @param onNode - The {@link FoundNodeFunction} to call when a node is found.
|
|
15
|
+
* @param trie - The trie to walk on.
|
|
16
|
+
* @param poolSize - The size of the task queue.
|
|
17
|
+
*/
|
|
18
|
+
constructor(onNode, trie, poolSize) {
|
|
19
|
+
this.onNode = onNode;
|
|
20
|
+
this.taskExecutor = new util_1.PrioritizedTaskExecutor(poolSize);
|
|
21
|
+
this.trie = trie;
|
|
22
|
+
this._resolvePromise = () => { };
|
|
23
|
+
this._rejectPromise = () => { };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Creates and starts an async walk over a trie from the given root.
|
|
27
|
+
* Resolves when all reachable nodes have been visited and no new tasks were scheduled.
|
|
28
|
+
*
|
|
29
|
+
* @param onNode - The {@link FoundNodeFunction} to call when a node is found.
|
|
30
|
+
* @param trie - The trie to walk on.
|
|
31
|
+
* @param rootHash - The root hash (32-byte keccak) to start walking from.
|
|
32
|
+
* @param poolSize - Task execution pool size to prevent OOM errors. Defaults to 500.
|
|
33
|
+
* @returns A Promise that resolves when the walk is finished.
|
|
34
|
+
*/
|
|
35
|
+
static async newWalk(onNode, trie, rootHash, poolSize) {
|
|
36
|
+
const controller = new WalkController(onNode, trie, poolSize ?? 500);
|
|
37
|
+
await controller._startWalk(rootHash);
|
|
38
|
+
}
|
|
39
|
+
async _startWalk(rootHash) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this._resolvePromise = resolve;
|
|
42
|
+
this._rejectPromise = reject;
|
|
43
|
+
this.trie
|
|
44
|
+
.lookupNode(rootHash)
|
|
45
|
+
.then((rootNode) => {
|
|
46
|
+
this._processNode(rootHash, rootNode, []);
|
|
47
|
+
})
|
|
48
|
+
.catch((error) => {
|
|
49
|
+
this._rejectPromise(error);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Runs all children of a node. Priority of these nodes is the key length of the children.
|
|
55
|
+
* Used when walking an Extension or when exploring all branches of a Branch node.
|
|
56
|
+
*
|
|
57
|
+
* @param node - Node to get all children of and call onNode on.
|
|
58
|
+
* @param currentKeyNibbles - The current key (nibbles) which would yield the `node` when
|
|
59
|
+
* trying to get this node with a `get` operation. Defaults to `[]`.
|
|
60
|
+
* @returns `void`
|
|
61
|
+
*/
|
|
62
|
+
allChildren(node, currentKeyNibbles = []) {
|
|
63
|
+
if (node instanceof index_ts_1.LeafMPTNode) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
let childEntries;
|
|
67
|
+
if (node instanceof index_ts_1.ExtensionMPTNode) {
|
|
68
|
+
childEntries = [[node.key(), node.value()]];
|
|
69
|
+
}
|
|
70
|
+
else if (node instanceof index_ts_1.BranchMPTNode) {
|
|
71
|
+
childEntries = node
|
|
72
|
+
.getChildren()
|
|
73
|
+
.map(([branchIndex, branchRef]) => [[branchIndex], branchRef]);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
for (const [keyExtension, childRef] of childEntries) {
|
|
79
|
+
const childKeyNibbles = currentKeyNibbles.concat(keyExtension);
|
|
80
|
+
const taskPriority = childKeyNibbles.length;
|
|
81
|
+
this.pushNodeToQueue(childRef, childKeyNibbles, taskPriority);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Pushes a node to the queue. If the queue has capacity, the node is executed immediately,
|
|
86
|
+
* otherwise it is queued for later execution.
|
|
87
|
+
*
|
|
88
|
+
* @param nodeRef - A node reference (32-byte keccak hash or raw encoding) to enqueue.
|
|
89
|
+
* @param currentKeyNibbles - The current key (nibbles) corresponding to this node. Defaults to `[]`.
|
|
90
|
+
* @param priority - Optional priority. Defaults to key length.
|
|
91
|
+
* @returns `void`
|
|
92
|
+
*/
|
|
93
|
+
pushNodeToQueue(nodeRef, currentKeyNibbles = [], priority) {
|
|
94
|
+
const taskPriority = priority ?? currentKeyNibbles.length;
|
|
95
|
+
this.taskExecutor.executeOrQueue(taskPriority, (taskFinishedCallback) => {
|
|
96
|
+
this.trie
|
|
97
|
+
.lookupNode(nodeRef)
|
|
98
|
+
.then((decodedNode) => {
|
|
99
|
+
taskFinishedCallback();
|
|
100
|
+
this._processNode(nodeRef, decodedNode, currentKeyNibbles);
|
|
101
|
+
})
|
|
102
|
+
.catch((error) => {
|
|
103
|
+
this._rejectPromise(error);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Pushes a branch of a certain BranchMPTNode to the event queue.
|
|
109
|
+
* Used by findPath when following a specific key (only one child index is traversed).
|
|
110
|
+
*
|
|
111
|
+
* @param node - The BranchMPTNode to select a branch on.
|
|
112
|
+
* @param currentKeyNibbles - The current key which leads to the corresponding node. Defaults to `[]`.
|
|
113
|
+
* @param childIndex - The child index (0–15) to add to the event queue.
|
|
114
|
+
* @param priority - Optional priority of the event. Defaults to the total key length.
|
|
115
|
+
* @returns `void`
|
|
116
|
+
* @throws If `node` is not a BranchMPTNode or if the branch at `childIndex` is empty.
|
|
117
|
+
*/
|
|
118
|
+
onlyBranchIndex(node, currentKeyNibbles = [], childIndex, priority) {
|
|
119
|
+
if (!(node instanceof index_ts_1.BranchMPTNode)) {
|
|
120
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('Expected branch node');
|
|
121
|
+
}
|
|
122
|
+
const childRef = node.getBranch(childIndex);
|
|
123
|
+
if (!childRef) {
|
|
124
|
+
throw (0, util_1.EthereumJSErrorWithoutCode)('Could not get branch of childIndex');
|
|
125
|
+
}
|
|
126
|
+
const childKeyNibbles = currentKeyNibbles.concat(childIndex);
|
|
127
|
+
const taskPriority = priority ?? childKeyNibbles.length;
|
|
128
|
+
this.pushNodeToQueue(childRef, childKeyNibbles, taskPriority);
|
|
129
|
+
}
|
|
130
|
+
_processNode(nodeRef, node, currentKeyNibbles) {
|
|
131
|
+
this.onNode(nodeRef, node, currentKeyNibbles, this);
|
|
132
|
+
if (this.taskExecutor.finished()) {
|
|
133
|
+
this._resolvePromise();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.WalkController = WalkController;
|
|
138
|
+
//# sourceMappingURL=walkController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walkController.js","sourceRoot":"","sources":["../../../src/util/walkController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MerklePatriciaTrie } from './index.ts';
|
|
2
|
+
import type { MPTOpts, Proof } from './index.ts';
|
|
3
|
+
export declare function createMPT(opts?: MPTOpts): Promise<MerklePatriciaTrie>;
|
|
4
|
+
/**
|
|
5
|
+
* Create a trie from a given (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof. A proof contains the encoded trie nodes
|
|
6
|
+
* from the root node to the leaf node storing state data.
|
|
7
|
+
* @param proof an EIP-1186 proof to create trie from
|
|
8
|
+
* @param trieOpts trie opts to be applied to returned trie
|
|
9
|
+
* @returns new trie created from given proof
|
|
10
|
+
*/
|
|
11
|
+
export declare function createMPTFromProof(proof: Proof, trieOpts?: MPTOpts): Promise<MerklePatriciaTrie>;
|
|
12
|
+
//# sourceMappingURL=constructors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructors.d.ts","sourceRoot":"","sources":["../../src/constructors.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,kBAAkB,EAAyC,MAAM,YAAY,CAAA;AAEtF,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEhD,wBAAsB,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,+BAyC7C;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,OAAO,+BAOxE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { KeyEncoding, ValueEncoding, bytesToUnprefixedHex, concatBytes, unprefixedHexToBytes, } from '@feelyourprotocol/util';
|
|
2
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
3
|
+
import { MerklePatriciaTrie, ROOT_DB_KEY, updateMPTFromMerkleProof } from "./index.js";
|
|
4
|
+
export async function createMPT(opts) {
|
|
5
|
+
const keccakFunction = opts?.common?.customCrypto.keccak256 ?? opts?.useKeyHashingFunction ?? keccak_256;
|
|
6
|
+
let key = ROOT_DB_KEY;
|
|
7
|
+
const encoding = opts?.valueEncoding === ValueEncoding.Bytes ? ValueEncoding.Bytes : ValueEncoding.String;
|
|
8
|
+
if (opts?.useKeyHashing === true) {
|
|
9
|
+
key = keccakFunction.call(undefined, ROOT_DB_KEY);
|
|
10
|
+
}
|
|
11
|
+
if (opts?.keyPrefix !== undefined) {
|
|
12
|
+
key = concatBytes(opts.keyPrefix, key);
|
|
13
|
+
}
|
|
14
|
+
if (opts?.db !== undefined && opts?.useRootPersistence === true) {
|
|
15
|
+
if (opts?.root === undefined) {
|
|
16
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as database keys (string encoding).
|
|
17
|
+
const root = await opts?.db.get(bytesToUnprefixedHex(key), {
|
|
18
|
+
keyEncoding: KeyEncoding.String,
|
|
19
|
+
valueEncoding: encoding,
|
|
20
|
+
});
|
|
21
|
+
if (typeof root === 'string') {
|
|
22
|
+
opts.root = unprefixedHexToBytes(root);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
opts.root = root;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as database keys/values (string encoding).
|
|
30
|
+
await opts?.db.put(bytesToUnprefixedHex(key), encoding === ValueEncoding.Bytes ? opts.root : bytesToUnprefixedHex(opts.root), {
|
|
31
|
+
keyEncoding: KeyEncoding.String,
|
|
32
|
+
valueEncoding: encoding,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return new MerklePatriciaTrie(opts);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a trie from a given (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof. A proof contains the encoded trie nodes
|
|
40
|
+
* from the root node to the leaf node storing state data.
|
|
41
|
+
* @param proof an EIP-1186 proof to create trie from
|
|
42
|
+
* @param trieOpts trie opts to be applied to returned trie
|
|
43
|
+
* @returns new trie created from given proof
|
|
44
|
+
*/
|
|
45
|
+
export async function createMPTFromProof(proof, trieOpts) {
|
|
46
|
+
const shouldVerifyRoot = trieOpts?.root !== undefined;
|
|
47
|
+
const trie = new MerklePatriciaTrie(trieOpts);
|
|
48
|
+
const root = await updateMPTFromMerkleProof(trie, proof, shouldVerifyRoot);
|
|
49
|
+
trie.root(root);
|
|
50
|
+
await trie.persistRoot();
|
|
51
|
+
return trie;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=constructors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructors.js","sourceRoot":"","sources":["../../src/constructors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAItF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,cAAc,GAClB,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,SAAS,IAAI,IAAI,EAAE,qBAAqB,IAAI,UAAU,CAAA;IACnF,IAAI,GAAG,GAAG,WAAW,CAAA;IAErB,MAAM,QAAQ,GACZ,IAAI,EAAE,aAAa,KAAK,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAA;IAE1F,IAAI,IAAI,EAAE,aAAa,KAAK,IAAI,EAAE,CAAC;QACjC,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAe,CAAA;IACjE,CAAC;IACD,IAAI,IAAI,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,IAAI,EAAE,EAAE,KAAK,SAAS,IAAI,IAAI,EAAE,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAChE,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,kGAAkG;YAClG,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE;gBACzD,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,aAAa,EAAE,QAAQ;aACxB,CAAC,CAAA;YACF,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,yGAAyG;YACzG,MAAM,IAAI,EAAE,EAAE,CAAC,GAAG,CAChB,oBAAoB,CAAC,GAAG,CAAC,EACzB,QAAQ,KAAK,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAC9E;gBACE,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,aAAa,EAAE,QAAQ;aACxB,CACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAA;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAY,EAAE,QAAkB;IACvE,MAAM,gBAAgB,GAAG,QAAQ,EAAE,IAAI,KAAK,SAAS,CAAA;IACrD,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAA;IAC1E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACf,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;IACxB,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { LRUCache } from 'lru-cache';
|
|
2
|
+
import type { BatchDBOp, DB } from '@feelyourprotocol/util';
|
|
3
|
+
import type { Checkpoint, CheckpointDBOpts } from '../types.ts';
|
|
4
|
+
/**
|
|
5
|
+
* DB is a thin wrapper around the underlying levelup db,
|
|
6
|
+
* which validates inputs and sets encoding type.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CheckpointDB implements DB {
|
|
9
|
+
checkpoints: Checkpoint[];
|
|
10
|
+
db: DB<string, string | Uint8Array>;
|
|
11
|
+
readonly cacheSize: number;
|
|
12
|
+
private readonly valueEncoding;
|
|
13
|
+
protected _cache?: LRUCache<string, Uint8Array>;
|
|
14
|
+
_stats: {
|
|
15
|
+
cache: {
|
|
16
|
+
reads: number;
|
|
17
|
+
hits: number;
|
|
18
|
+
writes: number;
|
|
19
|
+
};
|
|
20
|
+
db: {
|
|
21
|
+
reads: number;
|
|
22
|
+
hits: number;
|
|
23
|
+
writes: number;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Initialize a DB instance.
|
|
28
|
+
*/
|
|
29
|
+
constructor(opts: CheckpointDBOpts);
|
|
30
|
+
/**
|
|
31
|
+
* Flush the checkpoints and use the given checkpoints instead.
|
|
32
|
+
* @param {Checkpoint[]} checkpoints
|
|
33
|
+
*/
|
|
34
|
+
setCheckpoints(checkpoints: Checkpoint[]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Is the DB during a checkpoint phase?
|
|
37
|
+
*/
|
|
38
|
+
hasCheckpoints(): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Adds a new checkpoint to the stack
|
|
41
|
+
* @param root
|
|
42
|
+
*/
|
|
43
|
+
checkpoint(root: Uint8Array): void;
|
|
44
|
+
/**
|
|
45
|
+
* Commits the latest checkpoint
|
|
46
|
+
*/
|
|
47
|
+
commit(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Reverts the latest checkpoint
|
|
50
|
+
*/
|
|
51
|
+
revert(): Promise<Uint8Array<ArrayBufferLike>>;
|
|
52
|
+
/**
|
|
53
|
+
* @inheritDoc
|
|
54
|
+
*/
|
|
55
|
+
get(key: Uint8Array): Promise<Uint8Array | undefined>;
|
|
56
|
+
/**
|
|
57
|
+
* @inheritDoc
|
|
58
|
+
*/
|
|
59
|
+
put(key: Uint8Array, value: Uint8Array): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* @inheritDoc
|
|
62
|
+
*/
|
|
63
|
+
del(key: Uint8Array): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* @inheritDoc
|
|
66
|
+
*/
|
|
67
|
+
batch(opStack: BatchDBOp[]): Promise<void>;
|
|
68
|
+
stats(reset?: boolean): {
|
|
69
|
+
size: number;
|
|
70
|
+
cache: {
|
|
71
|
+
reads: number;
|
|
72
|
+
hits: number;
|
|
73
|
+
writes: number;
|
|
74
|
+
};
|
|
75
|
+
db: {
|
|
76
|
+
reads: number;
|
|
77
|
+
hits: number;
|
|
78
|
+
writes: number;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* @inheritDoc
|
|
83
|
+
*/
|
|
84
|
+
shallowCopy(): CheckpointDB;
|
|
85
|
+
open(): Promise<void>;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=checkpointDB.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointDB.d.ts","sourceRoot":"","sources":["../../../src/db/checkpointDB.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,KAAK,EAAE,SAAS,EAAE,EAAE,EAAgB,MAAM,kBAAkB,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE/D;;;GAGG;AACH,qBAAa,YAAa,YAAW,EAAE;IAC9B,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAA;IAC1C,SAAgB,SAAS,EAAE,MAAM,CAAA;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAW7C,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAG/C,MAAM;;;;;;;;;;;MAWL;IAED;;OAEG;gBACS,IAAI,EAAE,gBAAgB;IAelC;;;OAGG;IACH,cAAc,CAAC,WAAW,EAAE,UAAU,EAAE;IAWxC;;OAEG;IACH,cAAc;IAId;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU;IAI3B;;OAEG;IACG,MAAM;IA6BZ;;OAEG;IACG,MAAM;IAKZ;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IA2C3D;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB5D;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzC;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiChD,KAAK,CAAC,KAAK,UAAO;;;;;;;;;;;;;IAmBlB;;OAEG;IACH,WAAW,IAAI,YAAY;IAQ3B,IAAI;CAGL"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { KeyEncoding, ValueEncoding, bytesToUnprefixedHex, unprefixedHexToBytes, } from '@feelyourprotocol/util';
|
|
2
|
+
import { LRUCache } from 'lru-cache';
|
|
3
|
+
/**
|
|
4
|
+
* DB is a thin wrapper around the underlying levelup db,
|
|
5
|
+
* which validates inputs and sets encoding type.
|
|
6
|
+
*/
|
|
7
|
+
export class CheckpointDB {
|
|
8
|
+
/**
|
|
9
|
+
* Initialize a DB instance.
|
|
10
|
+
*/
|
|
11
|
+
constructor(opts) {
|
|
12
|
+
// protected _cache?: LRUCache<string, Uint8Array | undefined>
|
|
13
|
+
this._stats = {
|
|
14
|
+
cache: {
|
|
15
|
+
reads: 0,
|
|
16
|
+
hits: 0,
|
|
17
|
+
writes: 0,
|
|
18
|
+
},
|
|
19
|
+
db: {
|
|
20
|
+
reads: 0,
|
|
21
|
+
hits: 0,
|
|
22
|
+
writes: 0,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
this.db = opts.db;
|
|
26
|
+
this.cacheSize = opts.cacheSize ?? 0;
|
|
27
|
+
this.valueEncoding = opts.valueEncoding ?? ValueEncoding.String;
|
|
28
|
+
// Roots of trie at the moment of checkpoint
|
|
29
|
+
this.checkpoints = [];
|
|
30
|
+
if (this.cacheSize > 0) {
|
|
31
|
+
this._cache = new LRUCache({
|
|
32
|
+
max: this.cacheSize,
|
|
33
|
+
updateAgeOnGet: true,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Flush the checkpoints and use the given checkpoints instead.
|
|
39
|
+
* @param {Checkpoint[]} checkpoints
|
|
40
|
+
*/
|
|
41
|
+
setCheckpoints(checkpoints) {
|
|
42
|
+
this.checkpoints = [];
|
|
43
|
+
for (let i = 0; i < checkpoints.length; i++) {
|
|
44
|
+
this.checkpoints.push({
|
|
45
|
+
root: checkpoints[i].root,
|
|
46
|
+
keyValueMap: new Map(checkpoints[i].keyValueMap),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Is the DB during a checkpoint phase?
|
|
52
|
+
*/
|
|
53
|
+
hasCheckpoints() {
|
|
54
|
+
return this.checkpoints.length > 0;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Adds a new checkpoint to the stack
|
|
58
|
+
* @param root
|
|
59
|
+
*/
|
|
60
|
+
checkpoint(root) {
|
|
61
|
+
this.checkpoints.push({ keyValueMap: new Map(), root });
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Commits the latest checkpoint
|
|
65
|
+
*/
|
|
66
|
+
async commit() {
|
|
67
|
+
const { keyValueMap } = this.checkpoints.pop();
|
|
68
|
+
if (!this.hasCheckpoints()) {
|
|
69
|
+
// This was the final checkpoint, we should now commit and flush everything to disk
|
|
70
|
+
const batchOp = [];
|
|
71
|
+
for (const [key, value] of keyValueMap.entries()) {
|
|
72
|
+
if (value === undefined) {
|
|
73
|
+
batchOp.push({
|
|
74
|
+
type: 'del',
|
|
75
|
+
key: unprefixedHexToBytes(key),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
batchOp.push({
|
|
80
|
+
type: 'put',
|
|
81
|
+
key: unprefixedHexToBytes(key),
|
|
82
|
+
value,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
await this.batch(batchOp);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// dump everything into the current (higher level) diff cache
|
|
90
|
+
const currentKeyValueMap = this.checkpoints[this.checkpoints.length - 1].keyValueMap;
|
|
91
|
+
for (const [key, value] of keyValueMap.entries()) {
|
|
92
|
+
currentKeyValueMap.set(key, value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Reverts the latest checkpoint
|
|
98
|
+
*/
|
|
99
|
+
async revert() {
|
|
100
|
+
const { root } = this.checkpoints.pop();
|
|
101
|
+
return root;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* @inheritDoc
|
|
105
|
+
*/
|
|
106
|
+
async get(key) {
|
|
107
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as cache/database keys (string encoding).
|
|
108
|
+
const keyHex = bytesToUnprefixedHex(key);
|
|
109
|
+
if (this._cache !== undefined) {
|
|
110
|
+
const value = this._cache.get(keyHex);
|
|
111
|
+
this._stats.cache.reads += 1;
|
|
112
|
+
if (value !== undefined) {
|
|
113
|
+
this._stats.cache.hits += 1;
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Lookup the value in our diff cache. We return the latest checkpointed value (which should be the value on disk)
|
|
118
|
+
for (let index = this.checkpoints.length - 1; index >= 0; index--) {
|
|
119
|
+
if (this.checkpoints[index].keyValueMap.has(keyHex)) {
|
|
120
|
+
return this.checkpoints[index].keyValueMap.get(keyHex);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Nothing has been found in diff cache, look up from disk
|
|
124
|
+
const value = await this.db.get(keyHex, {
|
|
125
|
+
keyEncoding: KeyEncoding.String,
|
|
126
|
+
valueEncoding: this.valueEncoding,
|
|
127
|
+
});
|
|
128
|
+
this._stats.db.reads += 1;
|
|
129
|
+
if (value !== undefined) {
|
|
130
|
+
this._stats.db.hits += 1;
|
|
131
|
+
}
|
|
132
|
+
const returnValue = value !== undefined
|
|
133
|
+
? value instanceof Uint8Array
|
|
134
|
+
? value
|
|
135
|
+
: unprefixedHexToBytes(value)
|
|
136
|
+
: undefined;
|
|
137
|
+
this._cache?.set(keyHex, returnValue);
|
|
138
|
+
if (this.hasCheckpoints()) {
|
|
139
|
+
// Since we are a checkpoint, put this value in diff cache,
|
|
140
|
+
// so future `get` calls will not look the key up again from disk.
|
|
141
|
+
this.checkpoints[this.checkpoints.length - 1].keyValueMap.set(keyHex, returnValue);
|
|
142
|
+
}
|
|
143
|
+
return returnValue;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* @inheritDoc
|
|
147
|
+
*/
|
|
148
|
+
async put(key, value) {
|
|
149
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as cache/database keys and values (string encoding).
|
|
150
|
+
const keyHex = bytesToUnprefixedHex(key);
|
|
151
|
+
if (this.hasCheckpoints()) {
|
|
152
|
+
// put value in diff cache
|
|
153
|
+
this.checkpoints[this.checkpoints.length - 1].keyValueMap.set(keyHex, value);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const valuePut = this.valueEncoding === ValueEncoding.Bytes ? value : bytesToUnprefixedHex(value);
|
|
157
|
+
await this.db.put(keyHex, valuePut, {
|
|
158
|
+
keyEncoding: KeyEncoding.String,
|
|
159
|
+
valueEncoding: this.valueEncoding,
|
|
160
|
+
});
|
|
161
|
+
this._stats.db.writes += 1;
|
|
162
|
+
if (this._cache !== undefined) {
|
|
163
|
+
this._cache.set(keyHex, value);
|
|
164
|
+
this._stats.cache.writes += 1;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* @inheritDoc
|
|
170
|
+
*/
|
|
171
|
+
async del(key) {
|
|
172
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as cache/database keys (string encoding).
|
|
173
|
+
const keyHex = bytesToUnprefixedHex(key);
|
|
174
|
+
if (this.hasCheckpoints()) {
|
|
175
|
+
// delete the value in the current diff cache
|
|
176
|
+
this.checkpoints[this.checkpoints.length - 1].keyValueMap.set(keyHex, undefined);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// delete the value on disk
|
|
180
|
+
await this.db.del(keyHex, {
|
|
181
|
+
keyEncoding: KeyEncoding.String,
|
|
182
|
+
});
|
|
183
|
+
this._stats.db.writes += 1;
|
|
184
|
+
if (this._cache !== undefined) {
|
|
185
|
+
this._cache.set(keyHex, undefined);
|
|
186
|
+
this._stats.cache.writes += 1;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* @inheritDoc
|
|
192
|
+
*/
|
|
193
|
+
async batch(opStack) {
|
|
194
|
+
if (this.hasCheckpoints()) {
|
|
195
|
+
for (const op of opStack) {
|
|
196
|
+
if (op.type === 'put') {
|
|
197
|
+
await this.put(op.key, op.value);
|
|
198
|
+
}
|
|
199
|
+
else if (op.type === 'del') {
|
|
200
|
+
await this.del(op.key);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as database keys/values (string encoding).
|
|
206
|
+
const convertedOps = opStack.map((op) => {
|
|
207
|
+
const convertedOp = {
|
|
208
|
+
key: bytesToUnprefixedHex(op.key),
|
|
209
|
+
value: op.type === 'put' ? op.value : undefined,
|
|
210
|
+
type: op.type,
|
|
211
|
+
opts: { ...op.opts, ...{ valueEncoding: this.valueEncoding } },
|
|
212
|
+
};
|
|
213
|
+
this._stats.db.writes += 1;
|
|
214
|
+
if (op.type === 'put' && this.valueEncoding === ValueEncoding.String) {
|
|
215
|
+
convertedOp.value = bytesToUnprefixedHex(convertedOp.value);
|
|
216
|
+
}
|
|
217
|
+
return convertedOp;
|
|
218
|
+
});
|
|
219
|
+
await this.db.batch(convertedOps);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
stats(reset = true) {
|
|
223
|
+
const stats = { ...this._stats, size: this._cache?.size ?? 0 };
|
|
224
|
+
if (reset) {
|
|
225
|
+
this._stats = {
|
|
226
|
+
cache: {
|
|
227
|
+
reads: 0,
|
|
228
|
+
hits: 0,
|
|
229
|
+
writes: 0,
|
|
230
|
+
},
|
|
231
|
+
db: {
|
|
232
|
+
reads: 0,
|
|
233
|
+
hits: 0,
|
|
234
|
+
writes: 0,
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
return stats;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* @inheritDoc
|
|
242
|
+
*/
|
|
243
|
+
shallowCopy() {
|
|
244
|
+
return new CheckpointDB({
|
|
245
|
+
db: this.db,
|
|
246
|
+
cacheSize: this.cacheSize,
|
|
247
|
+
valueEncoding: this.valueEncoding,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
open() {
|
|
251
|
+
return Promise.resolve();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=checkpointDB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointDB.js","sourceRoot":"","sources":["../../../src/db/checkpointDB.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
|