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