@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.
Files changed (169) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +331 -0
  3. package/dist/cjs/cache/account.d.ts +85 -0
  4. package/dist/cjs/cache/account.d.ts.map +1 -0
  5. package/dist/cjs/cache/account.js +252 -0
  6. package/dist/cjs/cache/account.js.map +1 -0
  7. package/dist/cjs/cache/cache.d.ts +23 -0
  8. package/dist/cjs/cache/cache.d.ts.map +1 -0
  9. package/dist/cjs/cache/cache.js +31 -0
  10. package/dist/cjs/cache/cache.js.map +1 -0
  11. package/dist/cjs/cache/caches.d.ts +19 -0
  12. package/dist/cjs/cache/caches.d.ts.map +1 -0
  13. package/dist/cjs/cache/caches.js +107 -0
  14. package/dist/cjs/cache/caches.js.map +1 -0
  15. package/dist/cjs/cache/code.d.ts +87 -0
  16. package/dist/cjs/cache/code.d.ts.map +1 -0
  17. package/dist/cjs/cache/code.js +258 -0
  18. package/dist/cjs/cache/code.js.map +1 -0
  19. package/dist/cjs/cache/index.d.ts +7 -0
  20. package/dist/cjs/cache/index.d.ts.map +1 -0
  21. package/dist/cjs/cache/index.js +23 -0
  22. package/dist/cjs/cache/index.js.map +1 -0
  23. package/dist/cjs/cache/originalStorageCache.d.ts +21 -0
  24. package/dist/cjs/cache/originalStorageCache.d.ts.map +1 -0
  25. package/dist/cjs/cache/originalStorageCache.js +52 -0
  26. package/dist/cjs/cache/originalStorageCache.js.map +1 -0
  27. package/dist/cjs/cache/storage.d.ts +101 -0
  28. package/dist/cjs/cache/storage.d.ts.map +1 -0
  29. package/dist/cjs/cache/storage.js +337 -0
  30. package/dist/cjs/cache/storage.js.map +1 -0
  31. package/dist/cjs/cache/types.d.ts +36 -0
  32. package/dist/cjs/cache/types.d.ts.map +1 -0
  33. package/dist/cjs/cache/types.js +8 -0
  34. package/dist/cjs/cache/types.js.map +1 -0
  35. package/dist/cjs/index.d.ts +8 -0
  36. package/dist/cjs/index.d.ts.map +1 -0
  37. package/dist/cjs/index.js +24 -0
  38. package/dist/cjs/index.js.map +1 -0
  39. package/dist/cjs/merkleStateManager.d.ts +260 -0
  40. package/dist/cjs/merkleStateManager.d.ts.map +1 -0
  41. package/dist/cjs/merkleStateManager.js +616 -0
  42. package/dist/cjs/merkleStateManager.js.map +1 -0
  43. package/dist/cjs/package.json +3 -0
  44. package/dist/cjs/proof/index.d.ts +3 -0
  45. package/dist/cjs/proof/index.d.ts.map +1 -0
  46. package/dist/cjs/proof/index.js +19 -0
  47. package/dist/cjs/proof/index.js.map +1 -0
  48. package/dist/cjs/proof/merkle.d.ts +40 -0
  49. package/dist/cjs/proof/merkle.d.ts.map +1 -0
  50. package/dist/cjs/proof/merkle.js +182 -0
  51. package/dist/cjs/proof/merkle.js.map +1 -0
  52. package/dist/cjs/proof/rpc.d.ts +10 -0
  53. package/dist/cjs/proof/rpc.d.ts.map +1 -0
  54. package/dist/cjs/proof/rpc.js +20 -0
  55. package/dist/cjs/proof/rpc.js.map +1 -0
  56. package/dist/cjs/rpcStateManager.d.ts +162 -0
  57. package/dist/cjs/rpcStateManager.d.ts.map +1 -0
  58. package/dist/cjs/rpcStateManager.js +313 -0
  59. package/dist/cjs/rpcStateManager.js.map +1 -0
  60. package/dist/cjs/simpleStateManager.d.ts +54 -0
  61. package/dist/cjs/simpleStateManager.d.ts.map +1 -0
  62. package/dist/cjs/simpleStateManager.js +125 -0
  63. package/dist/cjs/simpleStateManager.js.map +1 -0
  64. package/dist/cjs/statefulBinaryTreeStateManager.d.ts +69 -0
  65. package/dist/cjs/statefulBinaryTreeStateManager.d.ts.map +1 -0
  66. package/dist/cjs/statefulBinaryTreeStateManager.js +576 -0
  67. package/dist/cjs/statefulBinaryTreeStateManager.js.map +1 -0
  68. package/dist/cjs/types.d.ts +92 -0
  69. package/dist/cjs/types.d.ts.map +1 -0
  70. package/dist/cjs/types.js +3 -0
  71. package/dist/cjs/types.js.map +1 -0
  72. package/dist/cjs/util.d.ts +4 -0
  73. package/dist/cjs/util.d.ts.map +1 -0
  74. package/dist/cjs/util.js +21 -0
  75. package/dist/cjs/util.js.map +1 -0
  76. package/dist/esm/cache/account.d.ts +85 -0
  77. package/dist/esm/cache/account.d.ts.map +1 -0
  78. package/dist/esm/cache/account.js +248 -0
  79. package/dist/esm/cache/account.js.map +1 -0
  80. package/dist/esm/cache/cache.d.ts +23 -0
  81. package/dist/esm/cache/cache.d.ts.map +1 -0
  82. package/dist/esm/cache/cache.js +27 -0
  83. package/dist/esm/cache/cache.js.map +1 -0
  84. package/dist/esm/cache/caches.d.ts +19 -0
  85. package/dist/esm/cache/caches.d.ts.map +1 -0
  86. package/dist/esm/cache/caches.js +103 -0
  87. package/dist/esm/cache/caches.js.map +1 -0
  88. package/dist/esm/cache/code.d.ts +87 -0
  89. package/dist/esm/cache/code.d.ts.map +1 -0
  90. package/dist/esm/cache/code.js +254 -0
  91. package/dist/esm/cache/code.js.map +1 -0
  92. package/dist/esm/cache/index.d.ts +7 -0
  93. package/dist/esm/cache/index.d.ts.map +1 -0
  94. package/dist/esm/cache/index.js +7 -0
  95. package/dist/esm/cache/index.js.map +1 -0
  96. package/dist/esm/cache/originalStorageCache.d.ts +21 -0
  97. package/dist/esm/cache/originalStorageCache.d.ts.map +1 -0
  98. package/dist/esm/cache/originalStorageCache.js +48 -0
  99. package/dist/esm/cache/originalStorageCache.js.map +1 -0
  100. package/dist/esm/cache/storage.d.ts +101 -0
  101. package/dist/esm/cache/storage.d.ts.map +1 -0
  102. package/dist/esm/cache/storage.js +333 -0
  103. package/dist/esm/cache/storage.js.map +1 -0
  104. package/dist/esm/cache/types.d.ts +36 -0
  105. package/dist/esm/cache/types.d.ts.map +1 -0
  106. package/dist/esm/cache/types.js +5 -0
  107. package/dist/esm/cache/types.js.map +1 -0
  108. package/dist/esm/index.d.ts +8 -0
  109. package/dist/esm/index.d.ts.map +1 -0
  110. package/dist/esm/index.js +8 -0
  111. package/dist/esm/index.js.map +1 -0
  112. package/dist/esm/merkleStateManager.d.ts +260 -0
  113. package/dist/esm/merkleStateManager.d.ts.map +1 -0
  114. package/dist/esm/merkleStateManager.js +612 -0
  115. package/dist/esm/merkleStateManager.js.map +1 -0
  116. package/dist/esm/package.json +3 -0
  117. package/dist/esm/proof/index.d.ts +3 -0
  118. package/dist/esm/proof/index.d.ts.map +1 -0
  119. package/dist/esm/proof/index.js +3 -0
  120. package/dist/esm/proof/index.js.map +1 -0
  121. package/dist/esm/proof/merkle.d.ts +40 -0
  122. package/dist/esm/proof/merkle.d.ts.map +1 -0
  123. package/dist/esm/proof/merkle.js +175 -0
  124. package/dist/esm/proof/merkle.js.map +1 -0
  125. package/dist/esm/proof/rpc.d.ts +10 -0
  126. package/dist/esm/proof/rpc.d.ts.map +1 -0
  127. package/dist/esm/proof/rpc.js +17 -0
  128. package/dist/esm/proof/rpc.js.map +1 -0
  129. package/dist/esm/rpcStateManager.d.ts +162 -0
  130. package/dist/esm/rpcStateManager.d.ts.map +1 -0
  131. package/dist/esm/rpcStateManager.js +308 -0
  132. package/dist/esm/rpcStateManager.js.map +1 -0
  133. package/dist/esm/simpleStateManager.d.ts +54 -0
  134. package/dist/esm/simpleStateManager.d.ts.map +1 -0
  135. package/dist/esm/simpleStateManager.js +121 -0
  136. package/dist/esm/simpleStateManager.js.map +1 -0
  137. package/dist/esm/statefulBinaryTreeStateManager.d.ts +69 -0
  138. package/dist/esm/statefulBinaryTreeStateManager.d.ts.map +1 -0
  139. package/dist/esm/statefulBinaryTreeStateManager.js +572 -0
  140. package/dist/esm/statefulBinaryTreeStateManager.js.map +1 -0
  141. package/dist/esm/types.d.ts +92 -0
  142. package/dist/esm/types.d.ts.map +1 -0
  143. package/dist/esm/types.js +2 -0
  144. package/dist/esm/types.js.map +1 -0
  145. package/dist/esm/util.d.ts +4 -0
  146. package/dist/esm/util.d.ts.map +1 -0
  147. package/dist/esm/util.js +18 -0
  148. package/dist/esm/util.js.map +1 -0
  149. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
  150. package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
  151. package/package.json +74 -0
  152. package/src/cache/account.ts +277 -0
  153. package/src/cache/cache.ts +35 -0
  154. package/src/cache/caches.ts +125 -0
  155. package/src/cache/code.ts +277 -0
  156. package/src/cache/index.ts +6 -0
  157. package/src/cache/originalStorageCache.ts +57 -0
  158. package/src/cache/storage.ts +369 -0
  159. package/src/cache/types.ts +38 -0
  160. package/src/index.ts +7 -0
  161. package/src/merkleStateManager.ts +737 -0
  162. package/src/proof/index.ts +2 -0
  163. package/src/proof/merkle.ts +264 -0
  164. package/src/proof/rpc.ts +24 -0
  165. package/src/rpcStateManager.ts +381 -0
  166. package/src/simpleStateManager.ts +154 -0
  167. package/src/statefulBinaryTreeStateManager.ts +789 -0
  168. package/src/types.ts +103 -0
  169. package/src/util.ts +28 -0
