chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
@@ -2,25 +2,24 @@ from __future__ import annotations
2
2
 
3
3
  import collections
4
4
  import logging
5
+ from collections.abc import Awaitable, Collection
5
6
  from dataclasses import dataclass, field
6
- from typing import Awaitable, Callable, Collection, Dict, List, Optional, Set, Tuple, Union
7
+ from typing import Callable, Optional, Union
7
8
 
8
- from chia_rs import AugSchemeMPL, BLSCache, G1Element, SpendBundleConditions
9
+ from chia_rs import SpendBundleConditions, compute_merkle_set_root
9
10
  from chiabip158 import PyBIP158
10
11
 
11
12
  from chia.consensus.block_record import BlockRecord
12
13
  from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
13
- from chia.consensus.block_root_validation import validate_block_merkle_roots
14
14
  from chia.consensus.blockchain_interface import BlockRecordsProtocol
15
15
  from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
16
16
  from chia.consensus.constants import ConsensusConstants
17
17
  from chia.full_node.mempool_check_conditions import mempool_check_time_locks
18
- from chia.types.blockchain_format.coin import Coin
18
+ from chia.types.blockchain_format.coin import Coin, hash_coin_ids
19
19
  from chia.types.blockchain_format.sized_bytes import bytes32
20
20
  from chia.types.coin_record import CoinRecord
21
21
  from chia.types.full_block import FullBlock
22
22
  from chia.types.unfinished_block import UnfinishedBlock
23
- from chia.util.condition_tools import pkm_pairs
24
23
  from chia.util.errors import Err
25
24
  from chia.util.hash import std_hash
26
25
  from chia.util.ints import uint32, uint64
@@ -68,13 +67,13 @@ class ForkInfo:
68
67
  # the header hash of the peak block of this fork
69
68
  peak_hash: bytes32
70
69
  # The additions include coinbase additions
71
- additions_since_fork: Dict[bytes32, ForkAdd] = field(default_factory=dict)
70
+ additions_since_fork: dict[bytes32, ForkAdd] = field(default_factory=dict)
72
71
  # coin-id, ForkRem
73
- removals_since_fork: Dict[bytes32, ForkRem] = field(default_factory=dict)
72
+ removals_since_fork: dict[bytes32, ForkRem] = field(default_factory=dict)
74
73
  # the header hashes of the blocks, starting with the one-past fork_height
75
74
  # i.e. the header hash of fork_height + 1 is stored in block_hashes[0]
76
75
  # followed by fork_height + 2, and so on.
77
- block_hashes: List[bytes32] = field(default_factory=list)
76
+ block_hashes: list[bytes32] = field(default_factory=list)
78
77
 
79
78
  def reset(self, fork_height: int, header_hash: bytes32) -> None:
80
79
  self.fork_height = fork_height
@@ -110,6 +109,36 @@ class ForkInfo:
110
109
  assert coin.name() not in self.additions_since_fork
111
110
  self.additions_since_fork[coin.name()] = ForkAdd(coin, block.height, timestamp, None, True)
112
111
 
112
+ def include_block(
113
+ self,
114
+ additions: list[tuple[Coin, Optional[bytes]]],
115
+ removals: list[Coin],
116
+ block: FullBlock,
117
+ header_hash: bytes32,
118
+ ) -> None:
119
+ height = block.height
120
+
121
+ assert self.peak_height == height - 1
122
+
123
+ assert len(self.block_hashes) == self.peak_height - self.fork_height
124
+ assert block.height == self.fork_height + 1 + len(self.block_hashes)
125
+ self.block_hashes.append(header_hash)
126
+
127
+ self.peak_height = int(block.height)
128
+ self.peak_hash = header_hash
129
+
130
+ if block.foliage_transaction_block is not None:
131
+ timestamp = block.foliage_transaction_block.timestamp
132
+ for spend in removals:
133
+ self.removals_since_fork[bytes32(spend.name())] = ForkRem(bytes32(spend.puzzle_hash), height)
134
+ for coin, hint in additions:
135
+ self.additions_since_fork[coin.name()] = ForkAdd(coin, height, timestamp, hint, False)
136
+ for coin in block.get_included_reward_coins():
137
+ assert block.foliage_transaction_block is not None
138
+ timestamp = block.foliage_transaction_block.timestamp
139
+ assert coin.name() not in self.additions_since_fork
140
+ self.additions_since_fork[coin.name()] = ForkAdd(coin, block.height, timestamp, None, True)
141
+
113
142
  def rollback(self, header_hash: bytes32, height: int) -> None:
114
143
  assert height <= self.peak_height
115
144
  self.peak_height = height
@@ -118,25 +147,54 @@ class ForkInfo:
118
147
  self.removals_since_fork = {k: v for k, v in self.removals_since_fork.items() if v.height <= height}
119
148
 
120
149
 
150
+ def validate_block_merkle_roots(
151
+ block_additions_root: bytes32,
152
+ block_removals_root: bytes32,
153
+ tx_additions: list[tuple[Coin, bytes32]],
154
+ tx_removals: list[bytes32],
155
+ ) -> Optional[Err]:
156
+ # Create addition Merkle set
157
+ puzzlehash_coins_map: dict[bytes32, list[bytes32]] = {}
158
+
159
+ for coin, coin_name in tx_additions:
160
+ if coin.puzzle_hash in puzzlehash_coins_map:
161
+ puzzlehash_coins_map[coin.puzzle_hash].append(coin_name)
162
+ else:
163
+ puzzlehash_coins_map[coin.puzzle_hash] = [coin_name]
164
+
165
+ # Addition Merkle set contains puzzlehash and hash of all coins with that puzzlehash
166
+ additions_merkle_items: list[bytes32] = []
167
+ for puzzle, coin_ids in puzzlehash_coins_map.items():
168
+ additions_merkle_items.append(puzzle)
169
+ additions_merkle_items.append(hash_coin_ids(coin_ids))
170
+
171
+ additions_root = bytes32(compute_merkle_set_root(additions_merkle_items))
172
+ removals_root = bytes32(compute_merkle_set_root(tx_removals))
173
+
174
+ if block_additions_root != additions_root:
175
+ return Err.BAD_ADDITION_ROOT
176
+ if block_removals_root != removals_root:
177
+ return Err.BAD_REMOVAL_ROOT
178
+
179
+ return None
180
+
181
+
121
182
  async def validate_block_body(
122
183
  constants: ConsensusConstants,
123
184
  records: BlockRecordsProtocol,
124
- get_coin_records: Callable[[Collection[bytes32]], Awaitable[List[CoinRecord]]],
185
+ get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
125
186
  block: Union[FullBlock, UnfinishedBlock],
126
187
  height: uint32,
127
188
  conds: Optional[SpendBundleConditions],
128
189
  fork_info: ForkInfo,
129
- bls_cache: Optional[BLSCache],
130
190
  *,
131
- validate_signature: bool = True,
132
- ) -> Tuple[Optional[Err], Optional[SpendBundleConditions]]:
191
+ log_coins: bool = False,
192
+ ) -> Optional[Err]:
133
193
  """
134
194
  This assumes the header block has been completely validated.
135
195
  Validates the transactions and body of the block.
136
- Returns None for the first value if everything validates correctly, or an
137
- Err if something does not validate.
138
- For the second value, returns a SpendBundleConditions only if validation
139
- succeeded, and there are transactions. In other cases it returns None.
196
+ Returns None if everything validates correctly, or an Err if something does
197
+ not validate.
140
198
  conds is the result of running the generator with the previous generators
141
199
  refs. It must be set for transaction blocks and must be None for
142
200
  non-transaction blocks.
@@ -158,7 +216,7 @@ async def validate_block_body(
158
216
  or block.transactions_info is not None
159
217
  or block.transactions_generator is not None
160
218
  ):
161
- return Err.NOT_BLOCK_BUT_HAS_DATA, None
219
+ return Err.NOT_BLOCK_BUT_HAS_DATA
162
220
 
163
221
  prev_tb: Optional[BlockRecord] = records.block_record(block.prev_header_hash)
164
222
  assert prev_tb is not None
@@ -167,28 +225,30 @@ async def validate_block_body(
167
225
  assert prev_tb is not None
168
226
  assert prev_tb.timestamp is not None
169
227
  if len(block.transactions_generator_ref_list) > 0:
170
- return Err.NOT_BLOCK_BUT_HAS_DATA, None
228
+ return Err.NOT_BLOCK_BUT_HAS_DATA
171
229
 
172
230
  assert fork_info.peak_height == height - 1
173
231
 
174
- return None, None # This means the block is valid
232
+ assert conds is None
233
+ # This means the block is valid
234
+ return None
175
235
 
176
236
  # All checks below this point correspond to transaction blocks
177
237
  # 2. For blocks, foliage block, transactions info must not be empty
178
238
  if block.foliage_transaction_block is None or block.transactions_info is None:
179
- return Err.IS_TRANSACTION_BLOCK_BUT_NO_DATA, None
239
+ return Err.IS_TRANSACTION_BLOCK_BUT_NO_DATA
180
240
  assert block.foliage_transaction_block is not None
181
241
 
182
242
  # keeps track of the reward coins that need to be incorporated
183
- expected_reward_coins: Set[Coin] = set()
243
+ expected_reward_coins: set[Coin] = set()
184
244
 
185
245
  # 3. The transaction info hash in the Foliage block must match the transaction info
186
246
  if block.foliage_transaction_block.transactions_info_hash != std_hash(block.transactions_info):
187
- return Err.INVALID_TRANSACTIONS_INFO_HASH, None
247
+ return Err.INVALID_TRANSACTIONS_INFO_HASH
188
248
 
189
249
  # 4. The foliage block hash in the foliage block must match the foliage block
190
250
  if block.foliage.foliage_transaction_block_hash != std_hash(block.foliage_transaction_block):
191
- return Err.INVALID_FOLIAGE_BLOCK_HASH, None
251
+ return Err.INVALID_FOLIAGE_BLOCK_HASH
192
252
 
193
253
  # 5. The reward claims must be valid for the previous blocks, and current block fees
194
254
  # If height == 0, expected_reward_coins will be left empty
@@ -241,19 +301,19 @@ async def validate_block_body(
241
301
  assert curr_b is not None
242
302
 
243
303
  if set(block.transactions_info.reward_claims_incorporated) != expected_reward_coins:
244
- return Err.INVALID_REWARD_COINS, None
304
+ return Err.INVALID_REWARD_COINS
245
305
 
246
306
  if len(block.transactions_info.reward_claims_incorporated) != len(expected_reward_coins):
247
- return Err.INVALID_REWARD_COINS, None
307
+ return Err.INVALID_REWARD_COINS
248
308
 
249
- removals: List[bytes32] = []
309
+ removals: list[bytes32] = []
250
310
 
251
311
  # we store coins paired with their names in order to avoid computing the
252
312
  # coin name multiple times, we store it next to the coin while validating
253
313
  # the block
254
- coinbase_additions: List[Tuple[Coin, bytes32]] = [(c, c.name()) for c in expected_reward_coins]
255
- additions: List[Tuple[Coin, bytes32]] = []
256
- removals_puzzle_dic: Dict[bytes32, bytes32] = {}
314
+ coinbase_additions: list[tuple[Coin, bytes32]] = [(c, c.name()) for c in expected_reward_coins]
315
+ additions: list[tuple[Coin, bytes32]] = []
316
+ removals_puzzle_dic: dict[bytes32, bytes32] = {}
257
317
  cost: uint64 = uint64(0)
258
318
 
259
319
  # In header validation we check that timestamp is not more than 5 minutes into the future
@@ -264,10 +324,10 @@ async def validate_block_body(
264
324
  # the generator for this block (or zeroes if no generator)
265
325
  if block.transactions_generator is not None:
266
326
  if std_hash(bytes(block.transactions_generator)) != block.transactions_info.generator_root:
267
- return Err.INVALID_TRANSACTIONS_GENERATOR_HASH, None
327
+ return Err.INVALID_TRANSACTIONS_GENERATOR_HASH
268
328
  else:
269
329
  if block.transactions_info.generator_root != bytes([0] * 32):
270
- return Err.INVALID_TRANSACTIONS_GENERATOR_HASH, None
330
+ return Err.INVALID_TRANSACTIONS_GENERATOR_HASH
271
331
 
272
332
  # 8a. The generator_ref_list must be the hash of the serialized bytes of
273
333
  # the generator ref list for this block (or 'one' bytes [0x01] if no generator)
@@ -275,20 +335,20 @@ async def validate_block_body(
275
335
  # 8c. The generator ref list must not point to a height >= this block's height
276
336
  if block.transactions_generator_ref_list in (None, []):
277
337
  if block.transactions_info.generator_refs_root != bytes([1] * 32):
278
- return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT, None
338
+ return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
279
339
  else:
280
340
  # If we have a generator reference list, we must have a generator
281
341
  if block.transactions_generator is None:
282
- return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT, None
342
+ return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
283
343
 
284
- # The generator_refs_root must be the hash of the concatenation of the List[uint32]
344
+ # The generator_refs_root must be the hash of the concatenation of the list[uint32]
285
345
  generator_refs_hash = std_hash(b"".join([i.stream_to_bytes() for i in block.transactions_generator_ref_list]))
286
346
  if block.transactions_info.generator_refs_root != generator_refs_hash:
287
- return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT, None
347
+ return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
288
348
  if len(block.transactions_generator_ref_list) > constants.MAX_GENERATOR_REF_LIST_SIZE:
289
- return Err.TOO_MANY_GENERATOR_REFS, None
349
+ return Err.TOO_MANY_GENERATOR_REFS
290
350
  if any([index >= height for index in block.transactions_generator_ref_list]):
291
- return Err.FUTURE_GENERATOR_REFS, None
351
+ return Err.FUTURE_GENERATOR_REFS
292
352
 
293
353
  if block.transactions_generator is not None:
294
354
  # Get List of names removed, puzzles hashes for removed coins and conditions created
@@ -301,10 +361,11 @@ async def validate_block_body(
301
361
  f"percent full: {round(100 * (cost / constants.MAX_BLOCK_COST_CLVM), 2)}%"
302
362
  )
303
363
  if cost > constants.MAX_BLOCK_COST_CLVM:
304
- return Err.BLOCK_COST_EXCEEDS_MAX, None
364
+ return Err.BLOCK_COST_EXCEEDS_MAX
305
365
 
306
366
  # 8. The CLVM program must not return any errors
307
367
  assert conds is not None
368
+ assert conds.validated_signature
308
369
 
309
370
  for spend in conds.spends:
310
371
  removals.append(bytes32(spend.coin_id))
@@ -317,19 +378,19 @@ async def validate_block_body(
317
378
 
318
379
  # 9. Check that the correct cost is in the transactions info
319
380
  if block.transactions_info.cost != cost:
320
- return Err.INVALID_BLOCK_COST, None
381
+ return Err.INVALID_BLOCK_COST
321
382
 
322
- additions_dic: Dict[bytes32, Coin] = {}
383
+ additions_dic: dict[bytes32, Coin] = {}
323
384
  # 10. Check additions for max coin amount
324
385
  # Be careful to check for 64 bit overflows in other languages. This is the max 64 bit unsigned integer
325
386
  # We will not even reach here because Coins do type checking (uint64)
326
387
  for coin, coin_name in additions + coinbase_additions:
327
388
  additions_dic[coin_name] = coin
328
389
  if coin.amount < 0:
329
- return Err.COIN_AMOUNT_NEGATIVE, None
390
+ return Err.COIN_AMOUNT_NEGATIVE
330
391
 
331
392
  if coin.amount > constants.MAX_COIN_AMOUNT:
332
- return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM, None
393
+ return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM
333
394
 
334
395
  # 11. Validate addition and removal roots
335
396
  root_error = validate_block_merkle_roots(
@@ -338,11 +399,11 @@ async def validate_block_body(
338
399
  additions + coinbase_additions,
339
400
  removals,
340
401
  )
341
- if root_error:
342
- return root_error, None
402
+ if root_error is not None:
403
+ return root_error
343
404
 
344
405
  # 12. The additions and removals must result in the correct filter
345
- byte_array_tx: List[bytearray] = []
406
+ byte_array_tx: list[bytearray] = []
346
407
 
347
408
  for coin, _ in additions + coinbase_additions:
348
409
  byte_array_tx.append(bytearray(coin.puzzle_hash))
@@ -354,19 +415,19 @@ async def validate_block_body(
354
415
  filter_hash = std_hash(encoded_filter)
355
416
 
356
417
  if filter_hash != block.foliage_transaction_block.filter_hash:
357
- return Err.INVALID_TRANSACTIONS_FILTER_HASH, None
418
+ return Err.INVALID_TRANSACTIONS_FILTER_HASH
358
419
 
359
420
  # 13. Check for duplicate outputs in additions
360
421
  addition_counter = collections.Counter(coin_name for _, coin_name in additions + coinbase_additions)
361
- for k, v in addition_counter.items():
362
- if v > 1:
363
- return Err.DUPLICATE_OUTPUT, None
422
+ for count in addition_counter.values():
423
+ if count > 1:
424
+ return Err.DUPLICATE_OUTPUT
364
425
 
365
426
  # 14. Check for duplicate spends inside block
366
427
  removal_counter = collections.Counter(removals)
367
428
  for count in removal_counter.values():
368
429
  if count > 1:
369
- return Err.DOUBLE_SPEND, None
430
+ return Err.DOUBLE_SPEND
370
431
 
371
432
  # 15. Check if removals exist and were not previously spent. (unspent_db + diff_store + this_block)
372
433
  # The fork point is the last block in common between the peak chain and the chain of `block`
@@ -374,10 +435,10 @@ async def validate_block_body(
374
435
  assert fork_info.fork_height < height
375
436
  assert fork_info.peak_height == height - 1
376
437
 
377
- removal_coin_records: Dict[bytes32, CoinRecord] = {}
438
+ removal_coin_records: dict[bytes32, CoinRecord] = {}
378
439
  # the removed coins we need to look up from the DB
379
440
  # i.e. all non-ephemeral coins
380
- removals_from_db: List[bytes32] = []
441
+ removals_from_db: list[bytes32] = []
381
442
  for rem in removals:
382
443
  if rem in additions_dic:
383
444
  # Ephemeral coin
@@ -396,40 +457,46 @@ async def validate_block_body(
396
457
  if rem in fork_info.removals_since_fork:
397
458
  # This coin was spent in the fork
398
459
  log.error(f"Err.DOUBLE_SPEND_IN_FORK {fork_info.removals_since_fork[rem]}")
399
- return Err.DOUBLE_SPEND_IN_FORK, None
460
+ return Err.DOUBLE_SPEND_IN_FORK
400
461
  removals_from_db.append(rem)
401
462
 
402
463
  unspent_records = await get_coin_records(removals_from_db)
403
464
 
404
465
  # some coin spends we need to ensure exist in the fork branch. Both coins we
405
466
  # can't find in the DB, but also coins that were spent after the fork point
406
- look_in_fork: List[bytes32] = []
467
+ look_in_fork: list[bytes32] = []
407
468
  for unspent in unspent_records:
408
469
  if unspent.confirmed_block_index <= fork_info.fork_height:
409
470
  # Spending something in the current chain, confirmed before fork
410
471
  # (We ignore all coins confirmed after fork)
411
472
  if unspent.spent == 1 and unspent.spent_block_index <= fork_info.fork_height:
412
473
  # Check for coins spent in an ancestor block
413
- return Err.DOUBLE_SPEND, None
474
+ return Err.DOUBLE_SPEND
414
475
  removal_coin_records[unspent.name] = unspent
415
476
  else:
416
477
  look_in_fork.append(unspent.name)
417
478
 
479
+ if log_coins and len(look_in_fork) > 0:
480
+ log.info("%d coins spent after fork", len(look_in_fork))
481
+
418
482
  if len(unspent_records) != len(removals_from_db):
419
483
  # some coins could not be found in the DB. We need to find out which
420
484
  # ones and look for them in additions_since_fork
421
- found: Set[bytes32] = {u.name for u in unspent_records}
485
+ found: set[bytes32] = {u.name for u in unspent_records}
422
486
  for rem in removals_from_db:
423
487
  if rem in found:
424
488
  continue
425
489
  look_in_fork.append(rem)
426
490
 
491
+ if log_coins and len(look_in_fork) > 0:
492
+ log.info("coins spent in fork: %s", ",".join([f"{name}"[0:6] for name in look_in_fork]))
493
+
427
494
  for rem in look_in_fork:
428
495
  # This coin is not in the current heaviest chain, so it must be in the fork
429
496
  if rem not in fork_info.additions_since_fork:
430
497
  # Check for spending a coin that does not exist in this fork
431
498
  log.error(f"Err.UNKNOWN_UNSPENT: COIN ID: {rem} fork_info: {fork_info}")
432
- return Err.UNKNOWN_UNSPENT, None
499
+ return Err.UNKNOWN_UNSPENT
433
500
  addition: ForkAdd = fork_info.additions_since_fork[rem]
434
501
  new_coin_record: CoinRecord = CoinRecord(
435
502
  addition.coin,
@@ -450,7 +517,7 @@ async def validate_block_body(
450
517
 
451
518
  # 16. Check that the total coin amount for added is <= removed
452
519
  if removed < added:
453
- return Err.MINTING_COIN, None
520
+ return Err.MINTING_COIN
454
521
 
455
522
  fees = removed - added
456
523
  assert fees >= 0
@@ -461,20 +528,20 @@ async def validate_block_body(
461
528
 
462
529
  # 17. Check that the assert fee sum <= fees, and that each reserved fee is non-negative
463
530
  if fees < assert_fee_sum:
464
- return Err.RESERVE_FEE_CONDITION_FAILED, None
531
+ return Err.RESERVE_FEE_CONDITION_FAILED
465
532
 
466
533
  # 18. Check that the fee amount + farmer reward < maximum coin amount
467
534
  if fees + calculate_base_farmer_reward(height) > constants.MAX_COIN_AMOUNT:
468
- return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM, None
535
+ return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM
469
536
 
470
537
  # 19. Check that the computed fees are equal to the fees in the block header
471
538
  if block.transactions_info.fees != fees:
472
- return Err.INVALID_BLOCK_FEE_AMOUNT, None
539
+ return Err.INVALID_BLOCK_FEE_AMOUNT
473
540
 
474
541
  # 20. Verify that removed coin puzzle_hashes match with calculated puzzle_hashes
475
542
  for unspent in removal_coin_records.values():
476
543
  if unspent.coin.puzzle_hash != removals_puzzle_dic[unspent.name]:
477
- return Err.WRONG_PUZZLE_HASH, None
544
+ return Err.WRONG_PUZZLE_HASH
478
545
 
479
546
  # 21. Verify conditions
480
547
  # verify absolute/relative height/time conditions
@@ -486,30 +553,10 @@ async def validate_block_body(
486
553
  prev_transaction_block_timestamp,
487
554
  )
488
555
  if error is not None:
489
- return error, None
490
-
491
- # create hash_key list for aggsig check
492
- pairs_pks: List[G1Element] = []
493
- pairs_msgs: List[bytes] = []
494
- if conds is not None:
495
- pairs_pks, pairs_msgs = pkm_pairs(conds, constants.AGG_SIG_ME_ADDITIONAL_DATA)
556
+ return error
496
557
 
497
- # 22. Verify aggregated signature
498
- # TODO: move this to pre_validate_blocks_multiprocessing so we can sync faster
558
+ # 22. Verify aggregated signature is done in pre-validation
499
559
  if not block.transactions_info.aggregated_signature:
500
- return Err.BAD_AGGREGATE_SIGNATURE, None
501
-
502
- # The pairing cache is not useful while syncing as each pairing is seen
503
- # only once, so the extra effort of populating it is not justified.
504
- # However, we force caching of pairings just for unfinished blocks
505
- # as the cache is likely to be useful when validating the corresponding
506
- # finished blocks later.
507
- if validate_signature:
508
- if bls_cache is None:
509
- if not AugSchemeMPL.aggregate_verify(pairs_pks, pairs_msgs, block.transactions_info.aggregated_signature):
510
- return Err.BAD_AGGREGATE_SIGNATURE, None
511
- else:
512
- if not bls_cache.aggregate_verify(pairs_pks, pairs_msgs, block.transactions_info.aggregated_signature):
513
- return Err.BAD_AGGREGATE_SIGNATURE, None
560
+ return Err.BAD_AGGREGATE_SIGNATURE
514
561
 
515
- return None, conds
562
+ return None
@@ -2,10 +2,20 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import random
5
- from typing import Callable, Dict, List, Optional, Sequence, Tuple
5
+ from collections.abc import Sequence
6
+ from typing import Callable, Optional
6
7
 
7
8
  import chia_rs
8
- from chia_rs import G1Element, G2Element, compute_merkle_set_root
9
+ from chia_rs import (
10
+ DONT_VALIDATE_SIGNATURE,
11
+ MEMPOOL_MODE,
12
+ G1Element,
13
+ G2Element,
14
+ compute_merkle_set_root,
15
+ get_flags_for_height_and_constants,
16
+ run_block_generator,
17
+ run_block_generator2,
18
+ )
9
19
  from chiabip158 import PyBIP158
10
20
 
11
21
  from chia.consensus.block_record import BlockRecord
@@ -13,8 +23,6 @@ from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate
13
23
  from chia.consensus.blockchain_interface import BlockRecordsProtocol
14
24
  from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
15
25
  from chia.consensus.constants import ConsensusConstants
16
- from chia.consensus.cost_calculator import NPCResult
17
- from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions
18
26
  from chia.full_node.signage_point import SignagePoint
19
27
  from chia.types.blockchain_format.coin import Coin, hash_coin_ids
20
28
  from chia.types.blockchain_format.foliage import Foliage, FoliageBlockData, FoliageTransactionBlock, TransactionsInfo
@@ -35,10 +43,23 @@ log = logging.getLogger(__name__)
35
43
 
36
44
 
37
45
  def compute_block_cost(generator: BlockGenerator, constants: ConsensusConstants, height: uint32) -> uint64:
38
- result: NPCResult = get_name_puzzle_conditions(
39
- generator, constants.MAX_BLOCK_COST_CLVM, mempool_mode=True, height=height, constants=constants
46
+ flags = get_flags_for_height_and_constants(height, constants) | MEMPOOL_MODE | DONT_VALIDATE_SIGNATURE
47
+
48
+ if height >= constants.HARD_FORK_HEIGHT:
49
+ run_block = run_block_generator2
50
+ else:
51
+ run_block = run_block_generator
52
+
53
+ _, conds = run_block(
54
+ bytes(generator.program),
55
+ generator.generator_refs,
56
+ constants.MAX_BLOCK_COST_CLVM,
57
+ flags,
58
+ G2Element(),
59
+ None,
60
+ constants,
40
61
  )
41
- return uint64(0 if result.conds is None else result.conds.cost)
62
+ return uint64(0 if conds is None else conds.cost)
42
63
 
43
64
 
44
65
  def compute_block_fee(additions: Sequence[Coin], removals: Sequence[Coin]) -> uint64:
@@ -56,8 +77,8 @@ def create_foliage(
56
77
  reward_block_unfinished: RewardChainBlockUnfinished,
57
78
  block_generator: Optional[BlockGenerator],
58
79
  aggregate_sig: G2Element,
59
- additions: List[Coin],
60
- removals: List[Coin],
80
+ additions: list[Coin],
81
+ removals: list[Coin],
61
82
  prev_block: Optional[BlockRecord],
62
83
  blocks: BlockRecordsProtocol,
63
84
  total_iters_sp: uint128,
@@ -69,7 +90,7 @@ def create_foliage(
69
90
  seed: bytes,
70
91
  compute_cost: Callable[[BlockGenerator, ConsensusConstants, uint32], uint64],
71
92
  compute_fees: Callable[[Sequence[Coin], Sequence[Coin]], uint64],
72
- ) -> Tuple[Foliage, Optional[FoliageTransactionBlock], Optional[TransactionsInfo]]:
93
+ ) -> tuple[Foliage, Optional[FoliageTransactionBlock], Optional[TransactionsInfo]]:
73
94
  """
