ethereum-execution 2.18.0rc6.dev2__py3-none-any.whl

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 (816) hide show
  1. ethereum/__init__.py +30 -0
  2. ethereum/assets/blocks/block_1.json +22 -0
  3. ethereum/assets/blocks/block_1234567.json +22 -0
  4. ethereum/assets/blocks/block_12964999.json +2720 -0
  5. ethereum/assets/cache_sizes_2048_epochs.json +329 -0
  6. ethereum/assets/dataset_sizes_2048_epochs.json +412 -0
  7. ethereum/assets/mainnet.json +26711 -0
  8. ethereum/crypto/__init__.py +3 -0
  9. ethereum/crypto/blake2.py +265 -0
  10. ethereum/crypto/elliptic_curve.py +170 -0
  11. ethereum/crypto/hash.py +56 -0
  12. ethereum/crypto/kzg.py +176 -0
  13. ethereum/ethash.py +426 -0
  14. ethereum/exceptions.py +75 -0
  15. ethereum/fork_criteria.py +205 -0
  16. ethereum/forks/arrow_glacier/__init__.py +33 -0
  17. ethereum/forks/arrow_glacier/blocks.py +326 -0
  18. ethereum/forks/arrow_glacier/bloom.py +87 -0
  19. ethereum/forks/arrow_glacier/exceptions.py +58 -0
  20. ethereum/forks/arrow_glacier/fork.py +954 -0
  21. ethereum/forks/arrow_glacier/fork_types.py +62 -0
  22. ethereum/forks/arrow_glacier/state.py +644 -0
  23. ethereum/forks/arrow_glacier/transactions.py +573 -0
  24. ethereum/forks/arrow_glacier/trie.py +498 -0
  25. ethereum/forks/arrow_glacier/utils/__init__.py +3 -0
  26. ethereum/forks/arrow_glacier/utils/address.py +94 -0
  27. ethereum/forks/arrow_glacier/utils/hexadecimal.py +55 -0
  28. ethereum/forks/arrow_glacier/utils/message.py +90 -0
  29. ethereum/forks/arrow_glacier/vm/__init__.py +195 -0
  30. ethereum/forks/arrow_glacier/vm/exceptions.py +131 -0
  31. ethereum/forks/arrow_glacier/vm/gas.py +245 -0
  32. ethereum/forks/arrow_glacier/vm/instructions/__init__.py +353 -0
  33. ethereum/forks/arrow_glacier/vm/instructions/arithmetic.py +373 -0
  34. ethereum/forks/arrow_glacier/vm/instructions/bitwise.py +245 -0
  35. ethereum/forks/arrow_glacier/vm/instructions/block.py +212 -0
  36. ethereum/forks/arrow_glacier/vm/instructions/comparison.py +177 -0
  37. ethereum/forks/arrow_glacier/vm/instructions/control_flow.py +171 -0
  38. ethereum/forks/arrow_glacier/vm/instructions/environment.py +544 -0
  39. ethereum/forks/arrow_glacier/vm/instructions/keccak.py +63 -0
  40. ethereum/forks/arrow_glacier/vm/instructions/log.py +88 -0
  41. ethereum/forks/arrow_glacier/vm/instructions/memory.py +141 -0
  42. ethereum/forks/arrow_glacier/vm/instructions/stack.py +204 -0
  43. ethereum/forks/arrow_glacier/vm/instructions/storage.py +126 -0
  44. ethereum/forks/arrow_glacier/vm/instructions/system.py +694 -0
  45. ethereum/forks/arrow_glacier/vm/interpreter.py +312 -0
  46. ethereum/forks/arrow_glacier/vm/memory.py +84 -0
  47. ethereum/forks/arrow_glacier/vm/precompiled_contracts/__init__.py +37 -0
  48. ethereum/forks/arrow_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
  49. ethereum/forks/arrow_glacier/vm/precompiled_contracts/blake2f.py +42 -0
  50. ethereum/forks/arrow_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
  51. ethereum/forks/arrow_glacier/vm/precompiled_contracts/identity.py +39 -0
  52. ethereum/forks/arrow_glacier/vm/precompiled_contracts/mapping.py +46 -0
  53. ethereum/forks/arrow_glacier/vm/precompiled_contracts/modexp.py +166 -0
  54. ethereum/forks/arrow_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
  55. ethereum/forks/arrow_glacier/vm/precompiled_contracts/sha256.py +41 -0
  56. ethereum/forks/arrow_glacier/vm/runtime.py +69 -0
  57. ethereum/forks/arrow_glacier/vm/stack.py +58 -0
  58. ethereum/forks/berlin/__init__.py +43 -0
  59. ethereum/forks/berlin/blocks.py +297 -0
  60. ethereum/forks/berlin/bloom.py +87 -0
  61. ethereum/forks/berlin/exceptions.py +24 -0
  62. ethereum/forks/berlin/fork.py +839 -0
  63. ethereum/forks/berlin/fork_types.py +62 -0
  64. ethereum/forks/berlin/state.py +644 -0
  65. ethereum/forks/berlin/transactions.py +456 -0
  66. ethereum/forks/berlin/trie.py +498 -0
  67. ethereum/forks/berlin/utils/__init__.py +3 -0
  68. ethereum/forks/berlin/utils/address.py +94 -0
  69. ethereum/forks/berlin/utils/hexadecimal.py +55 -0
  70. ethereum/forks/berlin/utils/message.py +90 -0
  71. ethereum/forks/berlin/vm/__init__.py +194 -0
  72. ethereum/forks/berlin/vm/exceptions.py +123 -0
  73. ethereum/forks/berlin/vm/gas.py +246 -0
  74. ethereum/forks/berlin/vm/instructions/__init__.py +351 -0
  75. ethereum/forks/berlin/vm/instructions/arithmetic.py +373 -0
  76. ethereum/forks/berlin/vm/instructions/bitwise.py +245 -0
  77. ethereum/forks/berlin/vm/instructions/block.py +212 -0
  78. ethereum/forks/berlin/vm/instructions/comparison.py +177 -0
  79. ethereum/forks/berlin/vm/instructions/control_flow.py +171 -0
  80. ethereum/forks/berlin/vm/instructions/environment.py +521 -0
  81. ethereum/forks/berlin/vm/instructions/keccak.py +63 -0
  82. ethereum/forks/berlin/vm/instructions/log.py +88 -0
  83. ethereum/forks/berlin/vm/instructions/memory.py +141 -0
  84. ethereum/forks/berlin/vm/instructions/stack.py +204 -0
  85. ethereum/forks/berlin/vm/instructions/storage.py +126 -0
  86. ethereum/forks/berlin/vm/instructions/system.py +706 -0
  87. ethereum/forks/berlin/vm/interpreter.py +308 -0
  88. ethereum/forks/berlin/vm/memory.py +84 -0
  89. ethereum/forks/berlin/vm/precompiled_contracts/__init__.py +37 -0
  90. ethereum/forks/berlin/vm/precompiled_contracts/alt_bn128.py +230 -0
  91. ethereum/forks/berlin/vm/precompiled_contracts/blake2f.py +42 -0
  92. ethereum/forks/berlin/vm/precompiled_contracts/ecrecover.py +64 -0
  93. ethereum/forks/berlin/vm/precompiled_contracts/identity.py +39 -0
  94. ethereum/forks/berlin/vm/precompiled_contracts/mapping.py +46 -0
  95. ethereum/forks/berlin/vm/precompiled_contracts/modexp.py +166 -0
  96. ethereum/forks/berlin/vm/precompiled_contracts/ripemd160.py +44 -0
  97. ethereum/forks/berlin/vm/precompiled_contracts/sha256.py +41 -0
  98. ethereum/forks/berlin/vm/runtime.py +69 -0
  99. ethereum/forks/berlin/vm/stack.py +58 -0
  100. ethereum/forks/byzantium/__init__.py +50 -0
  101. ethereum/forks/byzantium/blocks.py +265 -0
  102. ethereum/forks/byzantium/bloom.py +87 -0
  103. ethereum/forks/byzantium/fork.py +816 -0
  104. ethereum/forks/byzantium/fork_types.py +61 -0
  105. ethereum/forks/byzantium/state.py +583 -0
  106. ethereum/forks/byzantium/transactions.py +261 -0
  107. ethereum/forks/byzantium/trie.py +498 -0
  108. ethereum/forks/byzantium/utils/__init__.py +3 -0
  109. ethereum/forks/byzantium/utils/address.py +63 -0
  110. ethereum/forks/byzantium/utils/hexadecimal.py +55 -0
  111. ethereum/forks/byzantium/utils/message.py +80 -0
  112. ethereum/forks/byzantium/vm/__init__.py +186 -0
  113. ethereum/forks/byzantium/vm/exceptions.py +123 -0
  114. ethereum/forks/byzantium/vm/gas.py +245 -0
  115. ethereum/forks/byzantium/vm/instructions/__init__.py +337 -0
  116. ethereum/forks/byzantium/vm/instructions/arithmetic.py +373 -0
  117. ethereum/forks/byzantium/vm/instructions/bitwise.py +153 -0
  118. ethereum/forks/byzantium/vm/instructions/block.py +189 -0
  119. ethereum/forks/byzantium/vm/instructions/comparison.py +177 -0
  120. ethereum/forks/byzantium/vm/instructions/control_flow.py +171 -0
  121. ethereum/forks/byzantium/vm/instructions/environment.py +436 -0
  122. ethereum/forks/byzantium/vm/instructions/keccak.py +63 -0
  123. ethereum/forks/byzantium/vm/instructions/log.py +88 -0
  124. ethereum/forks/byzantium/vm/instructions/memory.py +141 -0
  125. ethereum/forks/byzantium/vm/instructions/stack.py +204 -0
  126. ethereum/forks/byzantium/vm/instructions/storage.py +88 -0
  127. ethereum/forks/byzantium/vm/instructions/system.py +601 -0
  128. ethereum/forks/byzantium/vm/interpreter.py +299 -0
  129. ethereum/forks/byzantium/vm/memory.py +84 -0
  130. ethereum/forks/byzantium/vm/precompiled_contracts/__init__.py +36 -0
  131. ethereum/forks/byzantium/vm/precompiled_contracts/alt_bn128.py +230 -0
  132. ethereum/forks/byzantium/vm/precompiled_contracts/ecrecover.py +64 -0
  133. ethereum/forks/byzantium/vm/precompiled_contracts/identity.py +39 -0
  134. ethereum/forks/byzantium/vm/precompiled_contracts/mapping.py +43 -0
  135. ethereum/forks/byzantium/vm/precompiled_contracts/modexp.py +168 -0
  136. ethereum/forks/byzantium/vm/precompiled_contracts/ripemd160.py +44 -0
  137. ethereum/forks/byzantium/vm/precompiled_contracts/sha256.py +41 -0
  138. ethereum/forks/byzantium/vm/runtime.py +69 -0
  139. ethereum/forks/byzantium/vm/stack.py +58 -0
  140. ethereum/forks/cancun/__init__.py +49 -0
  141. ethereum/forks/cancun/blocks.py +389 -0
  142. ethereum/forks/cancun/bloom.py +87 -0
  143. ethereum/forks/cancun/exceptions.py +109 -0
  144. ethereum/forks/cancun/fork.py +881 -0
  145. ethereum/forks/cancun/fork_types.py +63 -0
  146. ethereum/forks/cancun/state.py +667 -0
  147. ethereum/forks/cancun/transactions.py +721 -0
  148. ethereum/forks/cancun/trie.py +508 -0
  149. ethereum/forks/cancun/utils/__init__.py +3 -0
  150. ethereum/forks/cancun/utils/address.py +94 -0
  151. ethereum/forks/cancun/utils/hexadecimal.py +55 -0
  152. ethereum/forks/cancun/utils/message.py +90 -0
  153. ethereum/forks/cancun/vm/__init__.py +186 -0
  154. ethereum/forks/cancun/vm/exceptions.py +139 -0
  155. ethereum/forks/cancun/vm/gas.py +372 -0
  156. ethereum/forks/cancun/vm/instructions/__init__.py +365 -0
  157. ethereum/forks/cancun/vm/instructions/arithmetic.py +373 -0
  158. ethereum/forks/cancun/vm/instructions/bitwise.py +245 -0
  159. ethereum/forks/cancun/vm/instructions/block.py +261 -0
  160. ethereum/forks/cancun/vm/instructions/comparison.py +177 -0
  161. ethereum/forks/cancun/vm/instructions/control_flow.py +171 -0
  162. ethereum/forks/cancun/vm/instructions/environment.py +600 -0
  163. ethereum/forks/cancun/vm/instructions/keccak.py +63 -0
  164. ethereum/forks/cancun/vm/instructions/log.py +88 -0
  165. ethereum/forks/cancun/vm/instructions/memory.py +177 -0
  166. ethereum/forks/cancun/vm/instructions/stack.py +208 -0
  167. ethereum/forks/cancun/vm/instructions/storage.py +188 -0
  168. ethereum/forks/cancun/vm/instructions/system.py +708 -0
  169. ethereum/forks/cancun/vm/interpreter.py +302 -0
  170. ethereum/forks/cancun/vm/memory.py +84 -0
  171. ethereum/forks/cancun/vm/precompiled_contracts/__init__.py +39 -0
  172. ethereum/forks/cancun/vm/precompiled_contracts/alt_bn128.py +230 -0
  173. ethereum/forks/cancun/vm/precompiled_contracts/blake2f.py +42 -0
  174. ethereum/forks/cancun/vm/precompiled_contracts/ecrecover.py +64 -0
  175. ethereum/forks/cancun/vm/precompiled_contracts/identity.py +39 -0
  176. ethereum/forks/cancun/vm/precompiled_contracts/mapping.py +49 -0
  177. ethereum/forks/cancun/vm/precompiled_contracts/modexp.py +166 -0
  178. ethereum/forks/cancun/vm/precompiled_contracts/point_evaluation.py +72 -0
  179. ethereum/forks/cancun/vm/precompiled_contracts/ripemd160.py +44 -0
  180. ethereum/forks/cancun/vm/precompiled_contracts/sha256.py +41 -0
  181. ethereum/forks/cancun/vm/runtime.py +69 -0
  182. ethereum/forks/cancun/vm/stack.py +58 -0
  183. ethereum/forks/constantinople/__init__.py +51 -0
  184. ethereum/forks/constantinople/blocks.py +265 -0
  185. ethereum/forks/constantinople/bloom.py +87 -0
  186. ethereum/forks/constantinople/fork.py +816 -0
  187. ethereum/forks/constantinople/fork_types.py +62 -0
  188. ethereum/forks/constantinople/state.py +583 -0
  189. ethereum/forks/constantinople/transactions.py +261 -0
  190. ethereum/forks/constantinople/trie.py +498 -0
  191. ethereum/forks/constantinople/utils/__init__.py +3 -0
  192. ethereum/forks/constantinople/utils/address.py +93 -0
  193. ethereum/forks/constantinople/utils/hexadecimal.py +55 -0
  194. ethereum/forks/constantinople/utils/message.py +80 -0
  195. ethereum/forks/constantinople/vm/__init__.py +186 -0
  196. ethereum/forks/constantinople/vm/exceptions.py +123 -0
  197. ethereum/forks/constantinople/vm/gas.py +246 -0
  198. ethereum/forks/constantinople/vm/instructions/__init__.py +347 -0
  199. ethereum/forks/constantinople/vm/instructions/arithmetic.py +373 -0
  200. ethereum/forks/constantinople/vm/instructions/bitwise.py +245 -0
  201. ethereum/forks/constantinople/vm/instructions/block.py +189 -0
  202. ethereum/forks/constantinople/vm/instructions/comparison.py +177 -0
  203. ethereum/forks/constantinople/vm/instructions/control_flow.py +171 -0
  204. ethereum/forks/constantinople/vm/instructions/environment.py +470 -0
  205. ethereum/forks/constantinople/vm/instructions/keccak.py +63 -0
  206. ethereum/forks/constantinople/vm/instructions/log.py +88 -0
  207. ethereum/forks/constantinople/vm/instructions/memory.py +141 -0
  208. ethereum/forks/constantinople/vm/instructions/stack.py +204 -0
  209. ethereum/forks/constantinople/vm/instructions/storage.py +88 -0
  210. ethereum/forks/constantinople/vm/instructions/system.py +673 -0
  211. ethereum/forks/constantinople/vm/interpreter.py +300 -0
  212. ethereum/forks/constantinople/vm/memory.py +84 -0
  213. ethereum/forks/constantinople/vm/precompiled_contracts/__init__.py +36 -0
  214. ethereum/forks/constantinople/vm/precompiled_contracts/alt_bn128.py +230 -0
  215. ethereum/forks/constantinople/vm/precompiled_contracts/ecrecover.py +64 -0
  216. ethereum/forks/constantinople/vm/precompiled_contracts/identity.py +39 -0
  217. ethereum/forks/constantinople/vm/precompiled_contracts/mapping.py +43 -0
  218. ethereum/forks/constantinople/vm/precompiled_contracts/modexp.py +168 -0
  219. ethereum/forks/constantinople/vm/precompiled_contracts/ripemd160.py +44 -0
  220. ethereum/forks/constantinople/vm/precompiled_contracts/sha256.py +41 -0
  221. ethereum/forks/constantinople/vm/runtime.py +69 -0
  222. ethereum/forks/constantinople/vm/stack.py +58 -0
  223. ethereum/forks/dao_fork/__init__.py +29 -0
  224. ethereum/forks/dao_fork/blocks.py +265 -0
  225. ethereum/forks/dao_fork/bloom.py +87 -0
  226. ethereum/forks/dao_fork/dao.py +357 -0
  227. ethereum/forks/dao_fork/fork.py +816 -0
  228. ethereum/forks/dao_fork/fork_types.py +62 -0
  229. ethereum/forks/dao_fork/state.py +515 -0
  230. ethereum/forks/dao_fork/transactions.py +227 -0
  231. ethereum/forks/dao_fork/trie.py +498 -0
  232. ethereum/forks/dao_fork/utils/__init__.py +3 -0
  233. ethereum/forks/dao_fork/utils/address.py +62 -0
  234. ethereum/forks/dao_fork/utils/hexadecimal.py +55 -0
  235. ethereum/forks/dao_fork/utils/message.py +78 -0
  236. ethereum/forks/dao_fork/vm/__init__.py +163 -0
  237. ethereum/forks/dao_fork/vm/exceptions.py +86 -0
  238. ethereum/forks/dao_fork/vm/gas.py +212 -0
  239. ethereum/forks/dao_fork/vm/instructions/__init__.py +329 -0
  240. ethereum/forks/dao_fork/vm/instructions/arithmetic.py +373 -0
  241. ethereum/forks/dao_fork/vm/instructions/bitwise.py +153 -0
  242. ethereum/forks/dao_fork/vm/instructions/block.py +189 -0
  243. ethereum/forks/dao_fork/vm/instructions/comparison.py +177 -0
  244. ethereum/forks/dao_fork/vm/instructions/control_flow.py +171 -0
  245. ethereum/forks/dao_fork/vm/instructions/environment.py +376 -0
  246. ethereum/forks/dao_fork/vm/instructions/keccak.py +63 -0
  247. ethereum/forks/dao_fork/vm/instructions/log.py +85 -0
  248. ethereum/forks/dao_fork/vm/instructions/memory.py +141 -0
  249. ethereum/forks/dao_fork/vm/instructions/stack.py +204 -0
  250. ethereum/forks/dao_fork/vm/instructions/storage.py +87 -0
  251. ethereum/forks/dao_fork/vm/instructions/system.py +457 -0
  252. ethereum/forks/dao_fork/vm/interpreter.py +274 -0
  253. ethereum/forks/dao_fork/vm/memory.py +84 -0
  254. ethereum/forks/dao_fork/vm/precompiled_contracts/__init__.py +27 -0
  255. ethereum/forks/dao_fork/vm/precompiled_contracts/ecrecover.py +64 -0
  256. ethereum/forks/dao_fork/vm/precompiled_contracts/identity.py +39 -0
  257. ethereum/forks/dao_fork/vm/precompiled_contracts/mapping.py +33 -0
  258. ethereum/forks/dao_fork/vm/precompiled_contracts/ripemd160.py +44 -0
  259. ethereum/forks/dao_fork/vm/precompiled_contracts/sha256.py +41 -0
  260. ethereum/forks/dao_fork/vm/runtime.py +69 -0
  261. ethereum/forks/dao_fork/vm/stack.py +58 -0
  262. ethereum/forks/frontier/__init__.py +7 -0
  263. ethereum/forks/frontier/blocks.py +265 -0
  264. ethereum/forks/frontier/bloom.py +87 -0
  265. ethereum/forks/frontier/fork.py +789 -0
  266. ethereum/forks/frontier/fork_types.py +62 -0
  267. ethereum/forks/frontier/state.py +515 -0
  268. ethereum/forks/frontier/transactions.py +216 -0
  269. ethereum/forks/frontier/trie.py +499 -0
  270. ethereum/forks/frontier/utils/__init__.py +3 -0
  271. ethereum/forks/frontier/utils/address.py +62 -0
  272. ethereum/forks/frontier/utils/hexadecimal.py +55 -0
  273. ethereum/forks/frontier/utils/message.py +77 -0
  274. ethereum/forks/frontier/vm/__init__.py +162 -0
  275. ethereum/forks/frontier/vm/exceptions.py +86 -0
  276. ethereum/forks/frontier/vm/gas.py +212 -0
  277. ethereum/forks/frontier/vm/instructions/__init__.py +327 -0
  278. ethereum/forks/frontier/vm/instructions/arithmetic.py +373 -0
  279. ethereum/forks/frontier/vm/instructions/bitwise.py +153 -0
  280. ethereum/forks/frontier/vm/instructions/block.py +189 -0
  281. ethereum/forks/frontier/vm/instructions/comparison.py +177 -0
  282. ethereum/forks/frontier/vm/instructions/control_flow.py +171 -0
  283. ethereum/forks/frontier/vm/instructions/environment.py +376 -0
  284. ethereum/forks/frontier/vm/instructions/keccak.py +63 -0
  285. ethereum/forks/frontier/vm/instructions/log.py +85 -0
  286. ethereum/forks/frontier/vm/instructions/memory.py +141 -0
  287. ethereum/forks/frontier/vm/instructions/stack.py +204 -0
  288. ethereum/forks/frontier/vm/instructions/storage.py +87 -0
  289. ethereum/forks/frontier/vm/instructions/system.py +403 -0
  290. ethereum/forks/frontier/vm/interpreter.py +272 -0
  291. ethereum/forks/frontier/vm/memory.py +84 -0
  292. ethereum/forks/frontier/vm/precompiled_contracts/__init__.py +27 -0
  293. ethereum/forks/frontier/vm/precompiled_contracts/ecrecover.py +64 -0
  294. ethereum/forks/frontier/vm/precompiled_contracts/identity.py +39 -0
  295. ethereum/forks/frontier/vm/precompiled_contracts/mapping.py +33 -0
  296. ethereum/forks/frontier/vm/precompiled_contracts/ripemd160.py +44 -0
  297. ethereum/forks/frontier/vm/precompiled_contracts/sha256.py +41 -0
  298. ethereum/forks/frontier/vm/runtime.py +69 -0
  299. ethereum/forks/frontier/vm/stack.py +58 -0
  300. ethereum/forks/gray_glacier/__init__.py +34 -0
  301. ethereum/forks/gray_glacier/blocks.py +326 -0
  302. ethereum/forks/gray_glacier/bloom.py +87 -0
  303. ethereum/forks/gray_glacier/exceptions.py +58 -0
  304. ethereum/forks/gray_glacier/fork.py +954 -0
  305. ethereum/forks/gray_glacier/fork_types.py +62 -0
  306. ethereum/forks/gray_glacier/state.py +644 -0
  307. ethereum/forks/gray_glacier/transactions.py +573 -0
  308. ethereum/forks/gray_glacier/trie.py +498 -0
  309. ethereum/forks/gray_glacier/utils/__init__.py +3 -0
  310. ethereum/forks/gray_glacier/utils/address.py +94 -0
  311. ethereum/forks/gray_glacier/utils/hexadecimal.py +55 -0
  312. ethereum/forks/gray_glacier/utils/message.py +90 -0
  313. ethereum/forks/gray_glacier/vm/__init__.py +195 -0
  314. ethereum/forks/gray_glacier/vm/exceptions.py +131 -0
  315. ethereum/forks/gray_glacier/vm/gas.py +245 -0
  316. ethereum/forks/gray_glacier/vm/instructions/__init__.py +353 -0
  317. ethereum/forks/gray_glacier/vm/instructions/arithmetic.py +373 -0
  318. ethereum/forks/gray_glacier/vm/instructions/bitwise.py +245 -0
  319. ethereum/forks/gray_glacier/vm/instructions/block.py +212 -0
  320. ethereum/forks/gray_glacier/vm/instructions/comparison.py +177 -0
  321. ethereum/forks/gray_glacier/vm/instructions/control_flow.py +171 -0
  322. ethereum/forks/gray_glacier/vm/instructions/environment.py +544 -0
  323. ethereum/forks/gray_glacier/vm/instructions/keccak.py +63 -0
  324. ethereum/forks/gray_glacier/vm/instructions/log.py +88 -0
  325. ethereum/forks/gray_glacier/vm/instructions/memory.py +141 -0
  326. ethereum/forks/gray_glacier/vm/instructions/stack.py +204 -0
  327. ethereum/forks/gray_glacier/vm/instructions/storage.py +126 -0
  328. ethereum/forks/gray_glacier/vm/instructions/system.py +694 -0
  329. ethereum/forks/gray_glacier/vm/interpreter.py +312 -0
  330. ethereum/forks/gray_glacier/vm/memory.py +84 -0
  331. ethereum/forks/gray_glacier/vm/precompiled_contracts/__init__.py +37 -0
  332. ethereum/forks/gray_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
  333. ethereum/forks/gray_glacier/vm/precompiled_contracts/blake2f.py +42 -0
  334. ethereum/forks/gray_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
  335. ethereum/forks/gray_glacier/vm/precompiled_contracts/identity.py +39 -0
  336. ethereum/forks/gray_glacier/vm/precompiled_contracts/mapping.py +46 -0
  337. ethereum/forks/gray_glacier/vm/precompiled_contracts/modexp.py +166 -0
  338. ethereum/forks/gray_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
  339. ethereum/forks/gray_glacier/vm/precompiled_contracts/sha256.py +41 -0
  340. ethereum/forks/gray_glacier/vm/runtime.py +69 -0
  341. ethereum/forks/gray_glacier/vm/stack.py +58 -0
  342. ethereum/forks/homestead/__init__.py +34 -0
  343. ethereum/forks/homestead/blocks.py +265 -0
  344. ethereum/forks/homestead/bloom.py +87 -0
  345. ethereum/forks/homestead/fork.py +798 -0
  346. ethereum/forks/homestead/fork_types.py +62 -0
  347. ethereum/forks/homestead/state.py +515 -0
  348. ethereum/forks/homestead/transactions.py +227 -0
  349. ethereum/forks/homestead/trie.py +498 -0
  350. ethereum/forks/homestead/utils/__init__.py +3 -0
  351. ethereum/forks/homestead/utils/address.py +62 -0
  352. ethereum/forks/homestead/utils/hexadecimal.py +55 -0
  353. ethereum/forks/homestead/utils/message.py +78 -0
  354. ethereum/forks/homestead/vm/__init__.py +163 -0
  355. ethereum/forks/homestead/vm/exceptions.py +86 -0
  356. ethereum/forks/homestead/vm/gas.py +212 -0
  357. ethereum/forks/homestead/vm/instructions/__init__.py +329 -0
  358. ethereum/forks/homestead/vm/instructions/arithmetic.py +373 -0
  359. ethereum/forks/homestead/vm/instructions/bitwise.py +153 -0
  360. ethereum/forks/homestead/vm/instructions/block.py +189 -0
  361. ethereum/forks/homestead/vm/instructions/comparison.py +177 -0
  362. ethereum/forks/homestead/vm/instructions/control_flow.py +171 -0
  363. ethereum/forks/homestead/vm/instructions/environment.py +376 -0
  364. ethereum/forks/homestead/vm/instructions/keccak.py +63 -0
  365. ethereum/forks/homestead/vm/instructions/log.py +85 -0
  366. ethereum/forks/homestead/vm/instructions/memory.py +141 -0
  367. ethereum/forks/homestead/vm/instructions/stack.py +204 -0
  368. ethereum/forks/homestead/vm/instructions/storage.py +87 -0
  369. ethereum/forks/homestead/vm/instructions/system.py +457 -0
  370. ethereum/forks/homestead/vm/interpreter.py +274 -0
  371. ethereum/forks/homestead/vm/memory.py +84 -0
  372. ethereum/forks/homestead/vm/precompiled_contracts/__init__.py +27 -0
  373. ethereum/forks/homestead/vm/precompiled_contracts/ecrecover.py +64 -0
  374. ethereum/forks/homestead/vm/precompiled_contracts/identity.py +39 -0
  375. ethereum/forks/homestead/vm/precompiled_contracts/mapping.py +33 -0
  376. ethereum/forks/homestead/vm/precompiled_contracts/ripemd160.py +44 -0
  377. ethereum/forks/homestead/vm/precompiled_contracts/sha256.py +41 -0
  378. ethereum/forks/homestead/vm/runtime.py +69 -0
  379. ethereum/forks/homestead/vm/stack.py +58 -0
  380. ethereum/forks/istanbul/__init__.py +53 -0
  381. ethereum/forks/istanbul/blocks.py +265 -0
  382. ethereum/forks/istanbul/bloom.py +87 -0
  383. ethereum/forks/istanbul/fork.py +816 -0
  384. ethereum/forks/istanbul/fork_types.py +62 -0
  385. ethereum/forks/istanbul/state.py +644 -0
  386. ethereum/forks/istanbul/transactions.py +261 -0
  387. ethereum/forks/istanbul/trie.py +498 -0
  388. ethereum/forks/istanbul/utils/__init__.py +3 -0
  389. ethereum/forks/istanbul/utils/address.py +94 -0
  390. ethereum/forks/istanbul/utils/hexadecimal.py +55 -0
  391. ethereum/forks/istanbul/utils/message.py +80 -0
  392. ethereum/forks/istanbul/vm/__init__.py +186 -0
  393. ethereum/forks/istanbul/vm/exceptions.py +123 -0
  394. ethereum/forks/istanbul/vm/gas.py +248 -0
  395. ethereum/forks/istanbul/vm/instructions/__init__.py +351 -0
  396. ethereum/forks/istanbul/vm/instructions/arithmetic.py +373 -0
  397. ethereum/forks/istanbul/vm/instructions/bitwise.py +245 -0
  398. ethereum/forks/istanbul/vm/instructions/block.py +212 -0
  399. ethereum/forks/istanbul/vm/instructions/comparison.py +177 -0
  400. ethereum/forks/istanbul/vm/instructions/control_flow.py +171 -0
  401. ethereum/forks/istanbul/vm/instructions/environment.py +499 -0
  402. ethereum/forks/istanbul/vm/instructions/keccak.py +63 -0
  403. ethereum/forks/istanbul/vm/instructions/log.py +88 -0
  404. ethereum/forks/istanbul/vm/instructions/memory.py +141 -0
  405. ethereum/forks/istanbul/vm/instructions/stack.py +204 -0
  406. ethereum/forks/istanbul/vm/instructions/storage.py +113 -0
  407. ethereum/forks/istanbul/vm/instructions/system.py +673 -0
  408. ethereum/forks/istanbul/vm/interpreter.py +306 -0
  409. ethereum/forks/istanbul/vm/memory.py +84 -0
  410. ethereum/forks/istanbul/vm/precompiled_contracts/__init__.py +37 -0
  411. ethereum/forks/istanbul/vm/precompiled_contracts/alt_bn128.py +230 -0
  412. ethereum/forks/istanbul/vm/precompiled_contracts/blake2f.py +42 -0
  413. ethereum/forks/istanbul/vm/precompiled_contracts/ecrecover.py +64 -0
  414. ethereum/forks/istanbul/vm/precompiled_contracts/identity.py +39 -0
  415. ethereum/forks/istanbul/vm/precompiled_contracts/mapping.py +46 -0
  416. ethereum/forks/istanbul/vm/precompiled_contracts/modexp.py +168 -0
  417. ethereum/forks/istanbul/vm/precompiled_contracts/ripemd160.py +44 -0
  418. ethereum/forks/istanbul/vm/precompiled_contracts/sha256.py +41 -0
  419. ethereum/forks/istanbul/vm/runtime.py +69 -0
  420. ethereum/forks/istanbul/vm/stack.py +58 -0
  421. ethereum/forks/london/__init__.py +48 -0
  422. ethereum/forks/london/blocks.py +326 -0
  423. ethereum/forks/london/bloom.py +87 -0
  424. ethereum/forks/london/exceptions.py +58 -0
  425. ethereum/forks/london/fork.py +960 -0
  426. ethereum/forks/london/fork_types.py +62 -0
  427. ethereum/forks/london/state.py +644 -0
  428. ethereum/forks/london/transactions.py +573 -0
  429. ethereum/forks/london/trie.py +498 -0
  430. ethereum/forks/london/utils/__init__.py +3 -0
  431. ethereum/forks/london/utils/address.py +94 -0
  432. ethereum/forks/london/utils/hexadecimal.py +55 -0
  433. ethereum/forks/london/utils/message.py +90 -0
  434. ethereum/forks/london/vm/__init__.py +195 -0
  435. ethereum/forks/london/vm/exceptions.py +131 -0
  436. ethereum/forks/london/vm/gas.py +245 -0
  437. ethereum/forks/london/vm/instructions/__init__.py +353 -0
  438. ethereum/forks/london/vm/instructions/arithmetic.py +373 -0
  439. ethereum/forks/london/vm/instructions/bitwise.py +245 -0
  440. ethereum/forks/london/vm/instructions/block.py +212 -0
  441. ethereum/forks/london/vm/instructions/comparison.py +177 -0
  442. ethereum/forks/london/vm/instructions/control_flow.py +171 -0
  443. ethereum/forks/london/vm/instructions/environment.py +544 -0
  444. ethereum/forks/london/vm/instructions/keccak.py +63 -0
  445. ethereum/forks/london/vm/instructions/log.py +88 -0
  446. ethereum/forks/london/vm/instructions/memory.py +141 -0
  447. ethereum/forks/london/vm/instructions/stack.py +204 -0
  448. ethereum/forks/london/vm/instructions/storage.py +126 -0
  449. ethereum/forks/london/vm/instructions/system.py +694 -0
  450. ethereum/forks/london/vm/interpreter.py +312 -0
  451. ethereum/forks/london/vm/memory.py +84 -0
  452. ethereum/forks/london/vm/precompiled_contracts/__init__.py +37 -0
  453. ethereum/forks/london/vm/precompiled_contracts/alt_bn128.py +230 -0
  454. ethereum/forks/london/vm/precompiled_contracts/blake2f.py +42 -0
  455. ethereum/forks/london/vm/precompiled_contracts/ecrecover.py +64 -0
  456. ethereum/forks/london/vm/precompiled_contracts/identity.py +39 -0
  457. ethereum/forks/london/vm/precompiled_contracts/mapping.py +46 -0
  458. ethereum/forks/london/vm/precompiled_contracts/modexp.py +166 -0
  459. ethereum/forks/london/vm/precompiled_contracts/ripemd160.py +44 -0
  460. ethereum/forks/london/vm/precompiled_contracts/sha256.py +41 -0
  461. ethereum/forks/london/vm/runtime.py +69 -0
  462. ethereum/forks/london/vm/stack.py +58 -0
  463. ethereum/forks/muir_glacier/__init__.py +38 -0
  464. ethereum/forks/muir_glacier/blocks.py +265 -0
  465. ethereum/forks/muir_glacier/bloom.py +87 -0
  466. ethereum/forks/muir_glacier/fork.py +818 -0
  467. ethereum/forks/muir_glacier/fork_types.py +62 -0
  468. ethereum/forks/muir_glacier/state.py +644 -0
  469. ethereum/forks/muir_glacier/transactions.py +261 -0
  470. ethereum/forks/muir_glacier/trie.py +498 -0
  471. ethereum/forks/muir_glacier/utils/__init__.py +3 -0
  472. ethereum/forks/muir_glacier/utils/address.py +94 -0
  473. ethereum/forks/muir_glacier/utils/hexadecimal.py +55 -0
  474. ethereum/forks/muir_glacier/utils/message.py +80 -0
  475. ethereum/forks/muir_glacier/vm/__init__.py +186 -0
  476. ethereum/forks/muir_glacier/vm/exceptions.py +123 -0
  477. ethereum/forks/muir_glacier/vm/gas.py +248 -0
  478. ethereum/forks/muir_glacier/vm/instructions/__init__.py +351 -0
  479. ethereum/forks/muir_glacier/vm/instructions/arithmetic.py +373 -0
  480. ethereum/forks/muir_glacier/vm/instructions/bitwise.py +245 -0
  481. ethereum/forks/muir_glacier/vm/instructions/block.py +212 -0
  482. ethereum/forks/muir_glacier/vm/instructions/comparison.py +177 -0
  483. ethereum/forks/muir_glacier/vm/instructions/control_flow.py +171 -0
  484. ethereum/forks/muir_glacier/vm/instructions/environment.py +499 -0
  485. ethereum/forks/muir_glacier/vm/instructions/keccak.py +63 -0
  486. ethereum/forks/muir_glacier/vm/instructions/log.py +88 -0
  487. ethereum/forks/muir_glacier/vm/instructions/memory.py +141 -0
  488. ethereum/forks/muir_glacier/vm/instructions/stack.py +204 -0
  489. ethereum/forks/muir_glacier/vm/instructions/storage.py +113 -0
  490. ethereum/forks/muir_glacier/vm/instructions/system.py +673 -0
  491. ethereum/forks/muir_glacier/vm/interpreter.py +306 -0
  492. ethereum/forks/muir_glacier/vm/memory.py +84 -0
  493. ethereum/forks/muir_glacier/vm/precompiled_contracts/__init__.py +37 -0
  494. ethereum/forks/muir_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
  495. ethereum/forks/muir_glacier/vm/precompiled_contracts/blake2f.py +42 -0
  496. ethereum/forks/muir_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
  497. ethereum/forks/muir_glacier/vm/precompiled_contracts/identity.py +39 -0
  498. ethereum/forks/muir_glacier/vm/precompiled_contracts/mapping.py +46 -0
  499. ethereum/forks/muir_glacier/vm/precompiled_contracts/modexp.py +168 -0
  500. ethereum/forks/muir_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
  501. ethereum/forks/muir_glacier/vm/precompiled_contracts/sha256.py +41 -0
  502. ethereum/forks/muir_glacier/vm/runtime.py +69 -0
  503. ethereum/forks/muir_glacier/vm/stack.py +58 -0
  504. ethereum/forks/osaka/__init__.py +55 -0
  505. ethereum/forks/osaka/blocks.py +405 -0
  506. ethereum/forks/osaka/bloom.py +87 -0
  507. ethereum/forks/osaka/exceptions.py +131 -0
  508. ethereum/forks/osaka/fork.py +1059 -0
  509. ethereum/forks/osaka/fork_types.py +78 -0
  510. ethereum/forks/osaka/requests.py +191 -0
  511. ethereum/forks/osaka/state.py +667 -0
  512. ethereum/forks/osaka/transactions.py +887 -0
  513. ethereum/forks/osaka/trie.py +508 -0
  514. ethereum/forks/osaka/utils/__init__.py +3 -0
  515. ethereum/forks/osaka/utils/address.py +94 -0
  516. ethereum/forks/osaka/utils/hexadecimal.py +55 -0
  517. ethereum/forks/osaka/utils/message.py +90 -0
  518. ethereum/forks/osaka/vm/__init__.py +191 -0
  519. ethereum/forks/osaka/vm/eoa_delegation.py +211 -0
  520. ethereum/forks/osaka/vm/exceptions.py +139 -0
  521. ethereum/forks/osaka/vm/gas.py +396 -0
  522. ethereum/forks/osaka/vm/instructions/__init__.py +367 -0
  523. ethereum/forks/osaka/vm/instructions/arithmetic.py +373 -0
  524. ethereum/forks/osaka/vm/instructions/bitwise.py +274 -0
  525. ethereum/forks/osaka/vm/instructions/block.py +261 -0
  526. ethereum/forks/osaka/vm/instructions/comparison.py +177 -0
  527. ethereum/forks/osaka/vm/instructions/control_flow.py +171 -0
  528. ethereum/forks/osaka/vm/instructions/environment.py +600 -0
  529. ethereum/forks/osaka/vm/instructions/keccak.py +63 -0
  530. ethereum/forks/osaka/vm/instructions/log.py +88 -0
  531. ethereum/forks/osaka/vm/instructions/memory.py +177 -0
  532. ethereum/forks/osaka/vm/instructions/stack.py +208 -0
  533. ethereum/forks/osaka/vm/instructions/storage.py +188 -0
  534. ethereum/forks/osaka/vm/instructions/system.py +751 -0
  535. ethereum/forks/osaka/vm/interpreter.py +324 -0
  536. ethereum/forks/osaka/vm/memory.py +83 -0
  537. ethereum/forks/osaka/vm/precompiled_contracts/__init__.py +55 -0
  538. ethereum/forks/osaka/vm/precompiled_contracts/alt_bn128.py +230 -0
  539. ethereum/forks/osaka/vm/precompiled_contracts/blake2f.py +42 -0
  540. ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/__init__.py +622 -0
  541. ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +151 -0
  542. ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +153 -0
  543. ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_pairing.py +69 -0
  544. ethereum/forks/osaka/vm/precompiled_contracts/ecrecover.py +64 -0
  545. ethereum/forks/osaka/vm/precompiled_contracts/identity.py +39 -0
  546. ethereum/forks/osaka/vm/precompiled_contracts/mapping.py +77 -0
  547. ethereum/forks/osaka/vm/precompiled_contracts/modexp.py +175 -0
  548. ethereum/forks/osaka/vm/precompiled_contracts/p256verify.py +89 -0
  549. ethereum/forks/osaka/vm/precompiled_contracts/point_evaluation.py +72 -0
  550. ethereum/forks/osaka/vm/precompiled_contracts/ripemd160.py +44 -0
  551. ethereum/forks/osaka/vm/precompiled_contracts/sha256.py +41 -0
  552. ethereum/forks/osaka/vm/runtime.py +69 -0
  553. ethereum/forks/osaka/vm/stack.py +58 -0
  554. ethereum/forks/paris/__init__.py +43 -0
  555. ethereum/forks/paris/blocks.py +312 -0
  556. ethereum/forks/paris/bloom.py +87 -0
  557. ethereum/forks/paris/exceptions.py +58 -0
  558. ethereum/forks/paris/fork.py +651 -0
  559. ethereum/forks/paris/fork_types.py +62 -0
  560. ethereum/forks/paris/state.py +571 -0
  561. ethereum/forks/paris/transactions.py +573 -0
  562. ethereum/forks/paris/trie.py +498 -0
  563. ethereum/forks/paris/utils/__init__.py +3 -0
  564. ethereum/forks/paris/utils/address.py +94 -0
  565. ethereum/forks/paris/utils/hexadecimal.py +55 -0
  566. ethereum/forks/paris/utils/message.py +90 -0
  567. ethereum/forks/paris/vm/__init__.py +174 -0
  568. ethereum/forks/paris/vm/exceptions.py +131 -0
  569. ethereum/forks/paris/vm/gas.py +245 -0
  570. ethereum/forks/paris/vm/instructions/__init__.py +353 -0
  571. ethereum/forks/paris/vm/instructions/arithmetic.py +373 -0
  572. ethereum/forks/paris/vm/instructions/bitwise.py +245 -0
  573. ethereum/forks/paris/vm/instructions/block.py +261 -0
  574. ethereum/forks/paris/vm/instructions/comparison.py +177 -0
  575. ethereum/forks/paris/vm/instructions/control_flow.py +171 -0
  576. ethereum/forks/paris/vm/instructions/environment.py +544 -0
  577. ethereum/forks/paris/vm/instructions/keccak.py +63 -0
  578. ethereum/forks/paris/vm/instructions/log.py +88 -0
  579. ethereum/forks/paris/vm/instructions/memory.py +141 -0
  580. ethereum/forks/paris/vm/instructions/stack.py +204 -0
  581. ethereum/forks/paris/vm/instructions/storage.py +126 -0
  582. ethereum/forks/paris/vm/instructions/system.py +689 -0
  583. ethereum/forks/paris/vm/interpreter.py +298 -0
  584. ethereum/forks/paris/vm/memory.py +84 -0
  585. ethereum/forks/paris/vm/precompiled_contracts/__init__.py +37 -0
  586. ethereum/forks/paris/vm/precompiled_contracts/alt_bn128.py +230 -0
  587. ethereum/forks/paris/vm/precompiled_contracts/blake2f.py +42 -0
  588. ethereum/forks/paris/vm/precompiled_contracts/ecrecover.py +64 -0
  589. ethereum/forks/paris/vm/precompiled_contracts/identity.py +39 -0
  590. ethereum/forks/paris/vm/precompiled_contracts/mapping.py +46 -0
  591. ethereum/forks/paris/vm/precompiled_contracts/modexp.py +166 -0
  592. ethereum/forks/paris/vm/precompiled_contracts/ripemd160.py +44 -0
  593. ethereum/forks/paris/vm/precompiled_contracts/sha256.py +41 -0
  594. ethereum/forks/paris/vm/runtime.py +69 -0
  595. ethereum/forks/paris/vm/stack.py +58 -0
  596. ethereum/forks/prague/__init__.py +54 -0
  597. ethereum/forks/prague/blocks.py +405 -0
  598. ethereum/forks/prague/bloom.py +87 -0
  599. ethereum/forks/prague/exceptions.py +115 -0
  600. ethereum/forks/prague/fork.py +1044 -0
  601. ethereum/forks/prague/fork_types.py +78 -0
  602. ethereum/forks/prague/requests.py +191 -0
  603. ethereum/forks/prague/state.py +667 -0
  604. ethereum/forks/prague/transactions.py +879 -0
  605. ethereum/forks/prague/trie.py +508 -0
  606. ethereum/forks/prague/utils/__init__.py +3 -0
  607. ethereum/forks/prague/utils/address.py +94 -0
  608. ethereum/forks/prague/utils/hexadecimal.py +55 -0
  609. ethereum/forks/prague/utils/message.py +90 -0
  610. ethereum/forks/prague/vm/__init__.py +191 -0
  611. ethereum/forks/prague/vm/eoa_delegation.py +211 -0
  612. ethereum/forks/prague/vm/exceptions.py +139 -0
  613. ethereum/forks/prague/vm/gas.py +379 -0
  614. ethereum/forks/prague/vm/instructions/__init__.py +365 -0
  615. ethereum/forks/prague/vm/instructions/arithmetic.py +373 -0
  616. ethereum/forks/prague/vm/instructions/bitwise.py +245 -0
  617. ethereum/forks/prague/vm/instructions/block.py +261 -0
  618. ethereum/forks/prague/vm/instructions/comparison.py +177 -0
  619. ethereum/forks/prague/vm/instructions/control_flow.py +171 -0
  620. ethereum/forks/prague/vm/instructions/environment.py +600 -0
  621. ethereum/forks/prague/vm/instructions/keccak.py +63 -0
  622. ethereum/forks/prague/vm/instructions/log.py +88 -0
  623. ethereum/forks/prague/vm/instructions/memory.py +177 -0
  624. ethereum/forks/prague/vm/instructions/stack.py +208 -0
  625. ethereum/forks/prague/vm/instructions/storage.py +188 -0
  626. ethereum/forks/prague/vm/instructions/system.py +751 -0
  627. ethereum/forks/prague/vm/interpreter.py +324 -0
  628. ethereum/forks/prague/vm/memory.py +83 -0
  629. ethereum/forks/prague/vm/precompiled_contracts/__init__.py +53 -0
  630. ethereum/forks/prague/vm/precompiled_contracts/alt_bn128.py +230 -0
  631. ethereum/forks/prague/vm/precompiled_contracts/blake2f.py +42 -0
  632. ethereum/forks/prague/vm/precompiled_contracts/bls12_381/__init__.py +622 -0
  633. ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +151 -0
  634. ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +153 -0
  635. ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_pairing.py +69 -0
  636. ethereum/forks/prague/vm/precompiled_contracts/ecrecover.py +64 -0
  637. ethereum/forks/prague/vm/precompiled_contracts/identity.py +39 -0
  638. ethereum/forks/prague/vm/precompiled_contracts/mapping.py +74 -0
  639. ethereum/forks/prague/vm/precompiled_contracts/modexp.py +166 -0
  640. ethereum/forks/prague/vm/precompiled_contracts/point_evaluation.py +72 -0
  641. ethereum/forks/prague/vm/precompiled_contracts/ripemd160.py +44 -0
  642. ethereum/forks/prague/vm/precompiled_contracts/sha256.py +41 -0
  643. ethereum/forks/prague/vm/runtime.py +69 -0
  644. ethereum/forks/prague/vm/stack.py +58 -0
  645. ethereum/forks/shanghai/__init__.py +47 -0
  646. ethereum/forks/shanghai/blocks.py +360 -0
  647. ethereum/forks/shanghai/bloom.py +87 -0
  648. ethereum/forks/shanghai/exceptions.py +64 -0
  649. ethereum/forks/shanghai/fork.py +686 -0
  650. ethereum/forks/shanghai/fork_types.py +62 -0
  651. ethereum/forks/shanghai/state.py +571 -0
  652. ethereum/forks/shanghai/transactions.py +585 -0
  653. ethereum/forks/shanghai/trie.py +508 -0
  654. ethereum/forks/shanghai/utils/__init__.py +3 -0
  655. ethereum/forks/shanghai/utils/address.py +94 -0
  656. ethereum/forks/shanghai/utils/hexadecimal.py +55 -0
  657. ethereum/forks/shanghai/utils/message.py +90 -0
  658. ethereum/forks/shanghai/vm/__init__.py +179 -0
  659. ethereum/forks/shanghai/vm/exceptions.py +131 -0
  660. ethereum/forks/shanghai/vm/gas.py +266 -0
  661. ethereum/forks/shanghai/vm/instructions/__init__.py +355 -0
  662. ethereum/forks/shanghai/vm/instructions/arithmetic.py +373 -0
  663. ethereum/forks/shanghai/vm/instructions/bitwise.py +245 -0
  664. ethereum/forks/shanghai/vm/instructions/block.py +261 -0
  665. ethereum/forks/shanghai/vm/instructions/comparison.py +177 -0
  666. ethereum/forks/shanghai/vm/instructions/control_flow.py +171 -0
  667. ethereum/forks/shanghai/vm/instructions/environment.py +544 -0
  668. ethereum/forks/shanghai/vm/instructions/keccak.py +63 -0
  669. ethereum/forks/shanghai/vm/instructions/log.py +88 -0
  670. ethereum/forks/shanghai/vm/instructions/memory.py +141 -0
  671. ethereum/forks/shanghai/vm/instructions/stack.py +208 -0
  672. ethereum/forks/shanghai/vm/instructions/storage.py +126 -0
  673. ethereum/forks/shanghai/vm/instructions/system.py +709 -0
  674. ethereum/forks/shanghai/vm/interpreter.py +299 -0
  675. ethereum/forks/shanghai/vm/memory.py +84 -0
  676. ethereum/forks/shanghai/vm/precompiled_contracts/__init__.py +37 -0
  677. ethereum/forks/shanghai/vm/precompiled_contracts/alt_bn128.py +230 -0
  678. ethereum/forks/shanghai/vm/precompiled_contracts/blake2f.py +42 -0
  679. ethereum/forks/shanghai/vm/precompiled_contracts/ecrecover.py +64 -0
  680. ethereum/forks/shanghai/vm/precompiled_contracts/identity.py +39 -0
  681. ethereum/forks/shanghai/vm/precompiled_contracts/mapping.py +46 -0
  682. ethereum/forks/shanghai/vm/precompiled_contracts/modexp.py +166 -0
  683. ethereum/forks/shanghai/vm/precompiled_contracts/ripemd160.py +44 -0
  684. ethereum/forks/shanghai/vm/precompiled_contracts/sha256.py +41 -0
  685. ethereum/forks/shanghai/vm/runtime.py +69 -0
  686. ethereum/forks/shanghai/vm/stack.py +58 -0
  687. ethereum/forks/spurious_dragon/__init__.py +38 -0
  688. ethereum/forks/spurious_dragon/blocks.py +265 -0
  689. ethereum/forks/spurious_dragon/bloom.py +87 -0
  690. ethereum/forks/spurious_dragon/fork.py +807 -0
  691. ethereum/forks/spurious_dragon/fork_types.py +62 -0
  692. ethereum/forks/spurious_dragon/state.py +583 -0
  693. ethereum/forks/spurious_dragon/transactions.py +261 -0
  694. ethereum/forks/spurious_dragon/trie.py +498 -0
  695. ethereum/forks/spurious_dragon/utils/__init__.py +3 -0
  696. ethereum/forks/spurious_dragon/utils/address.py +63 -0
  697. ethereum/forks/spurious_dragon/utils/hexadecimal.py +55 -0
  698. ethereum/forks/spurious_dragon/utils/message.py +79 -0
  699. ethereum/forks/spurious_dragon/vm/__init__.py +184 -0
  700. ethereum/forks/spurious_dragon/vm/exceptions.py +86 -0
  701. ethereum/forks/spurious_dragon/vm/gas.py +244 -0
  702. ethereum/forks/spurious_dragon/vm/instructions/__init__.py +329 -0
  703. ethereum/forks/spurious_dragon/vm/instructions/arithmetic.py +373 -0
  704. ethereum/forks/spurious_dragon/vm/instructions/bitwise.py +153 -0
  705. ethereum/forks/spurious_dragon/vm/instructions/block.py +189 -0
  706. ethereum/forks/spurious_dragon/vm/instructions/comparison.py +177 -0
  707. ethereum/forks/spurious_dragon/vm/instructions/control_flow.py +171 -0
  708. ethereum/forks/spurious_dragon/vm/instructions/environment.py +376 -0
  709. ethereum/forks/spurious_dragon/vm/instructions/keccak.py +63 -0
  710. ethereum/forks/spurious_dragon/vm/instructions/log.py +85 -0
  711. ethereum/forks/spurious_dragon/vm/instructions/memory.py +141 -0
  712. ethereum/forks/spurious_dragon/vm/instructions/stack.py +204 -0
  713. ethereum/forks/spurious_dragon/vm/instructions/storage.py +87 -0
  714. ethereum/forks/spurious_dragon/vm/instructions/system.py +491 -0
  715. ethereum/forks/spurious_dragon/vm/interpreter.py +292 -0
  716. ethereum/forks/spurious_dragon/vm/memory.py +84 -0
  717. ethereum/forks/spurious_dragon/vm/precompiled_contracts/__init__.py +27 -0
  718. ethereum/forks/spurious_dragon/vm/precompiled_contracts/ecrecover.py +64 -0
  719. ethereum/forks/spurious_dragon/vm/precompiled_contracts/identity.py +39 -0
  720. ethereum/forks/spurious_dragon/vm/precompiled_contracts/mapping.py +33 -0
  721. ethereum/forks/spurious_dragon/vm/precompiled_contracts/ripemd160.py +44 -0
  722. ethereum/forks/spurious_dragon/vm/precompiled_contracts/sha256.py +41 -0
  723. ethereum/forks/spurious_dragon/vm/runtime.py +69 -0
  724. ethereum/forks/spurious_dragon/vm/stack.py +58 -0
  725. ethereum/forks/tangerine_whistle/__init__.py +32 -0
  726. ethereum/forks/tangerine_whistle/blocks.py +265 -0
  727. ethereum/forks/tangerine_whistle/bloom.py +87 -0
  728. ethereum/forks/tangerine_whistle/fork.py +798 -0
  729. ethereum/forks/tangerine_whistle/fork_types.py +62 -0
  730. ethereum/forks/tangerine_whistle/state.py +515 -0
  731. ethereum/forks/tangerine_whistle/transactions.py +227 -0
  732. ethereum/forks/tangerine_whistle/trie.py +498 -0
  733. ethereum/forks/tangerine_whistle/utils/__init__.py +3 -0
  734. ethereum/forks/tangerine_whistle/utils/address.py +63 -0
  735. ethereum/forks/tangerine_whistle/utils/hexadecimal.py +55 -0
  736. ethereum/forks/tangerine_whistle/utils/message.py +79 -0
  737. ethereum/forks/tangerine_whistle/vm/__init__.py +163 -0
  738. ethereum/forks/tangerine_whistle/vm/exceptions.py +86 -0
  739. ethereum/forks/tangerine_whistle/vm/gas.py +244 -0
  740. ethereum/forks/tangerine_whistle/vm/instructions/__init__.py +329 -0
  741. ethereum/forks/tangerine_whistle/vm/instructions/arithmetic.py +373 -0
  742. ethereum/forks/tangerine_whistle/vm/instructions/bitwise.py +153 -0
  743. ethereum/forks/tangerine_whistle/vm/instructions/block.py +189 -0
  744. ethereum/forks/tangerine_whistle/vm/instructions/comparison.py +177 -0
  745. ethereum/forks/tangerine_whistle/vm/instructions/control_flow.py +171 -0
  746. ethereum/forks/tangerine_whistle/vm/instructions/environment.py +376 -0
  747. ethereum/forks/tangerine_whistle/vm/instructions/keccak.py +63 -0
  748. ethereum/forks/tangerine_whistle/vm/instructions/log.py +85 -0
  749. ethereum/forks/tangerine_whistle/vm/instructions/memory.py +141 -0
  750. ethereum/forks/tangerine_whistle/vm/instructions/stack.py +204 -0
  751. ethereum/forks/tangerine_whistle/vm/instructions/storage.py +87 -0
  752. ethereum/forks/tangerine_whistle/vm/instructions/system.py +480 -0
  753. ethereum/forks/tangerine_whistle/vm/interpreter.py +274 -0
  754. ethereum/forks/tangerine_whistle/vm/memory.py +84 -0
  755. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/__init__.py +27 -0
  756. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/ecrecover.py +64 -0
  757. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/identity.py +39 -0
  758. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/mapping.py +33 -0
  759. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/ripemd160.py +44 -0
  760. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/sha256.py +41 -0
  761. ethereum/forks/tangerine_whistle/vm/runtime.py +69 -0
  762. ethereum/forks/tangerine_whistle/vm/stack.py +58 -0
  763. ethereum/genesis.py +279 -0
  764. ethereum/py.typed +0 -0
  765. ethereum/trace.py +252 -0
  766. ethereum/utils/__init__.py +18 -0
  767. ethereum/utils/byte.py +59 -0
  768. ethereum/utils/hexadecimal.py +221 -0
  769. ethereum/utils/numeric.py +208 -0
  770. ethereum_execution-2.18.0rc6.dev2.dist-info/METADATA +113 -0
  771. ethereum_execution-2.18.0rc6.dev2.dist-info/RECORD +816 -0
  772. ethereum_execution-2.18.0rc6.dev2.dist-info/WHEEL +5 -0
  773. ethereum_execution-2.18.0rc6.dev2.dist-info/entry_points.txt +17 -0
  774. ethereum_execution-2.18.0rc6.dev2.dist-info/licenses/LICENSE.md +35 -0
  775. ethereum_execution-2.18.0rc6.dev2.dist-info/top_level.txt +3 -0
  776. ethereum_optimized/__init__.py +78 -0
  777. ethereum_optimized/fork.py +72 -0
  778. ethereum_optimized/state_db.py +444 -0
  779. ethereum_optimized/utils.py +26 -0
  780. ethereum_spec_tools/__init__.py +6 -0
  781. ethereum_spec_tools/docc.py +1135 -0
  782. ethereum_spec_tools/evm_tools/__init__.py +119 -0
  783. ethereum_spec_tools/evm_tools/__main__.py +7 -0
  784. ethereum_spec_tools/evm_tools/b11r/__init__.py +143 -0
  785. ethereum_spec_tools/evm_tools/b11r/b11r_types.py +173 -0
  786. ethereum_spec_tools/evm_tools/daemon.py +202 -0
  787. ethereum_spec_tools/evm_tools/loaders/__init__.py +3 -0
  788. ethereum_spec_tools/evm_tools/loaders/fixture_loader.py +190 -0
  789. ethereum_spec_tools/evm_tools/loaders/fork_loader.py +320 -0
  790. ethereum_spec_tools/evm_tools/loaders/transaction_loader.py +208 -0
  791. ethereum_spec_tools/evm_tools/statetest/__init__.py +291 -0
  792. ethereum_spec_tools/evm_tools/t8n/__init__.py +402 -0
  793. ethereum_spec_tools/evm_tools/t8n/env.py +320 -0
  794. ethereum_spec_tools/evm_tools/t8n/evm_trace/__init__.py +5 -0
  795. ethereum_spec_tools/evm_tools/t8n/evm_trace/count.py +47 -0
  796. ethereum_spec_tools/evm_tools/t8n/evm_trace/eip3155.py +333 -0
  797. ethereum_spec_tools/evm_tools/t8n/evm_trace/group.py +39 -0
  798. ethereum_spec_tools/evm_tools/t8n/evm_trace/protocols.py +54 -0
  799. ethereum_spec_tools/evm_tools/t8n/t8n_types.py +393 -0
  800. ethereum_spec_tools/evm_tools/utils.py +187 -0
  801. ethereum_spec_tools/forks.py +302 -0
  802. ethereum_spec_tools/lint/__init__.py +195 -0
  803. ethereum_spec_tools/lint/__main__.py +11 -0
  804. ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py +273 -0
  805. ethereum_spec_tools/lint/lints/import_hygiene.py +145 -0
  806. ethereum_spec_tools/lint/lints/patch_hygiene.py +161 -0
  807. ethereum_spec_tools/new_fork/__init__.py +4 -0
  808. ethereum_spec_tools/new_fork/builder.py +430 -0
  809. ethereum_spec_tools/new_fork/cli.py +216 -0
  810. ethereum_spec_tools/new_fork/codemod/__init__.py +3 -0
  811. ethereum_spec_tools/new_fork/codemod/comment.py +79 -0
  812. ethereum_spec_tools/new_fork/codemod/constant.py +141 -0
  813. ethereum_spec_tools/new_fork/codemod/string.py +79 -0
  814. ethereum_spec_tools/patch_tool.py +78 -0
  815. ethereum_spec_tools/py.typed +0 -0
  816. ethereum_spec_tools/sync.py +1016 -0
