chia-blockchain 2.5.1rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -0,0 +1,766 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import logging
5
+ import math
6
+ import time
7
+ import traceback
8
+ from collections.abc import Awaitable
9
+ from dataclasses import dataclass, field
10
+ from typing import Any, Callable, Optional, Union
11
+
12
+ from aiohttp import ClientSession, WebSocketError, WSCloseCode, WSMessage, WSMsgType
13
+ from aiohttp.client import ClientWebSocketResponse
14
+ from aiohttp.web import WebSocketResponse
15
+ from packaging.version import Version
16
+ from typing_extensions import Protocol, final
17
+
18
+ from chia import __version__
19
+ from chia.protocols.protocol_message_types import ProtocolMessageTypes
20
+ from chia.protocols.protocol_state_machine import message_response_ok
21
+ from chia.protocols.protocol_timing import (
22
+ API_EXCEPTION_BAN_SECONDS,
23
+ CONSENSUS_ERROR_BAN_SECONDS,
24
+ INTERNAL_PROTOCOL_ERROR_BAN_SECONDS,
25
+ RATE_LIMITER_BAN_SECONDS,
26
+ )
27
+ from chia.protocols.shared_protocol import Capability, Error, Handshake, protocol_version
28
+ from chia.server.api_protocol import ApiMetadata, ApiProtocol
29
+ from chia.server.capabilities import known_active_capabilities
30
+ from chia.server.outbound_message import Message, NodeType, make_msg
31
+ from chia.server.rate_limits import RateLimiter
32
+ from chia.types.blockchain_format.sized_bytes import bytes32
33
+ from chia.types.peer_info import PeerInfo
34
+ from chia.util.errors import ApiError, ConsensusError, Err, ProtocolError, TimestampError
35
+ from chia.util.ints import int16, uint8, uint16
36
+ from chia.util.log_exceptions import log_exceptions
37
+
38
+ # Each message is prepended with LENGTH_BYTES bytes specifying the length
39
+ from chia.util.network import is_localhost
40
+ from chia.util.streamable import Streamable
41
+ from chia.util.task_referencer import create_referenced_task
42
+
43
+ # Max size 2^(8*4) which is around 4GiB
44
+ LENGTH_BYTES: int = 4
45
+
46
+ WebSocket = Union[WebSocketResponse, ClientWebSocketResponse]
47
+ ConnectionCallback = Callable[["WSChiaConnection"], Awaitable[None]]
48
+
49
+ error_response_version = Version("0.0.35")
50
+
51
+
52
+ def create_default_last_message_time_dict() -> dict[ProtocolMessageTypes, float]:
53
+ return {message_type: -math.inf for message_type in ProtocolMessageTypes}
54
+
55
+
56
+ class ConnectionClosedCallbackProtocol(Protocol):
57
+ async def __call__(
58
+ self,
59
+ connection: WSChiaConnection,
60
+ ban_time: int,
61
+ closed_connection: bool = ...,
62
+ ) -> None: ...
63
+
64
+
65
+ @final
66
+ @dataclass
67
+ class WSChiaConnection:
68
+ """
69
+ Represents a connection to another node. Local host and port are ours, while peer host and
70
+ port are the host and port of the peer that we are connected to. Node_id and connection_type are
71
+ set after the handshake is performed in this connection.
72
+ """
73
+
74
+ ws: WebSocket = field(repr=False)
75
+ api: ApiProtocol = field(repr=False)
76
+ local_type: NodeType
77
+ local_port: Optional[int]
78
+ local_capabilities_for_handshake: list[tuple[uint16, str]] = field(repr=False)
79
+ local_capabilities: list[Capability]
80
+ peer_info: PeerInfo
81
+ peer_node_id: bytes32
82
+ log: logging.Logger = field(repr=False)
83
+
84
+ close_callback: Optional[ConnectionClosedCallbackProtocol] = field(repr=False)
85
+ outbound_rate_limiter: RateLimiter
86
+ inbound_rate_limiter: RateLimiter
87
+ class_for_type: dict[NodeType, type[ApiProtocol]] = field(repr=False)
88
+
89
+ # connection properties
90
+ is_outbound: bool
91
+
92
+ # Messaging
93
+ received_message_callback: Optional[ConnectionCallback] = field(repr=False)
94
+ incoming_queue: asyncio.Queue[Message] = field(default_factory=asyncio.Queue, repr=False)
95
+ outgoing_queue: asyncio.Queue[Message] = field(default_factory=asyncio.Queue, repr=False)
96
+ api_tasks: dict[bytes32, asyncio.Task[None]] = field(default_factory=dict, repr=False)
97
+ # Contains task ids of api tasks which should not be canceled
98
+ execute_tasks: set[bytes32] = field(default_factory=set, repr=False)
99
+
100
+ # ChiaConnection metrics
101
+ creation_time: float = field(default_factory=time.time)
102
+ bytes_read: int = 0
103
+ bytes_written: int = 0
104
+ last_message_time: float = 0
105
+
106
+ peer_server_port: Optional[uint16] = None
107
+ inbound_task: Optional[asyncio.Task[None]] = field(default=None, repr=False)
108
+ incoming_message_task: Optional[asyncio.Task[None]] = field(default=None, repr=False)
109
+ outbound_task: Optional[asyncio.Task[None]] = field(default=None, repr=False)
110
+ _close_event: asyncio.Event = field(default_factory=asyncio.Event, repr=False)
111
+ session: Optional[ClientSession] = field(default=None, repr=False)
112
+
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)
115
+ closed: bool = False
116
+ connection_type: Optional[NodeType] = None
117
+ request_nonce: uint16 = uint16(0)
118
+ peer_capabilities: list[Capability] = field(default_factory=list)
119
+ # Used by the Chia Seeder.
120
+ version: str = field(default_factory=str)
121
+ protocol_version: Version = field(default_factory=lambda: Version("0"))
122
+
123
+ log_rate_limit_last_time: dict[ProtocolMessageTypes, float] = field(
124
+ default_factory=create_default_last_message_time_dict,
125
+ repr=False,
126
+ )
127
+
128
+ @classmethod
129
+ def create(
130
+ cls,
131
+ local_type: NodeType,
132
+ ws: WebSocket,
133
+ api: ApiProtocol,
134
+ server_port: Optional[int],
135
+ log: logging.Logger,
136
+ is_outbound: bool,
137
+ received_message_callback: Optional[ConnectionCallback],
138
+ close_callback: Optional[ConnectionClosedCallbackProtocol],
139
+ peer_id: bytes32,
140
+ inbound_rate_limit_percent: int,
141
+ outbound_rate_limit_percent: int,
142
+ local_capabilities_for_handshake: list[tuple[uint16, str]],
143
+ class_for_type: dict[NodeType, type[ApiProtocol]],
144
+ session: Optional[ClientSession] = None,
145
+ ) -> WSChiaConnection:
146
+ assert ws._writer is not None
147
+ peername = ws._writer.transport.get_extra_info("peername")
148
+
149
+ if peername is None:
150
+ raise ValueError(f"Was not able to get peername for {peer_id}")
151
+
152
+ if is_outbound:
153
+ request_nonce = uint16(0)
154
+ else:
155
+ # Different nonce to reduce chances of overlap. Each peer will increment the nonce by one for each
156
+ # request. The receiving peer (not is_outbound), will use 2^15 to 2^16 - 1
157
+ request_nonce = uint16(2**15)
158
+
159
+ return cls(
160
+ ws=ws,
161
+ api=api,
162
+ local_type=local_type,
163
+ local_port=server_port,
164
+ local_capabilities_for_handshake=local_capabilities_for_handshake,
165
+ local_capabilities=known_active_capabilities(local_capabilities_for_handshake),
166
+ peer_info=PeerInfo(peername[0], peername[1]),
167
+ peer_node_id=peer_id,
168
+ log=log,
169
+ close_callback=close_callback,
170
+ request_nonce=request_nonce,
171
+ outbound_rate_limiter=RateLimiter(incoming=False, percentage_of_limit=outbound_rate_limit_percent),
172
+ inbound_rate_limiter=RateLimiter(incoming=True, percentage_of_limit=inbound_rate_limit_percent),
173
+ is_outbound=is_outbound,
174
+ received_message_callback=received_message_callback,
175
+ class_for_type=class_for_type,
176
+ session=session,
177
+ )
178
+
179
+ def _get_extra_info(self, name: str) -> Optional[Any]:
180
+ writer = self.ws._writer
181
+ assert writer is not None, "websocket's ._writer is None, was .prepare() called?"
182
+ transport = writer.transport
183
+ if transport is None:
184
+ return None
185
+ try:
186
+ return transport.get_extra_info(name)
187
+ except AttributeError:
188
+ # "/usr/lib/python3.11/asyncio/sslproto.py", line 91, in get_extra_info
189
+ # return self._ssl_protocol._get_extra_info(name, default)
190
+ # AttributeError: 'NoneType' object has no attribute '_get_extra_info'
191
+ return None
192
+
193
+ async def perform_handshake(
194
+ self,
195
+ network_id: str,
196
+ server_port: int,
197
+ local_type: NodeType,
198
+ ) -> None:
199
+ if self.is_outbound:
200
+ outbound_handshake = make_msg(
201
+ ProtocolMessageTypes.handshake,
202
+ Handshake(
203
+ network_id,
204
+ protocol_version[local_type],
205
+ __version__,
206
+ uint16(server_port),
207
+ uint8(local_type.value),
208
+ self.local_capabilities_for_handshake,
209
+ ),
210
+ )
211
+ await self._send_message(outbound_handshake)
212
+ inbound_handshake_msg = await self._read_one_message()
213
+ if inbound_handshake_msg is None:
214
+ raise ProtocolError(Err.INVALID_HANDSHAKE)
215
+ inbound_handshake = Handshake.from_bytes(inbound_handshake_msg.data)
216
+
217
+ # Handle case of invalid ProtocolMessageType
218
+ try:
219
+ message_type: ProtocolMessageTypes = ProtocolMessageTypes(inbound_handshake_msg.type)
220
+ except Exception:
221
+ raise ProtocolError(Err.INVALID_HANDSHAKE)
222
+
223
+ if message_type != ProtocolMessageTypes.handshake:
224
+ raise ProtocolError(Err.INVALID_HANDSHAKE)
225
+
226
+ if inbound_handshake.network_id != network_id:
227
+ raise ProtocolError(Err.INCOMPATIBLE_NETWORK_ID)
228
+
229
+ if (
230
+ local_type in {NodeType.FARMER, NodeType.HARVESTER}
231
+ and inbound_handshake.protocol_version != protocol_version[local_type]
232
+ ):
233
+ self.log.warning(
234
+ f"protocol version mismatch: "
235
+ f"local_type={local_type} "
236
+ f"incoming={inbound_handshake.protocol_version} "
237
+ f"our={protocol_version[local_type]}"
238
+ )
239
+
240
+ self.version = inbound_handshake.software_version
241
+ self.protocol_version = Version(inbound_handshake.protocol_version)
242
+ self.peer_server_port = inbound_handshake.server_port
243
+ self.connection_type = NodeType(inbound_handshake.node_type)
244
+ # "1" means capability is enabled
245
+ self.peer_capabilities = known_active_capabilities(inbound_handshake.capabilities)
246
+ else:
247
+ try:
248
+ message = await self._read_one_message()
249
+ except Exception:
250
+ raise ProtocolError(Err.INVALID_HANDSHAKE)
251
+
252
+ if message is None:
253
+ raise ProtocolError(Err.INVALID_HANDSHAKE)
254
+
255
+ # Handle case of invalid ProtocolMessageType
256
+ try:
257
+ message_type = ProtocolMessageTypes(message.type)
258
+ except Exception:
259
+ raise ProtocolError(Err.INVALID_HANDSHAKE)
260
+
261
+ if message_type != ProtocolMessageTypes.handshake:
262
+ raise ProtocolError(Err.INVALID_HANDSHAKE)
263
+
264
+ inbound_handshake = Handshake.from_bytes(message.data)
265
+ if inbound_handshake.network_id != network_id:
266
+ raise ProtocolError(Err.INCOMPATIBLE_NETWORK_ID)
267
+
268
+ remote_node_type = NodeType(inbound_handshake.node_type)
269
+
270
+ if (
271
+ remote_node_type in {NodeType.FARMER, NodeType.HARVESTER}
272
+ and inbound_handshake.protocol_version != protocol_version[remote_node_type]
273
+ ):
274
+ self.log.warning(
275
+ f"protocol version mismatch: "
276
+ f"remote_type={remote_node_type} "
277
+ f"incoming={inbound_handshake.protocol_version} "
278
+ f"our={protocol_version[remote_node_type]}"
279
+ )
280
+
281
+ outbound_handshake = make_msg(
282
+ ProtocolMessageTypes.handshake,
283
+ Handshake(
284
+ network_id,
285
+ protocol_version[remote_node_type],
286
+ __version__,
287
+ uint16(server_port),
288
+ uint8(local_type.value),
289
+ self.local_capabilities_for_handshake,
290
+ ),
291
+ )
292
+ await self._send_message(outbound_handshake)
293
+ self.version = inbound_handshake.software_version
294
+ self.protocol_version = Version(inbound_handshake.protocol_version)
295
+ self.peer_server_port = inbound_handshake.server_port
296
+ self.connection_type = remote_node_type
297
+ # "1" means capability is enabled
298
+ self.peer_capabilities = known_active_capabilities(inbound_handshake.capabilities)
299
+
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())
303
+
304
+ async def close(
305
+ self,
306
+ ban_time: int = 0,
307
+ ws_close_code: WSCloseCode = WSCloseCode.OK,
308
+ error: Optional[Err] = None,
309
+ ) -> None:
310
+ """
311
+ Closes the connection, and finally calls the close_callback on the server, so the connection gets removed
312
+ from the global list.
313
+ """
314
+ if self.closed:
315
+ # always try to call the callback even for closed connections
316
+ with log_exceptions(self.log, consume=True):
317
+ self.log.debug(f"Closing already closed connection for {self.peer_info.host}")
318
+ if self.close_callback is not None:
319
+ await self.close_callback(self, ban_time, closed_connection=True)
320
+ self._close_event.set()
321
+ return None
322
+ self.closed = True
323
+
324
+ if error is None:
325
+ message = b""
326
+ else:
327
+ message = str(int(error.value)).encode("utf-8")
328
+
329
+ try:
330
+ if self.inbound_task is not None:
331
+ self.inbound_task.cancel()
332
+ if self.incoming_message_task is not None:
333
+ self.incoming_message_task.cancel()
334
+ if self.outbound_task is not None:
335
+ self.outbound_task.cancel()
336
+ if self.ws is not None and self.ws.closed is False:
337
+ await self.ws.close(code=ws_close_code, message=message)
338
+ if self.session is not None:
339
+ await self.session.close()
340
+ self.cancel_pending_requests()
341
+ self.cancel_tasks()
342
+ except Exception:
343
+ error_stack = traceback.format_exc()
344
+ self.log.warning(f"Exception closing socket: {error_stack}")
345
+ raise
346
+ finally:
347
+ with log_exceptions(self.log, consume=True):
348
+ if self.close_callback is not None:
349
+ await self.close_callback(self, ban_time, closed_connection=False)
350
+ self._close_event.set()
351
+
352
+ async def wait_until_closed(self) -> None:
353
+ await self._close_event.wait()
354
+
355
+ async def ban_peer_bad_protocol(self, log_err_msg: str) -> None:
356
+ """Ban peer for protocol violation"""
357
+ ban_seconds = INTERNAL_PROTOCOL_ERROR_BAN_SECONDS
358
+ self.log.error(f"Banning peer for {ban_seconds} seconds: {self.peer_info.host} {log_err_msg}")
359
+ await self.close(ban_seconds, WSCloseCode.PROTOCOL_ERROR, Err.INVALID_PROTOCOL_MESSAGE)
360
+
361
+ def cancel_pending_requests(self) -> None:
362
+ for message_id, event in self.pending_requests.items():
363
+ try:
364
+ event.set()
365
+ except Exception as e:
366
+ self.log.error(f"Failed setting event for {message_id}: {e} {traceback.format_exc()}")
367
+
368
+ def cancel_tasks(self) -> None:
369
+ for task_id, task in self.api_tasks.copy().items():
370
+ if task_id in self.execute_tasks:
371
+ continue
372
+ task.cancel()
373
+
374
+ async def outbound_handler(self) -> None:
375
+ try:
376
+ while not self.closed:
377
+ msg = await self.outgoing_queue.get()
378
+ if msg is not None:
379
+ await self._send_message(msg)
380
+ except asyncio.CancelledError:
381
+ pass
382
+ except Exception as e:
383
+ expected_types = (BrokenPipeError, ConnectionResetError, TimeoutError)
384
+ expected = False
385
+ if isinstance(e, expected_types) or isinstance(e.__cause__, expected_types):
386
+ expected = True
387
+ elif isinstance(e, OSError):
388
+ if e.errno in {113}:
389
+ expected = True
390
+
391
+ if expected:
392
+ self.log.warning(f"{e} {self.peer_info.host}")
393
+ else:
394
+ error_stack = traceback.format_exc()
395
+ self.log.error(f"Exception: {e} with {self.peer_info.host}")
396
+ self.log.error(f"Exception Stack: {error_stack}")
397
+
398
+ async def _api_call(self, full_message: Message, task_id: bytes32) -> None:
399
+ start_time = time.time()
400
+ message_type = ""
401
+ try:
402
+ if self.received_message_callback is not None:
403
+ await self.received_message_callback(self)
404
+ self.log.debug(
405
+ f"<- {ProtocolMessageTypes(full_message.type).name} from peer {self.peer_node_id} {self.peer_info.host}"
406
+ )
407
+
408
+ if full_message.type == ProtocolMessageTypes.error.value:
409
+ error = Error.from_bytes(full_message.data)
410
+ self.api.log.warning(f"ApiError: {error} from {self.peer_node_id}, {self.peer_info}")
411
+ return None
412
+
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
416
+
417
+ if metadata is None:
418
+ self.log.error(f"Non existing function: {message_type}")
419
+ raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [message_type])
420
+
421
+ if metadata is None:
422
+ self.log.error(f"Peer trying to call non api function {message_type}")
423
+ raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [message_type])
424
+
425
+ # If api is not ready ignore the request
426
+ if not self.api.ready():
427
+ self.log.warning(f"API not ready, ignore request: {full_message}")
428
+ return None
429
+
430
+ timeout: Optional[int] = 600
431
+ if metadata.execute_task:
432
+ # Don't timeout on methods with execute_task decorator, these need to run fully
433
+ self.execute_tasks.add(task_id)
434
+ timeout = None
435
+
436
+ if metadata.peer_required:
437
+ coroutine = metadata.method(self.api, full_message.data, self)
438
+ else:
439
+ coroutine = metadata.method(self.api, full_message.data)
440
+
441
+ async def wrapped_coroutine() -> Optional[Message]:
442
+ try:
443
+ result = await coroutine
444
+ return result
445
+ except asyncio.CancelledError:
446
+ pass
447
+ except ApiError as api_error:
448
+ self.log.warning(f"ApiError: {api_error} from {self.peer_node_id}, {self.peer_info}")
449
+ if self.protocol_version >= error_response_version:
450
+ return make_msg(
451
+ ProtocolMessageTypes.error,
452
+ Error(int16(api_error.code.value), api_error.message, api_error.data),
453
+ )
454
+ else:
455
+ return None
456
+ except TimestampError:
457
+ raise
458
+ except Exception as e:
459
+ tb = traceback.format_exc()
460
+ self.log.error(f"Exception: {e}, {self.get_peer_logging()}. {tb}")
461
+ raise
462
+ return None
463
+
464
+ response: Optional[Message] = await asyncio.wait_for(wrapped_coroutine(), timeout=timeout)
465
+ self.log.debug(
466
+ f"Time taken to process {message_type} from {self.peer_node_id} is "
467
+ f"{time.time() - start_time} seconds"
468
+ )
469
+
470
+ if response is not None:
471
+ response_message = Message(response.type, full_message.id, response.data)
472
+ await self.send_message(response_message)
473
+ # todo uncomment when enabling none response capability
474
+ # check that this call needs a reply
475
+ # elif message_requires_reply(ProtocolMessageTypes(full_message.type)) and self.has_capability(
476
+ # Capability.NONE_RESPONSE
477
+ # ):
478
+ # # this peer can accept None reply's, send empty msg back, so it doesn't wait for timeout
479
+ # response_message = Message(uint8(ProtocolMessageTypes.none_response.value), full_message.id, b"")
480
+ # await self.send_message(response_message)
481
+ except TimeoutError:
482
+ self.log.error(f"Timeout error for: {message_type}")
483
+ except TimestampError:
484
+ self.log.info("Received block with timestamp too far into the future")
485
+ except Exception as e:
486
+ if not self.closed:
487
+ tb = traceback.format_exc()
488
+ self.log.error(f"Exception: {e} {type(e)}, closing connection {self.get_peer_logging()}. {tb}")
489
+ else:
490
+ self.log.debug(f"Exception: {e} while closing connection")
491
+ if isinstance(e, ConsensusError):
492
+ ban_time = CONSENSUS_ERROR_BAN_SECONDS
493
+ else:
494
+ ban_time = API_EXCEPTION_BAN_SECONDS
495
+ # TODO: actually throw one of the errors from errors.py and pass this to close
496
+ await self.close(ban_time, WSCloseCode.PROTOCOL_ERROR, Err.UNKNOWN)
497
+ finally:
498
+ if task_id in self.api_tasks:
499
+ self.api_tasks.pop(task_id)
500
+ if task_id in self.execute_tasks:
501
+ self.execute_tasks.remove(task_id)
502
+
503
+ async def incoming_message_handler(self) -> None:
504
+ while True:
505
+ message = await self.incoming_queue.get()
506
+ task_id: bytes32 = bytes32.secret()
507
+ api_task = create_referenced_task(self._api_call(message, task_id))
508
+ self.api_tasks[task_id] = api_task
509
+
510
+ async def inbound_handler(self) -> None:
511
+ try:
512
+ while not self.closed:
513
+ message = await self._read_one_message()
514
+ if message is not None:
515
+ if message.id in self.pending_requests:
516
+ self.request_results[message.id] = message
517
+ event = self.pending_requests[message.id]
518
+ event.set()
519
+ else:
520
+ await self.incoming_queue.put(message)
521
+ else:
522
+ continue
523
+ except asyncio.CancelledError:
524
+ self.log.debug("Inbound_handler task cancelled")
525
+ except Exception as e:
526
+ error_stack = traceback.format_exc()
527
+ self.log.error(f"Exception: {e}")
528
+ self.log.error(f"Exception Stack: {error_stack}")
529
+
530
+ async def send_message(self, message: Message) -> bool:
531
+ """Send message sends a message with no tracking / callback."""
532
+ if self.closed:
533
+ return False
534
+ await self.outgoing_queue.put(message)
535
+ return True
536
+
537
+ async def call_api(
538
+ self,
539
+ request_method: Callable[..., Awaitable[Optional[Message]]],
540
+ message: Streamable,
541
+ timeout: int = 60,
542
+ ) -> Any:
543
+ if self.connection_type is None:
544
+ raise ValueError("handshake not done yet")
545
+ request_metadata = ApiMetadata.from_bound_method(request_method)
546
+ assert request_metadata is not None, f"ApiMetadata unavailable for {request_method}"
547
+ if (
548
+ request_metadata.request_type
549
+ not in self.class_for_type[self.connection_type].metadata.message_type_to_request
550
+ ):
551
+ raise AttributeError(
552
+ f"Node type {self.connection_type} does not have method {request_metadata.request_type.name}"
553
+ )
554
+
555
+ request = Message(uint8(request_metadata.request_type.value), None, bytes(message))
556
+ request_start_t = time.time()
557
+ response = await self.send_request(request, timeout)
558
+ self.log.debug(
559
+ f"Time for request {request_metadata.request_type.name}: {self.get_peer_logging()} = "
560
+ f"{time.time() - request_start_t}, None? {response is None}"
561
+ )
562
+ # todo or response.type == ProtocolMessageTypes.none_response.value when enabling none response
563
+ if response is None or response.data == b"":
564
+ return None
565
+ sent_message_type = ProtocolMessageTypes(request.type)
566
+ recv_message_type = ProtocolMessageTypes(response.type)
567
+ if recv_message_type == ProtocolMessageTypes.error:
568
+ return Error.from_bytes(response.data)
569
+ if not message_response_ok(sent_message_type, recv_message_type):
570
+ # peer protocol violation
571
+ error_message = f"WSConnection.invoke sent message {sent_message_type.name} "
572
+ f"but received {recv_message_type.name}"
573
+ await self.ban_peer_bad_protocol(error_message)
574
+ raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [error_message])
575
+
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)
578
+ assert receive_metadata is not None, f"ApiMetadata unavailable for {recv_method}"
579
+ return receive_metadata.message_class.from_bytes(response.data)
580
+
581
+ async def send_request(self, message_no_id: Message, timeout: int) -> Optional[Message]:
582
+ """Sends a message and waits for a response."""
583
+ if self.closed:
584
+ return None
585
+
586
+ # We will wait for this event, it will be set either by the response, or the timeout
587
+ event = asyncio.Event()
588
+
589
+ # The request nonce is an integer between 0 and 2**16 - 1, which is used to match requests to responses
590
+ # If is_outbound, 0 <= nonce < 2^15, else 2^15 <= nonce < 2^16
591
+ request_id = self.request_nonce
592
+ if self.is_outbound:
593
+ self.request_nonce = uint16(self.request_nonce + 1) if self.request_nonce != (2**15 - 1) else uint16(0)
594
+ else:
595
+ self.request_nonce = uint16(self.request_nonce + 1) if self.request_nonce != (2**16 - 1) else uint16(2**15)
596
+
597
+ message = Message(message_no_id.type, request_id, message_no_id.data)
598
+ assert message.id is not None
599
+ self.pending_requests[message.id] = event
600
+ await self.outgoing_queue.put(message)
601
+
602
+ try:
603
+ await asyncio.wait_for(event.wait(), timeout=timeout)
604
+ except asyncio.TimeoutError:
605
+ self.log.debug(f"Request timeout: {message}")
606
+
607
+ self.pending_requests.pop(message.id)
608
+ result: Optional[Message] = None
609
+ if message.id in self.request_results:
610
+ result = self.request_results[message.id]
611
+ assert result is not None
612
+ self.log.debug(
613
+ f"<- {ProtocolMessageTypes(result.type).name} from: {self.peer_info.host}:{self.peer_info.port}"
614
+ )
615
+ self.request_results.pop(message.id)
616
+
617
+ return result
618
+
619
+ async def _wait_and_retry(self, msg: Message) -> None:
620
+ try:
621
+ await asyncio.sleep(1)
622
+ await self.outgoing_queue.put(msg)
623
+ except Exception as e:
624
+ self.log.debug(f"Exception {e} while waiting to retry sending rate limited message")
625
+ return None
626
+
627
+ async def _send_message(self, message: Message) -> None:
628
+ encoded: bytes = bytes(message)
629
+ size = len(encoded)
630
+ assert len(encoded) < (2 ** (LENGTH_BYTES * 8))
631
+ limiter_msg = self.outbound_rate_limiter.process_msg_and_check(
632
+ message, self.local_capabilities, self.peer_capabilities
633
+ )
634
+ if limiter_msg is not None:
635
+ if not is_localhost(self.peer_info.host):
636
+ message_type = ProtocolMessageTypes(message.type)
637
+ last_time = self.log_rate_limit_last_time[message_type]
638
+ now = time.monotonic()
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}")
650
+
651
+ # TODO: fix this special case. This function has rate limits which are too low.
652
+ if ProtocolMessageTypes(message.type) != ProtocolMessageTypes.respond_peers:
653
+ create_referenced_task(self._wait_and_retry(message), known_unreferenced=True)
654
+
655
+ return None
656
+ else:
657
+ self.log.debug(
658
+ f"Not rate limiting ourselves. message type: {ProtocolMessageTypes(message.type).name}, "
659
+ f"peer: {self.peer_info.host}"
660
+ )
661
+
662
+ await self.ws.send_bytes(encoded)
663
+ self.log.debug(
664
+ f"-> {ProtocolMessageTypes(message.type).name} to peer {self.peer_info.host} {self.peer_node_id}"
665
+ )
666
+ self.bytes_written += size
667
+
668
+ async def _read_one_message(self) -> Optional[Message]:
669
+ message: WSMessage = await self.ws.receive()
670
+
671
+ if self.connection_type is not None:
672
+ connection_type_str = NodeType(self.connection_type).name.lower()
673
+ else:
674
+ connection_type_str = ""
675
+ if message.type == WSMsgType.CLOSING:
676
+ self.log.debug(
677
+ f"Closing connection to {connection_type_str} {self.peer_info.host}:"
678
+ f"{self.peer_server_port}/"
679
+ f"{self.peer_info.port}"
680
+ )
681
+ create_referenced_task(self.close(), known_unreferenced=True)
682
+ await asyncio.sleep(3)
683
+ elif message.type == WSMsgType.CLOSE:
684
+ self.log.debug(
685
+ f"Peer closed connection {connection_type_str} {self.peer_info.host}:"
686
+ f"{self.peer_server_port}/"
687
+ f"{self.peer_info.port}"
688
+ )
689
+ create_referenced_task(self.close(), known_unreferenced=True)
690
+ await asyncio.sleep(3)
691
+ elif message.type == WSMsgType.CLOSED:
692
+ if not self.closed:
693
+ create_referenced_task(self.close(), known_unreferenced=True)
694
+ await asyncio.sleep(3)
695
+ return None
696
+ elif message.type == WSMsgType.BINARY:
697
+ data = message.data
698
+ full_message_loaded: Message = Message.from_bytes(data)
699
+ self.bytes_read += len(data)
700
+ self.last_message_time = time.time()
701
+ try:
702
+ message_type = ProtocolMessageTypes(full_message_loaded.type).name
703
+ except Exception:
704
+ message_type = "Unknown"
705
+ limiter_msg = self.inbound_rate_limiter.process_msg_and_check(
706
+ full_message_loaded, self.local_capabilities, self.peer_capabilities
707
+ )
708
+ if limiter_msg is not None:
709
+ if self.local_type == NodeType.FULL_NODE and not is_localhost(self.peer_info.host):
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}")
712
+ # Only full node disconnects peers, to prevent abuse and crashing timelords, farmers, etc
713
+ create_referenced_task(self.close(RATE_LIMITER_BAN_SECONDS), known_unreferenced=True)
714
+ await asyncio.sleep(3)
715
+ return None
716
+ else:
717
+ self.log.debug(
718
+ f"Peer surpassed rate limit {self.peer_info.host}, message: {message_type}, "
719
+ f"port {self.peer_info.port} but not disconnecting"
720
+ )
721
+ return full_message_loaded
722
+ return full_message_loaded
723
+ elif message.type == WSMsgType.ERROR:
724
+ self.log.error(f"WebSocket Error: {message}")
725
+ if isinstance(message.data, WebSocketError) and message.data.code == WSCloseCode.MESSAGE_TOO_BIG:
726
+ create_referenced_task(self.close(RATE_LIMITER_BAN_SECONDS), known_unreferenced=True)
727
+ else:
728
+ create_referenced_task(self.close(), known_unreferenced=True)
729
+ await asyncio.sleep(3)
730
+
731
+ else:
732
+ self.log.error(f"Unexpected WebSocket message type: {message}")
733
+ create_referenced_task(self.close())
734
+ await asyncio.sleep(3)
735
+ return None
736
+
737
+ # Used by the Chia Seeder.
738
+ def get_version(self) -> str:
739
+ return self.version
740
+
741
+ def get_tls_version(self) -> str:
742
+ ssl_obj = self._get_extra_info("ssl_object")
743
+ if ssl_obj is not None:
744
+ return str(ssl_obj.version())
745
+ else:
746
+ return "unknown"
747
+
748
+ def get_peer_info(self) -> Optional[PeerInfo]:
749
+ result = self._get_extra_info("peername")
750
+ if result is None:
751
+ return None
752
+ connection_host = result[0]
753
+ port = self.peer_server_port if self.peer_server_port is not None else self.peer_info.port
754
+ return PeerInfo(connection_host, port)
755
+
756
+ def get_peer_logging(self) -> PeerInfo:
757
+ info: Optional[PeerInfo] = self.get_peer_info()
758
+ if info is None:
759
+ # in this case, we will use self.peer_info.host which is friendlier for logging
760
+ port = self.peer_server_port if self.peer_server_port is not None else self.peer_info.port
761
+ return PeerInfo(self.peer_info.host, port)
762
+ else:
763
+ return info
764
+
765
+ def has_capability(self, capability: Capability) -> bool:
766
+ return capability in self.peer_capabilities