74
95
  Creates a foliage for a given reward chain block. This may or may not be a tx block. In the case of a tx block,
75
96
  the return values are not None. This is called at the signage point, so some of this information may be
@@ -111,9 +132,9 @@ def create_foliage(
111
132
  height = uint32(prev_block.height + 1)
112
133
 
113
134
  # Create filter
114
- byte_array_tx: List[bytearray] = []
115
- tx_additions: List[Coin] = []
116
- tx_removals: List[bytes32] = []
135
+ byte_array_tx: list[bytearray] = []
136
+ tx_additions: list[Coin] = []
137
+ tx_removals: list[bytes32] = []
117
138
 
118
139
  pool_target_signature: Optional[G2Element] = get_pool_signature(
119
140
  pool_target, reward_block_unfinished.proof_of_space.pool_public_key
@@ -202,10 +223,10 @@ def create_foliage(
202
223
  bip158: PyBIP158 = PyBIP158(byte_array_tx)
203
224
  encoded = bytes(bip158.GetEncoded())
204
225
 
205
- additions_merkle_items: List[bytes32] = []
226
+ additions_merkle_items: list[bytes32] = []
206
227
 
207
228
  # Create addition Merkle set
208
- puzzlehash_coin_map: Dict[bytes32, List[bytes32]] = {}
229
+ puzzlehash_coin_map: dict[bytes32, list[bytes32]] = {}
209
230
 
210
231
  for coin in tx_additions:
211
232
  if coin.puzzle_hash in puzzlehash_coin_map:
@@ -221,7 +242,7 @@ def create_foliage(
221
242
  additions_root = bytes32(compute_merkle_set_root(additions_merkle_items))
222
243
  removals_root = bytes32(compute_merkle_set_root(tx_removals))
223
244
 
224
- generator_hash = bytes32([0] * 32)
245
+ generator_hash = bytes32.zeros
225
246
  if block_generator is not None:
226
247
  generator_hash = std_hash(block_generator.program)
227
248
 
@@ -295,10 +316,10 @@ def create_unfinished_block(
295
316
  seed: bytes = b"",
296
317
  block_generator: Optional[BlockGenerator] = None,
297
318
  aggregate_sig: G2Element = G2Element(),
298
- additions: Optional[List[Coin]] = None,
299
- removals: Optional[List[Coin]] = None,
319
+ additions: Optional[list[Coin]] = None,
320
+ removals: Optional[list[Coin]] = None,
300
321
  prev_block: Optional[BlockRecord] = None,
301
- finished_sub_slots_input: Optional[List[EndOfSubSlotBundle]] = None,
322
+ finished_sub_slots_input: Optional[list[EndOfSubSlotBundle]] = None,
302
323
  compute_cost: Callable[[BlockGenerator, ConsensusConstants, uint32], uint64] = compute_block_cost,
303
324
  compute_fees: Callable[[Sequence[Coin], Sequence[Coin]], uint64] = compute_block_fee,
304
325
  ) -> UnfinishedBlock:
@@ -334,7 +355,7 @@ def create_unfinished_block(
334
355
 
335
356
  """
336
357
  if finished_sub_slots_input is None:
337
- finished_sub_slots: List[EndOfSubSlotBundle] = []
358
+ finished_sub_slots: list[EndOfSubSlotBundle] = []
338
359
  else:
339
360
  finished_sub_slots = finished_sub_slots_input.copy()
340
361
  overflow: bool = sp_iters > ip_iters
@@ -428,7 +449,7 @@ def unfinished_block_to_full_block(
428
449
  rc_ip_proof: VDFProof,
429
450
  icc_ip_vdf: Optional[VDFInfo],
430
451
  icc_ip_proof: Optional[VDFProof],
431
- finished_sub_slots: List[EndOfSubSlotBundle],
452
+ finished_sub_slots: list[EndOfSubSlotBundle],
432
453
  prev_block: Optional[BlockRecord],
433
454
  blocks: BlockRecordsProtocol,
434
455
  total_iters_sp: uint128,