@@ -0,0 +1,572 @@
1
+ import { BinaryTree } from '@feelyourprotocol/binarytree';
2
+ import { BinaryTreeAccessedStateType } from '@feelyourprotocol/common';
3
+ import { RLP } from '@feelyourprotocol/rlp';
4
+ import { Account, BINARY_TREE_CODE_CHUNK_SIZE, BINARY_TREE_CODE_OFFSET, BINARY_TREE_NODE_WIDTH, BinaryTreeLeafType, EthereumJSErrorWithoutCode, KECCAK256_NULL, MapDB, bigIntToBytes, bytesToBigInt, bytesToHex, chunkifyBinaryTreeCode, createAddressFromString, createPartialAccount, createPartialAccountFromRLP, decodeBinaryTreeLeafBasicData, encodeBinaryTreeLeafBasicData, equalsBytes, generateBinaryTreeChunkSuffixes, generateBinaryTreeCodeStems, getBinaryTreeKeyForStorageSlot, getBinaryTreeStem, hexToBigInt, hexToBytes, isDebugEnabled, padToEven, setLengthLeft, setLengthRight, short, unprefixedHexToBytes, } from '@feelyourprotocol/util';
5
+ import { blake3 } from '@noble/hashes/blake3.js';
6
+ import { keccak_256 } from '@noble/hashes/sha3.js';
7
+ import debugDefault from 'debug';
8
+ import { OriginalStorageCache } from "./cache/originalStorageCache.js";
9
+ import { modifyAccountFields } from "./util.js";
10
+ const ZEROVALUE = '0x0000000000000000000000000000000000000000000000000000000000000000';
11
+ export class StatefulBinaryTreeStateManager {
12
+ constructor(opts) {
13
+ // Post-state provided from the executionWitness.
14
+ // Should not update. Used for comparing our computed post-state with the canonical one.
15
+ this._postState = {};
16
+ /**
17
+ * StateManager is run in DEBUG mode (default: false)
18
+ * Taken from DEBUG environment variable
19
+ *
20
+ * Safeguards on debug() calls are added for
21
+ * performance reasons to avoid string literal evaluation
22
+ * @hidden
23
+ */
24
+ this.DEBUG = false;
25
+ /**
26
+ * Gets the account associated with `address` or `undefined` if account does not exist
27
+ * @param address - Address of the `account` to get
28
+ */
29
+ this.getAccount = async (address) => {
30
+ const elem = this._caches?.account?.get(address);
31
+ if (elem !== undefined) {
32
+ return elem.accountRLP !== undefined
33
+ ? createPartialAccountFromRLP(elem.accountRLP)
34
+ : undefined;
35
+ }
36
+ const stem = getBinaryTreeStem(this.hashFunction, address, 0);
37
+ // First retrieve the account "header" values from the trie
38
+ const accountValues = await this._tree.get(stem, [
39
+ BinaryTreeLeafType.BasicData,
40
+ BinaryTreeLeafType.CodeHash,
41
+ ]);
42
+ let account;
43
+ if (accountValues[0] !== null && accountValues[0] !== undefined) {
44
+ const basicData = decodeBinaryTreeLeafBasicData(accountValues[0]);
45
+ account = createPartialAccount({
46
+ version: basicData.version,
47
+ balance: basicData.balance,
48
+ nonce: basicData.nonce,
49
+ // Codehash is either untouched (i.e. null) or deleted (i.e. overwritten with zeros)
50
+ codeHash: accountValues[1] === null ||
51
+ accountValues[1] === undefined ||
52
+ equalsBytes(accountValues[1], new Uint8Array(32))
53
+ ? KECCAK256_NULL
54
+ : accountValues[1],
55
+ codeSize: basicData.codeSize,
56
+ storageRoot: KECCAK256_NULL,
57
+ });
58
+ }
59
+ else if (accountValues[1] === undefined || accountValues[1] === null) {
60
+ // account does not exist if both basic fields and codehash are undefined
61
+ if (this.DEBUG) {
62
+ this._debug(`getAccount address=${address.toString()} from DB (non-existent)`);
63
+ }
64
+ this._caches?.account?.put(address, account);
65
+ }
66
+ if (this.DEBUG) {
67
+ this._debug(`getAccount address=${address.toString()} stem=${short(stem)}`);
68
+ }
69
+ return account;
70
+ };
71
+ /**
72
+ * Saves an account into state under the provided `address`.
73
+ * @param address - Address under which to store `account`
74
+ * @param account - The account to store or undefined if to be deleted
75
+ */
76
+ this.putAccount = async (address, account) => {
77
+ if (this.DEBUG) {
78
+ this._debug(`putAccount address=${address} nonce=${account?.nonce} balance=${account?.balance} contract=${account && account.isContract() ? 'yes' : 'no'} empty=${account && account.isEmpty() ? 'yes' : 'no'}`);
79
+ }
80
+ if (this._caches?.account === undefined) {
81
+ if (account !== undefined) {
82
+ const stem = getBinaryTreeStem(this.hashFunction, address, 0);
83
+ const basicDataBytes = encodeBinaryTreeLeafBasicData(account);
84
+ await this._tree.put(stem, [BinaryTreeLeafType.BasicData, BinaryTreeLeafType.CodeHash], [basicDataBytes, account.codeHash]);
85
+ }
86
+ else {
87
+ // Delete account
88
+ await this.deleteAccount(address);
89
+ }
90
+ }
91
+ else {
92
+ if (account !== undefined) {
93
+ this._caches?.account?.put(address, account, true);
94
+ }
95
+ else {
96
+ this._caches?.account?.del(address);
97
+ }
98
+ }
99
+ };
100
+ /**
101
+ * Deletes an account from state under the provided `address`.
102
+ * @param address - Address of the account which should be deleted
103
+ */
104
+ this.deleteAccount = async (address) => {
105
+ if (this.DEBUG) {
106
+ this._debug(`Delete account ${address}`);
107
+ }
108
+ this._caches?.deleteAccount(address);
109
+ if (this._caches?.account === undefined) {
110
+ const stem = getBinaryTreeStem(this.hashFunction, address);
111
+ // Special instance where we delete the account and revert the trie value to untouched
112
+ await this._tree.put(stem, [BinaryTreeLeafType.BasicData, BinaryTreeLeafType.CodeHash], [null, null]);
113
+ }
114
+ };
115
+ this.modifyAccountFields = async (address, accountFields) => {
116
+ await modifyAccountFields(this, address, accountFields);
117
+ };
118
+ this.putCode = async (address, value) => {
119
+ if (this.DEBUG) {
120
+ this._debug(`putCode address=${address.toString()} value=${short(value)}`);
121
+ }
122
+ this._caches?.code?.put(address, value);
123
+ const codeHash = keccak_256(value);
124
+ if (equalsBytes(codeHash, KECCAK256_NULL)) {
125
+ // If the code hash is the null hash, no code has to be stored
126
+ return;
127
+ }
128
+ if ((await this.getAccount(address)) === undefined) {
129
+ await this.putAccount(address, new Account());
130
+ }
131
+ if (this.DEBUG) {
132
+ this._debug(`Update codeHash (-> ${short(codeHash)}) for account ${address}`);
133
+ }
134
+ const codeChunks = chunkifyBinaryTreeCode(value);
135
+ const chunkStems = generateBinaryTreeCodeStems(codeChunks.length, address, this.hashFunction);
136
+ const chunkSuffixes = generateBinaryTreeChunkSuffixes(codeChunks.length);
137
+ // Put the code chunks corresponding to the first stem (up to 128 chunks)
138
+ await this._tree.put(chunkStems[0], chunkSuffixes.slice(0, chunkSuffixes.length <= BINARY_TREE_CODE_OFFSET
139
+ ? chunkSuffixes.length
140
+ : BINARY_TREE_CODE_OFFSET), codeChunks.slice(0, codeChunks.length <= BINARY_TREE_CODE_OFFSET ? codeChunks.length : BINARY_TREE_CODE_OFFSET));
141
+ // Put additional chunks under additional stems as applicable
142
+ for (let stem = 1; stem < chunkStems.length; stem++) {
143
+ const sliceStart = BINARY_TREE_CODE_OFFSET + BINARY_TREE_NODE_WIDTH * (stem - 1);
144
+ const sliceEnd = value.length <= BINARY_TREE_CODE_OFFSET + BINARY_TREE_NODE_WIDTH * stem
145
+ ? value.length
146
+ : BINARY_TREE_CODE_OFFSET + BINARY_TREE_NODE_WIDTH * stem;
147
+ await this._tree.put(chunkStems[stem], chunkSuffixes.slice(sliceStart, sliceEnd), codeChunks.slice(sliceStart, sliceEnd));
148
+ }
149
+ await this.modifyAccountFields(address, {
150
+ codeHash,
151
+ codeSize: value.length,
152
+ });
153
+ };
154
+ this.getCode = async (address) => {
155
+ if (this.DEBUG) {
156
+ this._debug(`getCode address=${address.toString()}`);
157
+ }
158
+ const elem = this._caches?.code?.get(address);
159
+ if (elem !== undefined) {
160
+ return elem.code ?? new Uint8Array(0);
161
+ }
162
+ const account = await this.getAccount(address);
163
+ if (!account) {
164
+ return new Uint8Array(0);
165
+ }
166
+ if (!account.isContract()) {
167
+ return new Uint8Array(0);
168
+ }
169
+ // allocate the code
170
+ const codeSize = account.codeSize;
171
+ const stems = generateBinaryTreeCodeStems(Math.ceil(codeSize / BINARY_TREE_CODE_CHUNK_SIZE), address, this.hashFunction);
172
+ const chunkSuffixes = generateBinaryTreeChunkSuffixes(Math.ceil(codeSize / BINARY_TREE_CODE_CHUNK_SIZE));
173
+ const chunksByStem = new Array(stems.length);
174
+ // Retrieve the code chunks stored in the first leaf node
175
+ chunksByStem[0] = await this._tree.get(stems[0], chunkSuffixes.slice(0, codeSize <= BINARY_TREE_CODE_OFFSET ? codeSize : BINARY_TREE_CODE_OFFSET));
176
+ // Retrieve code chunks on any additional stems
177
+ for (let stem = 1; stem < stems.length; stem++) {
178
+ const sliceStart = BINARY_TREE_CODE_OFFSET + BINARY_TREE_NODE_WIDTH * (stem - 1);
179
+ const sliceEnd = codeSize <= BINARY_TREE_CODE_OFFSET + BINARY_TREE_NODE_WIDTH * stem
180
+ ? codeSize
181
+ : BINARY_TREE_CODE_OFFSET + BINARY_TREE_NODE_WIDTH * stem;
182
+ chunksByStem[stem] = await this._tree.get(stems[stem], chunkSuffixes.slice(sliceStart, sliceEnd));
183
+ }
184
+ const chunks = chunksByStem.flat();
185
+ const code = new Uint8Array(codeSize);
186
+ // Insert code chunks into final array (skipping PUSHDATA overflow indicator byte)
187
+ for (let x = 0; x < chunks.length; x++) {
188
+ if (chunks[x] === undefined)
189
+ throw EthereumJSErrorWithoutCode(`expected code chunk at index ${x}, got undefined`);
190
+ let lastChunkByteIndex = BINARY_TREE_CODE_CHUNK_SIZE;
191
+ // Determine code ending byte (if we're on the last chunk)
192
+ if (x === chunks.length - 1) {
193
+ // On the last chunk, the slice either ends on a partial chunk (if codeSize doesn't exactly fit in full chunks), or a full chunk
194
+ lastChunkByteIndex = codeSize % BINARY_TREE_CODE_CHUNK_SIZE || BINARY_TREE_CODE_CHUNK_SIZE;
195
+ }
196
+ code.set(chunks[x].slice(1, lastChunkByteIndex + 1), code.byteOffset + x * BINARY_TREE_CODE_CHUNK_SIZE);
197
+ }
198
+ this._caches?.code?.put(address, code);
199
+ return code;
200
+ };
201
+ this.getCodeSize = async (address) => {
202
+ const accountBytes = (await this._tree.get(getBinaryTreeStem(this.hashFunction, address), [
203
+ BinaryTreeLeafType.BasicData,
204
+ ]))[0];
205
+ if (accountBytes === null)
206
+ return 0;
207
+ return decodeBinaryTreeLeafBasicData(accountBytes).codeSize;
208
+ };
209
+ this.getStorage = async (address, key) => {
210
+ if (key.length !== 32) {
211
+ throw EthereumJSErrorWithoutCode('Storage key must be 32 bytes long');
212
+ }
213
+ const cachedValue = this._caches?.storage?.get(address, key);
214
+ if (cachedValue !== undefined) {
215
+ const decoded = RLP.decode(cachedValue ?? new Uint8Array(0));
216
+ return decoded;
217
+ }
218
+ const account = await this.getAccount(address);
219
+ if (!account) {
220
+ return new Uint8Array();
221
+ }
222
+ const storageKey = getBinaryTreeKeyForStorageSlot(address, bytesToBigInt(key), this.hashFunction);
223
+ const value = await this._tree.get(storageKey.slice(0, 31), [storageKey[31]]);
224
+ this._caches?.storage?.put(address, key, value[0] ?? hexToBytes('0x80'));
225
+ const decoded = (value[0] ?? new Uint8Array(0));
226
+ return setLengthLeft(decoded, 32);
227
+ };
228
+ this.putStorage = async (address, key, value) => {
229
+ this._caches?.storage?.put(address, key, RLP.encode(value));
230
+ if (this._caches?.storage === undefined) {
231
+ const storageKey = getBinaryTreeKeyForStorageSlot(address, bytesToBigInt(key), this.hashFunction);
232
+ await this._tree.put(storageKey.slice(0, 31), [storageKey[31]], [setLengthLeft(value, 32)]);
233
+ }
234
+ };
235
+ this.clearStorage = async (address) => {
236
+ this._caches?.storage?.clearStorage(address);
237
+ };
238
+ this.checkpoint = async () => {
239
+ this._tree.checkpoint();
240
+ this._caches?.checkpoint();
241
+ this._checkpointCount++;
242
+ };
243
+ this.commit = async () => {
244
+ await this._tree.commit();
245
+ this._caches?.commit();
246
+ this._checkpointCount--;
247
+ if (this._checkpointCount === 0) {
248
+ await this.flush();
249
+ this.originalStorageCache.clear();
250
+ }
251
+ if (this.DEBUG) {
252
+ this._debug(`state checkpoint committed`);
253
+ }
254
+ };
255
+ this.revert = async () => {
256
+ await this._tree.revert();
257
+ this._caches?.revert();
258
+ this._checkpointCount--;
259
+ if (this._checkpointCount === 0) {
260
+ await this.flush();
261
+ this.originalStorageCache.clear();
262
+ }
263
+ };
264
+ this.flush = async () => {
265
+ const codeItems = this._caches?.code?.flush() ?? [];
266
+ for (const item of codeItems) {
267
+ const addr = createAddressFromString(`0x${item[0]}`);
268
+ const code = item[1].code;
269
+ if (code === undefined) {
270
+ continue;
271
+ }
272
+ await this.putCode(addr, code);
273
+ }
274
+ const storageItems = this._caches?.storage?.flush() ?? [];
275
+ for (const item of storageItems) {
276
+ const address = createAddressFromString(`0x${item[0]}`);
277
+ const keyHex = item[1];
278
+ const keyBytes = unprefixedHexToBytes(keyHex);
279
+ const value = item[2];
280
+ const decoded = RLP.decode(value ?? new Uint8Array(0));
281
+ const account = await this.getAccount(address);
282
+ if (account) {
283
+ await this.putStorage(address, keyBytes, decoded);
284
+ }
285
+ }
286
+ const accountItems = this._caches?.account?.flush() ?? [];
287
+ for (const item of accountItems) {
288
+ const address = createAddressFromString(`0x${item[0]}`);
289
+ const elem = item[1];
290
+ if (elem.accountRLP === undefined) {
291
+ await this.deleteAccount(address);
292
+ }
293
+ else {
294
+ const account = createPartialAccountFromRLP(elem.accountRLP);
295
+ await this.putAccount(address, account);
296
+ }
297
+ }
298
+ };
299
+ // Skip DEBUG calls unless 'ethjs' included in environmental DEBUG variables
300
+ this.DEBUG = isDebugEnabled('ethjs');
301
+ this._checkpointCount = 0;
302
+ if (opts.common?.isActivatedEIP(7864) === false) {
303
+ throw EthereumJSErrorWithoutCode('EIP-7864 required for binary tree state management');
304
+ }
305
+ this.hashFunction = opts.hashFunction ?? blake3;
306
+ this._tree =
307
+ opts.tree ??
308
+ new BinaryTree({
309
+ hashFunction: this.hashFunction,
310
+ db: new MapDB(),
311
+ useRootPersistence: false,
312
+ cacheSize: 0,
313
+ });
314
+ this._debug = debugDefault('statemanager:binarytree');
315
+ this.originalStorageCache = new OriginalStorageCache(this.getStorage.bind(this));
316
+ this._caches = opts.caches;
317
+ this.keccakFunction = keccak_256;
318
+ this.preStateRoot = new Uint8Array(32); // Initial state root is zeroes
319
+ }
320
+ initBinaryTreeExecutionWitness(_blockNum, executionWitness) {
321
+ if (executionWitness === null || executionWitness === undefined) {
322
+ const errorMsg = `Invalid executionWitness=${executionWitness} for initBinaryTreeExecutionWitness`;
323
+ this._debug(errorMsg);
324
+ throw Error(errorMsg);
325
+ }
326
+ this.preStateRoot = hexToBytes(executionWitness.parentStateRoot); // set prestate root
327
+ // Populate the post-state from the executionWitness
328
+ const postStateRaw = executionWitness.stateDiff.flatMap(({ stem, suffixDiffs }) => {
329
+ const suffixDiffPairs = suffixDiffs.map(({ newValue, currentValue, suffix }) => {
330
+ const key = `${stem}${padToEven(Number(suffix).toString(16))}`;
331
+ // A postState value of null means there was no change from the preState.
332
+ // In this implementation, we therefore replace null with the preState.
333
+ const value = newValue ?? currentValue;
334
+ return {
335
+ [key]: value,
336
+ };
337
+ });
338
+ return suffixDiffPairs;
339
+ });
340
+ const postState = postStateRaw.reduce((prevValue, currentValue) => {
341
+ const acc = { ...prevValue, ...currentValue };
342
+ return acc;
343
+ }, {});
344
+ this._postState = postState;
345
+ this._debug(`initBinaryTreeExecutionWitness postState=${JSON.stringify(this._postState)}`);
346
+ }
347
+ async getComputedValue(accessedState) {
348
+ const { address, type } = accessedState;
349
+ switch (type) {
350
+ case BinaryTreeAccessedStateType.BasicData: {
351
+ if (this._caches === undefined) {
352
+ const accountData = await this.getAccount(address);
353
+ if (accountData === undefined) {
354
+ return null;
355
+ }
356
+ const basicDataBytes = encodeBinaryTreeLeafBasicData(accountData);
357
+ return bytesToHex(basicDataBytes);
358
+ }
359
+ else {
360
+ const encodedAccount = this._caches?.account?.get(address)?.accountRLP;
361
+ if (encodedAccount === undefined) {
362
+ return null;
363
+ }
364
+ const basicDataBytes = encodeBinaryTreeLeafBasicData(createPartialAccountFromRLP(encodedAccount));
365
+ return bytesToHex(basicDataBytes);
366
+ }
367
+ }
368
+ case BinaryTreeAccessedStateType.CodeHash: {
369
+ if (this._caches === undefined) {
370
+ const accountData = await this.getAccount(address);
371
+ if (accountData === undefined) {
372
+ return null;
373
+ }
374
+ return bytesToHex(accountData.codeHash);
375
+ }
376
+ else {
377
+ const encodedAccount = this._caches?.account?.get(address)?.accountRLP;
378
+ if (encodedAccount === undefined) {
379
+ return null;
380
+ }
381
+ return bytesToHex(createPartialAccountFromRLP(encodedAccount).codeHash);
382
+ }
383
+ }
384
+ case BinaryTreeAccessedStateType.Code: {
385
+ const { codeOffset } = accessedState;
386
+ let code = null;
387
+ if (this._caches === undefined) {
388
+ code = await this.getCode(address);
389
+ if (code === undefined) {
390
+ return null;
391
+ }
392
+ }
393
+ else {
394
+ code = this._caches?.code?.get(address)?.code;
395
+ if (code === undefined) {
396
+ return null;
397
+ }
398
+ }
399
+ // we can only compare the actual code because to compare the first byte would
400
+ // be very tricky and impossible in certain scenarios like when the previous code chunk
401
+ // was not accessed and hence not even provided in the witness
402
+ // We are left-padding with two zeroes to get a 32-byte length, but these bytes should not be considered reliable
403
+ return bytesToHex(setLengthLeft(setLengthRight(code.slice(codeOffset, codeOffset + BINARY_TREE_CODE_CHUNK_SIZE), BINARY_TREE_CODE_CHUNK_SIZE), BINARY_TREE_CODE_CHUNK_SIZE + 1));
404
+ }
405
+ case BinaryTreeAccessedStateType.Storage: {
406
+ const { slot } = accessedState;
407
+ const key = setLengthLeft(bigIntToBytes(slot), 32);
408
+ let storage = null;
409
+ if (this._caches === undefined) {
410
+ storage = await this.getStorage(address, key);
411
+ if (storage === undefined) {
412
+ return null;
413
+ }
414
+ }
415
+ else {
416
+ storage = this._caches?.storage?.get(address, key);
417
+ }
418
+ if (storage === undefined) {
419
+ return null;
420
+ }
421
+ return bytesToHex(setLengthLeft(storage, 32));
422
+ }
423
+ }
424
+ }
425
+ // Verifies that the witness post-state matches the computed post-state
426
+ async verifyBinaryTreePostState(accessWitness) {
427
+ // track what all chunks were accessed so as to compare in the end if any chunks were missed
428
+ // in access while comparing against the provided poststate in the execution witness
429
+ const accessedChunks = new Map();
430
+ // switch to false if postVerify fails
431
+ let postFailures = 0;
432
+ for (const accessedState of accessWitness?.accesses() ?? []) {
433
+ const { address, type } = accessedState;
434
+ let extraMeta = '';
435
+ if (accessedState.type === BinaryTreeAccessedStateType.Code) {
436
+ extraMeta = `codeOffset=${accessedState.codeOffset}`;
437
+ }
438
+ else if (accessedState.type === BinaryTreeAccessedStateType.Storage) {
439
+ extraMeta = `slot=${accessedState.slot}`;
440
+ }
441
+ const { chunkKey } = accessedState;
442
+ accessedChunks.set(chunkKey, true);
443
+ let computedValue = await this.getComputedValue(accessedState);
444
+ if (computedValue === undefined) {
445
+ this.DEBUG &&
446
+ this._debug(`Missing computed value for address=${address} type=${type} ${extraMeta} chunkKey=${chunkKey}`);
447
+ postFailures++;
448
+ continue;
449
+ }
450
+ let canonicalValue = this._postState[chunkKey];
451
+ if (canonicalValue === undefined) {
452
+ this.DEBUG &&
453
+ this._debug(`Block accesses missing from postState for address=${address} type=${type} ${extraMeta} chunkKey=${chunkKey}`);
454
+ postFailures++;
455
+ continue;
456
+ }
457
+ // if the access type is code, then we can't match the first byte because since the computed value
458
+ // doesn't has the first byte for push data since previous chunk code itself might not be available
459
+ if (accessedState.type === BinaryTreeAccessedStateType.Code) {
460
+ computedValue = computedValue !== null ? `0x${computedValue.slice(4)}` : null;
461
+ canonicalValue = canonicalValue !== null ? `0x${canonicalValue.slice(4)}` : null;
462
+ }
463
+ else if (accessedState.type === BinaryTreeAccessedStateType.Storage &&
464
+ canonicalValue === null &&
465
+ computedValue === ZEROVALUE) {
466
+ canonicalValue = ZEROVALUE;
467
+ }
468
+ this._debug(`computed ${computedValue} canonical ${canonicalValue}`);
469
+ if (computedValue !== canonicalValue) {
470
+ if (type === BinaryTreeAccessedStateType.BasicData) {
471
+ this.DEBUG &&
472
+ this._debug(`canonical value: `, canonicalValue === null
473
+ ? null
474
+ : decodeBinaryTreeLeafBasicData(hexToBytes(canonicalValue)));
475
+ this.DEBUG &&
476
+ this._debug(`computed value: `, computedValue === null
477
+ ? null
478
+ : decodeBinaryTreeLeafBasicData(hexToBytes(computedValue)));
479
+ }
480
+ this.DEBUG &&
481
+ this._debug(`Block accesses mismatch address=${address} type=${type} ${extraMeta} chunkKey=${chunkKey}`);
482
+ this.DEBUG && this._debug(`expected=${canonicalValue}`);
483
+ this.DEBUG && this._debug(`computed=${computedValue}`);
484
+ postFailures++;
485
+ }
486
+ }
487
+ for (const canChunkKey of Object.keys(this._postState)) {
488
+ if (accessedChunks.get(canChunkKey) === undefined) {
489
+ this.DEBUG && this._debug(`Missing chunk access for canChunkKey=${canChunkKey}`);
490
+ postFailures++;
491
+ }
492
+ }
493
+ const verifyPassed = postFailures === 0;
494
+ this.DEBUG &&
495
+ this._debug(`verifyBinaryTreePostState verifyPassed=${verifyPassed} postFailures=${postFailures}`);
496
+ return verifyPassed;
497
+ }
498
+ getStateRoot() {
499
+ return Promise.resolve(this._tree.root());
500
+ }
501
+ setStateRoot(stateRoot, clearCache) {
502
+ this._tree.root(stateRoot);
503
+ clearCache === true && this.clearCaches();
504
+ return Promise.resolve();
505
+ }
506
+ hasStateRoot(root) {
507
+ return this._tree.checkRoot(root);
508
+ }
509
+ dumpStorage(_address) {
510
+ throw EthereumJSErrorWithoutCode('Method not implemented.');
511
+ }
512
+ dumpStorageRange(_address, _startKey, _limit) {
513
+ throw EthereumJSErrorWithoutCode('Method not implemented.');
514
+ }
515
+ clearCaches() {
516
+ this._caches?.clear();
517
+ }
518
+ shallowCopy(_downlevelCaches) {
519
+ throw EthereumJSErrorWithoutCode('Method not implemented.');
520
+ }
521
+ async checkChunkWitnessPresent(_address, _codeOffset) {
522
+ throw EthereumJSErrorWithoutCode('Method not implemented.');
523
+ }
524
+ async generateCanonicalGenesis(genesisState) {
525
+ await this._tree.createRootNode();
526
+ await this.checkpoint();
527
+ for (const addressStr of Object.keys(genesisState)) {
528
+ const addrState = genesisState[addressStr];
529
+ let nonce;
530
+ let balance;
531
+ let code;
532
+ let storage = [];
533
+ if (Array.isArray(addrState)) {
534
+ ;
535
+ [balance, code, storage, nonce] = addrState;
536
+ }
537
+ else {
538
+ balance = hexToBigInt(addrState);
539
+ nonce = '0x1';
540
+ code = '0x';
541
+ }
542
+ const address = createAddressFromString(addressStr);
543
+ await this.putAccount(address, new Account());
544
+ const codeBuf = hexToBytes(code ?? '0x');
545
+ const codeHash = this.keccakFunction(codeBuf);
546
+ // Set contract storage
547
+ if (storage !== undefined) {
548
+ for (const [storageKey, valHex] of storage) {
549
+ const val = hexToBytes(valHex);
550
+ if (['0x', '0x00'].includes(bytesToHex(val))) {
551
+ continue;
552
+ }
553
+ const key = setLengthLeft(hexToBytes(storageKey), 32);
554
+ await this.putStorage(address, key, val);
555
+ }
556
+ }
557
+ // Put contract code
558
+ await this.putCode(address, codeBuf);
559
+ // Put account data
560
+ const account = createPartialAccount({
561
+ nonce,
562
+ balance,
563
+ codeHash,
564
+ codeSize: codeBuf.byteLength,
565
+ });
566
+ await this.putAccount(address, account);
567
+ }
568
+ await this.commit();
569
+ await this.flush();
570
+ }
571
+ }
572
+ //# sourceMappingURL=statefulBinaryTreeStateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statefulBinaryTreeStateManager.js","sourceRoot":"","sources":["../../src/statefulBinaryTreeStateManager.ts"],"names":[],"mappings":"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"}