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
@@ -5,8 +5,9 @@ import logging
5
5
  import math
6
6
  import time
7
7
  import traceback
8
+ from collections.abc import Awaitable
8
9
  from dataclasses import dataclass, field
9
- from typing import Any, Awaitable, Callable, Dict, List, Optional, Set, Tuple, Union
10
+ from typing import Any, Callable, Optional, Union
10
11
 
11
12
  from aiohttp import ClientSession, WebSocketError, WSCloseCode, WSMessage, WSMsgType
12
13
  from aiohttp.client import ClientWebSocketResponse
@@ -21,22 +22,23 @@ from chia.protocols.protocol_timing import (
21
22
  API_EXCEPTION_BAN_SECONDS,
22
23
  CONSENSUS_ERROR_BAN_SECONDS,
23
24
  INTERNAL_PROTOCOL_ERROR_BAN_SECONDS,
25
+ RATE_LIMITER_BAN_SECONDS,
24
26
  )
25
27
  from chia.protocols.shared_protocol import Capability, Error, Handshake, protocol_version
26
- from chia.server.api_protocol import ApiProtocol
28
+ from chia.server.api_protocol import ApiMetadata, ApiProtocol
27
29
  from chia.server.capabilities import known_active_capabilities
28
30
  from chia.server.outbound_message import Message, NodeType, make_msg
29
31
  from chia.server.rate_limits import RateLimiter
30
32
  from chia.types.blockchain_format.sized_bytes import bytes32
31
33
  from chia.types.peer_info import PeerInfo
32
- from chia.util.api_decorators import get_metadata
33
34
  from chia.util.errors import ApiError, ConsensusError, Err, ProtocolError, TimestampError
34
35
  from chia.util.ints import int16, uint8, uint16
35
36
  from chia.util.log_exceptions import log_exceptions
36
37
 
37
38
  # Each message is prepended with LENGTH_BYTES bytes specifying the length
38
- from chia.util.network import class_for_type, is_localhost
39
+ from chia.util.network import is_localhost
39
40
  from chia.util.streamable import Streamable
41
+ from chia.util.task_referencer import create_referenced_task
40
42
 
41
43
  # Max size 2^(8*4) which is around 4GiB
42
44
  LENGTH_BYTES: int = 4
@@ -47,7 +49,7 @@ ConnectionCallback = Callable[["WSChiaConnection"], Awaitable[None]]
47
49
  error_response_version = Version("0.0.35")
48
50
 
49
51
 
50
- def create_default_last_message_time_dict() -> Dict[ProtocolMessageTypes, float]:
52
+ def create_default_last_message_time_dict() -> dict[ProtocolMessageTypes, float]:
51
53
  return {message_type: -math.inf for message_type in ProtocolMessageTypes}
52
54
 
53
55
 
@@ -73,8 +75,8 @@ class WSChiaConnection:
73
75
  api: ApiProtocol = field(repr=False)
74
76
  local_type: NodeType
75
77
  local_port: Optional[int]
76
- local_capabilities_for_handshake: List[Tuple[uint16, str]] = field(repr=False)
77
- local_capabilities: List[Capability]
78
+ local_capabilities_for_handshake: list[tuple[uint16, str]] = field(repr=False)
79
+ local_capabilities: list[Capability]
78
80
  peer_info: PeerInfo
79
81
  peer_node_id: bytes32
80
82
  log: logging.Logger = field(repr=False)
@@ -82,6 +84,7 @@ class WSChiaConnection:
82
84
  close_callback: Optional[ConnectionClosedCallbackProtocol] = field(repr=False)
83
85
  outbound_rate_limiter: RateLimiter
84
86
  inbound_rate_limiter: RateLimiter
87
+ class_for_type: dict[NodeType, type[ApiProtocol]] = field(repr=False)
85
88
 
86
89
  # connection properties
87
90
  is_outbound: bool
@@ -90,9 +93,9 @@ class WSChiaConnection:
90
93
  received_message_callback: Optional[ConnectionCallback] = field(repr=False)
91
94
  incoming_queue: asyncio.Queue[Message] = field(default_factory=asyncio.Queue, repr=False)
92
95
  outgoing_queue: asyncio.Queue[Message] = field(default_factory=asyncio.Queue, repr=False)
