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
ethereum/ethash.py ADDED
@@ -0,0 +1,426 @@
1
+ """
2
+ Ethash is a proof-of-work algorithm designed to be [ASIC] resistant through
3
+ [memory hardness][mem-hard].
4
+
5
+ To achieve memory hardness, computing Ethash requires access to subsets of a
6
+ large structure. The particular subsets chosen are based on the nonce and block
7
+ header, while the set itself is changed every [`epoch`].
8
+
9
+ At a high level, the Ethash algorithm is as follows:
10
+
11
+ 1. Create a **seed** value, generated with [`generate_seed`] and based on the
12
+ preceding block numbers.
13
+ 1. From the seed, compute a pseudorandom **cache** with [`generate_cache`].
14
+ 1. From the cache, generate a **dataset** with [`generate_dataset`]. The
15
+ dataset grows over time based on [`DATASET_EPOCH_GROWTH_SIZE`].
16
+ 1. Miners hash slices of the dataset together, which is where the memory
17
+ hardness is introduced. Verification of the proof-of-work only requires the
18
+ cache to be able to recompute a much smaller subset of the full dataset.
19
+
20
+ [`DATASET_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.DATASET_EPOCH_GROWTH_SIZE
21
+ [`generate_dataset`]: ref:ethereum.ethash.generate_dataset
22
+ [`generate_cache`]: ref:ethereum.ethash.generate_cache
23
+ [`generate_seed`]: ref:ethereum.ethash.generate_seed
24
+ [`epoch`]: ref:ethereum.ethash.epoch
25
+ [ASIC]: https://en.wikipedia.org/wiki/Application-specific_integrated_circuit
26
+ [mem-hard]: https://en.wikipedia.org/wiki/Memory-hard_function
27
+ """
28
+
29
+ from typing import Callable, Tuple
30
+
31
+ from ethereum_types.bytes import Bytes, Bytes8
32
+ from ethereum_types.numeric import U32, Uint, ulen
33
+
34
+ from ethereum.crypto.hash import Hash32, Hash64, keccak256, keccak512
35
+ from ethereum.utils.numeric import (
36
+ is_prime,
37
+ le_bytes_to_uint32_sequence,
38
+ le_uint32_sequence_to_bytes,
39
+ le_uint32_sequence_to_uint,
40
+ )
41
+
42
+ EPOCH_SIZE = Uint(30000)
43
+ """
44
+ Number of blocks before a dataset needs to be regenerated (known as an
45
+ "epoch".) See [`epoch`].
46
+
47
+ [`epoch`]: ref:ethereum.ethash.epoch
48
+ """
49
+
50
+ INITIAL_CACHE_SIZE = Uint(2**24)
51
+ """
52
+ Size of the cache (in bytes) during the first epoch. Each subsequent epoch's
53
+ cache roughly grows by [`CACHE_EPOCH_GROWTH_SIZE`] bytes. See [`cache_size`].
54
+
55
+ [`CACHE_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.CACHE_EPOCH_GROWTH_SIZE
56
+ [`cache_size`]: ref:ethereum.ethash.cache_size
57
+ """
58
+
59
+ CACHE_EPOCH_GROWTH_SIZE = Uint(2**17)
60
+ """
61
+ After the first epoch, the cache size grows by roughly this amount. See
62
+ [`cache_size`].
63
+
64
+ [`cache_size`]: ref:ethereum.ethash.cache_size
65
+ """
66
+
67
+ INITIAL_DATASET_SIZE = Uint(2**30)
68
+ """
69
+ Size of the dataset (in bytes) during the first epoch. Each subsequent epoch's
70
+ dataset roughly grows by [`DATASET_EPOCH_GROWTH_SIZE`] bytes. See
71
+ [`dataset_size`].
72
+
73
+ [`DATASET_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.DATASET_EPOCH_GROWTH_SIZE
74
+ [`dataset_size`]: ref:ethereum.ethash.dataset_size
75
+ """
76
+
77
+ DATASET_EPOCH_GROWTH_SIZE = Uint(2**23)
78
+ """
79
+ After the first epoch, the dataset size grows by roughly this amount. See
80
+ [`dataset_size`].
81
+
82
+ [`dataset_size`]: ref:ethereum.ethash.dataset_size
83
+ """
84
+
85
+ HASH_BYTES = Uint(64)
86
+ """
87
+ Length of a hash, in bytes.
88
+ """
89
+
90
+ MIX_BYTES = Uint(128)
91
+ """
92
+ Width of mix, in bytes. See [`generate_dataset_item`].
93
+
94
+ [`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
95
+ """
96
+
97
+ CACHE_ROUNDS = 3
98
+ """
99
+ Number of times to repeat the [`keccak512`] step while generating the hash. See
100
+ [`generate_cache`].
101
+
102
+ [`keccak512`]: ref:ethereum.crypto.hash.keccak512
103
+ [`generate_cache`]: ref:ethereum.ethash.generate_cache
104
+ """
105
+
106
+ DATASET_PARENTS = Uint(256)
107
+ """
108
+ Number of parents of each dataset element. See [`generate_dataset_item`].
109
+
110
+ [`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
111
+ """
112
+
113
+ HASHIMOTO_ACCESSES = 64
114
+ """
115
+ Number of accesses in the [`hashimoto`] loop.
116
+
117
+ [`hashimoto`]: ref:ethereum.ethash.hashimoto
118
+ """
119
+
120
+
121
+ def epoch(block_number: Uint) -> Uint:
122
+ """
123
+ Obtain the epoch number to which the block identified by `block_number`
124
+ belongs. The first epoch is numbered zero.
125
+
126
+ An Ethash epoch is a fixed number of blocks ([`EPOCH_SIZE`]) long, during
127
+ which the dataset remains constant. At the end of each epoch, the dataset
128
+ is generated anew. See [`generate_dataset`].
129
+
130
+ [`EPOCH_SIZE`]: ref:ethereum.ethash.EPOCH_SIZE
131
+ [`generate_dataset`]: ref:ethereum.ethash.generate_dataset
132
+ """
133
+ return block_number // EPOCH_SIZE
134
+
135
+
136
+ def cache_size(block_number: Uint) -> Uint:
137
+ """
138
+ Obtain the cache size (in bytes) of the epoch to which `block_number`
139
+ belongs.
140
+
141
+ See [`INITIAL_CACHE_SIZE`] and [`CACHE_EPOCH_GROWTH_SIZE`] for the initial
142
+ size and linear growth rate, respectively. The cache is generated in
143
+ [`generate_cache`].
144
+
145
+ The actual cache size is smaller than simply multiplying
146
+ `CACHE_EPOCH_GROWTH_SIZE` by the epoch number to minimize the risk of
147
+ unintended cyclic behavior. It is defined as the highest prime number below
148
+ what linear growth would calculate.
149
+
150
+ [`INITIAL_CACHE_SIZE`]: ref:ethereum.ethash.INITIAL_CACHE_SIZE
151
+ [`CACHE_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.CACHE_EPOCH_GROWTH_SIZE
152
+ [`generate_cache`]: ref:ethereum.ethash.generate_cache
153
+ """
154
+ size = INITIAL_CACHE_SIZE + (CACHE_EPOCH_GROWTH_SIZE * epoch(block_number))
155
+ size -= HASH_BYTES
156
+ while not is_prime(size // HASH_BYTES):
157
+ size -= Uint(2) * HASH_BYTES
158
+
159
+ return size
160
+
161
+
162
+ def dataset_size(block_number: Uint) -> Uint:
163
+ """
164
+ Obtain the dataset size (in bytes) of the epoch to which `block_number`
165
+ belongs.
166
+
167
+ See [`INITIAL_DATASET_SIZE`] and [`DATASET_EPOCH_GROWTH_SIZE`][ds] for the
168
+ initial size and linear growth rate, respectively. The complete dataset is
169
+ generated in [`generate_dataset`], while the slices used in verification
170
+ are generated in [`generate_dataset_item`].
171
+
172
+ The actual dataset size is smaller than simply multiplying
173
+ `DATASET_EPOCH_GROWTH_SIZE` by the epoch number to minimize the risk of
174
+ unintended cyclic behavior. It is defined as the highest prime number below
175
+ what linear growth would calculate.
176
+
177
+ [`INITIAL_DATASET_SIZE`]: ref:ethereum.ethash.INITIAL_DATASET_SIZE
178
+ [ds]: ref:ethereum.ethash.DATASET_EPOCH_GROWTH_SIZE
179
+ [`generate_dataset`]: ref:ethereum.ethash.generate_dataset
180
+ [`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
181
+ """
182
+ size = INITIAL_DATASET_SIZE + (
183
+ DATASET_EPOCH_GROWTH_SIZE * epoch(block_number)
184
+ )
185
+ size -= MIX_BYTES
186
+ while not is_prime(size // MIX_BYTES):
187
+ size -= Uint(2) * MIX_BYTES
188
+
189
+ return size
190
+
191
+
192
+ def generate_seed(block_number: Uint) -> Hash32:
193
+ """
194
+ Obtain the cache generation seed for the block identified by
195
+ `block_number`. See [`generate_cache`].
196
+
197
+ [`generate_cache`]: ref:ethereum.ethash.generate_cache
198
+ """
199
+ epoch_number = epoch(block_number)
200
+
201
+ seed = b"\x00" * 32
202
+ while epoch_number != 0:
203
+ seed = keccak256(seed)
204
+ epoch_number -= Uint(1)
205
+
206
+ return Hash32(seed)
207
+
208
+
209
+ def generate_cache(block_number: Uint) -> Tuple[Tuple[U32, ...], ...]:
210
+ """
211
+ Generate the cache for the block identified by `block_number`. See
212
+ [`generate_dataset`] for how the cache is used.
213
+
214
+ The cache is generated in two steps: filling the array with a chain of
215
+ [`keccak512`] hashes, then running two rounds of Sergio Demian Lerner's
216
+ [RandMemoHash] on those bytes.
217
+
218
+ [`keccak512`]: ref:ethereum.crypto.hash.keccak512
219
+ [`generate_dataset`]: ref:ethereum.ethash.generate_dataset
220
+ [RandMemoHash]: http://www.hashcash.org/papers/memohash.pdf
221
+ """
222
+ seed = generate_seed(block_number)
223
+ cache_size_bytes = cache_size(block_number)
224
+
225
+ cache_size_words = cache_size_bytes // HASH_BYTES
226
+ cache = [keccak512(seed)]
227
+
228
+ for index in range(1, cache_size_words):
229
+ cache_item = keccak512(cache[index - 1])
230
+ cache.append(cache_item)
231
+
232
+ for _ in range(CACHE_ROUNDS):
233
+ for index in range(cache_size_words):
234
+ # Converting `cache_size_words` to int as `-1 + Uint(5)` is an
235
+ # error.
236
+ first_cache_item = cache[
237
+ (index - 1 + int(cache_size_words)) % int(cache_size_words)
238
+ ]
239
+ second_cache_item = cache[
240
+ U32.from_le_bytes(cache[index][0:4]) % U32(cache_size_words)
241
+ ]
242
+ items = zip(first_cache_item, second_cache_item, strict=True)
243
+ result = Bytes([a ^ b for a, b in items])
244
+ cache[index] = keccak512(result)
245
+
246
+ return tuple(
247
+ le_bytes_to_uint32_sequence(cache_item) for cache_item in cache
248
+ )
249
+
250
+
251
+ def fnv(a: Uint | U32, b: Uint | U32) -> U32:
252
+ """
253
+ A non-associative substitute for XOR, inspired by the [FNV] hash by Fowler,
254
+ Noll, and Vo. See [`fnv_hash`], [`generate_dataset_item`], and
255
+ [`hashimoto`].
256
+
257
+ Note that here we multiply the prime with the full 32-bit input, in
258
+ contrast with the [FNV-1] spec which multiplies the prime with one byte
259
+ (octet) in turn.
260
+
261
+ [`hashimoto`]: ref:ethereum.ethash.hashimoto
262
+ [`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
263
+ [`fnv_hash`]: ref:ethereum.ethash.fnv_hash
264
+ [FNV]: https://w.wiki/XKZ
265
+ [FNV-1]: http://www.isthe.com/chongo/tech/comp/fnv/#FNV-1
266
+ """
267
+ # This is a faster way of doing `number % (2 ** 32)`.
268
+ result = ((Uint(a) * Uint(0x01000193)) ^ Uint(b)) & Uint(U32.MAX_VALUE)
269
+ return U32(result)
270
+
271
+
272
+ def fnv_hash(
273
+ mix_integers: Tuple[U32, ...], data: Tuple[U32, ...]
274
+ ) -> Tuple[U32, ...]:
275
+ """
276
+ Combines `data` into `mix_integers` using [`fnv`]. See [`hashimoto`] and
277
+ [`generate_dataset_item`].
278
+
279
+ [`hashimoto`]: ref:ethereum.ethash.hashimoto
280
+ [`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
281
+ [`fnv`]: ref:ethereum.ethash.fnv
282
+ """
283
+ return tuple(
284
+ fnv(mix_integers[i], data[i]) for i in range(len(mix_integers))
285
+ )
286
+
287
+
288
+ def generate_dataset_item(
289
+ cache: Tuple[Tuple[U32, ...], ...], index: Uint
290
+ ) -> Hash64:
291
+ """
292
+ Generate a particular dataset item 0-indexed by `index` by hashing
293
+ pseudorandomly-selected entries from `cache` together. See [`fnv`] and
294
+ [`fnv_hash`] for the digest function, [`generate_cache`] for generating
295
+ `cache`, and [`generate_dataset`] for the full dataset generation
296
+ algorithm.
297
+
298
+ [`fnv`]: ref:ethereum.ethash.fnv
299
+ [`fnv_hash`]: ref:ethereum.ethash.fnv_hash
300
+ [`generate_dataset`]: ref:ethereum.ethash.generate_dataset
301
+ [`generate_cache`]: ref:ethereum.ethash.generate_cache
302
+ """
303
+ mix = keccak512(
304
+ (
305
+ le_uint32_sequence_to_uint(cache[index % ulen(cache)]) ^ index
306
+ ).to_le_bytes64()
307
+ )
308
+
309
+ mix_integers = le_bytes_to_uint32_sequence(mix)
310
+
311
+ for j in (Uint(k) for k in range(DATASET_PARENTS)):
312
+ mix_word: U32 = mix_integers[j % Uint(16)]
313
+ cache_index = fnv(index ^ j, mix_word) % U32(len(cache))
314
+ parent = cache[cache_index]
315
+ mix_integers = fnv_hash(mix_integers, parent)
316
+
317
+ mix = Hash64(le_uint32_sequence_to_bytes(mix_integers))
318
+
319
+ return keccak512(mix)
320
+
321
+
322
+ def generate_dataset(block_number: Uint) -> Tuple[Hash64, ...]:
323
+ """
324
+ Generate the full dataset for the block identified by `block_number`.
325
+
326
+ This function is present only for demonstration purposes. It is not used
327
+ while validating blocks.
328
+ """
329
+ dataset_size_bytes: Uint = dataset_size(block_number)
330
+ cache: Tuple[Tuple[U32, ...], ...] = generate_cache(block_number)
331
+
332
+ # TODO: Parallelize this later on if it adds value
333
+ return tuple(
334
+ generate_dataset_item(cache, Uint(index))
335
+ for index in range(dataset_size_bytes // HASH_BYTES)
336
+ )
337
+
338
+
339
+ def hashimoto(
340
+ header_hash: Hash32,
341
+ nonce: Bytes8,
342
+ dataset_size: Uint,
343
+ fetch_dataset_item: Callable[[Uint], Tuple[U32, ...]],
344
+ ) -> Tuple[Bytes, Hash32]:
345
+ """
346
+ Obtain the mix digest and the final value for a header, by aggregating
347
+ data from the full dataset.
348
+
349
+ #### Parameters
350
+
351
+ - `header_hash` is a valid RLP hash of a block header.
352
+ - `nonce` is the propagated nonce for the given block.
353
+ - `dataset_size` is the size of the dataset. See [`dataset_size`].
354
+ - `fetch_dataset_item` is a function that retrieves a specific dataset item
355
+ based on its index.
356
+
357
+ #### Returns
358
+
359
+ - The mix digest generated from the header hash and propagated nonce.
360
+ - The final result obtained which will be checked for leading zeros (in
361
+ byte representation) in correspondence with the block difficulty.
362
+
363
+ [`dataset_size`]: ref:ethereum.ethash.dataset_size
364
+ """
365
+ nonce_le = Bytes(reversed(nonce))
366
+ seed_hash = keccak512(header_hash + nonce_le)
367
+ seed_head = U32.from_le_bytes(seed_hash[:4])
368
+
369
+ rows = dataset_size // Uint(128)
370
+ mix = le_bytes_to_uint32_sequence(seed_hash) * (MIX_BYTES // HASH_BYTES)
371
+
372
+ for i in range(HASHIMOTO_ACCESSES):
373
+ new_data: Tuple[U32, ...] = ()
374
+ parent = fnv(U32(i) ^ seed_head, mix[i % len(mix)]) % U32(rows)
375
+ for j in range(MIX_BYTES // HASH_BYTES):
376
+ # Typecasting `parent` from U32 to Uint as 2*parent + j may
377
+ # overflow U32.
378
+ new_data += fetch_dataset_item(Uint(2) * Uint(parent) + Uint(j))
379
+
380
+ mix = fnv_hash(mix, new_data)
381
+
382
+ compressed_mix = []
383
+ for i in range(0, len(mix), 4):
384
+ compressed_mix.append(
385
+ fnv(fnv(fnv(mix[i], mix[i + 1]), mix[i + 2]), mix[i + 3])
386
+ )
387
+
388
+ mix_digest = le_uint32_sequence_to_bytes(compressed_mix)
389
+ result = keccak256(seed_hash + mix_digest)
390
+
391
+ return mix_digest, result
392
+
393
+
394
+ def hashimoto_light(
395
+ header_hash: Hash32,
396
+ nonce: Bytes8,
397
+ cache: Tuple[Tuple[U32, ...], ...],
398
+ dataset_size: Uint,
399
+ ) -> Tuple[Bytes, Hash32]:
400
+ """
401
+ Run the [`hashimoto`] algorithm by generating dataset item using the cache
402
+ instead of loading the full dataset into main memory.
403
+
404
+ #### Parameters
405
+
406
+ - `header_hash` is a valid RLP hash of a block header.
407
+ - `nonce` is the propagated nonce for the given block.
408
+ - `cache` is the cache generated by [`generate_cache`].
409
+ - `dataset_size` is the size of the dataset. See [`dataset_size`].
410
+
411
+ #### Returns
412
+
413
+ - The mix digest generated from the header hash and propagated nonce.
414
+ - The final result obtained which will be checked for leading zeros (in
415
+ byte representation) in correspondence with the block difficulty.
416
+
417
+ [`dataset_size`]: ref:ethereum.ethash.dataset_size
418
+ [`generate_cache`]: ref:ethereum.ethash.generate_cache
419
+ [`hashimoto`]: ref:ethereum.ethash.hashimoto
420
+ """
421
+
422
+ def fetch_dataset_item(index: Uint) -> Tuple[U32, ...]:
423
+ item: Hash64 = generate_dataset_item(cache, index)
424
+ return le_bytes_to_uint32_sequence(item)
425
+
426
+ return hashimoto(header_hash, nonce, dataset_size, fetch_dataset_item)
ethereum/exceptions.py ADDED
@@ -0,0 +1,75 @@
1
+ """
2
+ Error types common across all Ethereum forks.
3
+ """
4
+
5
+
6
+ class EthereumException(Exception): # noqa N818
7
+ """
8
+ Base class for all exceptions _expected_ to be thrown during normal
9
+ operation.
10
+ """
11
+
12
+
13
+ class InvalidBlock(EthereumException):
14
+ """
15
+ Thrown when a block being processed is found to be invalid.
16
+ """
17
+
18
+
19
+ class StateWithEmptyAccount(EthereumException):
20
+ """
21
+ Thrown when the state has empty account.
22
+ """
23
+
24
+
25
+ class InvalidTransaction(EthereumException):
26
+ """
27
+ Thrown when a transaction being processed is found to be invalid.
28
+ """
29
+
30
+
31
+ class InvalidSenderError(InvalidTransaction):
32
+ """
33
+ Thrown when a transaction originates from an account that cannot send
34
+ transactions.
35
+ """
36
+
37
+
38
+ class InvalidSignatureError(InvalidTransaction):
39
+ """
40
+ Thrown when a transaction has an invalid signature.
41
+ """
42
+
43
+
44
+ class InsufficientBalanceError(InvalidTransaction):
45
+ """
46
+ Thrown when a transaction cannot be executed due to insufficient sender
47
+ funds.
48
+ """
49
+
50
+
51
+ class NonceMismatchError(InvalidTransaction):
52
+ """
53
+ Thrown when a transaction's nonce does not match the expected nonce for the
54
+ sender.
55
+ """
56
+
57
+
58
+ class GasUsedExceedsLimitError(InvalidTransaction):
59
+ """
60
+ Thrown when a transaction's gas usage exceeds the gas available in the
61
+ block.
62
+ """
63
+
64
+
65
+ class InsufficientTransactionGasError(InvalidTransaction):
66
+ """
67
+ Thrown when a transaction does not provide enough gas to cover its
68
+ intrinsic cost.
69
+ """
70
+
71
+
72
+ class NonceOverflowError(InvalidTransaction):
73
+ """
74
+ Thrown when a transaction's nonce is greater than `2**64 - 2`.
75
+ """
@@ -0,0 +1,205 @@
1
+ """
2
+ Activation criteria for forks.
3
+
4
+ Most generally, a _fork_ is a divergence in a blockchain resulting in multiple
5
+ tips. Most forks are short lived, and can be caused by networking issues or the
6
+ behavior of block creators. These short-lived forks resolve themselves
7
+ according to the rules of the protocol, eventually settling back to a single
8
+ tip of the chain.
9
+
10
+ A second class of forks are intentionally created by changing the rules of the
11
+ protocol, and never resolve back to a single tip. Older software will continue
12
+ to follow the original fork, while updated software will create and follow a
13
+ new fork.
14
+
15
+ For these intentional forks to succeed, all participants need to agree on
16
+ exactly when to switch rules. The agreed upon criteria are represented by
17
+ subclasses of [`ForkCriteria`], like [`ByBlockNumber`] and [`ByTimestamp`]. The
18
+ special type of [`Unscheduled`] is used for forks in active development that do
19
+ not yet have a scheduled deployment.
20
+
21
+ [`ForkCriteria`]: ref:ethereum.fork_criteria.ForkCriteria
22
+ [`ByBlockNumber`]: ref:ethereum.fork_criteria.ByBlockNumber
23
+ [`ByTimestamp`]: ref:ethereum.fork_criteria.ByTimestamp
24
+ [`Unscheduled`]: ref:ethereum.fork_criteria.Unscheduled
25
+ """
26
+
27
+ import functools
28
+ from abc import ABC, abstractmethod
29
+ from typing import Final, Literal, SupportsInt, Tuple
30
+
31
+ from ethereum_types.numeric import U256, Uint
32
+ from typing_extensions import override
33
+
34
+
35
+ @functools.total_ordering
36
+ class ForkCriteria(ABC):
37
+ """
38
+ Abstract base class for conditions specifying when a fork activates.
39
+
40
+ Subclasses override the comparison methods ([`__eq__`] and [`__lt__`]) to
41
+ provide an ordering for forks, and override [`check`] to determine whether
42
+ a particular block meets the activation criteria.
43
+
44
+ [`__eq__`]: ref:ethereum.fork_criteria.ForkCriteria.__eq__
45
+ [`__lt__`]: ref:ethereum.fork_criteria.ForkCriteria.__lt__
46
+ [`check`]: ref:ethereum.fork_criteria.ForkCriteria.check
47
+ """
48
+
49
+ BLOCK_NUMBER: Final[int] = 0
50
+ """
51
+ Value representing a fork criteria based on the block's number.
52
+
53
+ Used for pre-merge blocks.
54
+ """
55
+
56
+ TIMESTAMP: Final[int] = 1
57
+ """
58
+ Value representing a fork criteria based on the block's timestamp.
59
+
60
+ Used for post-merge blocks.
61
+ """
62
+
63
+ UNSCHEDULED: Final[int] = 2
64
+ """
65
+ Value representing a fork criteria that will never be satisfied.
66
+
67
+ Used for in-development forks.
68
+ """
69
+
70
+ _internal: Tuple[int, int]
71
+
72
+ def __eq__(self, other: object) -> bool:
73
+ """
74
+ Equality for fork criteria.
75
+ """
76
+ if isinstance(other, ForkCriteria):
77
+ return self._internal == other._internal
78
+ return NotImplemented
79
+
80
+ def __lt__(self, other: object) -> bool:
81
+ """
82
+ Less-than comparison function, with earlier forks being less than later
83
+ forks.
84
+
85
+ All [`BLOCK_NUMBER`] forks come before [`TIMESTAMP`] forks, and all
86
+ scheduled forks come before [`UNSCHEDULED`] forks.
87
+
88
+ [`BLOCK_NUMBER`]: ref:ethereum.fork_criteria.ForkCriteria.BLOCK_NUMBER
89
+ [`TIMESTAMP`]: ref:ethereum.fork_criteria.ForkCriteria.TIMESTAMP
90
+ [`UNSCHEDULED`]: ref:ethereum.fork_criteria.ForkCriteria.UNSCHEDULED
91
+ """
92
+ if isinstance(other, ForkCriteria):
93
+ return self._internal < other._internal
94
+ return NotImplemented
95
+
96
+ def __hash__(self) -> int:
97
+ """
98
+ Compute a hash for this instance, so it can be stored in dictionaries.
99
+ """
100
+ return hash(self._internal)
101
+
102
+ @abstractmethod
103
+ def check(self, block_number: Uint, timestamp: U256) -> bool:
104
+ """
105
+ Check whether fork criteria have been met.
106
+
107
+ Returns `True` when the current block meets or exceeds the criteria,
108
+ and `False` otherwise.
109
+ """
110
+ raise NotImplementedError()
111
+
112
+ @abstractmethod
113
+ def __repr__(self) -> str:
114
+ """
115
+ String representation of this object.
116
+ """
117
+ raise NotImplementedError()
118
+
119
+
120
+ class ByBlockNumber(ForkCriteria):
121
+ """
122
+ Forks that occur when a specific block number has been reached.
123
+ """
124
+
125
+ block_number: Uint
126
+ """
127
+ Number of the first block in this fork.
128
+ """
129
+
130
+ def __init__(self, block_number: SupportsInt):
131
+ self._internal = (ForkCriteria.BLOCK_NUMBER, int(block_number))
132
+ self.block_number = Uint(int(block_number))
133
+
134
+ @override
135
+ def check(self, block_number: Uint, timestamp: U256) -> bool:
136
+ """
137
+ Check whether the block number has been reached.
138
+
139
+ Returns `True` when the given `block_number` is equal to or greater
140
+ than [`block_number`], and `False` otherwise.
141
+
142
+ [`block_number`]: ref:ethereum.fork_criteria.ByBlockNumber.block_number
143
+ """
144
+ return block_number >= self.block_number
145
+
146
+ def __repr__(self) -> str:
147
+ """
148
+ String representation of this object.
149
+ """
150
+ return f"ByBlockNumber({self.block_number})"
151
+
152
+
153
+ class ByTimestamp(ForkCriteria):
154
+ """
155
+ Forks that occur when a specific timestamp has been reached.
156
+ """
157
+
158
+ timestamp: U256
159
+ """
160
+ First instance of time that is part of this fork.
161
+ """
162
+
163
+ def __init__(self, timestamp: SupportsInt):
164
+ self._internal = (ForkCriteria.TIMESTAMP, int(timestamp))
165
+ self.timestamp = U256(timestamp)
166
+
167
+ @override
168
+ def check(self, block_number: Uint, timestamp: U256) -> bool:
169
+ """
170
+ Check whether the timestamp has been reached.
171
+
172
+ Returns `True` when the given `timestamp` is equal to or greater than
173
+ [`timestamp`], and `False` otherwise.
174
+
175
+ [`timestamp`]: ref:ethereum.fork_criteria.ByTimestamp.timestamp
176
+ """
177
+ return timestamp >= self.timestamp
178
+
179
+ def __repr__(self) -> str:
180
+ """
181
+ String representation of this object.
182
+ """
183
+ return f"ByTimestamp({self.timestamp})"
184
+
185
+
186
+ class Unscheduled(ForkCriteria):
187
+ """
188
+ Forks that have not been scheduled.
189
+ """
190
+
191
+ def __init__(self, order_index: int = 0) -> None:
192
+ self._internal = (ForkCriteria.UNSCHEDULED, order_index)
193
+
194
+ @override
195
+ def check(self, block_number: Uint, timestamp: U256) -> Literal[False]:
196
+ """
197
+ Unscheduled forks never occur; always returns `False`.
198
+ """
199
+ return False
200
+
201
+ def __repr__(self) -> str:
202
+ """
203
+ String representation of this object.
204
+ """
205
+ return f"Unscheduled(order_index={self._internal[1]})"