@@ -0,0 +1,1016 @@
1
+ """
2
+ Ethereum Sync.
3
+
4
+ Using an RPC provider, fetch each block and validate it with the specification.
5
+ """
6
+
7
+ import argparse
8
+ import json
9
+ import logging
10
+ import os
11
+ import pkgutil
12
+ import shutil
13
+ import time
14
+ from queue import Empty, Full, Queue
15
+ from threading import Thread
16
+ from typing import Any, Dict, List, Optional, TypeVar, Union, cast
17
+ from urllib import request
18
+
19
+ from ethereum_rlp import rlp
20
+ from ethereum_types.bytes import Bytes0, Bytes256
21
+ from ethereum_types.numeric import U64, U256, Uint
22
+
23
+ from ethereum import genesis
24
+ from ethereum.utils.hexadecimal import (
25
+ hex_to_bytes,
26
+ hex_to_bytes8,
27
+ hex_to_bytes32,
28
+ hex_to_u64,
29
+ hex_to_u256,
30
+ hex_to_uint,
31
+ )
32
+
33
+ from .forks import Hardfork
34
+
35
+ T = TypeVar("T")
36
+
37
+
38
+ class RpcError(Exception):
39
+ """
40
+ Error message and code returned by the RPC provider.
41
+ """
42
+
43
+ def __init__(self, code: int, message: str) -> None:
44
+ super().__init__(message)
45
+ self.code = code
46
+
47
+
48
+ class ForkTracking:
49
+ """
50
+ Enables subclasses to track the current fork.
51
+ """
52
+
53
+ forks: List[Hardfork]
54
+ block_number: Uint
55
+ active_fork_index: int
56
+
57
+ def __init__(
58
+ self, forks: List[Hardfork], block_number: Uint, block_timestamp: U256
59
+ ):
60
+ self.forks = forks
61
+ self.set_block(block_number, block_timestamp)
62
+
63
+ @property
64
+ def active_fork(self) -> Hardfork:
65
+ """
66
+ Currently executing hard fork.
67
+ """
68
+ return self.forks[self.active_fork_index]
69
+
70
+ @property
71
+ def next_fork(self) -> Optional[Hardfork]:
72
+ """
73
+ Hard fork that follows the currently executing hard fork.
74
+ """
75
+ try:
76
+ return self.forks[self.active_fork_index + 1]
77
+ except IndexError:
78
+ return None
79
+
80
+ def module(self, name: str) -> Any:
81
+ """
82
+ Return a module from the current hard fork.
83
+ """
84
+ return self.active_fork.module(name)
85
+
86
+ def set_block(self, block_number: Uint, block_timestamp: U256) -> None:
87
+ """Set the block number and switch to the correct fork."""
88
+ self.block_number = block_number
89
+ self.active_fork_index = 0
90
+ while self.next_fork is not None and self.next_fork.has_activated(
91
+ block_number, block_timestamp
92
+ ):
93
+ self.active_fork_index += 1
94
+
95
+ def advance_block(self, timestamp: U256) -> bool:
96
+ """Increment the block number, return `True` if the fork changed."""
97
+ self.block_number += Uint(1)
98
+ new_fork = False
99
+ while self.next_fork is not None and self.next_fork.has_activated(
100
+ self.block_number, timestamp
101
+ ):
102
+ self.active_fork_index += 1
103
+ new_fork = True
104
+ return new_fork
105
+
106
+
107
+ class BlockDownloader(ForkTracking):
108
+ """Downloads blocks from the RPC provider."""
109
+
110
+ queue: Queue
111
+ log: logging.Logger
112
+ rpc_url: str
113
+ geth: bool
114
+
115
+ def __init__(
116
+ self,
117
+ forks: List[Hardfork],
118
+ log: logging.Logger,
119
+ rpc_url: str,
120
+ geth: bool,
121
+ first_block: Uint,
122
+ first_block_timestamp: U256,
123
+ ) -> None:
124
+ ForkTracking.__init__(self, forks, first_block, first_block_timestamp)
125
+
126
+ # `first_block_timestamp` is the timestamp for the persisted block,
127
+ # but the downloader starts 256 blocks earlier. Since this might be
128
+ # the previous fork we step 1 fork backwards. In the case that there
129
+ # wasn't a fork in the previous 256 blocks, `advance_block()` will
130
+ # restore the correct fork before any blocks are processed.
131
+ if self.active_fork_index > 0:
132
+ self.active_fork_index -= 1
133
+
134
+ self.queue = Queue(maxsize=512)
135
+ self.log = log
136
+ self.rpc_url = rpc_url
137
+ self.geth = geth
138
+
139
+ Thread(target=self.download, name="download", daemon=True).start()
140
+
141
+ def take_block(self) -> Optional[Any]:
142
+ """
143
+ Pop a block of the download queue.
144
+ """
145
+ # Use a loop+timeout so that KeyboardInterrupt is still raised.
146
+ while True:
147
+ try:
148
+ return self.queue.get(timeout=1)
149
+ except Empty:
150
+ pass
151
+
152
+ def download(self) -> None:
153
+ """
154
+ Fetch chunks of blocks from the RPC provider.
155
+ """
156
+ running = True
157
+
158
+ while running:
159
+ count = Uint(max(1, self.queue.maxsize // 2))
160
+ replies = self.fetch_blocks(self.block_number + Uint(1), count)
161
+
162
+ for reply in replies:
163
+ to_push: Optional[bytes]
164
+
165
+ if isinstance(reply, RpcError):
166
+ if reply.code != -32000:
167
+ raise reply
168
+
169
+ logging.info("reached end of chain", exc_info=reply)
170
+ running = False
171
+ to_push = None
172
+ else:
173
+ to_push = reply
174
+
175
+ # Use a loop+timeout so that KeyboardInterrupt is still raised.
176
+ while True:
177
+ try:
178
+ self.queue.put(to_push, timeout=1)
179
+ break
180
+ except Full:
181
+ pass
182
+
183
+ def fetch_blocks(
184
+ self,
185
+ first: Uint,
186
+ count: Uint,
187
+ ) -> List[Union[Any, RpcError]]:
188
+ """
189
+ Fetch the block specified by the given number from the RPC provider.
190
+ """
191
+ if self.geth:
192
+ return self.fetch_blocks_debug(first, count)
193
+ else:
194
+ return self.fetch_blocks_eth(first, count)
195
+
196
+ def fetch_blocks_debug(
197
+ self,
198
+ first: Uint,
199
+ count: Uint,
200
+ ) -> List[Union[bytes, RpcError]]:
201
+ """
202
+ Fetch the block specified by the given number from the RPC provider as
203
+ an RLP encoded byte array.
204
+ """
205
+ if count == 0:
206
+ return []
207
+
208
+ calls = []
209
+
210
+ for number in range(first, first + count):
211
+ calls.append(
212
+ {
213
+ "jsonrpc": "2.0",
214
+ "id": hex(number),
215
+ "method": "debug_getRawBlock",
216
+ "params": [hex(number)],
217
+ }
218
+ )
219
+
220
+ data = json.dumps(calls).encode("utf-8")
221
+
222
+ self.log.debug("fetching blocks [%d, %d)...", first, first + count)
223
+
224
+ post = request.Request(
225
+ self.rpc_url,
226
+ data=data,
227
+ headers={
228
+ "Content-Length": str(len(data)),
229
+ "Content-Type": "application/json",
230
+ "User-Agent": "ethereum-spec-sync",
231
+ },
232
+ )
233
+
234
+ with request.urlopen(post) as response:
235
+ replies = json.load(response)
236
+ if not isinstance(replies, list):
237
+ self.log.error(
238
+ "got non-list JSON-RPC response. replies=%r", replies
239
+ )
240
+ raise ValueError
241
+
242
+ block_rlps: Dict[Uint, Union[RpcError, bytes]] = {}
243
+
244
+ for reply in replies:
245
+ try:
246
+ reply_id = Uint(int(reply["id"], 0))
247
+ except Exception:
248
+ self.log.exception(
249
+ "unable to parse RPC id. reply=%r", reply
250
+ )
251
+ raise
252
+
253
+ if reply_id < first or reply_id >= first + count:
254
+ raise Exception("mismatched request id")
255
+
256
+ if "error" in reply:
257
+ block_rlps[reply_id] = RpcError(
258
+ reply["error"]["code"],
259
+ reply["error"]["message"],
260
+ )
261
+ else:
262
+ block_rlps[reply_id] = bytes.fromhex(reply["result"][2:])
263
+
264
+ if len(block_rlps) != count:
265
+ raise Exception(
266
+ f"expected {count} blocks but only got {len(block_rlps)}"
267
+ )
268
+
269
+ self.log.info("blocks [%d, %d) fetched", first, first + count)
270
+
271
+ blocks: List[Union[RpcError, Any]] = []
272
+ for _, block_rlp in sorted(block_rlps.items()):
273
+ if isinstance(block_rlp, RpcError):
274
+ blocks.append(block_rlp)
275
+ else:
276
+ # Unfortunately we have to decode the RLP twice.
277
+ decoded_block = rlp.decode(block_rlp)
278
+ assert not isinstance(decoded_block, bytes)
279
+ assert not isinstance(decoded_block[0], bytes)
280
+ assert isinstance(decoded_block[0][11], bytes)
281
+ timestamp = U256.from_be_bytes(decoded_block[0][11])
282
+ self.advance_block(timestamp)
283
+ try:
284
+ blocks.append(
285
+ rlp.decode_to(
286
+ self.module("blocks").Block, block_rlp
287
+ )
288
+ )
289
+ except Exception:
290
+ self.log.exception(
291
+ "failed to decode block %d with timestamp %d",
292
+ self.block_number,
293
+ timestamp,
294
+ )
295
+ raise
296
+
297
+ return blocks
298
+
299
+ def load_transaction(self, t: Any) -> Any:
300
+ """
301
+ Turn a json transaction into a `Transaction`.
302
+ """
303
+ access_list = []
304
+ for sublist in t.get("accessList", []):
305
+ access_list.append(
306
+ (
307
+ self.module("utils.hexadecimal").hex_to_address(
308
+ sublist.get("address")
309
+ ),
310
+ [
311
+ hex_to_bytes32(key)
312
+ for key in sublist.get("storageKeys")
313
+ ],
314
+ )
315
+ )
316
+ if hasattr(self.module("transactions"), "LegacyTransaction"):
317
+ if t["type"] == "0x1":
318
+ return b"\x01" + rlp.encode(
319
+ self.module("transactions").AccessListTransaction(
320
+ hex_to_u64(t["chainId"]),
321
+ hex_to_u256(t["nonce"]),
322
+ hex_to_uint(t["gasPrice"]),
323
+ hex_to_uint(t["gas"]),
324
+ self.module("utils.hexadecimal").hex_to_address(
325
+ t["to"]
326
+ )
327
+ if t["to"]
328
+ else Bytes0(b""),
329
+ hex_to_u256(t["value"]),
330
+ hex_to_bytes(t["input"]),
331
+ access_list,
332
+ hex_to_u256(t["v"]),
333
+ hex_to_u256(t["r"]),
334
+ hex_to_u256(t["s"]),
335
+ )
336
+ )
337
+ elif t["type"] == "0x2":
338
+ return b"\x02" + rlp.encode(
339
+ self.module("transactions").FeeMarketTransaction(
340
+ hex_to_u64(t["chainId"]),
341
+ hex_to_u256(t["nonce"]),
342
+ hex_to_uint(t["maxPriorityFeePerGas"]),
343
+ hex_to_uint(t["maxFeePerGas"]),
344
+ hex_to_uint(t["gas"]),
345
+ self.module("utils.hexadecimal").hex_to_address(
346
+ t["to"]
347
+ )
348
+ if t["to"]
349
+ else Bytes0(b""),
350
+ hex_to_u256(t["value"]),
351
+ hex_to_bytes(t["input"]),
352
+ access_list,
353
+ hex_to_u256(t["v"]),
354
+ hex_to_u256(t["r"]),
355
+ hex_to_u256(t["s"]),
356
+ )
357
+ )
358
+ else:
359
+ return self.module("transactions").LegacyTransaction(
360
+ hex_to_u256(t["nonce"]),
361
+ hex_to_uint(t["gasPrice"]),
362
+ hex_to_uint(t["gas"]),
363
+ self.module("utils.hexadecimal").hex_to_address(t["to"])
364
+ if t["to"]
365
+ else Bytes0(b""),
366
+ hex_to_u256(t["value"]),
367
+ hex_to_bytes(t["input"]),
368
+ hex_to_u256(t["v"]),
369
+ hex_to_u256(t["r"]),
370
+ hex_to_u256(t["s"]),
371
+ )
372
+ else:
373
+ return self.module("transactions").Transaction(
374
+ hex_to_u256(t["nonce"]),
375
+ hex_to_uint(t["gasPrice"]),
376
+ hex_to_uint(t["gas"]),
377
+ self.module("utils.hexadecimal").hex_to_address(t["to"])
378
+ if t["to"]
379
+ else Bytes0(b""),
380
+ hex_to_u256(t["value"]),
381
+ hex_to_bytes(t["input"]),
382
+ hex_to_u256(t["v"]),
383
+ hex_to_u256(t["r"]),
384
+ hex_to_u256(t["s"]),
385
+ )
386
+
387
+ def fetch_blocks_eth(
388
+ self,
389
+ first: Uint,
390
+ count: Uint,
391
+ ) -> List[Union[Any, RpcError]]:
392
+ """
393
+ Fetch the block specified by the given number from the RPC provider
394
+ using only standard endpoints.
395
+ """
396
+ if count == 0:
397
+ return []
398
+
399
+ calls = []
400
+
401
+ for number in range(first, first + count):
402
+ calls.append(
403
+ {
404
+ "jsonrpc": "2.0",
405
+ "id": hex(number),
406
+ "method": "eth_getBlockByNumber",
407
+ "params": [hex(number), True],
408
+ }
409
+ )
410
+
411
+ data = json.dumps(calls).encode("utf-8")
412
+
413
+ self.log.debug("fetching blocks [%d, %d)...", first, first + count)
414
+
415
+ post = request.Request(
416
+ self.rpc_url,
417
+ data=data,
418
+ headers={
419
+ "Content-Length": str(len(data)),
420
+ "Content-Type": "application/json",
421
+ "User-Agent": "ethereum-spec-sync",
422
+ },
423
+ )
424
+
425
+ with request.urlopen(post) as response:
426
+ replies = json.load(response)
427
+ block_jsons: Dict[Uint, Any] = {}
428
+ ommers_needed: Dict[Uint, int] = {}
429
+ blocks: Dict[Uint, Union[Any, RpcError]] = {}
430
+
431
+ for reply in replies:
432
+ reply_id = Uint(int(reply["id"], 0))
433
+
434
+ if reply_id < first or reply_id >= first + count:
435
+ raise Exception("mismatched request id")
436
+
437
+ if "error" in reply:
438
+ blocks[reply_id] = RpcError(
439
+ reply["error"]["code"],
440
+ reply["error"]["message"],
441
+ )
442
+ else:
443
+ res = reply["result"]
444
+ if res is None:
445
+ from time import sleep
446
+
447
+ sleep(12)
448
+ break
449
+
450
+ block_jsons[reply_id] = res
451
+ ommers_needed[reply_id] = len(res["uncles"])
452
+
453
+ ommers = self.fetch_ommers(ommers_needed)
454
+ for id in block_jsons: # noqa A001
455
+ self.advance_block(hex_to_u256(block_jsons[id]["timestamp"]))
456
+ blocks[id] = self.make_block(
457
+ block_jsons[id], ommers.get(id, ())
458
+ )
459
+
460
+ self.log.info("blocks [%d, %d) fetched", first, first + count)
461
+
462
+ return [v for (_, v) in sorted(blocks.items())]
463
+
464
+ def fetch_ommers(self, ommers_needed: Dict[Uint, int]) -> Dict[Uint, Any]:
465
+ """
466
+ Fetch the ommers for a given block from the RPC provider.
467
+ """
468
+ calls = []
469
+
470
+ for block_number, num_ommers in ommers_needed.items():
471
+ for i in range(num_ommers):
472
+ calls.append(
473
+ {
474
+ "jsonrpc": "2.0",
475
+ "id": hex(block_number * Uint(20) + Uint(i)),
476
+ "method": "eth_getUncleByBlockNumberAndIndex",
477
+ "params": [hex(block_number), hex(i)],
478
+ }
479
+ )
480
+
481
+ if calls == []:
482
+ return {}
483
+
484
+ data = json.dumps(calls).encode("utf-8")
485
+
486
+ self.log.debug(
487
+ "fetching ommers [%d, %d]...",
488
+ min(ommers_needed),
489
+ max(ommers_needed),
490
+ )
491
+
492
+ post = request.Request(
493
+ self.rpc_url,
494
+ data=data,
495
+ headers={
496
+ "Content-Length": str(len(data)),
497
+ "Content-Type": "application/json",
498
+ "User-Agent": "ethereum-spec-sync",
499
+ },
500
+ )
501
+
502
+ with request.urlopen(post) as response:
503
+ replies = json.load(response)
504
+ ommers: Dict[Uint, Dict[Uint, Any]] = {}
505
+
506
+ twenty = Uint(20)
507
+ for reply in replies:
508
+ reply_id = Uint(int(reply["id"], 0))
509
+
510
+ if reply_id // twenty not in ommers:
511
+ ommers[reply_id // twenty] = {}
512
+
513
+ if "error" in reply:
514
+ raise RpcError(
515
+ reply["error"]["code"],
516
+ reply["error"]["message"],
517
+ )
518
+ else:
519
+ ommers[reply_id // twenty][reply_id % twenty] = (
520
+ self.make_header(reply["result"])
521
+ )
522
+
523
+ self.log.info(
524
+ "ommers [%d, %d] fetched",
525
+ min(ommers_needed),
526
+ max(ommers_needed),
527
+ )
528
+
529
+ return {
530
+ k: tuple(x for (_, x) in sorted(v.items()))
531
+ for (k, v) in ommers.items()
532
+ }
533
+
534
+ def make_header(self, json: Any) -> Any:
535
+ """
536
+ Create a Header object from JSON describing it.
537
+ """
538
+ fields = [
539
+ hex_to_bytes32(json["parentHash"]),
540
+ hex_to_bytes32(json["sha3Uncles"]),
541
+ self.module("utils.hexadecimal").hex_to_address(json["miner"]),
542
+ hex_to_bytes32(json["stateRoot"]),
543
+ hex_to_bytes32(json["transactionsRoot"]),
544
+ hex_to_bytes32(json["receiptsRoot"]),
545
+ Bytes256(hex_to_bytes(json["logsBloom"])),
546
+ hex_to_uint(json["difficulty"]),
547
+ hex_to_uint(json["number"]),
548
+ hex_to_uint(json["gasLimit"]),
549
+ hex_to_uint(json["gasUsed"]),
550
+ hex_to_u256(json["timestamp"]),
551
+ hex_to_bytes(json["extraData"]),
552
+ hex_to_bytes32(json["mixHash"]),
553
+ hex_to_bytes8(json["nonce"]),
554
+ ]
555
+ if hasattr(self.module("blocks").Header, "base_fee_per_gas"):
556
+ fields.append(hex_to_uint(json["baseFeePerGas"]))
557
+ if hasattr(self.module("blocks").Header, "withdrawals_root"):
558
+ fields.append(hex_to_bytes32(json["withdrawalsRoot"]))
559
+ return self.module("blocks").Header(*fields)
560
+
561
+ def make_block(self, json: Any, ommers: Any) -> Any:
562
+ """
563
+ Create a block from JSON describing it.
564
+ """
565
+ header = self.make_header(json)
566
+ transactions = []
567
+ for t in json["transactions"]:
568
+ transactions.append(self.load_transaction(t))
569
+
570
+ if json.get("withdrawals") is not None:
571
+ withdrawals = []
572
+ for j in json["withdrawals"]:
573
+ withdrawals.append(
574
+ self.module("blocks").Withdrawal(
575
+ hex_to_u64(j["index"]),
576
+ hex_to_u64(j["validatorIndex"]),
577
+ self.module("utils.hexadecimal").hex_to_address(
578
+ j["address"]
579
+ ),
580
+ hex_to_u256(j["amount"]),
581
+ )
582
+ )
583
+
584
+ extra_fields = []
585
+ if hasattr(self.module("blocks").Block, "withdrawals"):
586
+ extra_fields.append(withdrawals)
587
+
588
+ return self.module("blocks").Block(
589
+ header,
590
+ tuple(transactions),
591
+ ommers,
592
+ *extra_fields,
593
+ )
594
+
595
+
596
+ class Sync(ForkTracking):
597
+ """
598
+ A command line tool to fetch blocks from an RPC provider and validate them
599
+ against the specification.
600
+ """
601
+
602
+ @staticmethod
603
+ def parse_arguments() -> argparse.Namespace:
604
+ """
605
+ Parse command line arguments.
606
+ """
607
+ parser = argparse.ArgumentParser()
608
+
609
+ parser.add_argument(
610
+ "--rpc-url",
611
+ help="endpoint providing the Ethereum RPC API",
612
+ default="http://localhost:8545/",
613
+ )
614
+
615
+ parser.add_argument(
616
+ "--unoptimized",
617
+ help="don't use the optimized state/ethash (extremely slow)",
618
+ action="store_true",
619
+ )
620
+
621
+ parser.add_argument(
622
+ "--persist",
623
+ help="store the state in a db in this file",
624
+ )
625
+
626
+ parser.add_argument(
627
+ "--geth",
628
+ help="use geth specific RPC endpoints while fetching blocks",
629
+ action="store_true",
630
+ )
631
+
632
+ parser.add_argument(
633
+ "--reset",
634
+ help="delete the db and start from scratch",
635
+ action="store_true",
636
+ )
637
+
638
+ parser.add_argument(
639
+ "--gas-per-commit",
640
+ help="commit to db each time this much gas is consumed",
641
+ type=int,
642
+ default=1_000_000_000,
643
+ )
644
+
645
+ parser.add_argument(
646
+ "--initial-state",
647
+ help="start from the state in this db, rather than genesis",
648
+ )
649
+
650
+ parser.add_argument(
651
+ "--stop-at",
652
+ help="after syncing this block, exit successfully",
653
+ type=int,
654
+ )
655
+
656
+ parser.add_argument(
657
+ "--mainnet",
658
+ help="Set the chain to mainnet",
659
+ action="store_const",
660
+ dest="chain",
661
+ const="mainnet",
662
+ default="mainnet",
663
+ )
664
+ parser.add_argument(
665
+ "--zhejiang",
666
+ help="Set the chain to mainnet",
667
+ action="store_const",
668
+ dest="chain",
669
+ const="zhejiang",
670
+ )
671
+ parser.add_argument(
672
+ "--sepolia",
673
+ help="Set the chain to mainnet",
674
+ action="store_const",
675
+ dest="chain",
676
+ const="sepolia",
677
+ )
678
+
679
+ return parser.parse_args()
680
+
681
+ downloader: BlockDownloader
682
+ options: argparse.Namespace
683
+ chain: Any
684
+ log: logging.Logger
685
+
686
+ def __init__(self) -> None:
687
+ self.log = logging.getLogger(__name__)
688
+ self.options = self.parse_arguments()
689
+
690
+ if not self.options.unoptimized:
691
+ import ethereum_optimized
692
+
693
+ ethereum_optimized.monkey_patch(state_path=self.options.persist)
694
+ else:
695
+ if self.options.persist is not None:
696
+ self.log.error("--persist is not supported with --unoptimized")
697
+ exit(1)
698
+ if self.options.initial_state is not None:
699
+ self.log.error(
700
+ "--initial-state is not supported with --unoptimized"
701
+ )
702
+ exit(1)
703
+ if self.options.reset:
704
+ self.log.error("--reset is not supported with --unoptimized")
705
+ exit(1)
706
+
707
+ if self.options.persist is None:
708
+ if self.options.initial_state is not None:
709
+ self.log.error(
710
+ "--initial_state is not supported without --persist"
711
+ )
712
+ exit(1)
713
+ if self.options.reset:
714
+ self.log.error("--reset is not supported without --persist")
715
+ exit(1)
716
+
717
+ config_str = cast(
718
+ bytes,
719
+ pkgutil.get_data("ethereum", f"assets/{self.options.chain}.json"),
720
+ ).decode()
721
+ config = json.loads(config_str)
722
+
723
+ if self.options.chain == "mainnet":
724
+ forks = Hardfork.discover()
725
+ else:
726
+ forks = Hardfork.load_from_json(config)
727
+
728
+ ForkTracking.__init__(self, forks, Uint(0), U256(0))
729
+
730
+ if self.options.reset:
731
+ import rust_pyspec_glue
732
+
733
+ assert self.options.persist is not None
734
+ rust_pyspec_glue.DB.delete(self.options.persist)
735
+
736
+ if self.options.initial_state is not None:
737
+ assert self.options.persist is not None
738
+ if not os.path.exists(
739
+ os.path.join(self.options.persist, "mdbx.dat")
740
+ ):
741
+ try:
742
+ os.mkdir(self.options.persist)
743
+ except FileExistsError:
744
+ pass
745
+ shutil.copy(
746
+ os.path.join(self.options.initial_state, "mdbx.dat"),
747
+ self.options.persist,
748
+ )
749
+
750
+ state = self.module("state").State()
751
+
752
+ persisted_block: Optional[Uint] = None
753
+ persisted_block_timestamp: Optional[U256] = None
754
+
755
+ if self.options.persist is not None:
756
+ state_mod = self.module("state")
757
+ persisted_block_opt = state_mod.get_metadata(
758
+ state, b"block_number"
759
+ )
760
+ persisted_block_timestamp_opt = state_mod.get_metadata(
761
+ state, b"block_timestamp"
762
+ )
763
+
764
+ if persisted_block_opt is not None:
765
+ persisted_block = Uint(int(persisted_block_opt))
766
+ if persisted_block_timestamp_opt is not None:
767
+ persisted_block_timestamp = U256(
768
+ int(persisted_block_timestamp_opt)
769
+ )
770
+
771
+ if persisted_block is None or persisted_block_timestamp is None:
772
+ self.chain = self.module("fork").BlockChain(
773
+ blocks=[],
774
+ state=state,
775
+ chain_id=None,
776
+ )
777
+ genesis_configuration = genesis.get_genesis_configuration(
778
+ f"{self.options.chain}.json"
779
+ )
780
+
781
+ description: genesis.GenesisFork = genesis.GenesisFork(
782
+ Address=self.active_fork.module("fork_types").Address,
783
+ Account=self.active_fork.module("fork_types").Account,
784
+ Trie=self.active_fork.module("trie").Trie,
785
+ Bloom=self.active_fork.module("fork_types").Bloom,
786
+ Header=self.active_fork.module("blocks").Header,
787
+ Block=self.active_fork.module("blocks").Block,
788
+ set_account=self.active_fork.module("state").set_account,
789
+ set_storage=self.active_fork.module("state").set_storage,
790
+ state_root=self.active_fork.module("state").state_root,
791
+ root=self.active_fork.module("trie").root,
792
+ hex_to_address=self.active_fork.module(
793
+ "utils.hexadecimal"
794
+ ).hex_to_address,
795
+ )
796
+ genesis.add_genesis_block(
797
+ description,
798
+ self.chain,
799
+ genesis_configuration,
800
+ )
801
+ self.downloader = BlockDownloader(
802
+ forks,
803
+ self.log,
804
+ self.options.rpc_url,
805
+ self.options.geth,
806
+ Uint(0),
807
+ genesis_configuration.timestamp,
808
+ )
809
+ self.set_block(Uint(0), genesis_configuration.timestamp)
810
+ else:
811
+ self.set_block(persisted_block, persisted_block_timestamp)
812
+ if persisted_block < Uint(256):
813
+ initial_blocks_length = persisted_block
814
+ else:
815
+ initial_blocks_length = Uint(255)
816
+ self.downloader = BlockDownloader(
817
+ forks,
818
+ self.log,
819
+ self.options.rpc_url,
820
+ self.options.geth,
821
+ persisted_block - initial_blocks_length,
822
+ persisted_block_timestamp,
823
+ )
824
+ blocks = []
825
+ for _ in range(initial_blocks_length):
826
+ blocks.append(self.downloader.take_block())
827
+ self.chain = self.module("fork").BlockChain(
828
+ blocks=blocks,
829
+ state=state,
830
+ chain_id=self.fetch_chain_id(state),
831
+ )
832
+
833
+ def persist(self) -> None:
834
+ """
835
+ Save the block list, state and chain id to file.
836
+ """
837
+ if self.options.persist is None:
838
+ return
839
+
840
+ self.log.debug("persisting blocks and state...")
841
+
842
+ state_mod = self.module("state")
843
+ state_mod.set_metadata(
844
+ self.chain.state,
845
+ b"chain_id",
846
+ str(self.chain.chain_id).encode(),
847
+ )
848
+
849
+ start = time.monotonic()
850
+
851
+ state_mod.commit_db_transaction(self.chain.state)
852
+ state_mod.begin_db_transaction(self.chain.state)
853
+
854
+ end = time.monotonic()
855
+ self.log.info(
856
+ "persisted state and %d blocks (took %.3f)",
857
+ len(self.chain.blocks),
858
+ end - start,
859
+ )
860
+
861
+ def fetch_chain_id(self, state: Any) -> U64:
862
+ """
863
+ Fetch the persisted chain id from the database.
864
+ """
865
+ state_mod = self.module("state")
866
+ chain_id = state_mod.get_metadata(state, b"chain_id")
867
+
868
+ if chain_id is not None:
869
+ chain_id = U64(int(chain_id))
870
+
871
+ return chain_id
872
+
873
+ def process_blocks(self) -> None:
874
+ """
875
+ Validate blocks that have been fetched.
876
+ """
877
+ time_of_last_commit = time.monotonic()
878
+ gas_since_last_commit = 0
879
+ last_committed_block: Optional[int] = None
880
+ block: Optional[Any] = None
881
+
882
+ def persist() -> None:
883
+ nonlocal time_of_last_commit
884
+ nonlocal gas_since_last_commit
885
+ nonlocal last_committed_block
886
+
887
+ now = time.monotonic()
888
+ elapsed = now - time_of_last_commit
889
+ time_of_last_commit = now
890
+
891
+ if elapsed == 0:
892
+ elapsed = 1
893
+
894
+ m_gas = gas_since_last_commit / 1_000_000.0
895
+ m_gas_per_second = m_gas / elapsed
896
+ gas_since_last_commit = 0
897
+
898
+ if block is not None:
899
+ count = block.header.number
900
+ if last_committed_block is not None:
901
+ count -= last_committed_block
902
+ last_committed_block = block.header.number
903
+
904
+ self.log.info(
905
+ "imported chain segment "
906
+ "count=%d mgas=%f mgasps=%f block=%d",
907
+ count,
908
+ m_gas,
909
+ m_gas_per_second,
910
+ block.header.number,
911
+ )
912
+
913
+ self.persist()
914
+
915
+ while True:
916
+ block = self.downloader.take_block()
917
+
918
+ if block is None:
919
+ break
920
+
921
+ try:
922
+ self.process_block(block)
923
+ except Exception:
924
+ self.log.exception(
925
+ "failed to process block %d", block.header.number
926
+ )
927
+ raise
928
+
929
+ # Additional gas to account for block overhead
930
+ gas_since_last_commit += 30000
931
+ gas_since_last_commit += int(block.header.gas_used)
932
+
933
+ if self.options.persist is not None:
934
+ state_mod = self.module("state")
935
+ state_mod.set_metadata(
936
+ self.chain.state,
937
+ b"block_number",
938
+ str(self.block_number).encode(),
939
+ )
940
+ state_mod.set_metadata(
941
+ self.chain.state,
942
+ b"block_timestamp",
943
+ str(block.header.timestamp).encode(),
944
+ )
945
+
946
+ self.log.debug(
947
+ "block %d applied",
948
+ self.block_number,
949
+ )
950
+
951
+ if self.block_number == self.options.stop_at:
952
+ persist()
953
+ return
954
+
955
+ if self.block_number > Uint(2220000) and self.block_number < Uint(
956
+ 2463000
957
+ ):
958
+ # Excessive DB load due to the Shanghai DOS attacks, requires
959
+ # more regular DB commits
960
+ if gas_since_last_commit > self.options.gas_per_commit / 10:
961
+ persist()
962
+ elif self.block_number > Uint(
963
+ 2675000
964
+ ) and self.block_number < Uint(2700598):
965
+ # Excessive DB load due to state clearing, requires more
966
+ # regular DB commits
967
+ if gas_since_last_commit > self.options.gas_per_commit / 10:
968
+ persist()
969
+ elif gas_since_last_commit > self.options.gas_per_commit:
970
+ persist()
971
+
972
+ def process_block(self, block: Any) -> None:
973
+ """
974
+ Process a single block.
975
+ """
976
+ if (
977
+ self.advance_block(block.header.timestamp)
978
+ or self.block_number == 1
979
+ ):
980
+ self.log.debug("applying %s fork...", self.active_fork.name)
981
+ start = time.monotonic()
982
+ self.chain = self.module("fork").apply_fork(self.chain)
983
+ end = time.monotonic()
984
+ self.log.info(
985
+ "applied %s fork (took %.3f)",
986
+ self.active_fork.name,
987
+ end - start,
988
+ )
989
+
990
+ assert (not self.chain.blocks) or (
991
+ self.block_number == self.chain.blocks[-1].header.number + Uint(1)
992
+ )
993
+
994
+ if block.header.number != self.block_number:
995
+ raise Exception(
996
+ f"expected block {self.block_number} "
997
+ f"but got {block.header.number}"
998
+ )
999
+
1000
+ self.log.debug("applying block %d...", self.block_number)
1001
+
1002
+ self.module("fork").state_transition(self.chain, block)
1003
+
1004
+
1005
+ def main() -> None:
1006
+ """
1007
+ Using an RPC provider, fetch each block and validate it.
1008
+ """
1009
+ logging.basicConfig(level=logging.INFO)
1010
+
1011
+ sync = Sync()
1012
+ sync.process_blocks()
1013
+
1014
+
1015
+ if __name__ == "__main__":
1016
+ main()