93
- api_tasks: Dict[bytes32, asyncio.Task[None]] = field(default_factory=dict, repr=False)
96
+ api_tasks: dict[bytes32, asyncio.Task[None]] = field(default_factory=dict, repr=False)
94
97
  # Contains task ids of api tasks which should not be canceled
95
- execute_tasks: Set[bytes32] = field(default_factory=set, repr=False)
98
+ execute_tasks: set[bytes32] = field(default_factory=set, repr=False)
96
99
 
97
100
  # ChiaConnection metrics
98
101
  creation_time: float = field(default_factory=time.time)
@@ -107,17 +110,17 @@ class WSChiaConnection:
107
110
  _close_event: asyncio.Event = field(default_factory=asyncio.Event, repr=False)
108
111
  session: Optional[ClientSession] = field(default=None, repr=False)
109
112
 
110
- pending_requests: Dict[uint16, asyncio.Event] = field(default_factory=dict, repr=False)
111
- request_results: Dict[uint16, Message] = field(default_factory=dict, repr=False)
113
+ pending_requests: dict[uint16, asyncio.Event] = field(default_factory=dict, repr=False)
114
+ request_results: dict[uint16, Message] = field(default_factory=dict, repr=False)
112
115
  closed: bool = False
113
116
  connection_type: Optional[NodeType] = None
114
117
  request_nonce: uint16 = uint16(0)
115
- peer_capabilities: List[Capability] = field(default_factory=list)
118
+ peer_capabilities: list[Capability] = field(default_factory=list)
116
119
  # Used by the Chia Seeder.
117
120
  version: str = field(default_factory=str)
118
121
  protocol_version: Version = field(default_factory=lambda: Version("0"))
119
122
 
120
- log_rate_limit_last_time: Dict[ProtocolMessageTypes, float] = field(
123
+ log_rate_limit_last_time: dict[ProtocolMessageTypes, float] = field(
121
124
  default_factory=create_default_last_message_time_dict,
122
125
  repr=False,
123
126
  )
@@ -136,7 +139,8 @@ class WSChiaConnection:
136
139
  peer_id: bytes32,
137
140
  inbound_rate_limit_percent: int,
138
141
  outbound_rate_limit_percent: int,
139
- local_capabilities_for_handshake: List[Tuple[uint16, str]],
142
+ local_capabilities_for_handshake: list[tuple[uint16, str]],
143
+ class_for_type: dict[NodeType, type[ApiProtocol]],
140
144
  session: Optional[ClientSession] = None,
141
145
  ) -> WSChiaConnection:
142
146
  assert ws._writer is not None
@@ -168,6 +172,7 @@ class WSChiaConnection:
168
172
  inbound_rate_limiter=RateLimiter(incoming=True, percentage_of_limit=inbound_rate_limit_percent),
169
173
  is_outbound=is_outbound,
170
174
  received_message_callback=received_message_callback,
175
+ class_for_type=class_for_type,
171
176
  session=session,
172
177
  )
173
178
 
@@ -222,7 +227,7 @@ class WSChiaConnection:
222
227
  raise ProtocolError(Err.INCOMPATIBLE_NETWORK_ID)
223
228
 
224
229
  if (
225
- local_type in [NodeType.FARMER, NodeType.HARVESTER]
230
+ local_type in {NodeType.FARMER, NodeType.HARVESTER}
226
231
  and inbound_handshake.protocol_version != protocol_version[local_type]
227
232
  ):
