chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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 (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
@@ -1,36 +1,34 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import copy
4
5
  import logging
5
6
  import time
6
7
  import traceback
8
+ from collections.abc import Awaitable, Collection
7
9
  from concurrent.futures import Executor
8
10
  from dataclasses import dataclass
9
- from typing import Dict, List, Optional, Sequence, Tuple
11
+ from typing import Optional
10
12
 
11
- from chia_rs import AugSchemeMPL, SpendBundleConditions
13
+ from chia_rs import SpendBundleConditions, get_flags_for_height_and_constants, run_block_generator, run_block_generator2
12
14
 
13
15
  from chia.consensus.block_header_validation import validate_finished_header_block
14
16
  from chia.consensus.block_record import BlockRecord
15
- from chia.consensus.blockchain_interface import BlocksProtocol
17
+ from chia.consensus.blockchain_interface import BlockRecordsProtocol
16
18
  from chia.consensus.constants import ConsensusConstants
17
- from chia.consensus.cost_calculator import NPCResult
18
19
  from chia.consensus.full_block_to_block_record import block_to_block_record
19
20
  from chia.consensus.get_block_challenge import get_block_challenge
20
21
  from chia.consensus.get_block_generator import get_block_generator
21
22
  from chia.consensus.pot_iterations import calculate_iterations_quality, is_overflow_block
22
- from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions
23
23
  from chia.types.blockchain_format.coin import Coin
24
24
  from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
25
25
  from chia.types.blockchain_format.sized_bytes import bytes32
26
26
  from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
27
27
  from chia.types.full_block import FullBlock
28
28
  from chia.types.generator_types import BlockGenerator
29
- from chia.types.unfinished_block import UnfinishedBlock
29
+ from chia.types.validation_state import ValidationState
30
30
  from chia.util.augmented_chain import AugmentedBlockchain
31
- from chia.util.block_cache import BlockCache
32
- from chia.util.condition_tools import pkm_pairs
33
- from chia.util.errors import Err, ValidationError
31
+ from chia.util.errors import Err
34
32
  from chia.util.generator_tools import get_block_header, tx_removals_and_additions
35
33
  from chia.util.ints import uint16, uint32, uint64
36
34
  from chia.util.streamable import Streamable, streamable
@@ -44,322 +42,227 @@ class PreValidationResult(Streamable):
44
42
  error: Optional[uint16]
45
43
  required_iters: Optional[uint64] # Iff error is None
46
44
  conds: Optional[SpendBundleConditions] # Iff error is None and block is a transaction block
47
- validated_signature: bool
48
45
  timing: uint32 # the time (in milliseconds) it took to pre-validate the block
49
46
 
47
+ @property
48
+ def validated_signature(self) -> bool:
49
+ if self.conds is None:
50
+ return False
51
+ return self.conds.validated_signature
50
52
 
51
- def batch_pre_validate_blocks(
53
+
54
+ # this layer of abstraction is here to let wallet tests monkeypatch it
55
+ def _run_block(
56
+ block: FullBlock, prev_generators: list[bytes], constants: ConsensusConstants
57
+ ) -> tuple[Optional[int], Optional[SpendBundleConditions]]:
58
+ assert block.transactions_generator is not None
59
+ assert block.transactions_info is not None
60
+ flags = get_flags_for_height_and_constants(block.height, constants)
61
+ if block.height >= constants.HARD_FORK_HEIGHT:
62
+ run_block = run_block_generator2
63
+ else:
64
+ run_block = run_block_generator
65
+ return run_block(
66
+ bytes(block.transactions_generator),
67
+ prev_generators,
68
+ block.transactions_info.cost,
69
+ flags,
70
+ block.transactions_info.aggregated_signature,
71
+ None,
72
+ constants,
73
+ )
74
+
75
+
76
+ def _pre_validate_block(
52
77
  constants: ConsensusConstants,
53
- blocks_pickled: Dict[bytes, bytes],
54
- full_blocks_pickled: List[bytes],
55
- prev_transaction_generators: List[Optional[List[bytes]]],
56
- conditions: Dict[uint32, bytes],
57
- expected_difficulty: List[uint64],
58
- expected_sub_slot_iters: List[uint64],
59
- validate_signatures: bool,
60
- prev_ses_block_bytes: Optional[List[Optional[bytes]]] = None,
61
- ) -> List[bytes]:
62
- blocks: Dict[bytes32, BlockRecord] = {}
63
- for k, v in blocks_pickled.items():
64
- blocks[bytes32(k)] = BlockRecord.from_bytes_unchecked(v)
65
- results: List[PreValidationResult] = []
66
-
67
- # In this case, we are validating full blocks, not headers
68
- for i in range(len(full_blocks_pickled)):
69
- try:
70
- validation_start = time.monotonic()
71
- block: FullBlock = FullBlock.from_bytes_unchecked(full_blocks_pickled[i])
72
- tx_additions: List[Coin] = []
73
- removals: List[bytes32] = []
74
- conds: Optional[SpendBundleConditions] = None
75
- if block.height in conditions:
76
- conds = SpendBundleConditions.from_bytes(conditions[block.height])
77
- removals, tx_additions = tx_removals_and_additions(conds)
78
- elif block.transactions_generator is not None:
79
- # TODO: this function would be simpler if conditions were
80
- # required to be passed in for all transaction blocks. We would
81
- # no longer need prev_transaction_generators
82
- prev_generators = prev_transaction_generators[i]
83
- assert prev_generators is not None
84
- assert block.transactions_info is not None
85
- block_generator = BlockGenerator(block.transactions_generator, prev_generators)
86
- assert block_generator.program == block.transactions_generator
87
- npc_result = get_name_puzzle_conditions(
88
- block_generator,
89
- min(constants.MAX_BLOCK_COST_CLVM, block.transactions_info.cost),
90
- mempool_mode=False,
91
- height=block.height,
92
- constants=constants,
93
- )
94
- if npc_result.error is not None:
95
- validation_time = time.monotonic() - validation_start
96
- results.append(
97
- PreValidationResult(
98
- uint16(npc_result.error), None, npc_result.conds, False, uint32(validation_time * 1000)
99
- )
100
- )
101
- continue
102
- assert npc_result.conds is not None
103
- conds = npc_result.conds
104
- removals, tx_additions = tx_removals_and_additions(conds)
105
-
106
- header_block = get_block_header(block, tx_additions, removals)
107
- prev_ses_block = None
108
- if prev_ses_block_bytes is not None and len(prev_ses_block_bytes) > 0:
109
- buffer = prev_ses_block_bytes[i]
110
- if buffer is not None:
111
- prev_ses_block = BlockRecord.from_bytes_unchecked(buffer)
112
- required_iters, error = validate_finished_header_block(
113
- constants,
114
- BlockCache(blocks),
115
- header_block,
116
- True, # check_filter
117
- expected_difficulty[i],
118
- expected_sub_slot_iters[i],
119
- prev_ses_block=prev_ses_block,
120
- )
121
- error_int: Optional[uint16] = None
122
- if error is not None:
123
- error_int = uint16(error.code.value)
124
-
125
- successfully_validated_signatures = False
126
- # If we failed header block validation, no need to validate
127
- # signature, the block is already invalid If this is False, it means
128
- # either we don't have a signature (not a tx block) or we have an
129
- # invalid signature (which also puts in an error) or we didn't
130
- # validate the signature because we want to validate it later.
131
- # add_block will attempt to validate the signature later.
132
- if error_int is None and validate_signatures and conds is not None:
133
- assert block.transactions_info is not None
134
- pairs_pks, pairs_msgs = pkm_pairs(conds, constants.AGG_SIG_ME_ADDITIONAL_DATA)
135
- if not AugSchemeMPL.aggregate_verify(
136
- pairs_pks, pairs_msgs, block.transactions_info.aggregated_signature
137
- ):
138
- error_int = uint16(Err.BAD_AGGREGATE_SIGNATURE.value)
139
- else:
140
- successfully_validated_signatures = True
141
-
142
- validation_time = time.monotonic() - validation_start
143
- results.append(
144
- PreValidationResult(
145
- error_int,
146
- required_iters,
147
- conds,
148
- successfully_validated_signatures,
149
- uint32(validation_time * 1000),
78
+ blockchain: BlockRecordsProtocol,
79
+ block: FullBlock,
80
+ prev_generators: Optional[list[bytes]],
81
+ conds: Optional[SpendBundleConditions],
82
+ expected_vs: ValidationState,
83
+ ) -> PreValidationResult:
84
+ """
85
+ Args:
86
+ constants:
87
+ blockchain:
88
+ block:
89
+ prev_generators:
90
+ conds:
91
+ expected_vs: The validation state that we calculate for the next block
92
+ if it's validated.
93
+ """
94
+
95
+ try:
96
+ validation_start = time.monotonic()
97
+ removals_and_additions: Optional[tuple[Collection[bytes32], Collection[Coin]]] = None
98
+ if conds is not None:
99
+ assert conds.validated_signature is True
100
+ assert block.transactions_generator is not None
101
+ removals_and_additions = tx_removals_and_additions(conds)
102
+ elif block.transactions_generator is not None:
103
+ assert prev_generators is not None
104
+ assert block.transactions_info is not None
105
+
106
+ if block.transactions_info.cost > constants.MAX_BLOCK_COST_CLVM:
107
+ validation_time = time.monotonic() - validation_start
108
+ return PreValidationResult(
109
+ uint16(Err.BLOCK_COST_EXCEEDS_MAX.value), None, None, uint32(validation_time * 1000)
150
110
  )
151
- )
152
- except Exception:
153
- error_stack = traceback.format_exc()
154
- log.error(f"Exception: {error_stack}")
155
- validation_time = time.monotonic() - validation_start
156
- results.append(
157
- PreValidationResult(uint16(Err.UNKNOWN.value), None, None, False, uint32(validation_time * 1000))
158
- )
159
- return [bytes(r) for r in results]
160
-
161
-
162
- async def pre_validate_blocks_multiprocessing(
111
+
112
+ err, conds = _run_block(block, prev_generators, constants)
113
+
114
+ assert (err is None) != (conds is None)
115
+ if err is not None:
116
+ validation_time = time.monotonic() - validation_start
117
+ return PreValidationResult(uint16(err), None, None, uint32(validation_time * 1000))
118
+ assert conds is not None
119
+ assert conds.validated_signature is True
120
+ removals_and_additions = tx_removals_and_additions(conds)
121
+ elif block.is_transaction_block():
122
+ # This is a transaction block with just reward coins.
123
+ removals_and_additions = ([], [])
124
+
125
+ assert conds is None or conds.validated_signature is True
126
+ header_block = get_block_header(block, removals_and_additions)
127
+ required_iters, error = validate_finished_header_block(
128
+ constants,
129
+ blockchain,
130
+ header_block,
131
+ True, # check_filter
132
+ expected_vs,
133
+ )
134
+ error_int: Optional[uint16] = None
135
+ if error is not None:
136
+ error_int = uint16(error.code.value)
137
+
138
+ validation_time = time.monotonic() - validation_start
139
+ return PreValidationResult(
140
+ error_int,
141
+ required_iters,
142
+ conds,
143
+ uint32(validation_time * 1000),
144
+ )
145
+ except Exception:
146
+ error_stack = traceback.format_exc()
147
+ log.error(f"Exception: {error_stack}")
148
+ validation_time = time.monotonic() - validation_start
149
+ return PreValidationResult(uint16(Err.UNKNOWN.value), None, None, uint32(validation_time * 1000))
150
+
151
+
152
+ async def pre_validate_block(
163
153
  constants: ConsensusConstants,
164
- block_records: BlocksProtocol,
165
- blocks: Sequence[FullBlock],
154
+ blockchain: AugmentedBlockchain,
155
+ block: FullBlock,
166
156
  pool: Executor,
167
- block_height_conds_map: Dict[uint32, SpendBundleConditions],
157
+ conds: Optional[SpendBundleConditions],
158
+ vs: ValidationState,
168
159
  *,
169
- sub_slot_iters: uint64,
170
- difficulty: uint64,
171
- prev_ses_block: Optional[BlockRecord],
172
- wp_summaries: Optional[List[SubEpochSummary]] = None,
173
- validate_signatures: bool = True,
174
- ) -> List[PreValidationResult]:
160
+ wp_summaries: Optional[list[SubEpochSummary]] = None,
161
+ ) -> Awaitable[PreValidationResult]:
175
162
  """
176
163
  This method must be called under the blockchain lock
177
- If all the full blocks pass pre-validation, (only validates header), returns the list of required iters.
178
- if any validation issue occurs, returns False.
164
+ The block passed to this function is submitted to be validated in the
165
+ executor passed in as "pool". The future for the job is then returned.
166
+ When awaited, the return value is the PreValidationResult for the block.
167
+ The PreValidationResult indicates whether the block was valid or not.
179
168
 
180
169
  Args:
181
170
  constants:
182
- pool:
183
- constants:
184
- block_records:
185
- blocks: list of full blocks to validate (must be connected to current chain)
186
- npc_results
171
+ blockchain: The blockchain object to validate these blocks with respect to.
172
+ It's an AugmentedBlockchain to allow for previous batches of blocks to
173
+ be included, even if they haven't been added to the underlying blockchain
174
+ database yet. The blocks passed in will be added/augmented onto this blockchain.
175
+ pool: The executor to submit the validation jobs to
176
+ block: The full block to validate (must be connected to current chain)
177
+ conds: The SpendBundleConditions for transaction blocks, if we have one.
178
+ This will be computed if None is passed.
179
+ vs: The ValidationState refers to the state for the block.
180
+ This is an in-out parameter that will be updated to the validation state
181
+ for the next block. It includes subslot iterators, difficulty and
182
+ the previous sub epoch summary (ses) block.
183
+ wp_summaries:
184
+ validate_signatures:
187
185
  """
188
186
  prev_b: Optional[BlockRecord] = None
189
187
 
190
- # Collects all the recent blocks (up to the previous sub-epoch)
191
- recent_blocks: Dict[bytes32, BlockRecord] = {}
192
- num_sub_slots_found = 0
193
- num_blocks_seen = 0
188
+ async def return_error(error_code: Err) -> PreValidationResult:
189
+ return PreValidationResult(uint16(error_code.value), None, None, uint32(0))
194
190
 
195
- if blocks[0].height > 0:
196
- curr = block_records.try_block_record(blocks[0].prev_header_hash)
191
+ if block.height > 0:
192
+ curr = blockchain.try_block_record(block.prev_header_hash)
197
193
  if curr is None:
198
- return [PreValidationResult(uint16(Err.INVALID_PREV_BLOCK_HASH.value), None, None, False, uint32(0))]
194
+ return return_error(Err.INVALID_PREV_BLOCK_HASH)
199
195
  prev_b = curr
200
- num_sub_slots_to_look_for = 3 if curr.overflow else 2
201
- header_hash = curr.header_hash
202
- while (
203
- curr.sub_epoch_summary_included is None
204
- or num_blocks_seen < constants.NUMBER_OF_TIMESTAMPS
205
- or num_sub_slots_found < num_sub_slots_to_look_for
206
- ) and curr.height > 0:
207
- if curr.first_in_sub_slot:
208
- assert curr.finished_challenge_slot_hashes is not None
209
- num_sub_slots_found += len(curr.finished_challenge_slot_hashes)
210
- recent_blocks[header_hash] = curr
211
- if curr.is_transaction_block:
212
- num_blocks_seen += 1
213
- header_hash = curr.prev_hash
214
- curr = block_records.block_record(curr.prev_hash)
215
- assert curr is not None
216
- recent_blocks[header_hash] = curr
217
-
218
- # the agumented blockchain object will let us add temporary block records
219
- # they won't actually be added to the underlying blockchain object
220
- blockchain = AugmentedBlockchain(block_records)
221
-
222
- diff_ssis: List[Tuple[uint64, uint64]] = []
223
- prev_ses_block_list: List[Optional[BlockRecord]] = []
224
-
225
- for block in blocks:
226
- if len(block.finished_sub_slots) > 0:
227
- if block.finished_sub_slots[0].challenge_chain.new_difficulty is not None:
228
- difficulty = block.finished_sub_slots[0].challenge_chain.new_difficulty
229
- if block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters is not None:
230
- sub_slot_iters = block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters
231
- overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
232
- challenge = get_block_challenge(constants, block, BlockCache(recent_blocks), prev_b is None, overflow, False)
233
- if block.reward_chain_block.challenge_chain_sp_vdf is None:
234
- cc_sp_hash: bytes32 = challenge
235
- else:
236
- cc_sp_hash = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
237
- q_str: Optional[bytes32] = verify_and_get_quality_string(
238
- block.reward_chain_block.proof_of_space, constants, challenge, cc_sp_hash, height=block.height
239
- )
240
- if q_str is None:
241
- return [PreValidationResult(uint16(Err.INVALID_POSPACE.value), None, None, False, uint32(0))]
242
-
243
- required_iters: uint64 = calculate_iterations_quality(
244
- constants.DIFFICULTY_CONSTANT_FACTOR,
245
- q_str,
246
- block.reward_chain_block.proof_of_space.size,
247
- difficulty,
248
- cc_sp_hash,
249
- )
250
196
 
251
- try:
252
- block_rec = block_to_block_record(
253
- constants,
254
- blockchain,
255
- required_iters,
256
- block,
257
- sub_slot_iters=sub_slot_iters,
258
- prev_ses_block=prev_ses_block,
259
- )
260
- except ValueError:
261
- return [PreValidationResult(uint16(Err.INVALID_SUB_EPOCH_SUMMARY.value), None, None, False, uint32(0))]
262
-
263
- if block_rec.sub_epoch_summary_included is not None and wp_summaries is not None:
264
- next_ses = wp_summaries[int(block.height / constants.SUB_EPOCH_BLOCKS) - 1]
265
- if not block_rec.sub_epoch_summary_included.get_hash() == next_ses.get_hash():
266
- log.error("sub_epoch_summary does not match wp sub_epoch_summary list")
267
- return [PreValidationResult(uint16(Err.INVALID_SUB_EPOCH_SUMMARY.value), None, None, False, uint32(0))]
268
-
269
- recent_blocks[block_rec.header_hash] = block_rec
270
- blockchain.add_extra_block(block, block_rec) # Temporarily add block to chain
271
- prev_b = block_rec
272
- diff_ssis.append((difficulty, sub_slot_iters))
273
- prev_ses_block_list.append(prev_ses_block)
274
- if block_rec.sub_epoch_summary_included is not None:
275
- prev_ses_block = block_rec
276
-
277
- conditions_pickled = {}
278
- for k, v in block_height_conds_map.items():
279
- conditions_pickled[k] = bytes(v)
280
- futures = []
281
- # Pool of workers to validate blocks concurrently
282
- recent_blocks_bytes = {bytes(k): bytes(v) for k, v in recent_blocks.items()} # convert to bytes
283
-
284
- batch_size = 4
285
- for i in range(0, len(blocks), batch_size):
286
- end_i = min(i + batch_size, len(blocks))
287
- blocks_to_validate = blocks[i:end_i]
288
- b_pickled: List[bytes] = []
289
- previous_generators: List[Optional[List[bytes]]] = []
290
- for block in blocks_to_validate:
291
- assert isinstance(block, FullBlock)
292
- b_pickled.append(bytes(block))
293
- try:
294
- block_generator: Optional[BlockGenerator] = await get_block_generator(
295
- blockchain.lookup_block_generators, block
296
- )
297
- except ValueError:
298
- return [
299
- PreValidationResult(
300
- uint16(Err.FAILED_GETTING_GENERATOR_MULTIPROCESSING.value), None, None, False, uint32(0)
301
- )
302
- ]
303
- if block_generator is not None:
304
- previous_generators.append(block_generator.generator_refs)
305
- else:
306
- previous_generators.append(None)
307
-
308
- ses_blocks_bytes_list: List[Optional[bytes]] = []
309
- for j in range(i, end_i):
310
- ses_block_rec = prev_ses_block_list[j]
311
- if ses_block_rec is None:
312
- ses_blocks_bytes_list.append(None)
313
- else:
314
- ses_blocks_bytes_list.append(bytes(ses_block_rec))
315
-
316
- futures.append(
317
- asyncio.get_running_loop().run_in_executor(
318
- pool,
319
- batch_pre_validate_blocks,
320
- constants,
321
- recent_blocks_bytes,
322
- b_pickled,
323
- previous_generators,
324
- conditions_pickled,
325
- [diff_ssis[j][0] for j in range(i, end_i)],
326
- [diff_ssis[j][1] for j in range(i, end_i)],
327
- validate_signatures,
328
- ses_blocks_bytes_list,
329
- )
330
- )
331
- # Collect all results into one flat list
332
- return [
333
- PreValidationResult.from_bytes(result)
334
- for batch_result in (await asyncio.gather(*futures))
335
- for result in batch_result
336
- ]
197
+ assert isinstance(block, FullBlock)
198
+ if len(block.finished_sub_slots) > 0:
199
+ if block.finished_sub_slots[0].challenge_chain.new_difficulty is not None:
200
+ vs.difficulty = block.finished_sub_slots[0].challenge_chain.new_difficulty
201
+ if block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters is not None:
202
+ vs.ssi = block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters
203
+ overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
204
+ challenge = get_block_challenge(constants, block, blockchain, prev_b is None, overflow, False)
205
+ if block.reward_chain_block.challenge_chain_sp_vdf is None:
206
+ cc_sp_hash: bytes32 = challenge
207
+ else:
208
+ cc_sp_hash = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
209
+ q_str: Optional[bytes32] = verify_and_get_quality_string(
210
+ block.reward_chain_block.proof_of_space, constants, challenge, cc_sp_hash, height=block.height
211
+ )
212
+ if q_str is None:
213
+ return return_error(Err.INVALID_POSPACE)
337
214
 
215
+ required_iters: uint64 = calculate_iterations_quality(
216
+ constants.DIFFICULTY_CONSTANT_FACTOR,
217
+ q_str,
218
+ block.reward_chain_block.proof_of_space.size,
219
+ vs.difficulty,
220
+ cc_sp_hash,
221
+ )
338
222
 
339
- def _run_generator(
340
- constants: ConsensusConstants,
341
- unfinished_block_bytes: bytes,
342
- block_generator_bytes: bytes,
343
- height: uint32,
344
- ) -> Optional[bytes]:
345
- """
346
- Runs the CLVM generator from bytes inputs. This is meant to be called under a ProcessPoolExecutor, in order to
347
- validate the heavy parts of a block (clvm program) in a different process.
348
- """
349
223
  try:
350
- unfinished_block: UnfinishedBlock = UnfinishedBlock.from_bytes(unfinished_block_bytes)
351
- assert unfinished_block.transactions_info is not None
352
- block_generator: BlockGenerator = BlockGenerator.from_bytes(block_generator_bytes)
353
- assert block_generator.program == unfinished_block.transactions_generator
354
- npc_result: NPCResult = get_name_puzzle_conditions(
355
- block_generator,
356
- min(constants.MAX_BLOCK_COST_CLVM, unfinished_block.transactions_info.cost),
357
- mempool_mode=False,
358
- height=height,
359
- constants=constants,
224
+ block_rec = block_to_block_record(
225
+ constants,
226
+ blockchain,
227
+ required_iters,
228
+ block,
229
+ sub_slot_iters=vs.ssi,
230
+ prev_ses_block=vs.prev_ses_block,
360
231
  )
361
- return bytes(npc_result)
362
- except ValidationError as e:
363
- return bytes(NPCResult(uint16(e.code.value), None))
364
- except Exception:
365
- return bytes(NPCResult(uint16(Err.UNKNOWN.value), None))
232
+ except ValueError:
233
+ log.exception("block_to_block_record()")
234
+ return return_error(Err.INVALID_SUB_EPOCH_SUMMARY)
235
+
236
+ if block_rec.sub_epoch_summary_included is not None and wp_summaries is not None:
237
+ next_ses = wp_summaries[int(block.height / constants.SUB_EPOCH_BLOCKS) - 1]
238
+ if not block_rec.sub_epoch_summary_included.get_hash() == next_ses.get_hash():
239
+ log.error("sub_epoch_summary does not match wp sub_epoch_summary list")
240
+ return return_error(Err.INVALID_SUB_EPOCH_SUMMARY)
241
+
242
+ blockchain.add_extra_block(block, block_rec) # Temporarily add block to chain
243
+ prev_b = block_rec
244
+
245
+ previous_generators: Optional[list[bytes]] = None
246
+
247
+ try:
248
+ block_generator: Optional[BlockGenerator] = await get_block_generator(blockchain.lookup_block_generators, block)
249
+ if block_generator is not None:
250
+ previous_generators = block_generator.generator_refs
251
+ except ValueError:
252
+ return return_error(Err.FAILED_GETTING_GENERATOR_MULTIPROCESSING)
253
+
254
+ future = asyncio.get_running_loop().run_in_executor(
255
+ pool,
256
+ _pre_validate_block,
257
+ constants,
258
+ blockchain,
259
+ block,
260
+ previous_generators,
261
+ conds,
262
+ copy.copy(vs),
263
+ )
264
+
265
+ if block_rec.sub_epoch_summary_included is not None:
266
+ vs.prev_ses_block = block_rec
267
+
268
+ return future
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import List, Optional, Tuple
3
+ from typing import Optional
4
4
 
5
5
  from chia.consensus.block_record import BlockRecord
6
6
  from chia.consensus.blockchain_interface import BlockRecordsProtocol
@@ -13,13 +13,13 @@ from chia.util.ints import uint64, uint128
13
13
 
14
14
  def get_signage_point_vdf_info(
15
15
  constants: ConsensusConstants,
16
- finished_sub_slots: List[EndOfSubSlotBundle],
16
+ finished_sub_slots: list[EndOfSubSlotBundle],
17
17
  overflow: bool,
18
18
  prev_b: Optional[BlockRecord],
19
19
  blocks: BlockRecordsProtocol,
20
20
  sp_total_iters: uint128,
21
21
  sp_iters: uint64,
22
- ) -> Tuple[bytes32, bytes32, ClassgroupElement, ClassgroupElement, uint64, uint64]:
22
+ ) -> tuple[bytes32, bytes32, ClassgroupElement, ClassgroupElement, uint64, uint64]:
23
23
  """
24
24
  Returns the following information, for the VDF of the signage point at sp_total_iters.
25
25
  cc and rc challenge hash