chia-blockchain 2.5.1rc1__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 (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -0,0 +1,1059 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import time
5
+ from typing import Optional
6
+
7
+ from chia_rs import AugSchemeMPL
8
+
9
+ from chia.consensus.block_record import BlockRecord
10
+ from chia.consensus.blockchain_interface import BlockRecordsProtocol
11
+ from chia.consensus.constants import ConsensusConstants
12
+ from chia.consensus.deficit import calculate_deficit
13
+ from chia.consensus.difficulty_adjustment import can_finish_sub_and_full_epoch
14
+ from chia.consensus.get_block_challenge import final_eos_is_already_included, get_block_challenge
15
+ from chia.consensus.make_sub_epoch_summary import make_sub_epoch_summary
16
+ from chia.consensus.pot_iterations import (
17
+ calculate_ip_iters,
18
+ calculate_iterations_quality,
19
+ calculate_sp_interval_iters,
20
+ calculate_sp_iters,
21
+ is_overflow_block,
22
+ )
23
+ from chia.consensus.vdf_info_computation import get_signage_point_vdf_info
24
+ from chia.types.blockchain_format.classgroup import ClassgroupElement
25
+ from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
26
+ from chia.types.blockchain_format.sized_bytes import bytes32
27
+ from chia.types.blockchain_format.slots import ChallengeChainSubSlot, RewardChainSubSlot, SubSlotProofs
28
+ from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
29
+ from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
30
+ from chia.types.header_block import HeaderBlock
31
+ from chia.types.unfinished_header_block import UnfinishedHeaderBlock
32
+ from chia.types.validation_state import ValidationState
33
+ from chia.util.errors import Err, ValidationError
34
+ from chia.util.hash import std_hash
35
+ from chia.util.ints import uint8, uint32, uint64, uint128
36
+
37
+ log = logging.getLogger(__name__)
38
+
39
+
40
+ # noinspection PyCallByClass
41
+ def validate_unfinished_header_block(
42
+ constants: ConsensusConstants,
43
+ blocks: BlockRecordsProtocol,
44
+ header_block: UnfinishedHeaderBlock,
45
+ check_filter: bool,
46
+ expected_vs: ValidationState,
47
+ skip_overflow_last_ss_validation: bool = False,
48
+ skip_vdf_is_valid: bool = False,
49
+ check_sub_epoch_summary: bool = True,
50
+ ) -> tuple[Optional[uint64], Optional[ValidationError]]:
51
+ """
52
+ Validates an unfinished header block. This is a block without the infusion VDFs (unfinished)
53
+ and without transactions and transaction info (header). Returns (required_iters, error).
54
+
55
+ This method is meant to validate only the unfinished part of the block. However, the finished_sub_slots
56
+ refers to all sub-slots that were finishes from the previous block's infusion point, up to this blocks
57
+ infusion point. Therefore, in the case where this is an overflow block, and the last sub-slot is not yet
58
+ released, header_block.finished_sub_slots will be missing one sub-slot. In this case,
59
+ skip_overflow_last_ss_validation must be set to True. This will skip validation of end of slots, sub-epochs,
60
+ and lead to other small tweaks in validation.
61
+ """
62
+ # 1. Check that the previous block exists in the blockchain, or that it is correct
63
+
64
+ prev_b = blocks.try_block_record(header_block.prev_header_hash)
65
+ genesis_block = prev_b is None
66
+ if genesis_block and header_block.prev_header_hash != constants.GENESIS_CHALLENGE:
67
+ return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)
68
+
69
+ overflow = is_overflow_block(constants, header_block.reward_chain_block.signage_point_index)
70
+ if skip_overflow_last_ss_validation and overflow:
71
+ if final_eos_is_already_included(header_block, blocks, expected_vs.ssi):
72
+ skip_overflow_last_ss_validation = False
73
+ finished_sub_slots_since_prev = len(header_block.finished_sub_slots)
74
+ else:
75
+ finished_sub_slots_since_prev = len(header_block.finished_sub_slots) + 1
76
+ else:
77
+ finished_sub_slots_since_prev = len(header_block.finished_sub_slots)
78
+
79
+ new_sub_slot: bool = finished_sub_slots_since_prev > 0
80
+
81
+ can_finish_se: bool = False
82
+ can_finish_epoch: bool = False
83
+ if genesis_block:
84
+ height: uint32 = uint32(0)
85
+ assert expected_vs.difficulty == constants.DIFFICULTY_STARTING
86
+ assert expected_vs.ssi == constants.SUB_SLOT_ITERS_STARTING
87
+ else:
88
+ assert prev_b is not None
89
+ height = uint32(prev_b.height + 1)
90
+ if new_sub_slot:
91
+ can_finish_se, can_finish_epoch = can_finish_sub_and_full_epoch(
92
+ constants,
93
+ blocks,
94
+ prev_b.height,
95
+ prev_b.prev_hash,
96
+ prev_b.deficit,
97
+ prev_b.sub_epoch_summary_included is not None,
98
+ prev_ses_block=expected_vs.prev_ses_block,
99
+ )
100
+ else:
101
+ can_finish_se = False
102
+ can_finish_epoch = False
103
+
104
+ # 2. Check finished slots that have been crossed since prev_b
105
+ ses_hash: Optional[bytes32] = None
106
+ if new_sub_slot and not skip_overflow_last_ss_validation:
107
+ # Finished a slot(s) since previous block. The first sub-slot must have at least one block, and all
108
+ # subsequent sub-slots must be empty
109
+ for finished_sub_slot_n, sub_slot in enumerate(header_block.finished_sub_slots):
110
+ # Start of slot challenge is fetched from SP
111
+ challenge_hash: bytes32 = sub_slot.challenge_chain.challenge_chain_end_of_slot_vdf.challenge
112
+
113
+ if finished_sub_slot_n == 0:
114
+ if genesis_block:
115
+ # 2a. check sub-slot challenge hash for genesis block
116
+ if challenge_hash != constants.GENESIS_CHALLENGE:
117
+ return None, ValidationError(Err.INVALID_PREV_CHALLENGE_SLOT_HASH)
118
+ else:
119
+ assert prev_b is not None
120
+ curr: BlockRecord = prev_b
121
+ while not curr.first_in_sub_slot:
122
+ curr = blocks.block_record(curr.prev_hash)
123
+ assert curr.finished_challenge_slot_hashes is not None
124
+
125
+ # 2b. check sub-slot challenge hash for non-genesis block
126
+ if not curr.finished_challenge_slot_hashes[-1] == challenge_hash:
127
+ print(curr.finished_challenge_slot_hashes[-1], challenge_hash)
128
+ return None, ValidationError(Err.INVALID_PREV_CHALLENGE_SLOT_HASH)
129
+ else:
130
+ # 2c. check sub-slot challenge hash for empty slot
131
+ if (
132
+ not header_block.finished_sub_slots[finished_sub_slot_n - 1].challenge_chain.get_hash()
133
+ == challenge_hash
134
+ ):
135
+ return None, ValidationError(Err.INVALID_PREV_CHALLENGE_SLOT_HASH)
136
+
137
+ if genesis_block:
138
+ # 2d. Validate that genesis block has no ICC
139
+ if sub_slot.infused_challenge_chain is not None:
140
+ return None, ValidationError(Err.SHOULD_NOT_HAVE_ICC)
141
+ else:
142
+ assert prev_b is not None
143
+ icc_iters_committed: Optional[uint64] = None
144
+ icc_iters_proof: Optional[uint64] = None
145
+ icc_challenge_hash: Optional[bytes32] = None
146
+ icc_vdf_input = None
147
+ if prev_b.deficit < constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK:
148
+ # There should be no ICC chain if the last block's deficit is 16
149
+ # Prev sb's deficit is 0, 1, 2, 3, or 4
150
+ if finished_sub_slot_n == 0:
151
+ # This is the first sub slot after the last sb, which must have deficit 1-4, and thus an ICC
152
+ curr = prev_b
153
+ while not curr.is_challenge_block(constants) and not curr.first_in_sub_slot:
154
+ curr = blocks.block_record(curr.prev_hash)
155
+ if curr.is_challenge_block(constants):
156
+ icc_challenge_hash = curr.challenge_block_info_hash
157
+ icc_iters_committed = uint64(prev_b.sub_slot_iters - curr.ip_iters(constants))
158
+ else:
159
+ assert curr.finished_infused_challenge_slot_hashes is not None
160
+ icc_challenge_hash = curr.finished_infused_challenge_slot_hashes[-1]
161
+ icc_iters_committed = prev_b.sub_slot_iters
162
+ icc_iters_proof = uint64(prev_b.sub_slot_iters - prev_b.ip_iters(constants))
163
+ if prev_b.is_challenge_block(constants):
164
+ icc_vdf_input = ClassgroupElement.get_default_element()
165
+ else:
166
+ icc_vdf_input = prev_b.infused_challenge_vdf_output
167
+ else:
168
+ # This is not the first sub slot after the last block, so we might not have an ICC
169
+ if (
170
+ header_block.finished_sub_slots[finished_sub_slot_n - 1].reward_chain.deficit
171
+ < constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK
172
+ ):
173
+ finished_ss = header_block.finished_sub_slots[finished_sub_slot_n - 1]
174
+ assert finished_ss.infused_challenge_chain is not None
175
+
176
+ # Only sets the icc iff the previous sub slots deficit is 4 or less
177
+ icc_challenge_hash = finished_ss.infused_challenge_chain.get_hash()
178
+ icc_iters_committed = prev_b.sub_slot_iters
179
+ icc_iters_proof = icc_iters_committed
180
+ icc_vdf_input = ClassgroupElement.get_default_element()
181
+
182
+ # 2e. Validate that there is not icc iff icc_challenge hash is None
183
+ assert (sub_slot.infused_challenge_chain is None) == (icc_challenge_hash is None)
184
+ if sub_slot.infused_challenge_chain is not None:
185
+ assert icc_vdf_input is not None
186
+ assert icc_iters_proof is not None
187
+ assert icc_iters_committed is not None
188
+ assert icc_challenge_hash is not None
189
+ assert sub_slot.proofs.infused_challenge_chain_slot_proof is not None
190
+ # 2f. Check infused challenge chain sub-slot VDF
191
+ # Only validate from prev_b to optimize
192
+ target_vdf_info = VDFInfo(
193
+ icc_challenge_hash,
194
+ icc_iters_proof,
195
+ sub_slot.infused_challenge_chain.infused_challenge_chain_end_of_slot_vdf.output,
196
+ )
197
+ if (
198
+ sub_slot.infused_challenge_chain.infused_challenge_chain_end_of_slot_vdf
199
+ != target_vdf_info.replace(number_of_iterations=icc_iters_committed)
200
+ ):
201
+ return None, ValidationError(Err.INVALID_ICC_EOS_VDF)
202
+ if not skip_vdf_is_valid:
203
+ if (
204
+ not sub_slot.proofs.infused_challenge_chain_slot_proof.normalized_to_identity
205
+ and not validate_vdf(
206
+ sub_slot.proofs.infused_challenge_chain_slot_proof,
207
+ constants,
208
+ icc_vdf_input,
209
+ target_vdf_info,
210
+ None,
211
+ )
212
+ ):
213
+ return None, ValidationError(Err.INVALID_ICC_EOS_VDF)
214
+ if (
215
+ sub_slot.proofs.infused_challenge_chain_slot_proof.normalized_to_identity
216
+ and not validate_vdf(
217
+ sub_slot.proofs.infused_challenge_chain_slot_proof,
218
+ constants,
219
+ ClassgroupElement.get_default_element(),
220
+ sub_slot.infused_challenge_chain.infused_challenge_chain_end_of_slot_vdf,
221
+ )
222
+ ):
223
+ return None, ValidationError(Err.INVALID_ICC_EOS_VDF)
224
+
225
+ if sub_slot.reward_chain.deficit == constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK:
226
+ # 2g. Check infused challenge sub-slot hash in challenge chain, deficit 16
227
+ if (
228
+ sub_slot.infused_challenge_chain.get_hash()
229
+ != sub_slot.challenge_chain.infused_challenge_chain_sub_slot_hash
230
+ ):
231
+ return None, ValidationError(Err.INVALID_ICC_HASH_CC)
232
+ else:
233
+ # 2h. Check infused challenge sub-slot hash not included for other deficits
234
+ if sub_slot.challenge_chain.infused_challenge_chain_sub_slot_hash is not None:
235
+ return None, ValidationError(Err.INVALID_ICC_HASH_CC)
236
+
237
+ # 2i. Check infused challenge sub-slot hash in reward sub-slot
238
+ if (
239
+ sub_slot.infused_challenge_chain.get_hash()
240
+ != sub_slot.reward_chain.infused_challenge_chain_sub_slot_hash
241
+ ):
242
+ return None, ValidationError(Err.INVALID_ICC_HASH_RC)
243
+ else:
244
+ # 2j. If no icc, check that the cc doesn't include it
245
+ if sub_slot.challenge_chain.infused_challenge_chain_sub_slot_hash is not None:
246
+ return None, ValidationError(Err.INVALID_ICC_HASH_CC)
247
+
248
+ # 2k. If no icc, check that the cc doesn't include it
249
+ if sub_slot.reward_chain.infused_challenge_chain_sub_slot_hash is not None:
250
+ return None, ValidationError(Err.INVALID_ICC_HASH_RC)
251
+
252
+ if sub_slot.challenge_chain.subepoch_summary_hash is not None:
253
+ assert ses_hash is None # Only one of the slots can have it
254
+ ses_hash = sub_slot.challenge_chain.subepoch_summary_hash
255
+
256
+ # 2l. check sub-epoch summary hash is None for empty slots
257
+ if finished_sub_slot_n != 0:
258
+ if sub_slot.challenge_chain.subepoch_summary_hash is not None:
259
+ return None, ValidationError(Err.INVALID_SUB_EPOCH_SUMMARY_HASH)
260
+
261
+ if can_finish_epoch and sub_slot.challenge_chain.subepoch_summary_hash is not None:
262
+ # 2m. Check new difficulty and ssi
263
+ if sub_slot.challenge_chain.new_sub_slot_iters != expected_vs.ssi:
264
+ return None, ValidationError(Err.INVALID_NEW_SUB_SLOT_ITERS)
265
+ if sub_slot.challenge_chain.new_difficulty != expected_vs.difficulty:
266
+ return None, ValidationError(Err.INVALID_NEW_DIFFICULTY)
267
+ else:
268
+ # 2n. Check new difficulty and ssi are None if we don't finish epoch
269
+ if sub_slot.challenge_chain.new_sub_slot_iters is not None:
270
+ return None, ValidationError(Err.INVALID_NEW_SUB_SLOT_ITERS)
271
+ if sub_slot.challenge_chain.new_difficulty is not None:
272
+ return None, ValidationError(Err.INVALID_NEW_DIFFICULTY)
273
+
274
+ # 2o. Check challenge sub-slot hash in reward sub-slot
275
+ if sub_slot.challenge_chain.get_hash() != sub_slot.reward_chain.challenge_chain_sub_slot_hash:
276
+ return (
277
+ None,
278
+ ValidationError(
279
+ Err.INVALID_CHALLENGE_SLOT_HASH_RC,
280
+ "sub-slot hash in reward sub-slot mismatch",
281
+ ),
282
+ )
283
+
284
+ eos_vdf_iters: uint64 = expected_vs.ssi
285
+ cc_start_element: ClassgroupElement = ClassgroupElement.get_default_element()
286
+ cc_eos_vdf_challenge: bytes32 = challenge_hash
287
+ if genesis_block:
288
+ if finished_sub_slot_n == 0:
289
+ # First block, one empty slot. prior_point is the initial challenge
290
+ rc_eos_vdf_challenge: bytes32 = constants.GENESIS_CHALLENGE
291
+ cc_eos_vdf_challenge = constants.GENESIS_CHALLENGE
292
+ else:
293
+ # First block, but have at least two empty slots
294
+ rc_eos_vdf_challenge = header_block.finished_sub_slots[
295
+ finished_sub_slot_n - 1
296
+ ].reward_chain.get_hash()
297
+ else:
298
+ assert prev_b is not None
299
+ if finished_sub_slot_n == 0:
300
+ # No empty slots, so the starting point of VDF is the last reward block. Uses
301
+ # the same IPS as the previous block, since it's the same slot
302
+ rc_eos_vdf_challenge = prev_b.reward_infusion_new_challenge
303
+ eos_vdf_iters = uint64(prev_b.sub_slot_iters - prev_b.ip_iters(constants))
304
+ cc_start_element = prev_b.challenge_vdf_output
305
+ else:
306
+ # At least one empty slot, so use previous slot hash. IPS might change because it's a new slot
307
+ rc_eos_vdf_challenge = header_block.finished_sub_slots[
308
+ finished_sub_slot_n - 1
309
+ ].reward_chain.get_hash()
310
+
311
+ # 2p. Check end of reward slot VDF
312
+ target_vdf_info = VDFInfo(
313
+ rc_eos_vdf_challenge,
314
+ eos_vdf_iters,
315
+ sub_slot.reward_chain.end_of_slot_vdf.output,
316
+ )
317
+ if not skip_vdf_is_valid and not validate_vdf(
318
+ sub_slot.proofs.reward_chain_slot_proof,
319
+ constants,
320
+ ClassgroupElement.get_default_element(),
321
+ sub_slot.reward_chain.end_of_slot_vdf,
322
+ target_vdf_info,
323
+ ):
324
+ return None, ValidationError(Err.INVALID_RC_EOS_VDF)
325
+
326
+ # 2q. Check challenge chain sub-slot VDF
327
+ partial_cc_vdf_info = VDFInfo(
328
+ cc_eos_vdf_challenge,
329
+ eos_vdf_iters,
330
+ sub_slot.challenge_chain.challenge_chain_end_of_slot_vdf.output,
331
+ )
332
+ if genesis_block:
333
+ cc_eos_vdf_info_iters = constants.SUB_SLOT_ITERS_STARTING
334
+ else:
335
+ assert prev_b is not None
336
+ if finished_sub_slot_n == 0:
337
+ cc_eos_vdf_info_iters = prev_b.sub_slot_iters
338
+ else:
339
+ cc_eos_vdf_info_iters = expected_vs.ssi
340
+ # Check that the modified data is correct
341
+ if sub_slot.challenge_chain.challenge_chain_end_of_slot_vdf != partial_cc_vdf_info.replace(
342
+ number_of_iterations=cc_eos_vdf_info_iters
343
+ ):
344
+ return None, ValidationError(Err.INVALID_CC_EOS_VDF, "wrong challenge chain end of slot vdf")
345
+
346
+ if not skip_vdf_is_valid:
347
+ # Pass in None for target info since we are only checking the proof from the temporary point,
348
+ # but the challenge_chain_end_of_slot_vdf actually starts from the start of slot (for light clients)
349
+ if not sub_slot.proofs.challenge_chain_slot_proof.normalized_to_identity and not validate_vdf(
350
+ sub_slot.proofs.challenge_chain_slot_proof, constants, cc_start_element, partial_cc_vdf_info, None
351
+ ):
352
+ return None, ValidationError(Err.INVALID_CC_EOS_VDF)
353
+ if sub_slot.proofs.challenge_chain_slot_proof.normalized_to_identity and not validate_vdf(
354
+ sub_slot.proofs.challenge_chain_slot_proof,
355
+ constants,
356
+ ClassgroupElement.get_default_element(),
357
+ sub_slot.challenge_chain.challenge_chain_end_of_slot_vdf,
358
+ ):
359
+ return None, ValidationError(Err.INVALID_CC_EOS_VDF)
360
+
361
+ if genesis_block:
362
+ # 2r. Check deficit (MIN_SUB.. deficit edge case for genesis block)
363
+ if sub_slot.reward_chain.deficit != constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK:
364
+ return (
365
+ None,
366
+ ValidationError(
367
+ Err.INVALID_DEFICIT,
368
+ f"genesis, expected deficit {constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK}",
369
+ ),
370
+ )
371
+ else:
372
+ assert prev_b is not None
373
+ if prev_b.deficit == 0:
374
+ # 2s. If prev sb had deficit 0, resets deficit to MIN_BLOCK_PER_CHALLENGE_BLOCK
375
+ if sub_slot.reward_chain.deficit != constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK:
376
+ log.error(
377
+ constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK,
378
+ )
379
+ return (
380
+ None,
381
+ ValidationError(
382
+ Err.INVALID_DEFICIT,
383
+ f"expected deficit {constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK}, saw "
384
+ f"{sub_slot.reward_chain.deficit}",
385
+ ),
386
+ )
387
+ else:
388
+ # 2t. Otherwise, deficit stays the same at the slot ends, cannot reset until 0
389
+ if sub_slot.reward_chain.deficit != prev_b.deficit:
390
+ return None, ValidationError(Err.INVALID_DEFICIT, "deficit is wrong at slot end")
391
+
392
+ # 3. Check sub-epoch summary
393
+ # Note that the subepoch summary is the summary of the previous subepoch (not the one that just finished)
394
+ if not skip_overflow_last_ss_validation:
395
+ if ses_hash is not None:
396
+ # 3a. Check that genesis block does not have sub-epoch summary
397
+ if genesis_block:
398
+ return (
399
+ None,
400
+ ValidationError(
401
+ Err.INVALID_SUB_EPOCH_SUMMARY_HASH,
402
+ "genesis with sub-epoch-summary hash",
403
+ ),
404
+ )
405
+ assert prev_b is not None
406
+
407
+ # 3b. Check that we finished a slot and we finished a sub-epoch
408
+ if not new_sub_slot or not can_finish_se:
409
+ return (
410
+ None,
411
+ ValidationError(
412
+ Err.INVALID_SUB_EPOCH_SUMMARY_HASH,
413
+ f"new sub-slot: {new_sub_slot} finishes sub-epoch {can_finish_se}",
414
+ ),
415
+ )
416
+
417
+ # 3c. Check the actual sub-epoch is correct
418
+ if check_sub_epoch_summary:
419
+ expected_sub_epoch_summary = make_sub_epoch_summary(
420
+ constants,
421
+ blocks,
422
+ height,
423
+ blocks.block_record(prev_b.prev_hash),
424
+ expected_vs.difficulty if can_finish_epoch else None,
425
+ expected_vs.ssi if can_finish_epoch else None,
426
+ expected_vs.prev_ses_block,
427
+ )
428
+ expected_hash = expected_sub_epoch_summary.get_hash()
429
+ if expected_hash != ses_hash:
430
+ log.error(f"{expected_sub_epoch_summary}")
431
+ return (
432
+ None,
433
+ ValidationError(
434
+ Err.INVALID_SUB_EPOCH_SUMMARY,
435
+ f"expected ses hash: {expected_hash} got {ses_hash} ",
436
+ ),
437
+ )
438
+ elif new_sub_slot and not genesis_block:
439
+ # 3d. Check that we don't have to include a sub-epoch summary
440
+ if can_finish_se or can_finish_epoch:
441
+ return (
442
+ None,
443
+ ValidationError(
444
+ Err.INVALID_SUB_EPOCH_SUMMARY,
445
+ "block finishes sub-epoch but ses-hash is None",
446
+ ),
447
+ )
448
+
449
+ # 4. Check if the number of blocks is less than the max
450
+ if not new_sub_slot and not genesis_block:
451
+ assert prev_b is not None
452
+ num_blocks = 2 # This includes the current block and the prev block
453
+ curr = prev_b
454
+ while not curr.first_in_sub_slot:
455
+ num_blocks += 1
456
+ curr = blocks.block_record(curr.prev_hash)
457
+ if num_blocks > constants.MAX_SUB_SLOT_BLOCKS:
458
+ return None, ValidationError(Err.TOO_MANY_BLOCKS)
459
+
460
+ # If block state is correct, we should always find a challenge here
461
+ # This computes what the challenge should be for this block
462
+
463
+ challenge = get_block_challenge(
464
+ constants,
465
+ header_block,
466
+ blocks,
467
+ genesis_block,
468
+ overflow,
469
+ skip_overflow_last_ss_validation,
470
+ )
471
+
472
+ # 5a. Check proof of space
473
+ if challenge != header_block.reward_chain_block.pos_ss_cc_challenge_hash:
474
+ log.error(f"Finished slots: {header_block.finished_sub_slots}")
475
+ log.error(
476
+ f"Data: {genesis_block} {overflow} {skip_overflow_last_ss_validation} {header_block.total_iters} "
477
+ f"{header_block.reward_chain_block.signage_point_index}"
478
+ f"Prev: {prev_b}"
479
+ )
480
+ log.error(f"Challenge {challenge} provided {header_block.reward_chain_block.pos_ss_cc_challenge_hash}")
481
+ return None, ValidationError(Err.INVALID_CC_CHALLENGE)
482
+
483
+ # 5b. Check proof of space
484
+ if header_block.reward_chain_block.challenge_chain_sp_vdf is None:
485
+ # Edge case of first sp (start of slot), where sp_iters == 0
486
+ cc_sp_hash: bytes32 = challenge
487
+ else:
488
+ cc_sp_hash = header_block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
489
+
490
+ q_str: Optional[bytes32] = verify_and_get_quality_string(
491
+ header_block.reward_chain_block.proof_of_space, constants, challenge, cc_sp_hash, height=height
492
+ )
493
+ if q_str is None:
494
+ return None, ValidationError(Err.INVALID_POSPACE)
495
+
496
+ # 6. check signage point index
497
+ # no need to check negative values as this is uint 8
498
+ if header_block.reward_chain_block.signage_point_index >= constants.NUM_SPS_SUB_SLOT:
499
+ return None, ValidationError(Err.INVALID_SP_INDEX)
500
+
501
+ # Note that required iters might be from the previous slot (if we are in an overflow block)
502
+ required_iters: uint64 = calculate_iterations_quality(
503
+ constants.DIFFICULTY_CONSTANT_FACTOR,
504
+ q_str,
505
+ header_block.reward_chain_block.proof_of_space.size,
506
+ expected_vs.difficulty,
507
+ cc_sp_hash,
508
+ )
509
+
510
+ # 7. check required iters
511
+ if required_iters >= calculate_sp_interval_iters(constants, expected_vs.ssi):
512
+ return None, ValidationError(Err.INVALID_REQUIRED_ITERS)
513
+
514
+ # 8a. check signage point index 0 has no cc sp
515
+ if (header_block.reward_chain_block.signage_point_index == 0) != (
516
+ header_block.reward_chain_block.challenge_chain_sp_vdf is None
517
+ ):
518
+ return None, ValidationError(Err.INVALID_SP_INDEX)
519
+
520
+ # 8b. check signage point index 0 has no rc sp
521
+ if (header_block.reward_chain_block.signage_point_index == 0) != (
522
+ header_block.reward_chain_block.reward_chain_sp_vdf is None
523
+ ):
524
+ return None, ValidationError(Err.INVALID_SP_INDEX)
525
+
526
+ sp_iters: uint64 = calculate_sp_iters(
527
+ constants,
528
+ expected_vs.ssi,
529
+ header_block.reward_chain_block.signage_point_index,
530
+ )
531
+
532
+ ip_iters: uint64 = calculate_ip_iters(
533
+ constants,
534
+ expected_vs.ssi,
535
+ header_block.reward_chain_block.signage_point_index,
536
+ required_iters,
537
+ )
538
+ if header_block.reward_chain_block.challenge_chain_sp_vdf is None:
539
+ # Blocks with very low required iters are not overflow blocks
540
+ assert not overflow
541
+
542
+ # 9. Check no overflows in the first sub-slot of a new epoch
543
+ # (although they are OK in the second sub-slot), this is important
544
+ if overflow and can_finish_epoch:
545
+ if finished_sub_slots_since_prev < 2:
546
+ return None, ValidationError(Err.NO_OVERFLOWS_IN_FIRST_SUB_SLOT_NEW_EPOCH)
547
+
548
+ # 10. Check total iters
549
+ if genesis_block:
550
+ total_iters: uint128 = uint128(expected_vs.ssi * finished_sub_slots_since_prev)
551
+ else:
552
+ assert prev_b is not None
553
+ if new_sub_slot:
554
+ total_iters = prev_b.total_iters
555
+ # Add the rest of the slot of prev_b
556
+ total_iters = uint128(total_iters + prev_b.sub_slot_iters - prev_b.ip_iters(constants))
557
+ # Add other empty slots
558
+ total_iters = uint128(total_iters + (expected_vs.ssi * (finished_sub_slots_since_prev - 1)))
559
+ else:
560
+ # Slot iters is guaranteed to be the same for header_block and prev_b
561
+ # This takes the beginning of the slot, and adds ip_iters
562
+ total_iters = uint128(prev_b.total_iters - prev_b.ip_iters(constants))
563
+ total_iters = uint128(total_iters + ip_iters)
564
+ if total_iters != header_block.reward_chain_block.total_iters:
565
+ return (
566
+ None,
567
+ ValidationError(
568
+ Err.INVALID_TOTAL_ITERS,
569
+ f"expected {total_iters} got {header_block.reward_chain_block.total_iters}",
570
+ ),
571
+ )
572
+
573
+ sp_total_iters: uint128 = uint128(total_iters - ip_iters + sp_iters - (expected_vs.ssi if overflow else 0))
574
+ if overflow and skip_overflow_last_ss_validation:
575
+ dummy_vdf_info = VDFInfo(
576
+ bytes32.zeros,
577
+ uint64(1),
578
+ ClassgroupElement.get_default_element(),
579
+ )
580
+ dummy_sub_slot = EndOfSubSlotBundle(
581
+ ChallengeChainSubSlot(dummy_vdf_info, None, None, None, None),
582
+ None,
583
+ RewardChainSubSlot(dummy_vdf_info, bytes32.zeros, None, uint8(0)),
584
+ SubSlotProofs(VDFProof(uint8(0), b"", False), None, VDFProof(uint8(0), b"", False)),
585
+ )
586
+ sub_slots_to_pass_in = [*header_block.finished_sub_slots, dummy_sub_slot]
587
+ else:
588
+ sub_slots_to_pass_in = header_block.finished_sub_slots
589
+ (
590
+ cc_vdf_challenge,
591
+ rc_vdf_challenge,
592
+ cc_vdf_input,
593
+ rc_vdf_input,
594
+ cc_vdf_iters,
595
+ rc_vdf_iters,
596
+ ) = get_signage_point_vdf_info(
597
+ constants,
598
+ sub_slots_to_pass_in,
599
+ overflow,
600
+ prev_b,
601
+ blocks,
602
+ sp_total_iters,
603
+ sp_iters,
604
+ )
605
+
606
+ # 11. Check reward chain sp proof
607
+ if sp_iters != 0:
608
+ assert (
609
+ header_block.reward_chain_block.reward_chain_sp_vdf is not None
610
+ and header_block.reward_chain_sp_proof is not None
611
+ )
612
+ target_vdf_info = VDFInfo(
613
+ rc_vdf_challenge,
614
+ rc_vdf_iters,
615
+ header_block.reward_chain_block.reward_chain_sp_vdf.output,
616
+ )
617
+ if not skip_vdf_is_valid and not validate_vdf(
618
+ header_block.reward_chain_sp_proof,
619
+ constants,
620
+ rc_vdf_input,
621
+ header_block.reward_chain_block.reward_chain_sp_vdf,
622
+ target_vdf_info,
623
+ ):
624
+ return None, ValidationError(Err.INVALID_RC_SP_VDF)
625
+ rc_sp_hash = header_block.reward_chain_block.reward_chain_sp_vdf.output.get_hash()
626
+ else:
627
+ # Edge case of first sp (start of slot), where sp_iters == 0
628
+ assert overflow is not None
629
+ if header_block.reward_chain_block.reward_chain_sp_vdf is not None:
630
+ return None, ValidationError(Err.INVALID_RC_SP_VDF)
631
+ if new_sub_slot:
632
+ rc_sp_hash = header_block.finished_sub_slots[-1].reward_chain.get_hash()
633
+ else:
634
+ if genesis_block:
635
+ rc_sp_hash = constants.GENESIS_CHALLENGE
636
+ else:
637
+ assert prev_b is not None
638
+ curr = prev_b
639
+ while not curr.first_in_sub_slot:
640
+ curr = blocks.block_record(curr.prev_hash)
641
+ assert curr.finished_reward_slot_hashes is not None
642
+ rc_sp_hash = curr.finished_reward_slot_hashes[-1]
643
+
644
+ # 12. Check reward chain sp signature
645
+ if not AugSchemeMPL.verify(
646
+ header_block.reward_chain_block.proof_of_space.plot_public_key,
647
+ rc_sp_hash,
648
+ header_block.reward_chain_block.reward_chain_sp_signature,
649
+ ):
650
+ return None, ValidationError(Err.INVALID_RC_SIGNATURE)
651
+
652
+ # 13. Check cc sp vdf
653
+ if sp_iters != 0:
654
+ assert header_block.reward_chain_block.challenge_chain_sp_vdf is not None
655
+ assert header_block.challenge_chain_sp_proof is not None
656
+ target_vdf_info = VDFInfo(
657
+ cc_vdf_challenge,
658
+ cc_vdf_iters,
659
+ header_block.reward_chain_block.challenge_chain_sp_vdf.output,
660
+ )
661
+
662
+ if header_block.reward_chain_block.challenge_chain_sp_vdf != target_vdf_info.replace(
663
+ number_of_iterations=sp_iters
664
+ ):
665
+ return None, ValidationError(Err.INVALID_CC_SP_VDF)
666
+ if not skip_vdf_is_valid:
667
+ if not header_block.challenge_chain_sp_proof.normalized_to_identity and not validate_vdf(
668
+ header_block.challenge_chain_sp_proof, constants, cc_vdf_input, target_vdf_info, None
669
+ ):
670
+ return None, ValidationError(Err.INVALID_CC_SP_VDF)
671
+ if header_block.challenge_chain_sp_proof.normalized_to_identity and not validate_vdf(
672
+ header_block.challenge_chain_sp_proof,
673
+ constants,
674
+ ClassgroupElement.get_default_element(),
675
+ header_block.reward_chain_block.challenge_chain_sp_vdf,
676
+ ):
677
+ return None, ValidationError(Err.INVALID_CC_SP_VDF)
678
+ else:
679
+ assert overflow is not None
680
+ if header_block.reward_chain_block.challenge_chain_sp_vdf is not None:
681
+ return None, ValidationError(Err.INVALID_CC_SP_VDF)
682
+
683
+ # 14. Check cc sp sig
684
+ if not AugSchemeMPL.verify(
685
+ header_block.reward_chain_block.proof_of_space.plot_public_key,
686
+ cc_sp_hash,
687
+ header_block.reward_chain_block.challenge_chain_sp_signature,
688
+ ):
689
+ return None, ValidationError(Err.INVALID_CC_SIGNATURE, "invalid cc sp sig")
690
+
691
+ # 15. Check is_transaction_block
692
+ if genesis_block:
693
+ if header_block.foliage.foliage_transaction_block_hash is None:
694
+ return None, ValidationError(Err.INVALID_IS_TRANSACTION_BLOCK, "invalid genesis")
695
+ else:
696
+ assert prev_b is not None
697
+ # Finds the previous block
698
+ curr = prev_b
699
+ while not curr.is_transaction_block:
700
+ curr = blocks.block_record(curr.prev_hash)
701
+
702
+ # The first block to have an sp > the last tx block's infusion iters, is a tx block
703
+ if overflow:
704
+ our_sp_total_iters: uint128 = uint128(total_iters - ip_iters + sp_iters - expected_vs.ssi)
705
+ else:
706
+ our_sp_total_iters = uint128(total_iters - ip_iters + sp_iters)
707
+ if (our_sp_total_iters > curr.total_iters) != (header_block.foliage.foliage_transaction_block_hash is not None):
708
+ return None, ValidationError(Err.INVALID_IS_TRANSACTION_BLOCK)
709
+ if (our_sp_total_iters > curr.total_iters) != (
710
+ header_block.foliage.foliage_transaction_block_signature is not None
711
+ ):
712
+ return None, ValidationError(Err.INVALID_IS_TRANSACTION_BLOCK)
713
+
714
+ # 16. Check foliage block signature by plot key
715
+ if not AugSchemeMPL.verify(
716
+ header_block.reward_chain_block.proof_of_space.plot_public_key,
717
+ header_block.foliage.foliage_block_data.get_hash(),
718
+ header_block.foliage.foliage_block_data_signature,
719
+ ):
720
+ return None, ValidationError(Err.INVALID_PLOT_SIGNATURE)
721
+
722
+ # 17. Check foliage block signature by plot key
723
+ if header_block.foliage.foliage_transaction_block_hash is not None:
724
+ assert header_block.foliage.foliage_transaction_block_signature is not None
725
+ if not AugSchemeMPL.verify(
726
+ header_block.reward_chain_block.proof_of_space.plot_public_key,
727
+ header_block.foliage.foliage_transaction_block_hash,
728
+ header_block.foliage.foliage_transaction_block_signature,
729
+ ):
730
+ return None, ValidationError(Err.INVALID_PLOT_SIGNATURE)
731
+
732
+ # 18. Check unfinished reward chain block hash
733
+ if (
734
+ header_block.reward_chain_block.get_hash()
735
+ != header_block.foliage.foliage_block_data.unfinished_reward_block_hash
736
+ ):
737
+ return None, ValidationError(Err.INVALID_URSB_HASH)
738
+
739
+ # 19. Check pool target max height
740
+ if (
741
+ header_block.foliage.foliage_block_data.pool_target.max_height != 0
742
+ and header_block.foliage.foliage_block_data.pool_target.max_height < height
743
+ ):
744
+ return None, ValidationError(Err.OLD_POOL_TARGET)
745
+
746
+ # 20a. Check pre-farm puzzle hashes for genesis block.
747
+ if genesis_block:
748
+ if (
749
+ header_block.foliage.foliage_block_data.pool_target.puzzle_hash
750
+ != constants.GENESIS_PRE_FARM_POOL_PUZZLE_HASH
751
+ ):
752
+ log.error(f"Pool target {header_block.foliage.foliage_block_data.pool_target} hb {header_block}")
753
+ return None, ValidationError(Err.INVALID_PREFARM)
754
+ if (
755
+ header_block.foliage.foliage_block_data.farmer_reward_puzzle_hash
756
+ != constants.GENESIS_PRE_FARM_FARMER_PUZZLE_HASH
757
+ ):
758
+ return None, ValidationError(Err.INVALID_PREFARM)
759
+ else:
760
+ # 20b. If pospace has a pool pk, heck pool target signature. Should not check this for genesis block.
761
+ if header_block.reward_chain_block.proof_of_space.pool_public_key is not None:
762
+ assert header_block.reward_chain_block.proof_of_space.pool_contract_puzzle_hash is None
763
+ assert header_block.foliage.foliage_block_data.pool_signature is not None
764
+ if not AugSchemeMPL.verify(
765
+ header_block.reward_chain_block.proof_of_space.pool_public_key,
766
+ bytes(header_block.foliage.foliage_block_data.pool_target),
767
+ header_block.foliage.foliage_block_data.pool_signature,
768
+ ):
769
+ return None, ValidationError(Err.INVALID_POOL_SIGNATURE)
770
+ else:
771
+ # 20c. Otherwise, the plot is associated with a contract puzzle hash, not a public key
772
+ assert header_block.reward_chain_block.proof_of_space.pool_contract_puzzle_hash is not None
773
+ if (
774
+ header_block.foliage.foliage_block_data.pool_target.puzzle_hash
775
+ != header_block.reward_chain_block.proof_of_space.pool_contract_puzzle_hash
776
+ ):
777
+ return None, ValidationError(Err.INVALID_POOL_TARGET)
778
+
779
+ # 21. Check extension data if applicable. None for mainnet.
780
+ # 22. Check if foliage block is present
781
+ if (header_block.foliage.foliage_transaction_block_hash is not None) != (
782
+ header_block.foliage_transaction_block is not None
783
+ ):
784
+ return None, ValidationError(Err.INVALID_FOLIAGE_BLOCK_PRESENCE)
785
+
786
+ if (header_block.foliage.foliage_transaction_block_signature is not None) != (
787
+ header_block.foliage_transaction_block is not None
788
+ ):
789
+ return None, ValidationError(Err.INVALID_FOLIAGE_BLOCK_PRESENCE)
790
+
791
+ if header_block.foliage_transaction_block is not None:
792
+ # 23. Check foliage block hash
793
+ if header_block.foliage_transaction_block.get_hash() != header_block.foliage.foliage_transaction_block_hash:
794
+ return None, ValidationError(Err.INVALID_FOLIAGE_BLOCK_HASH)
795
+
796
+ if genesis_block:
797
+ # 24a. Check prev block hash for genesis
798
+ if header_block.foliage_transaction_block.prev_transaction_block_hash != constants.GENESIS_CHALLENGE:
799
+ return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)
800
+ else:
801
+ assert prev_b is not None
802
+ # 24b. Check prev block hash for non-genesis
803
+ curr_b: BlockRecord = prev_b
804
+ while not curr_b.is_transaction_block:
805
+ curr_b = blocks.block_record(curr_b.prev_hash)
806
+ if not header_block.foliage_transaction_block.prev_transaction_block_hash == curr_b.header_hash:
807
+ log.error(
808
+ f"Prev BH: {header_block.foliage_transaction_block.prev_transaction_block_hash} "
809
+ f"{curr_b.header_hash} curr sb: {curr_b}"
810
+ )
811
+ return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)
812
+
813
+ # 25. The filter hash in the Foliage Block must be the hash of the filter
814
+ if check_filter:
815
+ if header_block.foliage_transaction_block.filter_hash != std_hash(header_block.transactions_filter):
816
+ return None, ValidationError(Err.INVALID_TRANSACTIONS_FILTER_HASH)
817
+
818
+ # 26a. The timestamp in Foliage Block must not be over 5 minutes in the future
819
+ if header_block.foliage_transaction_block.timestamp > int(time.time() + constants.MAX_FUTURE_TIME2):
820
+ return None, ValidationError(Err.TIMESTAMP_TOO_FAR_IN_FUTURE)
821
+
822
+ if prev_b is not None:
823
+ # 26b. The timestamp must be greater than the previous transaction block timestamp
824
+ prev_transaction_b = blocks.block_record(header_block.foliage_transaction_block.prev_transaction_block_hash)
825
+ assert prev_transaction_b.timestamp is not None
826
+ if header_block.foliage_transaction_block.timestamp <= prev_transaction_b.timestamp:
827
+ return None, ValidationError(Err.TIMESTAMP_TOO_FAR_IN_PAST)
828
+ return required_iters, None # Valid unfinished header block
829
+
830
+
831
+ def validate_finished_header_block(
832
+ constants: ConsensusConstants,
833
+ blocks: BlockRecordsProtocol,
834
+ header_block: HeaderBlock,
835
+ check_filter: bool,
836
+ expected_vs: ValidationState,
837
+ check_sub_epoch_summary: bool = True,
838
+ ) -> tuple[Optional[uint64], Optional[ValidationError]]:
839
+ """
840
+ Fully validates the header of a block. A header block is the same as a full block, but
841
+ without transactions and transaction info. Returns (required_iters, error).
842
+ """
843
+ unfinished_header_block = UnfinishedHeaderBlock(
844
+ header_block.finished_sub_slots,
845
+ header_block.reward_chain_block.get_unfinished(),
846
+ header_block.challenge_chain_sp_proof,
847
+ header_block.reward_chain_sp_proof,
848
+ header_block.foliage,
849
+ header_block.foliage_transaction_block,
850
+ header_block.transactions_filter,
851
+ )
852
+
853
+ required_iters, validate_unfinished_err = validate_unfinished_header_block(
854
+ constants,
855
+ blocks,
856
+ unfinished_header_block,
857
+ check_filter,
858
+ expected_vs,
859
+ False,
860
+ check_sub_epoch_summary=check_sub_epoch_summary,
861
+ )
862
+
863
+ genesis_block = False
864
+ if validate_unfinished_err is not None:
865
+ return None, validate_unfinished_err
866
+
867
+ assert required_iters is not None
868
+
869
+ if header_block.height == 0:
870
+ prev_b: Optional[BlockRecord] = None
871
+ genesis_block = True
872
+ else:
873
+ prev_b = blocks.block_record(header_block.prev_header_hash)
874
+ new_sub_slot: bool = len(header_block.finished_sub_slots) > 0
875
+
876
+ ip_iters: uint64 = calculate_ip_iters(
877
+ constants,
878
+ expected_vs.ssi,
879
+ header_block.reward_chain_block.signage_point_index,
880
+ required_iters,
881
+ )
882
+ if not genesis_block:
883
+ assert prev_b is not None
884
+ # 27. Check block height
885
+ if header_block.height != prev_b.height + 1:
886
+ return None, ValidationError(Err.INVALID_HEIGHT)
887
+
888
+ # 28. Check weight
889
+ if header_block.weight != prev_b.weight + expected_vs.difficulty:
890
+ log.error(f"INVALID WEIGHT: {header_block} {prev_b} {expected_vs.difficulty}")
891
+ return None, ValidationError(Err.INVALID_WEIGHT)
892
+ else:
893
+ # 27b. Check genesis block height, weight, and prev block hash
894
+ if header_block.height != uint32(0):
895
+ return None, ValidationError(Err.INVALID_HEIGHT)
896
+ if header_block.weight != uint128(constants.DIFFICULTY_STARTING):
897
+ return None, ValidationError(Err.INVALID_WEIGHT)
898
+ if header_block.prev_header_hash != constants.GENESIS_CHALLENGE:
899
+ return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)
900
+
901
+ # RC vdf challenge is taken from more recent of (slot start, prev_block)
902
+ if genesis_block:
903
+ cc_vdf_output = ClassgroupElement.get_default_element()
904
+ ip_vdf_iters = ip_iters
905
+ if new_sub_slot:
906
+ rc_vdf_challenge = header_block.finished_sub_slots[-1].reward_chain.get_hash()
907
+ else:
908
+ rc_vdf_challenge = constants.GENESIS_CHALLENGE
909
+ else:
910
+ assert prev_b is not None
911
+ if new_sub_slot:
912
+ # slot start is more recent
913
+ rc_vdf_challenge = header_block.finished_sub_slots[-1].reward_chain.get_hash()
914
+ ip_vdf_iters = ip_iters
915
+ cc_vdf_output = ClassgroupElement.get_default_element()
916
+
917
+ else:
918
+ # Prev sb is more recent
919
+ rc_vdf_challenge = prev_b.reward_infusion_new_challenge
920
+ ip_vdf_iters = uint64(header_block.reward_chain_block.total_iters - prev_b.total_iters)
921
+ cc_vdf_output = prev_b.challenge_vdf_output
922
+
923
+ # 29. Check challenge chain infusion point VDF
924
+ if new_sub_slot:
925
+ cc_vdf_challenge = header_block.finished_sub_slots[-1].challenge_chain.get_hash()
926
+ else:
927
+ # Not first block in slot
928
+ if genesis_block:
929
+ # genesis block
930
+ cc_vdf_challenge = constants.GENESIS_CHALLENGE
931
+ else:
932
+ assert prev_b is not None
933
+ # Not genesis block, go back to first block in slot
934
+ curr = prev_b
935
+ while curr.finished_challenge_slot_hashes is None:
936
+ curr = blocks.block_record(curr.prev_hash)
937
+ cc_vdf_challenge = curr.finished_challenge_slot_hashes[-1]
938
+
939
+ cc_target_vdf_info = VDFInfo(
940
+ cc_vdf_challenge,
941
+ ip_vdf_iters,
942
+ header_block.reward_chain_block.challenge_chain_ip_vdf.output,
943
+ )
944
+ if header_block.reward_chain_block.challenge_chain_ip_vdf != cc_target_vdf_info.replace(
945
+ number_of_iterations=ip_iters
946
+ ):
947
+ expected = cc_target_vdf_info.replace(number_of_iterations=ip_iters)
948
+ log.error(f"{header_block.reward_chain_block.challenge_chain_ip_vdf}. expected {expected}")
949
+ log.error(f"Block: {header_block}")
950
+ return None, ValidationError(Err.INVALID_CC_IP_VDF)
951
+ if not header_block.challenge_chain_ip_proof.normalized_to_identity and not validate_vdf(
952
+ header_block.challenge_chain_ip_proof,
953
+ constants,
954
+ cc_vdf_output,
955
+ cc_target_vdf_info,
956
+ None,
957
+ ):
958
+ log.error(f"Did not validate, output {cc_vdf_output}")
959
+ log.error(f"Block: {header_block}")
960
+ return None, ValidationError(Err.INVALID_CC_IP_VDF)
961
+ if header_block.challenge_chain_ip_proof.normalized_to_identity and not validate_vdf(
962
+ header_block.challenge_chain_ip_proof,
963
+ constants,
964
+ ClassgroupElement.get_default_element(),
965
+ header_block.reward_chain_block.challenge_chain_ip_vdf,
966
+ ):
967
+ return None, ValidationError(Err.INVALID_CC_IP_VDF)
968
+
969
+ # 30. Check reward chain infusion point VDF
970
+ rc_target_vdf_info = VDFInfo(
971
+ rc_vdf_challenge,
972
+ ip_vdf_iters,
973
+ header_block.reward_chain_block.reward_chain_ip_vdf.output,
974
+ )
975
+ if not validate_vdf(
976
+ header_block.reward_chain_ip_proof,
977
+ constants,
978
+ ClassgroupElement.get_default_element(),
979
+ header_block.reward_chain_block.reward_chain_ip_vdf,
980
+ rc_target_vdf_info,
981
+ ):
982
+ return None, ValidationError(Err.INVALID_RC_IP_VDF)
983
+
984
+ # 31. Check infused challenge chain infusion point VDF
985
+ if not genesis_block:
986
+ overflow = is_overflow_block(constants, header_block.reward_chain_block.signage_point_index)
987
+ deficit = calculate_deficit(
988
+ constants,
989
+ header_block.height,
990
+ prev_b,
991
+ overflow,
992
+ len(header_block.finished_sub_slots),
993
+ )
994
+
995
+ if header_block.reward_chain_block.infused_challenge_chain_ip_vdf is None:
996
+ # If we don't have an ICC chain, deficit must be 4 or 5
997
+ if deficit < constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK - 1:
998
+ return None, ValidationError(Err.INVALID_ICC_VDF)
999
+ else:
1000
+ assert header_block.infused_challenge_chain_ip_proof is not None
1001
+ # If we have an ICC chain, deficit must be 0, 1, 2 or 3
1002
+ if deficit >= constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK - 1:
1003
+ return (
1004
+ None,
1005
+ ValidationError(
1006
+ Err.INVALID_ICC_VDF,
1007
+ f"icc vdf and deficit is bigger or equal to {constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK - 1}",
1008
+ ),
1009
+ )
1010
+ if new_sub_slot:
1011
+ last_ss = header_block.finished_sub_slots[-1]
1012
+ assert last_ss.infused_challenge_chain is not None
1013
+ icc_vdf_challenge: bytes32 = last_ss.infused_challenge_chain.get_hash()
1014
+ icc_vdf_input: Optional[ClassgroupElement] = ClassgroupElement.get_default_element()
1015
+ else:
1016
+ assert prev_b is not None
1017
+ if prev_b.is_challenge_block(constants):
1018
+ icc_vdf_input = ClassgroupElement.get_default_element()
1019
+ else:
1020
+ icc_vdf_input = prev_b.infused_challenge_vdf_output
1021
+ curr = prev_b
1022
+ while curr.finished_infused_challenge_slot_hashes is None and not curr.is_challenge_block(constants):
1023
+ curr = blocks.block_record(curr.prev_hash)
1024
+
1025
+ if curr.is_challenge_block(constants):
1026
+ icc_vdf_challenge = curr.challenge_block_info_hash
1027
+ else:
1028
+ assert curr.finished_infused_challenge_slot_hashes is not None
1029
+ icc_vdf_challenge = curr.finished_infused_challenge_slot_hashes[-1]
1030
+
1031
+ icc_target_vdf_info = VDFInfo(
1032
+ icc_vdf_challenge,
1033
+ ip_vdf_iters,
1034
+ header_block.reward_chain_block.infused_challenge_chain_ip_vdf.output,
1035
+ )
1036
+
1037
+ if icc_vdf_input is None or not validate_vdf(
1038
+ header_block.infused_challenge_chain_ip_proof,
1039
+ constants,
1040
+ icc_vdf_input,
1041
+ header_block.reward_chain_block.infused_challenge_chain_ip_vdf,
1042
+ icc_target_vdf_info,
1043
+ ):
1044
+ return None, ValidationError(Err.INVALID_ICC_VDF, "invalid icc proof")
1045
+ else:
1046
+ if header_block.infused_challenge_chain_ip_proof is not None:
1047
+ return None, ValidationError(Err.INVALID_ICC_VDF)
1048
+
1049
+ # 32. Check reward block hash
1050
+ if header_block.foliage.reward_block_hash != header_block.reward_chain_block.get_hash():
1051
+ return None, ValidationError(Err.INVALID_REWARD_BLOCK_HASH)
1052
+
1053
+ # 33. Check reward block is_transaction_block
1054
+ if (
1055
+ header_block.foliage.foliage_transaction_block_hash is not None
1056
+ ) != header_block.reward_chain_block.is_transaction_block:
1057
+ return None, ValidationError(Err.INVALID_FOLIAGE_BLOCK_PRESENCE)
1058
+
1059
+ return required_iters, None