228
233
  self.log.warning(
@@ -263,7 +268,7 @@ class WSChiaConnection:
263
268
  remote_node_type = NodeType(inbound_handshake.node_type)
264
269
 
265
270
  if (
266
- remote_node_type in [NodeType.FARMER, NodeType.HARVESTER]
271
+ remote_node_type in {NodeType.FARMER, NodeType.HARVESTER}
267
272
  and inbound_handshake.protocol_version != protocol_version[remote_node_type]
268
273
  ):
269
274
  self.log.warning(
@@ -292,9 +297,9 @@ class WSChiaConnection:
292
297
  # "1" means capability is enabled
293
298
  self.peer_capabilities = known_active_capabilities(inbound_handshake.capabilities)
294
299
 
295
- self.outbound_task = asyncio.create_task(self.outbound_handler())
296
- self.inbound_task = asyncio.create_task(self.inbound_handler())
297
- self.incoming_message_task = asyncio.create_task(self.incoming_message_handler())
300
+ self.outbound_task = create_referenced_task(self.outbound_handler())
301
+ self.inbound_task = create_referenced_task(self.inbound_handler())
302
+ self.incoming_message_task = create_referenced_task(self.incoming_message_handler())
298
303
 
299
304
  async def close(
300
305
  self,
@@ -375,8 +380,9 @@ class WSChiaConnection:
375
380
  except asyncio.CancelledError:
376
381
  pass
377
382
  except Exception as e:
383
+ expected_types = (BrokenPipeError, ConnectionResetError, TimeoutError)
378
384
  expected = False
379
- if isinstance(e, (BrokenPipeError, ConnectionResetError, TimeoutError)):
385
+ if isinstance(e, expected_types) or isinstance(e.__cause__, expected_types):
380
386
  expected = True
381
387
  elif isinstance(e, OSError):
382
388
  if e.errno in {113}:
@@ -398,20 +404,20 @@ class WSChiaConnection:
398
404
  self.log.debug(
399
405
  f"<- {ProtocolMessageTypes(full_message.type).name} from peer {self.peer_node_id} {self.peer_info.host}"
400
406
  )
401
- message_type = ProtocolMessageTypes(full_message.type).name
402
407
 
403
408
  if full_message.type == ProtocolMessageTypes.error.value:
404
409
  error = Error.from_bytes(full_message.data)
405
410
  self.api.log.warning(f"ApiError: {error} from {self.peer_node_id}, {self.peer_info}")
406
411
  return None
407
412
 
408
- f = getattr(self.api, message_type, None)
413
+ bare_message_type = ProtocolMessageTypes(full_message.type)
414
+ metadata = self.api.metadata.message_type_to_request.get(bare_message_type)
415
+ message_type = bare_message_type.name
409
416
 
410
- if f is None:
417
+ if metadata is None:
411
418
  self.log.error(f"Non existing function: {message_type}")
412
419
  raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [message_type])
413
420
 
414
- metadata = get_metadata(function=f)
415
421
  if metadata is None:
416
422
  self.log.error(f"Peer trying to call non api function {message_type}")
417
423
  raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [message_type])
@@ -428,14 +434,13 @@ class WSChiaConnection:
428
434
  timeout = None
429
435
 
430
436
  if metadata.peer_required:
431
- coroutine = f(full_message.data, self)
437
+ coroutine = metadata.method(self.api, full_message.data, self)
432
438
  else:
433
- coroutine = f(full_message.data)
439
+ coroutine = metadata.method(self.api, full_message.data)
434
440
 
435
441
  async def wrapped_coroutine() -> Optional[Message]:
436
442
  try:
437
- # hinting Message here is compensating for difficulty around hinting of the callbacks
438
- result: Message = await coroutine
443
+ result = await coroutine
439
444
  return result
440
445
  except asyncio.CancelledError:
441
446
  pass
@@ -499,7 +504,7 @@ class WSChiaConnection:
499
504
  while True:
500
505
  message = await self.incoming_queue.get()
501
506
  task_id: bytes32 = bytes32.secret()
502
- api_task = asyncio.create_task(self._api_call(message, task_id))
507
+ api_task = create_referenced_task(self._api_call(message, task_id))
503
508
  self.api_tasks[task_id] = api_task
504
509
 
505
510
  async def inbound_handler(self) -> None:
@@ -537,10 +542,12 @@ class WSChiaConnection:
537
542
  ) -> Any:
538
543
  if self.connection_type is None:
539
544
  raise ValueError("handshake not done yet")
540
- request_metadata = get_metadata(request_method)
545
+ request_metadata = ApiMetadata.from_bound_method(request_method)
541
546
  assert request_metadata is not None, f"ApiMetadata unavailable for {request_method}"
542
- attribute = getattr(class_for_type(self.connection_type), request_metadata.request_type.name, None)
543
- if attribute is None:
547
+ if (
548
+ request_metadata.request_type
549
+ not in self.class_for_type[self.connection_type].metadata.message_type_to_request
550
+ ):
544
551
  raise AttributeError(
545
552
  f"Node type {self.connection_type} does not have method {request_metadata.request_type.name}"
546
553
  )
