@feelyourprotocol/statemanager 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/LICENSE +373 -0
- package/README.md +331 -0
- package/dist/cjs/cache/account.d.ts +85 -0
- package/dist/cjs/cache/account.d.ts.map +1 -0
- package/dist/cjs/cache/account.js +252 -0
- package/dist/cjs/cache/account.js.map +1 -0
- package/dist/cjs/cache/cache.d.ts +23 -0
- package/dist/cjs/cache/cache.d.ts.map +1 -0
- package/dist/cjs/cache/cache.js +31 -0
- package/dist/cjs/cache/cache.js.map +1 -0
- package/dist/cjs/cache/caches.d.ts +19 -0
- package/dist/cjs/cache/caches.d.ts.map +1 -0
- package/dist/cjs/cache/caches.js +107 -0
- package/dist/cjs/cache/caches.js.map +1 -0
- package/dist/cjs/cache/code.d.ts +87 -0
- package/dist/cjs/cache/code.d.ts.map +1 -0
- package/dist/cjs/cache/code.js +258 -0
- package/dist/cjs/cache/code.js.map +1 -0
- package/dist/cjs/cache/index.d.ts +7 -0
- package/dist/cjs/cache/index.d.ts.map +1 -0
- package/dist/cjs/cache/index.js +23 -0
- package/dist/cjs/cache/index.js.map +1 -0
- package/dist/cjs/cache/originalStorageCache.d.ts +21 -0
- package/dist/cjs/cache/originalStorageCache.d.ts.map +1 -0
- package/dist/cjs/cache/originalStorageCache.js +52 -0
- package/dist/cjs/cache/originalStorageCache.js.map +1 -0
- package/dist/cjs/cache/storage.d.ts +101 -0
- package/dist/cjs/cache/storage.d.ts.map +1 -0
- package/dist/cjs/cache/storage.js +337 -0
- package/dist/cjs/cache/storage.js.map +1 -0
- package/dist/cjs/cache/types.d.ts +36 -0
- package/dist/cjs/cache/types.d.ts.map +1 -0
- package/dist/cjs/cache/types.js +8 -0
- package/dist/cjs/cache/types.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/merkleStateManager.d.ts +260 -0
- package/dist/cjs/merkleStateManager.d.ts.map +1 -0
- package/dist/cjs/merkleStateManager.js +616 -0
- package/dist/cjs/merkleStateManager.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/merkle.d.ts +40 -0
- package/dist/cjs/proof/merkle.d.ts.map +1 -0
- package/dist/cjs/proof/merkle.js +182 -0
- package/dist/cjs/proof/merkle.js.map +1 -0
- package/dist/cjs/proof/rpc.d.ts +10 -0
- package/dist/cjs/proof/rpc.d.ts.map +1 -0
- package/dist/cjs/proof/rpc.js +20 -0
- package/dist/cjs/proof/rpc.js.map +1 -0
- package/dist/cjs/rpcStateManager.d.ts +162 -0
- package/dist/cjs/rpcStateManager.d.ts.map +1 -0
- package/dist/cjs/rpcStateManager.js +313 -0
- package/dist/cjs/rpcStateManager.js.map +1 -0
- package/dist/cjs/simpleStateManager.d.ts +54 -0
- package/dist/cjs/simpleStateManager.d.ts.map +1 -0
- package/dist/cjs/simpleStateManager.js +125 -0
- package/dist/cjs/simpleStateManager.js.map +1 -0
- package/dist/cjs/statefulBinaryTreeStateManager.d.ts +69 -0
- package/dist/cjs/statefulBinaryTreeStateManager.d.ts.map +1 -0
- package/dist/cjs/statefulBinaryTreeStateManager.js +576 -0
- package/dist/cjs/statefulBinaryTreeStateManager.js.map +1 -0
- package/dist/cjs/types.d.ts +92 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/util.d.ts +4 -0
- package/dist/cjs/util.d.ts.map +1 -0
- package/dist/cjs/util.js +21 -0
- package/dist/cjs/util.js.map +1 -0
- package/dist/esm/cache/account.d.ts +85 -0
- package/dist/esm/cache/account.d.ts.map +1 -0
- package/dist/esm/cache/account.js +248 -0
- package/dist/esm/cache/account.js.map +1 -0
- package/dist/esm/cache/cache.d.ts +23 -0
- package/dist/esm/cache/cache.d.ts.map +1 -0
- package/dist/esm/cache/cache.js +27 -0
- package/dist/esm/cache/cache.js.map +1 -0
- package/dist/esm/cache/caches.d.ts +19 -0
- package/dist/esm/cache/caches.d.ts.map +1 -0
- package/dist/esm/cache/caches.js +103 -0
- package/dist/esm/cache/caches.js.map +1 -0
- package/dist/esm/cache/code.d.ts +87 -0
- package/dist/esm/cache/code.d.ts.map +1 -0
- package/dist/esm/cache/code.js +254 -0
- package/dist/esm/cache/code.js.map +1 -0
- package/dist/esm/cache/index.d.ts +7 -0
- package/dist/esm/cache/index.d.ts.map +1 -0
- package/dist/esm/cache/index.js +7 -0
- package/dist/esm/cache/index.js.map +1 -0
- package/dist/esm/cache/originalStorageCache.d.ts +21 -0
- package/dist/esm/cache/originalStorageCache.d.ts.map +1 -0
- package/dist/esm/cache/originalStorageCache.js +48 -0
- package/dist/esm/cache/originalStorageCache.js.map +1 -0
- package/dist/esm/cache/storage.d.ts +101 -0
- package/dist/esm/cache/storage.d.ts.map +1 -0
- package/dist/esm/cache/storage.js +333 -0
- package/dist/esm/cache/storage.js.map +1 -0
- package/dist/esm/cache/types.d.ts +36 -0
- package/dist/esm/cache/types.d.ts.map +1 -0
- package/dist/esm/cache/types.js +5 -0
- package/dist/esm/cache/types.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/merkleStateManager.d.ts +260 -0
- package/dist/esm/merkleStateManager.d.ts.map +1 -0
- package/dist/esm/merkleStateManager.js +612 -0
- package/dist/esm/merkleStateManager.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/merkle.d.ts +40 -0
- package/dist/esm/proof/merkle.d.ts.map +1 -0
- package/dist/esm/proof/merkle.js +175 -0
- package/dist/esm/proof/merkle.js.map +1 -0
- package/dist/esm/proof/rpc.d.ts +10 -0
- package/dist/esm/proof/rpc.d.ts.map +1 -0
- package/dist/esm/proof/rpc.js +17 -0
- package/dist/esm/proof/rpc.js.map +1 -0
- package/dist/esm/rpcStateManager.d.ts +162 -0
- package/dist/esm/rpcStateManager.d.ts.map +1 -0
- package/dist/esm/rpcStateManager.js +308 -0
- package/dist/esm/rpcStateManager.js.map +1 -0
- package/dist/esm/simpleStateManager.d.ts +54 -0
- package/dist/esm/simpleStateManager.d.ts.map +1 -0
- package/dist/esm/simpleStateManager.js +121 -0
- package/dist/esm/simpleStateManager.js.map +1 -0
- package/dist/esm/statefulBinaryTreeStateManager.d.ts +69 -0
- package/dist/esm/statefulBinaryTreeStateManager.d.ts.map +1 -0
- package/dist/esm/statefulBinaryTreeStateManager.js +572 -0
- package/dist/esm/statefulBinaryTreeStateManager.js.map +1 -0
- package/dist/esm/types.d.ts +92 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/util.d.ts +4 -0
- package/dist/esm/util.d.ts.map +1 -0
- package/dist/esm/util.js +18 -0
- package/dist/esm/util.js.map +1 -0
- package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
- package/package.json +74 -0
- package/src/cache/account.ts +277 -0
- package/src/cache/cache.ts +35 -0
- package/src/cache/caches.ts +125 -0
- package/src/cache/code.ts +277 -0
- package/src/cache/index.ts +6 -0
- package/src/cache/originalStorageCache.ts +57 -0
- package/src/cache/storage.ts +369 -0
- package/src/cache/types.ts +38 -0
- package/src/index.ts +7 -0
- package/src/merkleStateManager.ts +737 -0
- package/src/proof/index.ts +2 -0
- package/src/proof/merkle.ts +264 -0
- package/src/proof/rpc.ts +24 -0
- package/src/rpcStateManager.ts +381 -0
- package/src/simpleStateManager.ts +154 -0
- package/src/statefulBinaryTreeStateManager.ts +789 -0
- package/src/types.ts +103 -0
- package/src/util.ts +28 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { AccountCache } from "./account.js";
|
|
2
|
+
import { CodeCache } from "./code.js";
|
|
3
|
+
import { StorageCache } from "./storage.js";
|
|
4
|
+
import { CacheType } from "./types.js";
|
|
5
|
+
export class Caches {
|
|
6
|
+
constructor(opts = {}) {
|
|
7
|
+
const accountSettings = {
|
|
8
|
+
type: opts.account?.type ?? CacheType.ORDERED_MAP,
|
|
9
|
+
size: opts.account?.size ?? 100000,
|
|
10
|
+
};
|
|
11
|
+
const codeSettings = {
|
|
12
|
+
type: opts.code?.type ?? CacheType.ORDERED_MAP,
|
|
13
|
+
size: opts.code?.size ?? 20000,
|
|
14
|
+
};
|
|
15
|
+
const storageSettings = {
|
|
16
|
+
type: opts.storage?.type ?? CacheType.ORDERED_MAP,
|
|
17
|
+
size: opts.storage?.size ?? 20000,
|
|
18
|
+
};
|
|
19
|
+
this.settings = {
|
|
20
|
+
account: accountSettings,
|
|
21
|
+
code: codeSettings,
|
|
22
|
+
storage: storageSettings,
|
|
23
|
+
};
|
|
24
|
+
if (this.settings.account.size !== 0) {
|
|
25
|
+
this.account = new AccountCache({
|
|
26
|
+
size: this.settings.account.size,
|
|
27
|
+
type: this.settings.account.type,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (this.settings.code.size !== 0) {
|
|
31
|
+
this.code = new CodeCache({
|
|
32
|
+
size: this.settings.code.size,
|
|
33
|
+
type: this.settings.code.type,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (this.settings.storage.size !== 0) {
|
|
37
|
+
this.storage = new StorageCache({
|
|
38
|
+
size: this.settings.storage.size,
|
|
39
|
+
type: this.settings.storage.type,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
checkpoint() {
|
|
44
|
+
this.account?.checkpoint();
|
|
45
|
+
this.storage?.checkpoint();
|
|
46
|
+
this.code?.checkpoint();
|
|
47
|
+
}
|
|
48
|
+
clear() {
|
|
49
|
+
this.account?.clear();
|
|
50
|
+
this.storage?.clear();
|
|
51
|
+
this.code?.clear();
|
|
52
|
+
}
|
|
53
|
+
commit() {
|
|
54
|
+
this.account?.commit();
|
|
55
|
+
this.storage?.commit();
|
|
56
|
+
this.code?.commit();
|
|
57
|
+
}
|
|
58
|
+
deleteAccount(address) {
|
|
59
|
+
this.code?.del(address);
|
|
60
|
+
this.account?.del(address);
|
|
61
|
+
this.storage?.clearStorage(address);
|
|
62
|
+
}
|
|
63
|
+
shallowCopy(downlevelCaches) {
|
|
64
|
+
let cacheOptions;
|
|
65
|
+
// Account cache options
|
|
66
|
+
if (this.settings.account.size !== 0) {
|
|
67
|
+
cacheOptions = {
|
|
68
|
+
account: downlevelCaches
|
|
69
|
+
? { size: this.settings.account.size, type: CacheType.ORDERED_MAP }
|
|
70
|
+
: this.settings.account,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Storage cache options
|
|
74
|
+
if (this.settings.storage.size !== 0) {
|
|
75
|
+
cacheOptions = {
|
|
76
|
+
...cacheOptions,
|
|
77
|
+
storage: downlevelCaches
|
|
78
|
+
? { size: this.settings.storage.size, type: CacheType.ORDERED_MAP }
|
|
79
|
+
: this.settings.storage,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Code cache options
|
|
83
|
+
if (this.settings.code.size !== 0) {
|
|
84
|
+
cacheOptions = {
|
|
85
|
+
...cacheOptions,
|
|
86
|
+
code: downlevelCaches
|
|
87
|
+
? { size: this.settings.code.size, type: CacheType.ORDERED_MAP }
|
|
88
|
+
: this.settings.code,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (cacheOptions !== undefined) {
|
|
92
|
+
return new Caches(cacheOptions);
|
|
93
|
+
}
|
|
94
|
+
else
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
revert() {
|
|
98
|
+
this.account?.revert();
|
|
99
|
+
this.storage?.revert();
|
|
100
|
+
this.code?.revert();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=caches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caches.js","sourceRoot":"","sources":["../../../src/cache/caches.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { OrderedMap } from '@js-sdsl/ordered-map';
|
|
2
|
+
import { LRUCache } from 'lru-cache';
|
|
3
|
+
import { Cache } from './cache.ts';
|
|
4
|
+
import type { Address } from '@feelyourprotocol/util';
|
|
5
|
+
import type { CacheOpts } from './types.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Represents a cached code element.
|
|
8
|
+
*/
|
|
9
|
+
type CodeCacheElement = {
|
|
10
|
+
code: Uint8Array | undefined;
|
|
11
|
+
};
|
|
12
|
+
export declare class CodeCache extends Cache {
|
|
13
|
+
_lruCache: LRUCache<string, CodeCacheElement> | undefined;
|
|
14
|
+
_orderedMapCache: OrderedMap<string, CodeCacheElement> | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Diff cache collecting the state of the cache
|
|
17
|
+
* at the beginning of checkpoint height
|
|
18
|
+
* (respectively: before a first modification)
|
|
19
|
+
*
|
|
20
|
+
* If the whole cache element is undefined (in contrast
|
|
21
|
+
* to the code), the element didn't exist in the cache
|
|
22
|
+
* before.
|
|
23
|
+
*/
|
|
24
|
+
_diffCache: Map<string, CodeCacheElement | undefined>[];
|
|
25
|
+
constructor(opts: CacheOpts);
|
|
26
|
+
/**
|
|
27
|
+
* Saves the state of the code cache before making changes to it.
|
|
28
|
+
*
|
|
29
|
+
* @param cacheKeyHex Account key for which code is being modified.
|
|
30
|
+
*/
|
|
31
|
+
_saveCachePreState(cacheKeyHex: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Puts code into the cache under its hash.
|
|
34
|
+
*
|
|
35
|
+
* @param address - Address of account code is being modified for.
|
|
36
|
+
* @param code - Bytecode or undefined if code doesn't exist.
|
|
37
|
+
*/
|
|
38
|
+
put(address: Address, code: Uint8Array | undefined): void;
|
|
39
|
+
/**
|
|
40
|
+
* Returns the queried code or undefined if it doesn't exist.
|
|
41
|
+
*
|
|
42
|
+
* @param address - Account address for which code is being fetched.
|
|
43
|
+
*/
|
|
44
|
+
get(address: Address): CodeCacheElement | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Marks code as deleted in the cache.
|
|
47
|
+
*
|
|
48
|
+
* @param address - Account address for which code is being fetched.
|
|
49
|
+
*/
|
|
50
|
+
del(address: Address): void;
|
|
51
|
+
/**
|
|
52
|
+
* Flushes the cache by returning codes that have been modified
|
|
53
|
+
* or deleted and resetting the diff cache (at checkpoint height).
|
|
54
|
+
*/
|
|
55
|
+
flush(): [string, CodeCacheElement][];
|
|
56
|
+
/**
|
|
57
|
+
* Revert changes to the cache to the last checkpoint (no effect on trie).
|
|
58
|
+
*/
|
|
59
|
+
revert(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Commits the current state of the cache (no effect on trie).
|
|
62
|
+
*/
|
|
63
|
+
commit(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Marks the current state of the cache as a checkpoint, which can
|
|
66
|
+
* later be reverted or committed.
|
|
67
|
+
*/
|
|
68
|
+
checkpoint(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Returns the size of the cache
|
|
71
|
+
* @returns
|
|
72
|
+
*/
|
|
73
|
+
size(): number;
|
|
74
|
+
/**
|
|
75
|
+
* Returns a dictionary with cache statistics.
|
|
76
|
+
*
|
|
77
|
+
* @param reset - Whether to reset statistics after retrieval.
|
|
78
|
+
* @returns A dictionary with cache statistics.
|
|
79
|
+
*/
|
|
80
|
+
stats(reset?: boolean): any;
|
|
81
|
+
/**
|
|
82
|
+
* Clears the cache.
|
|
83
|
+
*/
|
|
84
|
+
clear(): void;
|
|
85
|
+
}
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../../src/cache/code.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGlC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C;;GAEG;AACH,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAA;IACzD,gBAAgB,EAAE,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAA;IAElE;;;;;;;;OAQG;IACH,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC,EAAE,CAAK;gBAEhD,IAAI,EAAE,SAAS;IAe3B;;;;OAIG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM;IAatC;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAmBzD;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS;IAoBnD;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAoB3B;;;OAGG;IACH,KAAK,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE;IA0BrC;;OAEG;IACH,MAAM,IAAI,IAAI;IAyBd;;OAEG;IACH,MAAM,IAAI,IAAI;IAgBd;;;OAGG;IACH,UAAU,IAAI,IAAI;IAQlB;;;OAGG;IACH,IAAI;IAQJ;;;;;OAKG;IACH,KAAK,CAAC,KAAK,UAAO,GAAG,GAAG;IAexB;;OAEG;IACH,KAAK,IAAI,IAAI;CAUd"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { bytesToUnprefixedHex } from '@feelyourprotocol/util';
|
|
2
|
+
import { OrderedMap } from '@js-sdsl/ordered-map';
|
|
3
|
+
import debugDefault from 'debug';
|
|
4
|
+
import { LRUCache } from 'lru-cache';
|
|
5
|
+
import { Cache } from "./cache.js";
|
|
6
|
+
import { CacheType } from "./types.js";
|
|
7
|
+
export class CodeCache extends Cache {
|
|
8
|
+
constructor(opts) {
|
|
9
|
+
super();
|
|
10
|
+
/**
|
|
11
|
+
* Diff cache collecting the state of the cache
|
|
12
|
+
* at the beginning of checkpoint height
|
|
13
|
+
* (respectively: before a first modification)
|
|
14
|
+
*
|
|
15
|
+
* If the whole cache element is undefined (in contrast
|
|
16
|
+
* to the code), the element didn't exist in the cache
|
|
17
|
+
* before.
|
|
18
|
+
*/
|
|
19
|
+
this._diffCache = [];
|
|
20
|
+
if (opts.type === CacheType.LRU) {
|
|
21
|
+
this._lruCache = new LRUCache({
|
|
22
|
+
max: opts.size,
|
|
23
|
+
updateAgeOnGet: true,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this._orderedMapCache = new OrderedMap();
|
|
28
|
+
}
|
|
29
|
+
this._diffCache.push(new Map());
|
|
30
|
+
this._debug = debugDefault('statemanager:cache:code');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Saves the state of the code cache before making changes to it.
|
|
34
|
+
*
|
|
35
|
+
* @param cacheKeyHex Account key for which code is being modified.
|
|
36
|
+
*/
|
|
37
|
+
_saveCachePreState(cacheKeyHex) {
|
|
38
|
+
const diffMap = this._diffCache[this._checkpoints];
|
|
39
|
+
if (!diffMap.has(cacheKeyHex)) {
|
|
40
|
+
let oldElem;
|
|
41
|
+
if (this._lruCache) {
|
|
42
|
+
oldElem = this._lruCache.get(cacheKeyHex);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
oldElem = this._orderedMapCache.getElementByKey(cacheKeyHex);
|
|
46
|
+
}
|
|
47
|
+
diffMap.set(cacheKeyHex, oldElem);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Puts code into the cache under its hash.
|
|
52
|
+
*
|
|
53
|
+
* @param address - Address of account code is being modified for.
|
|
54
|
+
* @param code - Bytecode or undefined if code doesn't exist.
|
|
55
|
+
*/
|
|
56
|
+
put(address, code) {
|
|
57
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
|
|
58
|
+
const addressHex = bytesToUnprefixedHex(address.bytes);
|
|
59
|
+
this._saveCachePreState(addressHex);
|
|
60
|
+
const elem = {
|
|
61
|
+
code,
|
|
62
|
+
};
|
|
63
|
+
if (this.DEBUG) {
|
|
64
|
+
this._debug(`Put code ${addressHex}`);
|
|
65
|
+
}
|
|
66
|
+
if (this._lruCache) {
|
|
67
|
+
this._lruCache.set(addressHex, elem);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this._orderedMapCache.setElement(addressHex, elem);
|
|
71
|
+
}
|
|
72
|
+
this._stats.writes += 1;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Returns the queried code or undefined if it doesn't exist.
|
|
76
|
+
*
|
|
77
|
+
* @param address - Account address for which code is being fetched.
|
|
78
|
+
*/
|
|
79
|
+
get(address) {
|
|
80
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
|
|
81
|
+
const addressHex = bytesToUnprefixedHex(address.bytes);
|
|
82
|
+
if (this.DEBUG) {
|
|
83
|
+
this._debug(`Get code ${addressHex}`);
|
|
84
|
+
}
|
|
85
|
+
let elem;
|
|
86
|
+
if (this._lruCache) {
|
|
87
|
+
elem = this._lruCache.get(addressHex);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
elem = this._orderedMapCache.getElementByKey(addressHex);
|
|
91
|
+
}
|
|
92
|
+
this._stats.reads += 1;
|
|
93
|
+
if (elem) {
|
|
94
|
+
this._stats.hits += 1;
|
|
95
|
+
}
|
|
96
|
+
return elem;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Marks code as deleted in the cache.
|
|
100
|
+
*
|
|
101
|
+
* @param address - Account address for which code is being fetched.
|
|
102
|
+
*/
|
|
103
|
+
del(address) {
|
|
104
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
|
|
105
|
+
const addressHex = bytesToUnprefixedHex(address.bytes);
|
|
106
|
+
this._saveCachePreState(addressHex);
|
|
107
|
+
if (this.DEBUG) {
|
|
108
|
+
this._debug(`Delete code ${addressHex}`);
|
|
109
|
+
}
|
|
110
|
+
if (this._lruCache) {
|
|
111
|
+
this._lruCache.set(addressHex, {
|
|
112
|
+
code: undefined,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this._orderedMapCache.setElement(addressHex, {
|
|
117
|
+
code: undefined,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
this._stats.deletions += 1;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Flushes the cache by returning codes that have been modified
|
|
124
|
+
* or deleted and resetting the diff cache (at checkpoint height).
|
|
125
|
+
*/
|
|
126
|
+
flush() {
|
|
127
|
+
if (this.DEBUG) {
|
|
128
|
+
this._debug(`Flushing cache on checkpoint ${this._checkpoints}`);
|
|
129
|
+
}
|
|
130
|
+
const diffMap = this._diffCache[this._checkpoints];
|
|
131
|
+
const items = [];
|
|
132
|
+
for (const entry of diffMap.entries()) {
|
|
133
|
+
const cacheKeyHex = entry[0];
|
|
134
|
+
let elem;
|
|
135
|
+
if (this._lruCache) {
|
|
136
|
+
elem = this._lruCache.get(cacheKeyHex);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
elem = this._orderedMapCache.getElementByKey(cacheKeyHex);
|
|
140
|
+
}
|
|
141
|
+
if (elem !== undefined) {
|
|
142
|
+
items.push([cacheKeyHex, elem]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
this._diffCache[this._checkpoints] = new Map();
|
|
146
|
+
return items;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Revert changes to the cache to the last checkpoint (no effect on trie).
|
|
150
|
+
*/
|
|
151
|
+
revert() {
|
|
152
|
+
this._checkpoints -= 1;
|
|
153
|
+
if (this.DEBUG) {
|
|
154
|
+
this._debug(`Revert to checkpoint ${this._checkpoints}`);
|
|
155
|
+
}
|
|
156
|
+
const diffMap = this._diffCache.pop();
|
|
157
|
+
for (const entry of diffMap.entries()) {
|
|
158
|
+
const addressHex = entry[0];
|
|
159
|
+
const elem = entry[1];
|
|
160
|
+
if (elem === undefined) {
|
|
161
|
+
if (this._lruCache) {
|
|
162
|
+
this._lruCache.delete(addressHex);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
this._orderedMapCache.eraseElementByKey(addressHex);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
if (this._lruCache) {
|
|
170
|
+
this._lruCache.set(addressHex, elem);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
this._orderedMapCache.setElement(addressHex, elem);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Commits the current state of the cache (no effect on trie).
|
|
180
|
+
*/
|
|
181
|
+
commit() {
|
|
182
|
+
this._checkpoints -= 1;
|
|
183
|
+
if (this.DEBUG) {
|
|
184
|
+
this._debug(`Commit to checkpoint ${this._checkpoints}`);
|
|
185
|
+
}
|
|
186
|
+
const diffMap = this._diffCache.pop();
|
|
187
|
+
for (const entry of diffMap.entries()) {
|
|
188
|
+
const addressHex = entry[0];
|
|
189
|
+
const oldEntry = this._diffCache[this._checkpoints].has(addressHex);
|
|
190
|
+
if (!oldEntry) {
|
|
191
|
+
const elem = entry[1];
|
|
192
|
+
this._diffCache[this._checkpoints].set(addressHex, elem);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Marks the current state of the cache as a checkpoint, which can
|
|
198
|
+
* later be reverted or committed.
|
|
199
|
+
*/
|
|
200
|
+
checkpoint() {
|
|
201
|
+
this._checkpoints += 1;
|
|
202
|
+
if (this.DEBUG) {
|
|
203
|
+
this._debug(`New checkpoint ${this._checkpoints}`);
|
|
204
|
+
}
|
|
205
|
+
this._diffCache.push(new Map());
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Returns the size of the cache
|
|
209
|
+
* @returns
|
|
210
|
+
*/
|
|
211
|
+
size() {
|
|
212
|
+
if (this._lruCache) {
|
|
213
|
+
return this._lruCache.size;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
return this._orderedMapCache.size();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Returns a dictionary with cache statistics.
|
|
221
|
+
*
|
|
222
|
+
* @param reset - Whether to reset statistics after retrieval.
|
|
223
|
+
* @returns A dictionary with cache statistics.
|
|
224
|
+
*/
|
|
225
|
+
stats(reset = true) {
|
|
226
|
+
const stats = { ...this._stats };
|
|
227
|
+
stats.size = this.size();
|
|
228
|
+
if (reset) {
|
|
229
|
+
this._stats = {
|
|
230
|
+
size: 0,
|
|
231
|
+
reads: 0,
|
|
232
|
+
hits: 0,
|
|
233
|
+
writes: 0,
|
|
234
|
+
deletions: 0,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return stats;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Clears the cache.
|
|
241
|
+
*/
|
|
242
|
+
clear() {
|
|
243
|
+
if (this.DEBUG) {
|
|
244
|
+
this._debug(`Clear cache`);
|
|
245
|
+
}
|
|
246
|
+
if (this._lruCache) {
|
|
247
|
+
this._lruCache.clear();
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
this._orderedMapCache.clear();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../../src/cache/code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Address } from '@feelyourprotocol/util';
|
|
2
|
+
type getStorage = (address: Address, key: Uint8Array) => Promise<Uint8Array>;
|
|
3
|
+
/**
|
|
4
|
+
* Helper class to cache original storage values (so values already being present in
|
|
5
|
+
* the pre-state of a call), mainly for correct gas cost calculation in EVM/VM.
|
|
6
|
+
*
|
|
7
|
+
* TODO: Usage of this class is very implicit through the injected `getStorage()`
|
|
8
|
+
* method bound to the calling state manager. It should be examined if there are alternative
|
|
9
|
+
* designs being more transparent and direct along the next breaking release round.
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
export declare class OriginalStorageCache {
|
|
13
|
+
private map;
|
|
14
|
+
private getStorage;
|
|
15
|
+
constructor(getStorage: getStorage);
|
|
16
|
+
get(address: Address, key: Uint8Array): Promise<Uint8Array>;
|
|
17
|
+
put(address: Address, key: Uint8Array, value: Uint8Array): void;
|
|
18
|
+
clear(): void;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=originalStorageCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"originalStorageCache.d.ts","sourceRoot":"","sources":["../../../src/cache/originalStorageCache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE/C,KAAK,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;AAE5E;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAsC;IACjD,OAAO,CAAC,UAAU,CAAY;gBAClB,UAAU,EAAE,UAAU;IAK5B,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBjE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IAcxD,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { bytesToUnprefixedHex } from '@feelyourprotocol/util';
|
|
2
|
+
/**
|
|
3
|
+
* Helper class to cache original storage values (so values already being present in
|
|
4
|
+
* the pre-state of a call), mainly for correct gas cost calculation in EVM/VM.
|
|
5
|
+
*
|
|
6
|
+
* TODO: Usage of this class is very implicit through the injected `getStorage()`
|
|
7
|
+
* method bound to the calling state manager. It should be examined if there are alternative
|
|
8
|
+
* designs being more transparent and direct along the next breaking release round.
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
export class OriginalStorageCache {
|
|
12
|
+
constructor(getStorage) {
|
|
13
|
+
this.map = new Map();
|
|
14
|
+
this.getStorage = getStorage;
|
|
15
|
+
}
|
|
16
|
+
async get(address, key) {
|
|
17
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
|
|
18
|
+
const addressHex = bytesToUnprefixedHex(address.bytes);
|
|
19
|
+
const map = this.map.get(addressHex);
|
|
20
|
+
if (map !== undefined) {
|
|
21
|
+
const keyHex = bytesToUnprefixedHex(key);
|
|
22
|
+
const value = map.get(keyHex);
|
|
23
|
+
if (value !== undefined) {
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const value = await this.getStorage(address, key);
|
|
28
|
+
this.put(address, key, value);
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
put(address, key, value) {
|
|
32
|
+
// Using deprecated bytesToUnprefixedHex for performance: used as Map keys for cache lookups.
|
|
33
|
+
const addressHex = bytesToUnprefixedHex(address.bytes);
|
|
34
|
+
let map = this.map.get(addressHex);
|
|
35
|
+
if (map === undefined) {
|
|
36
|
+
map = new Map();
|
|
37
|
+
this.map.set(addressHex, map);
|
|
38
|
+
}
|
|
39
|
+
const keyHex = bytesToUnprefixedHex(key);
|
|
40
|
+
if (map.has(keyHex) === false) {
|
|
41
|
+
map.set(keyHex, value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
clear() {
|
|
45
|
+
this.map = new Map();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=originalStorageCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"originalStorageCache.js","sourceRoot":"","sources":["../../../src/cache/originalStorageCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAMvD;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAG/B,YAAY,UAAsB;QAChC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAgB,EAAE,GAAe;QACzC,6FAA6F;QAC7F,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACpC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;YACxC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACjD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAC7B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,GAAG,CAAC,OAAgB,EAAE,GAAe,EAAE,KAAiB;QACtD,6FAA6F;QAC7F,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACtD,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,GAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;YAC/B,GAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { OrderedMap } from '@js-sdsl/ordered-map';
|
|
2
|
+
import { LRUCache } from 'lru-cache';
|
|
3
|
+
import { Cache } from './cache.ts';
|
|
4
|
+
import type { Address } from '@feelyourprotocol/util';
|
|
5
|
+
import type { CacheOpts } from './types.ts';
|
|
6
|
+
/**
|
|
7
|
+
* key -> storage mapping
|
|
8
|
+
*
|
|
9
|
+
* undefined: storage value is known not to exist in the cache
|
|
10
|
+
*/
|
|
11
|
+
type DiffStorageCacheMap = Map<string, Uint8Array | undefined>;
|
|
12
|
+
type StorageCacheMap = Map<string, Uint8Array>;
|
|
13
|
+
export declare class StorageCache extends Cache {
|
|
14
|
+
_lruCache: LRUCache<string, StorageCacheMap> | undefined;
|
|
15
|
+
_orderedMapCache: OrderedMap<string, StorageCacheMap> | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Diff cache collecting the state of the cache
|
|
18
|
+
* at the beginning of checkpoint height
|
|
19
|
+
* (respectively: before a first modification)
|
|
20
|
+
*
|
|
21
|
+
* If the whole cache element is undefined (in contrast
|
|
22
|
+
* to the account), the element didn't exist in the cache
|
|
23
|
+
* before.
|
|
24
|
+
*/
|
|
25
|
+
_diffCache: Map<string, DiffStorageCacheMap>[];
|
|
26
|
+
constructor(opts: CacheOpts);
|
|
27
|
+
_saveCachePreState(addressHex: string, keyHex: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Puts storage value to cache under address_key cache key.
|
|
30
|
+
* @param address - Account address
|
|
31
|
+
* @param key - Storage key
|
|
32
|
+
* @param val - RLP-encoded storage value
|
|
33
|
+
*/
|
|
34
|
+
put(address: Address, key: Uint8Array, value: Uint8Array): void;
|
|
35
|
+
/**
|
|
36
|
+
* Returns the queried slot as the RLP encoded storage value
|
|
37
|
+
* hexToBytes('0x80'): slot is known to be empty
|
|
38
|
+
* undefined: slot is not in cache
|
|
39
|
+
* @param address - Address of account
|
|
40
|
+
* @param key - Storage key
|
|
41
|
+
* @returns Storage value or undefined
|
|
42
|
+
*/
|
|
43
|
+
get(address: Address, key: Uint8Array): Uint8Array | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Marks storage key for address as deleted in cache.
|
|
46
|
+
* @param address - Address
|
|
47
|
+
* @param key - Storage key
|
|
48
|
+
*/
|
|
49
|
+
del(address: Address, key: Uint8Array): void;
|
|
50
|
+
/**
|
|
51
|
+
* Deletes all storage slots for address from the cache
|
|
52
|
+
* @param address
|
|
53
|
+
*/
|
|
54
|
+
clearStorage(address: Address): void;
|
|
55
|
+
/**
|
|
56
|
+
* Flushes cache by returning storage slots that have been modified
|
|
57
|
+
* or deleted and resetting the diff cache (at checkpoint height).
|
|
58
|
+
*/
|
|
59
|
+
flush(): [string, string, Uint8Array | undefined][];
|
|
60
|
+
/**
|
|
61
|
+
* Revert changes to cache last checkpoint (no effect on trie).
|
|
62
|
+
*/
|
|
63
|
+
revert(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Commits to current state of cache (no effect on trie).
|
|
66
|
+
*/
|
|
67
|
+
commit(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Marks current state of cache as checkpoint, which can
|
|
70
|
+
* later on be reverted or committed.
|
|
71
|
+
*/
|
|
72
|
+
checkpoint(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Returns the size of the cache
|
|
75
|
+
* @returns
|
|
76
|
+
*/
|
|
77
|
+
size(): number;
|
|
78
|
+
/**
|
|
79
|
+
* Returns a dict with cache stats
|
|
80
|
+
* @param reset
|
|
81
|
+
*/
|
|
82
|
+
stats(reset?: boolean): {
|
|
83
|
+
size: number;
|
|
84
|
+
reads: number;
|
|
85
|
+
hits: number;
|
|
86
|
+
writes: number;
|
|
87
|
+
deletions: number;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Clears cache.
|
|
91
|
+
*/
|
|
92
|
+
clear(): void;
|
|
93
|
+
/**
|
|
94
|
+
* Dumps the RLP-encoded storage values for an `account` specified by `address`.
|
|
95
|
+
* @param address - The address of the `account` to return storage for
|
|
96
|
+
* @returns {StorageCacheMap | undefined} - The storage values for the `account` or undefined if the `account` is not in the cache
|
|
97
|
+
*/
|
|
98
|
+
dump(address: Address): StorageCacheMap | undefined;
|
|
99
|
+
}
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=storage.d.ts.map
|