@@ -566,8 +573,8 @@ class WSChiaConnection:
566
573
  await self.ban_peer_bad_protocol(error_message)
567
574
  raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [error_message])
568
575
 
569
- recv_method = getattr(class_for_type(self.local_type), recv_message_type.name)
570
- receive_metadata = get_metadata(recv_method)
576
+ recv_method = self.class_for_type[self.local_type].metadata.message_type_to_request[recv_message_type].method
577
+ receive_metadata = ApiMetadata.from_bound_method(recv_method)
571
578
  assert receive_metadata is not None, f"ApiMetadata unavailable for {recv_method}"
572
579
  return receive_metadata.message_class.from_bytes(response.data)
573
580
 
@@ -621,21 +628,29 @@ class WSChiaConnection:
621
628
  encoded: bytes = bytes(message)
622
629
  size = len(encoded)
623
630
  assert len(encoded) < (2 ** (LENGTH_BYTES * 8))
624
- if not self.outbound_rate_limiter.process_msg_and_check(
631
+ limiter_msg = self.outbound_rate_limiter.process_msg_and_check(
625
632
  message, self.local_capabilities, self.peer_capabilities
626
- ):
633
+ )
634
+ if limiter_msg is not None:
627
635
  if not is_localhost(self.peer_info.host):
628
636
  message_type = ProtocolMessageTypes(message.type)
629
637
  last_time = self.log_rate_limit_last_time[message_type]
630
638
  now = time.monotonic()
631
- self.log_rate_limit_last_time[message_type] = now
632
- if now - last_time >= 60:
633
- msg = f"Rate limiting ourselves. message type: {message_type.name}, peer: {self.peer_info.host}"
634
- self.log.debug(msg)
639
+ if now - last_time >= 30:
640
+ self.log_rate_limit_last_time[message_type] = now
641
+ details = ", ".join(
642
+ [
643
+ f"{message_type.name}",
644
+ f"sz: {len(message.data) / 1000:0.2f} kB",
645
+ f"peer: {self.peer_info.host}",
646
+ f"{limiter_msg}",
647
+ ]
648
+ )
649
+ self.log.info(f"Rate limiting ourselves. Dropping outbound message: {details}")
635
650
 
636
651
  # TODO: fix this special case. This function has rate limits which are too low.
637
652
  if ProtocolMessageTypes(message.type) != ProtocolMessageTypes.respond_peers:
638
- asyncio.create_task(self._wait_and_retry(message))
653
+ create_referenced_task(self._wait_and_retry(message), known_unreferenced=True)
639
654
 
640
655
  return None
641
656
  else:
@@ -663,7 +678,7 @@ class WSChiaConnection:
663
678
  f"{self.peer_server_port}/"
664
679
  f"{self.peer_info.port}"
665
680
  )
666
- asyncio.create_task(self.close())
681
+ create_referenced_task(self.close(), known_unreferenced=True)
667
682
  await asyncio.sleep(3)
668
683
  elif message.type == WSMsgType.CLOSE:
669
684
  self.log.debug(
@@ -671,11 +686,11 @@ class WSChiaConnection:
671
686
  f"{self.peer_server_port}/"
672
687
  f"{self.peer_info.port}"
673
688
  )
674
- asyncio.create_task(self.close())
689
+ create_referenced_task(self.close(), known_unreferenced=True)
675
690
  await asyncio.sleep(3)
676
691
  elif message.type == WSMsgType.CLOSED:
677
692
  if not self.closed:
678
- asyncio.create_task(self.close())
693
+ create_referenced_task(self.close(), known_unreferenced=True)
679
694
  await asyncio.sleep(3)
680
695
  return None
681
696
  elif message.type == WSMsgType.BINARY:
@@ -687,16 +702,15 @@ class WSChiaConnection:
687
702
  message_type = ProtocolMessageTypes(full_message_loaded.type).name
688
703
  except Exception:
689
704
  message_type = "Unknown"
690
- if not self.inbound_rate_limiter.process_msg_and_check(
705
+ limiter_msg = self.inbound_rate_limiter.process_msg_and_check(
691
706
  full_message_loaded, self.local_capabilities, self.peer_capabilities
692
- ):
707
+ )
708
+ if limiter_msg is not None:
693
709
  if self.local_type == NodeType.FULL_NODE and not is_localhost(self.peer_info.host):
694
- self.log.error(
695
- f"Peer has been rate limited and will be disconnected: {self.peer_info.host}, "
696
- f"message: {message_type}"
697
- )
710
+ details = ", ".join([f"{self.peer_info.host}", f"message: {message_type}", limiter_msg])
711
+ self.log.error(f"Peer has been rate limited and will be disconnected: {details}")
698
712
  # Only full node disconnects peers, to prevent abuse and crashing timelords, farmers, etc
699
- asyncio.create_task(self.close(300))
713
+ create_referenced_task(self.close(RATE_LIMITER_BAN_SECONDS), known_unreferenced=True)
700
714
  await asyncio.sleep(3)
701
715
  return None
702
716
  else:
@@ -709,14 +723,14 @@ class WSChiaConnection:
709
723
  elif message.type == WSMsgType.ERROR:
710
724
  self.log.error(f"WebSocket Error: {message}")
711
725
  if isinstance(message.data, WebSocketError) and message.data.code == WSCloseCode.MESSAGE_TOO_BIG:
712
- asyncio.create_task(self.close(300))
726
+ create_referenced_task(self.close(RATE_LIMITER_BAN_SECONDS), known_unreferenced=True)
713
727
  else:
714
- asyncio.create_task(self.close())
728
+ create_referenced_task(self.close(), known_unreferenced=True)
715
729
  await asyncio.sleep(3)
716
730
 
717
731
  else:
718
732
  self.log.error(f"Unexpected WebSocket message type: {message}")
719
- asyncio.create_task(self.close())
733
+ create_referenced_task(self.close())
720
734
  await asyncio.sleep(3)
721
735
  return None
722
736
 
@@ -0,0 +1,54 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional
4
+
5
+ from chia.consensus.block_body_validation import ForkInfo
6
+ from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
7
+ from chia.full_node.full_node import FullNode, PeakPostProcessingResult
8
+ from chia.types.full_block import FullBlock
9
+ from chia.types.peer_info import PeerInfo
10
+ from chia.types.validation_state import ValidationState
11
+ from chia.util.batches import to_batches
12
+ from chia.util.ints import uint32
13
+
14
+
15
+ async def add_blocks_in_batches(
16
+ blocks: list[FullBlock],
17
+ full_node: FullNode,
18
+ ) -> None:
19
+ peak_hash = blocks[0].prev_header_hash
20
+ if blocks[0].height == 0:
21
+ assert peak_hash == full_node.constants.GENESIS_CHALLENGE
22
+ diff = full_node.constants.DIFFICULTY_STARTING
23
+ ssi = full_node.constants.SUB_SLOT_ITERS_STARTING
24
+ fork_height = -1
25
+ else:
26
+ # assume the fork point is immediately before the
27
+ # batch of block we're about to add
28
+ block_record = await full_node.blockchain.get_block_record_from_db(peak_hash)
29
+ assert block_record is not None
30
+ ssi, diff = get_next_sub_slot_iters_and_difficulty(
31
+ full_node.constants, True, block_record, full_node.blockchain
32
+ )
33
+ fork_height = block_record.height
34
+ fork_info = ForkInfo(fork_height, blocks[0].height - 1, peak_hash)
35
+
36
+ vs = ValidationState(ssi, diff, None)
37
+
38
+ for block_batch in to_batches(blocks, 64):
39
+ b = block_batch.entries[0]
40
+ if (b.height % 128) == 0:
41
+ print(f"main chain: {b.height:4} weight: {b.weight}")
42
+ # vs is updated by the call to add_block_batch()
43
+ success, state_change_summary = await full_node.add_block_batch(
44
+ block_batch.entries, PeerInfo("0.0.0.0", 0), fork_info, vs
45
+ )
46
+ assert success is True
47
+ if state_change_summary is not None:
48
+ peak_fb: Optional[FullBlock] = await full_node.blockchain.get_full_peak()
49
+ assert peak_fb is not None
50
+ ppp_result: PeakPostProcessingResult = await full_node.peak_post_processing(
51
+ peak_fb, state_change_summary, None
52
+ )
53
+ await full_node.peak_post_processing_2(peak_fb, None, state_change_summary, ppp_result)
54
+ await full_node._finish_sync(uint32(max(0, fork_height)))