chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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 (531) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_blockchain_transactions.py +5 -2
  6. chia/_tests/blockchain/test_build_chains.py +2 -4
  7. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  8. chia/_tests/clvm/coin_store.py +4 -7
  9. chia/_tests/clvm/test_clvm_step.py +4 -4
  10. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  11. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  12. chia/_tests/clvm/test_singletons.py +2 -4
  13. chia/_tests/clvm/test_spend_sim.py +2 -2
  14. chia/_tests/cmds/cmd_test_utils.py +27 -45
  15. chia/_tests/cmds/test_cmd_framework.py +6 -6
  16. chia/_tests/cmds/test_daemon.py +3 -3
  17. chia/_tests/cmds/test_show.py +4 -4
  18. chia/_tests/cmds/test_tx_config_args.py +1 -2
  19. chia/_tests/cmds/testing_classes.py +4 -5
  20. chia/_tests/cmds/wallet/test_did.py +24 -27
  21. chia/_tests/cmds/wallet/test_nft.py +12 -10
  22. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  23. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  24. chia/_tests/conftest.py +66 -31
  25. chia/_tests/connection_utils.py +2 -2
  26. chia/_tests/core/cmds/test_beta.py +4 -4
  27. chia/_tests/core/cmds/test_keys.py +2 -3
  28. chia/_tests/core/cmds/test_wallet.py +15 -15
  29. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  30. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  31. chia/_tests/core/daemon/test_daemon.py +11 -11
  32. chia/_tests/core/data_layer/conftest.py +2 -2
  33. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  34. chia/_tests/core/data_layer/test_data_store.py +10 -10
  35. chia/_tests/core/data_layer/util.py +11 -11
  36. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  37. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  38. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  39. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  40. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  41. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  42. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  43. chia/_tests/core/full_node/test_conditions.py +21 -23
  44. chia/_tests/core/full_node/test_full_node.py +273 -70
  45. chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
  46. chia/_tests/core/full_node/test_hint_management.py +2 -4
  47. chia/_tests/core/full_node/test_performance.py +0 -1
  48. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  49. chia/_tests/core/full_node/test_transactions.py +1 -2
  50. chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
  51. chia/_tests/core/mempool/test_mempool.py +54 -50
  52. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  53. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  54. chia/_tests/core/mempool/test_mempool_manager.py +988 -854
  55. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  56. chia/_tests/core/server/serve.py +7 -7
  57. chia/_tests/core/server/test_dos.py +1 -2
  58. chia/_tests/core/server/test_event_loop.py +12 -4
  59. chia/_tests/core/server/test_loop.py +7 -8
  60. chia/_tests/core/server/test_rate_limits.py +9 -8
  61. chia/_tests/core/server/test_server.py +61 -1
  62. chia/_tests/core/services/test_services.py +2 -2
  63. chia/_tests/core/ssl/test_ssl.py +2 -2
  64. chia/_tests/core/test_cost_calculation.py +2 -6
  65. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  66. chia/_tests/core/test_filter.py +0 -1
  67. chia/_tests/core/test_full_node_rpc.py +2 -2
  68. chia/_tests/core/test_merkle_set.py +1 -2
  69. chia/_tests/core/test_seeder.py +4 -4
  70. chia/_tests/core/util/test_config.py +4 -4
  71. chia/_tests/core/util/test_jsonify.py +2 -2
  72. chia/_tests/core/util/test_keychain.py +3 -3
  73. chia/_tests/core/util/test_lockfile.py +2 -1
  74. chia/_tests/core/util/test_log_exceptions.py +1 -2
  75. chia/_tests/core/util/test_streamable.py +17 -17
  76. chia/_tests/db/test_db_wrapper.py +3 -2
  77. chia/_tests/environments/wallet.py +14 -14
  78. chia/_tests/ether.py +4 -3
  79. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  80. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  81. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  82. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  83. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  84. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  85. chia/_tests/harvester/test_harvester_api.py +11 -4
  86. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  87. chia/_tests/plot_sync/test_receiver.py +11 -10
  88. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  89. chia/_tests/plot_sync/util.py +1 -2
  90. chia/_tests/plotting/test_plot_manager.py +7 -6
  91. chia/_tests/plotting/test_prover.py +30 -38
  92. chia/_tests/pools/test_pool_cmdline.py +4 -6
  93. chia/_tests/pools/test_pool_rpc.py +203 -61
  94. chia/_tests/pools/test_pool_wallet.py +3 -3
  95. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  96. chia/_tests/process_junit.py +2 -2
  97. chia/_tests/rpc/test_rpc_client.py +4 -4
  98. chia/_tests/rpc/test_rpc_server.py +3 -3
  99. chia/_tests/simulation/test_simulation.py +12 -25
  100. chia/_tests/solver/test_solver_service.py +13 -4
  101. chia/_tests/testconfig.py +2 -2
  102. chia/_tests/timelord/test_new_peak.py +22 -11
  103. chia/_tests/tools/test_run_block.py +0 -2
  104. chia/_tests/tools/test_virtual_project.py +2 -1
  105. chia/_tests/util/benchmarks.py +1 -0
  106. chia/_tests/util/blockchain.py +38 -36
  107. chia/_tests/util/blockchain_mock.py +11 -11
  108. chia/_tests/util/build_network_protocol_files.py +2 -1
  109. chia/_tests/util/coin_store.py +2 -1
  110. chia/_tests/util/config.py +1 -1
  111. chia/_tests/util/db_connection.py +2 -3
  112. chia/_tests/util/full_sync.py +9 -11
  113. chia/_tests/util/gen_ssl_certs.py +4 -5
  114. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  115. chia/_tests/util/misc.py +24 -24
  116. chia/_tests/util/network_protocol_data.py +20 -3
  117. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  118. chia/_tests/util/protocol_messages_json.py +292 -3
  119. chia/_tests/util/setup_nodes.py +62 -47
  120. chia/_tests/util/spend_sim.py +57 -57
  121. chia/_tests/util/test_async_pool.py +2 -3
  122. chia/_tests/util/test_chia_version.py +1 -3
  123. chia/_tests/util/test_config.py +3 -3
  124. chia/_tests/util/test_full_block_utils.py +6 -3
  125. chia/_tests/util/test_limited_semaphore.py +1 -2
  126. chia/_tests/util/test_misc.py +2 -2
  127. chia/_tests/util/test_network.py +1 -2
  128. chia/_tests/util/test_priority_mutex.py +3 -3
  129. chia/_tests/util/test_recursive_replace.py +5 -6
  130. chia/_tests/util/test_replace_str_to_bytes.py +9 -10
  131. chia/_tests/util/test_testnet_overrides.py +3 -3
  132. chia/_tests/util/time_out_assert.py +2 -2
  133. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  134. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  135. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  136. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  137. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  138. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  139. chia/_tests/wallet/conftest.py +6 -6
  140. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  141. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  142. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  145. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  146. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  147. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  148. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  149. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  150. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  151. chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
  152. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  153. chia/_tests/wallet/test_coin_management.py +2 -2
  154. chia/_tests/wallet/test_conditions.py +45 -51
  155. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  156. chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
  157. chia/_tests/wallet/test_notifications.py +14 -14
  158. chia/_tests/wallet/test_signer_protocol.py +5 -5
  159. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  160. chia/_tests/wallet/test_transaction_store.py +20 -20
  161. chia/_tests/wallet/test_util.py +2 -2
  162. chia/_tests/wallet/test_wallet.py +380 -228
  163. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  164. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  165. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  166. chia/_tests/wallet/test_wallet_node.py +16 -15
  167. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  168. chia/_tests/wallet/test_wallet_utils.py +2 -3
  169. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  170. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  171. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  172. chia/_tests/wallet/wallet_block_tools.py +12 -11
  173. chia/_tests/weight_proof/config.py +1 -0
  174. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  175. chia/apis/__init__.py +21 -0
  176. chia/apis/farmer_stub.py +102 -0
  177. chia/apis/full_node_stub.py +374 -0
  178. chia/apis/harvester_stub.py +57 -0
  179. chia/apis/introducer_stub.py +35 -0
  180. chia/apis/solver_stub.py +30 -0
  181. chia/apis/stub_protocol_registry.py +21 -0
  182. chia/apis/timelord_stub.py +39 -0
  183. chia/apis/wallet_stub.py +161 -0
  184. chia/cmds/beta.py +3 -4
  185. chia/cmds/beta_funcs.py +4 -3
  186. chia/cmds/check_wallet_db.py +4 -4
  187. chia/cmds/chia.py +1 -2
  188. chia/cmds/cmd_classes.py +11 -13
  189. chia/cmds/cmd_helpers.py +11 -11
  190. chia/cmds/cmds_util.py +15 -15
  191. chia/cmds/coin_funcs.py +6 -7
  192. chia/cmds/coins.py +2 -3
  193. chia/cmds/configure.py +1 -2
  194. chia/cmds/data.py +42 -42
  195. chia/cmds/data_funcs.py +81 -81
  196. chia/cmds/db.py +4 -5
  197. chia/cmds/db_backup_func.py +2 -2
  198. chia/cmds/db_upgrade_func.py +3 -3
  199. chia/cmds/db_validate_func.py +2 -2
  200. chia/cmds/dev/data.py +4 -4
  201. chia/cmds/dev/gh.py +5 -5
  202. chia/cmds/dev/installers.py +2 -3
  203. chia/cmds/dev/mempool.py +3 -4
  204. chia/cmds/dev/mempool_funcs.py +4 -4
  205. chia/cmds/dev/sim.py +8 -8
  206. chia/cmds/dump_keyring.py +3 -3
  207. chia/cmds/farm.py +6 -8
  208. chia/cmds/farm_funcs.py +25 -24
  209. chia/cmds/init_funcs.py +4 -4
  210. chia/cmds/keys.py +16 -18
  211. chia/cmds/keys_funcs.py +36 -36
  212. chia/cmds/netspace.py +1 -3
  213. chia/cmds/netspace_funcs.py +1 -2
  214. chia/cmds/options.py +3 -2
  215. chia/cmds/param_types.py +17 -16
  216. chia/cmds/passphrase.py +6 -7
  217. chia/cmds/passphrase_funcs.py +11 -13
  218. chia/cmds/peer.py +1 -3
  219. chia/cmds/peer_funcs.py +3 -3
  220. chia/cmds/plotnft.py +6 -7
  221. chia/cmds/plotnft_funcs.py +37 -26
  222. chia/cmds/rpc.py +3 -3
  223. chia/cmds/show.py +3 -5
  224. chia/cmds/show_funcs.py +9 -9
  225. chia/cmds/sim_funcs.py +25 -26
  226. chia/cmds/solver.py +1 -3
  227. chia/cmds/solver_funcs.py +1 -2
  228. chia/cmds/start_funcs.py +2 -2
  229. chia/cmds/wallet.py +76 -81
  230. chia/cmds/wallet_funcs.py +206 -177
  231. chia/consensus/augmented_chain.py +6 -6
  232. chia/consensus/block_body_validation.py +19 -15
  233. chia/consensus/block_creation.py +25 -21
  234. chia/consensus/block_header_validation.py +27 -13
  235. chia/consensus/block_height_map.py +3 -6
  236. chia/consensus/block_height_map_protocol.py +2 -2
  237. chia/consensus/block_record.py +2 -4
  238. chia/consensus/blockchain.py +58 -40
  239. chia/consensus/blockchain_interface.py +7 -7
  240. chia/consensus/coin_store_protocol.py +5 -6
  241. chia/consensus/condition_tools.py +4 -4
  242. chia/consensus/cost_calculator.py +2 -3
  243. chia/consensus/default_constants.py +19 -13
  244. chia/consensus/deficit.py +1 -3
  245. chia/consensus/difficulty_adjustment.py +3 -5
  246. chia/consensus/find_fork_point.py +2 -4
  247. chia/consensus/full_block_to_block_record.py +11 -13
  248. chia/consensus/generator_tools.py +2 -3
  249. chia/consensus/get_block_challenge.py +50 -26
  250. chia/consensus/get_block_generator.py +2 -3
  251. chia/consensus/make_sub_epoch_summary.py +8 -7
  252. chia/consensus/multiprocess_validation.py +31 -20
  253. chia/consensus/pos_quality.py +6 -23
  254. chia/consensus/pot_iterations.py +17 -44
  255. chia/consensus/signage_point.py +4 -5
  256. chia/consensus/vdf_info_computation.py +2 -4
  257. chia/daemon/client.py +8 -8
  258. chia/daemon/keychain_proxy.py +31 -37
  259. chia/daemon/server.py +32 -33
  260. chia/daemon/windows_signal.py +4 -3
  261. chia/data_layer/data_layer.py +86 -77
  262. chia/data_layer/data_layer_rpc_api.py +9 -9
  263. chia/data_layer/data_layer_rpc_client.py +13 -15
  264. chia/data_layer/data_layer_server.py +3 -3
  265. chia/data_layer/data_layer_util.py +14 -14
  266. chia/data_layer/data_layer_wallet.py +94 -101
  267. chia/data_layer/data_store.py +50 -50
  268. chia/data_layer/dl_wallet_store.py +9 -12
  269. chia/data_layer/download_data.py +8 -9
  270. chia/data_layer/s3_plugin_service.py +5 -9
  271. chia/data_layer/start_data_layer.py +5 -5
  272. chia/farmer/farmer.py +31 -31
  273. chia/farmer/farmer_api.py +45 -33
  274. chia/farmer/farmer_rpc_api.py +5 -4
  275. chia/farmer/farmer_rpc_client.py +6 -6
  276. chia/farmer/start_farmer.py +6 -6
  277. chia/full_node/block_store.py +13 -16
  278. chia/full_node/check_fork_next_block.py +1 -2
  279. chia/full_node/coin_store.py +15 -16
  280. chia/full_node/eligible_coin_spends.py +3 -3
  281. chia/full_node/fee_estimate_store.py +2 -3
  282. chia/full_node/fee_tracker.py +1 -2
  283. chia/full_node/full_block_utils.py +4 -4
  284. chia/full_node/full_node.py +239 -223
  285. chia/full_node/full_node_api.py +197 -152
  286. chia/full_node/full_node_rpc_api.py +34 -32
  287. chia/full_node/full_node_rpc_client.py +18 -19
  288. chia/full_node/full_node_store.py +45 -43
  289. chia/full_node/hard_fork_utils.py +44 -0
  290. chia/full_node/hint_management.py +2 -2
  291. chia/full_node/mempool.py +17 -19
  292. chia/full_node/mempool_manager.py +89 -42
  293. chia/full_node/pending_tx_cache.py +2 -3
  294. chia/full_node/start_full_node.py +5 -5
  295. chia/full_node/sync_store.py +3 -4
  296. chia/full_node/tx_processing_queue.py +120 -36
  297. chia/full_node/weight_proof.py +61 -48
  298. chia/harvester/harvester.py +25 -24
  299. chia/harvester/harvester_api.py +61 -38
  300. chia/harvester/harvester_rpc_api.py +10 -10
  301. chia/harvester/start_harvester.py +4 -4
  302. chia/introducer/introducer.py +3 -3
  303. chia/introducer/introducer_api.py +6 -4
  304. chia/introducer/start_introducer.py +4 -4
  305. chia/legacy/keyring.py +3 -3
  306. chia/plot_sync/delta.py +1 -2
  307. chia/plot_sync/receiver.py +20 -17
  308. chia/plot_sync/sender.py +15 -10
  309. chia/plotters/bladebit.py +7 -7
  310. chia/plotters/chiapos.py +2 -2
  311. chia/plotters/madmax.py +4 -4
  312. chia/plotters/plotters.py +4 -4
  313. chia/plotters/plotters_util.py +3 -3
  314. chia/plotting/cache.py +20 -14
  315. chia/plotting/check_plots.py +26 -35
  316. chia/plotting/create_plots.py +22 -23
  317. chia/plotting/manager.py +21 -14
  318. chia/plotting/prover.py +59 -42
  319. chia/plotting/util.py +16 -16
  320. chia/pools/pool_config.py +2 -1
  321. chia/pools/pool_puzzles.py +11 -12
  322. chia/pools/pool_wallet.py +34 -57
  323. chia/pools/pool_wallet_info.py +39 -10
  324. chia/protocols/farmer_protocol.py +8 -9
  325. chia/protocols/fee_estimate.py +3 -4
  326. chia/protocols/full_node_protocol.py +3 -4
  327. chia/protocols/harvester_protocol.py +27 -15
  328. chia/protocols/outbound_message.py +3 -3
  329. chia/protocols/pool_protocol.py +8 -9
  330. chia/protocols/shared_protocol.py +1 -2
  331. chia/protocols/solver_protocol.py +9 -2
  332. chia/protocols/timelord_protocol.py +4 -7
  333. chia/protocols/wallet_protocol.py +11 -12
  334. chia/rpc/rpc_client.py +9 -9
  335. chia/rpc/rpc_server.py +17 -17
  336. chia/rpc/util.py +2 -2
  337. chia/seeder/crawler.py +8 -8
  338. chia/seeder/crawler_api.py +21 -27
  339. chia/seeder/crawler_rpc_api.py +2 -2
  340. chia/seeder/dns_server.py +21 -21
  341. chia/seeder/start_crawler.py +4 -4
  342. chia/server/address_manager.py +15 -16
  343. chia/server/api_protocol.py +11 -11
  344. chia/server/chia_policy.py +46 -26
  345. chia/server/introducer_peers.py +2 -3
  346. chia/server/node_discovery.py +19 -19
  347. chia/server/rate_limit_numbers.py +4 -5
  348. chia/server/rate_limits.py +4 -4
  349. chia/server/resolve_peer_info.py +4 -4
  350. chia/server/server.py +49 -52
  351. chia/server/signal_handlers.py +6 -6
  352. chia/server/start_service.py +17 -17
  353. chia/server/upnp.py +4 -6
  354. chia/server/ws_connection.py +52 -37
  355. chia/simulator/add_blocks_in_batches.py +1 -3
  356. chia/simulator/block_tools.py +312 -200
  357. chia/simulator/full_node_simulator.py +56 -35
  358. chia/simulator/keyring.py +2 -3
  359. chia/simulator/setup_services.py +15 -15
  360. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  361. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  362. chia/simulator/simulator_protocol.py +1 -2
  363. chia/simulator/simulator_test_tools.py +3 -3
  364. chia/simulator/start_simulator.py +7 -7
  365. chia/simulator/wallet_tools.py +10 -10
  366. chia/solver/solver.py +10 -10
  367. chia/solver/solver_api.py +10 -8
  368. chia/solver/solver_rpc_api.py +2 -2
  369. chia/solver/start_solver.py +4 -4
  370. chia/ssl/cacert.pem +148 -90
  371. chia/ssl/chia_ca.crt +14 -10
  372. chia/ssl/chia_ca_old.crt +19 -0
  373. chia/ssl/create_ssl.py +4 -4
  374. chia/ssl/renewedselfsignedca.conf +4 -0
  375. chia/ssl/ssl_check.py +1 -2
  376. chia/timelord/iters_from_block.py +1 -4
  377. chia/timelord/start_timelord.py +4 -4
  378. chia/timelord/timelord.py +44 -40
  379. chia/timelord/timelord_api.py +6 -4
  380. chia/timelord/timelord_launcher.py +2 -2
  381. chia/timelord/timelord_rpc_api.py +2 -2
  382. chia/timelord/timelord_state.py +11 -12
  383. chia/types/block_protocol.py +1 -3
  384. chia/types/blockchain_format/coin.py +1 -3
  385. chia/types/blockchain_format/program.py +11 -8
  386. chia/types/blockchain_format/proof_of_space.py +123 -76
  387. chia/types/blockchain_format/tree_hash.py +3 -3
  388. chia/types/blockchain_format/vdf.py +1 -2
  389. chia/types/coin_spend.py +3 -3
  390. chia/types/mempool_item.py +5 -5
  391. chia/types/mempool_submission_status.py +2 -3
  392. chia/types/peer_info.py +1 -2
  393. chia/types/unfinished_header_block.py +3 -4
  394. chia/types/validation_state.py +1 -2
  395. chia/util/action_scope.py +8 -8
  396. chia/util/async_pool.py +5 -5
  397. chia/util/bech32m.py +1 -2
  398. chia/util/beta_metrics.py +2 -2
  399. chia/util/block_cache.py +4 -4
  400. chia/util/chia_logging.py +2 -2
  401. chia/util/chia_version.py +1 -2
  402. chia/util/config.py +15 -16
  403. chia/util/db_wrapper.py +26 -27
  404. chia/util/default_root.py +1 -2
  405. chia/util/errors.py +3 -3
  406. chia/util/file_keyring.py +14 -14
  407. chia/util/files.py +2 -3
  408. chia/util/hash.py +4 -4
  409. chia/util/initial-config.yaml +4 -5
  410. chia/util/inline_executor.py +2 -1
  411. chia/util/ip_address.py +1 -2
  412. chia/util/keychain.py +25 -27
  413. chia/util/keyring_wrapper.py +18 -19
  414. chia/util/lock.py +3 -4
  415. chia/util/log_exceptions.py +1 -2
  416. chia/util/lru_cache.py +2 -2
  417. chia/util/network.py +6 -6
  418. chia/util/path.py +2 -3
  419. chia/util/priority_mutex.py +2 -2
  420. chia/util/profiler.py +1 -2
  421. chia/util/safe_cancel_task.py +1 -2
  422. chia/util/streamable.py +24 -10
  423. chia/util/task_referencer.py +1 -1
  424. chia/util/timing.py +3 -3
  425. chia/util/virtual_project_analysis.py +6 -5
  426. chia/util/ws_message.py +2 -2
  427. chia/wallet/cat_wallet/cat_info.py +3 -4
  428. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  429. chia/wallet/cat_wallet/cat_utils.py +3 -4
  430. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  431. chia/wallet/cat_wallet/lineage_store.py +3 -4
  432. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  433. chia/wallet/coin_selection.py +9 -10
  434. chia/wallet/conditions.py +142 -106
  435. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  436. chia/wallet/derivation_record.py +1 -2
  437. chia/wallet/derive_keys.py +2 -4
  438. chia/wallet/did_wallet/did_info.py +10 -11
  439. chia/wallet/did_wallet/did_wallet.py +36 -82
  440. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  441. chia/wallet/driver_protocol.py +5 -7
  442. chia/wallet/lineage_proof.py +4 -4
  443. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  444. chia/wallet/nft_wallet/nft_info.py +8 -9
  445. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  446. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  447. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  448. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  449. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  450. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  451. chia/wallet/notification_manager.py +3 -3
  452. chia/wallet/notification_store.py +44 -61
  453. chia/wallet/outer_puzzles.py +6 -7
  454. chia/wallet/puzzle_drivers.py +34 -6
  455. chia/wallet/puzzles/clawback/drivers.py +6 -6
  456. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  457. chia/wallet/puzzles/load_clvm.py +1 -1
  458. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  459. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  460. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  461. chia/wallet/puzzles/tails.py +3 -3
  462. chia/wallet/singleton.py +5 -7
  463. chia/wallet/singleton_record.py +3 -3
  464. chia/wallet/start_wallet.py +5 -5
  465. chia/wallet/trade_manager.py +37 -58
  466. chia/wallet/trade_record.py +4 -4
  467. chia/wallet/trading/offer.py +59 -46
  468. chia/wallet/trading/trade_store.py +8 -9
  469. chia/wallet/transaction_record.py +8 -8
  470. chia/wallet/uncurried_puzzle.py +1 -2
  471. chia/wallet/util/clvm_streamable.py +12 -12
  472. chia/wallet/util/compute_hints.py +4 -5
  473. chia/wallet/util/curry_and_treehash.py +1 -2
  474. chia/wallet/util/merkle_tree.py +2 -3
  475. chia/wallet/util/peer_request_cache.py +8 -8
  476. chia/wallet/util/signing.py +85 -0
  477. chia/wallet/util/tx_config.py +15 -6
  478. chia/wallet/util/wallet_sync_utils.py +14 -16
  479. chia/wallet/util/wallet_types.py +2 -2
  480. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  481. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  482. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  483. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  484. chia/wallet/vc_wallet/vc_store.py +5 -6
  485. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  486. chia/wallet/wallet.py +50 -78
  487. chia/wallet/wallet_action_scope.py +11 -11
  488. chia/wallet/wallet_blockchain.py +12 -12
  489. chia/wallet/wallet_coin_record.py +12 -6
  490. chia/wallet/wallet_coin_store.py +24 -25
  491. chia/wallet/wallet_interested_store.py +3 -5
  492. chia/wallet/wallet_nft_store.py +10 -11
  493. chia/wallet/wallet_node.py +53 -61
  494. chia/wallet/wallet_node_api.py +5 -3
  495. chia/wallet/wallet_protocol.py +23 -23
  496. chia/wallet/wallet_puzzle_store.py +15 -18
  497. chia/wallet/wallet_request_types.py +778 -114
  498. chia/wallet/wallet_retry_store.py +1 -3
  499. chia/wallet/wallet_rpc_api.py +572 -909
  500. chia/wallet/wallet_rpc_client.py +87 -279
  501. chia/wallet/wallet_singleton_store.py +3 -4
  502. chia/wallet/wallet_state_manager.py +332 -106
  503. chia/wallet/wallet_transaction_store.py +11 -14
  504. chia/wallet/wallet_user_store.py +4 -6
  505. chia/wallet/wallet_weight_proof_handler.py +4 -4
  506. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
  507. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
  508. chia/apis.py +0 -21
  509. chia/consensus/check_time_locks.py +0 -57
  510. chia/data_layer/puzzles/__init__.py +0 -0
  511. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  512. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  513. chia/types/coin_record.py +0 -44
  514. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  515. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  516. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  517. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  518. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  520. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  521. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  522. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  524. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  525. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  526. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  527. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  528. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  529. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
  530. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
  531. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
@@ -5,7 +5,7 @@ import logging
5
5
  import time
6
6
  from collections.abc import Awaitable, Sequence
7
7
  from pathlib import Path
8
- from typing import TYPE_CHECKING, ClassVar, Optional, cast
8
+ from typing import TYPE_CHECKING, ClassVar
9
9
 
10
10
  from chia_rs import AugSchemeMPL, G1Element, G2Element, ProofOfSpace
11
11
  from chia_rs.sized_bytes import bytes32
@@ -16,7 +16,7 @@ from chia.consensus.pot_iterations import (
16
16
  calculate_sp_interval_iters,
17
17
  )
18
18
  from chia.harvester.harvester import Harvester
19
- from chia.plotting.prover import PlotVersion
19
+ from chia.plotting.prover import PlotVersion, V1Prover, V2Prover, V2Quality
20
20
  from chia.plotting.util import PlotInfo, parse_plot_info
21
21
  from chia.protocols import harvester_protocol
22
22
  from chia.protocols.farmer_protocol import FarmingInfo
@@ -28,20 +28,22 @@ from chia.server.ws_connection import WSChiaConnection
28
28
  from chia.types.blockchain_format.proof_of_space import (
29
29
  calculate_pos_challenge,
30
30
  calculate_prefix_bits,
31
- calculate_required_plot_strength,
32
31
  generate_plot_public_key,
32
+ is_v1_phased_out,
33
33
  make_pos,
34
34
  passes_plot_filter,
35
- quality_for_partial_proof,
35
+ v1_cut_off_height,
36
36
  )
37
37
  from chia.wallet.derive_keys import master_sk_to_local_sk
38
38
 
39
39
 
40
40
  class HarvesterAPI:
41
41
  if TYPE_CHECKING:
42
- from chia.server.api_protocol import ApiProtocol
42
+ from chia.apis.harvester_stub import HarvesterApiStub
43
43
 
44
- _protocol_check: ClassVar[ApiProtocol] = cast("HarvesterAPI", None)
44
+ # Verify this class implements the HarvesterApiStub protocol
45
+ def _protocol_check(self: HarvesterAPI) -> HarvesterApiStub:
46
+ return self
45
47
 
46
48
  log: logging.Logger
47
49
  harvester: Harvester
@@ -58,7 +60,7 @@ class HarvesterAPI:
58
60
  filter_prefix_bits = calculate_prefix_bits(
59
61
  self.harvester.constants,
60
62
  challenge.peak_height,
61
- plot_info.prover.get_size(),
63
+ plot_info.prover.get_param(),
62
64
  )
63
65
  return passes_plot_filter(
64
66
  filter_prefix_bits,
@@ -89,7 +91,7 @@ class HarvesterAPI:
89
91
  return proofs_found
90
92
 
91
93
  async def _handle_v2_responses(
92
- self, v2_awaitables: Sequence[Awaitable[Optional[PartialProofsData]]], start_time: float, peer: WSChiaConnection
94
+ self, v2_awaitables: Sequence[Awaitable[PartialProofsData | None]], start_time: float, peer: WSChiaConnection
93
95
  ) -> int:
94
96
  partial_proofs_found = 0
95
97
  for quality_awaitable in asyncio.as_completed(v2_awaitables):
@@ -153,13 +155,9 @@ class HarvesterAPI:
153
155
  start = time.monotonic()
154
156
  assert len(new_challenge.challenge_hash) == 32
155
157
 
156
- required_plot_strength = calculate_required_plot_strength(
157
- self.harvester.constants, new_challenge.last_tx_height
158
- )
159
-
160
158
  loop = asyncio.get_running_loop()
161
159
 
162
- def blocking_lookup_v2_partial_proofs(filename: Path, plot_info: PlotInfo) -> Optional[PartialProofsData]:
160
+ def blocking_lookup_v2_partial_proofs(filename: Path, plot_info: PlotInfo) -> PartialProofsData | None:
163
161
  # Uses the V2 Prover object to lookup qualities only. No full proofs generated.
164
162
  try:
165
163
  plot_id = plot_info.prover.get_id()
@@ -168,12 +166,12 @@ class HarvesterAPI:
168
166
  new_challenge.challenge_hash,
169
167
  new_challenge.sp_hash,
170
168
  )
171
- partial_proofs = plot_info.prover.get_partial_proofs_for_challenge(
172
- sp_challenge_hash, required_plot_strength
169
+ qualities = plot_info.prover.get_qualities_for_challenge(
170
+ sp_challenge_hash, self.harvester.constants.QUALITY_PROOF_SCAN_FILTER
173
171
  )
174
172
 
175
173
  # If no partial proofs are found, return None
176
- if len(partial_proofs) == 0:
174
+ if len(qualities) == 0:
177
175
  return None
178
176
 
179
177
  # Get the appropriate difficulty for this plot
@@ -191,33 +189,36 @@ class HarvesterAPI:
191
189
  good_partial_proofs = []
192
190
  sp_interval_iters = calculate_sp_interval_iters(self.harvester.constants, sub_slot_iters)
193
191
 
194
- for partial_proof in partial_proofs:
195
- quality_str = quality_for_partial_proof(partial_proof, new_challenge.challenge_hash)
192
+ for quality in qualities:
196
193
  required_iters: uint64 = calculate_iterations_quality(
197
194
  self.harvester.constants,
198
- quality_str,
199
- plot_info.prover.get_size(),
195
+ quality.get_string(),
196
+ plot_info.prover.get_param(),
200
197
  difficulty,
201
198
  new_challenge.sp_hash,
202
- sub_slot_iters,
203
- new_challenge.last_tx_height,
204
199
  )
205
200
 
206
- if required_iters < sp_interval_iters:
207
- good_partial_proofs.append(partial_proof)
201
+ if required_iters >= sp_interval_iters:
202
+ continue
203
+
204
+ assert isinstance(plot_info.prover, V2Prover)
205
+ assert isinstance(quality, V2Quality)
206
+
207
+ partial_proof = plot_info.prover.get_partial_proof(quality)
208
+ good_partial_proofs.append(partial_proof)
208
209
 
209
210
  if len(good_partial_proofs) == 0:
210
211
  return None
211
212
 
212
- size = plot_info.prover.get_size().size_v2
213
- assert size is not None
214
213
  return PartialProofsData(
215
214
  new_challenge.challenge_hash,
216
215
  new_challenge.sp_hash,
217
- good_partial_proofs[0].hex() + str(filename.resolve()),
216
+ str(filename.resolve()),
218
217
  good_partial_proofs,
219
218
  new_challenge.signage_point_index,
220
- size,
219
+ self.harvester.constants.PLOT_SIZE_V2,
220
+ plot_info.prover.get_strength(),
221
+ plot_id,
221
222
  plot_info.pool_public_key,
222
223
  plot_info.pool_contract_puzzle_hash,
223
224
  plot_info.plot_public_key,
@@ -238,7 +239,9 @@ class HarvesterAPI:
238
239
  new_challenge.sp_hash,
239
240
  )
240
241
  try:
241
- quality_strings = plot_info.prover.get_qualities_for_challenge(sp_challenge_hash)
242
+ qualities = plot_info.prover.get_qualities_for_challenge(
243
+ sp_challenge_hash, self.harvester.constants.QUALITY_PROOF_SCAN_FILTER
244
+ )
242
245
  except RuntimeError as e:
243
246
  if str(e) == "Timeout waiting for context queue.":
244
247
  self.harvester.log.warning(
@@ -264,7 +267,7 @@ class HarvesterAPI:
264
267
  return []
265
268
 
266
269
  responses: list[tuple[bytes32, ProofOfSpace]] = []
267
- if quality_strings is not None:
270
+ if len(qualities) > 0:
268
271
  difficulty = new_challenge.difficulty
269
272
  sub_slot_iters = new_challenge.sub_slot_iters
270
273
  if plot_info.pool_contract_puzzle_hash is not None:
@@ -277,24 +280,34 @@ class HarvesterAPI:
277
280
  sub_slot_iters = pool_difficulty.sub_slot_iters
278
281
 
279
282
  # Found proofs of space (on average 1 is expected per plot)
280
- for index, quality_str in enumerate(quality_strings):
283
+ for index, quality in enumerate(qualities):
281
284
  required_iters: uint64 = calculate_iterations_quality(
282
285
  self.harvester.constants,
283
- quality_str,
284
- plot_info.prover.get_size(),
286
+ quality.get_string(),
287
+ plot_info.prover.get_param(),
285
288
  difficulty,
286
289
  new_challenge.sp_hash,
287
- sub_slot_iters,
288
- new_challenge.last_tx_height,
289
290
  )
290
291
  sp_interval_iters = calculate_sp_interval_iters(self.harvester.constants, sub_slot_iters)
291
292
  if required_iters < sp_interval_iters:
292
293
  # Found a very good proof of space! will fetch the whole proof from disk,
293
294
  # then send to farmer
294
295
  try:
296
+ assert isinstance(plot_info.prover, V1Prover)
295
297
  proof_xs = plot_info.prover.get_full_proof(
296
298
  sp_challenge_hash, index, self.harvester.parallel_read
297
299
  )
300
+
301
+ if is_v1_phased_out(proof_xs, new_challenge.last_tx_height, self.harvester.constants):
302
+ self.harvester.log.info(
303
+ f"Proof dropped due to hard fork phase-out of v1 plots: {filename}"
304
+ )
305
+ self.harvester.log.info(
306
+ f"File: {filename} Plot ID: {plot_id.hex()}, challenge: {sp_challenge_hash}, "
307
+ f"plot_info: {plot_info}"
308
+ )
309
+ continue
310
+
298
311
  except RuntimeError as e:
299
312
  if str(e) == "GRResult_NoProof received":
300
313
  self.harvester.log.info(
@@ -327,6 +340,7 @@ class HarvesterAPI:
327
340
  )
328
341
  continue
329
342
 
343
+ quality_str = bytes32(quality.get_string())
330
344
  responses.append(
331
345
  (
332
346
  quality_str,
@@ -335,7 +349,7 @@ class HarvesterAPI:
335
349
  plot_info.pool_public_key,
336
350
  plot_info.pool_contract_puzzle_hash,
337
351
  plot_info.plot_public_key,
338
- plot_info.prover.get_size(),
352
+ plot_info.prover.get_param(),
339
353
  proof_xs,
340
354
  ),
341
355
  )
@@ -383,6 +397,11 @@ class HarvesterAPI:
383
397
  if not self._plot_passes_filter(try_plot_info, new_challenge):
384
398
  continue
385
399
  if try_plot_info.prover.get_version() == PlotVersion.V2:
400
+ # before hard fork activation, we can't farm v2 plots
401
+ constants = self.harvester.constants
402
+ if new_challenge.last_tx_height < constants.HARD_FORK2_HEIGHT:
403
+ continue
404
+
386
405
  v2_awaitables.append(
387
406
  loop.run_in_executor(
388
407
  self.harvester.executor,
@@ -393,12 +412,15 @@ class HarvesterAPI:
393
412
  )
394
413
  passed += 1
395
414
  else:
415
+ # after the phase-out, ignore v1 plots
416
+ if new_challenge.last_tx_height >= v1_cut_off_height(self.harvester.constants):
417
+ continue
418
+
396
419
  passed += 1
397
420
  awaitables.append(lookup_challenge(try_plot_filename, try_plot_info))
398
421
  self.harvester.log.debug(f"new_signage_point_harvester {passed} plots passed the plot filter")
399
422
 
400
423
  # Concurrently executes all lookups on disk, to take advantage of multiple disk parallelism
401
- time_taken = time.monotonic() - start
402
424
  total_proofs_found = 0
403
425
  total_v2_partial_proofs_found = 0
404
426
 
@@ -419,6 +441,7 @@ class HarvesterAPI:
419
441
  else:
420
442
  total_v2_partial_proofs_found = results[0]
421
443
 
444
+ time_taken = time.monotonic() - start
422
445
  now = uint64(time.time())
423
446
 
424
447
  farming_info = FarmingInfo(
@@ -452,7 +475,7 @@ class HarvesterAPI:
452
475
  )
453
476
 
454
477
  @metadata.request(reply_types=[ProtocolMessageTypes.respond_signatures])
455
- async def request_signatures(self, request: harvester_protocol.RequestSignatures) -> Optional[Message]:
478
+ async def request_signatures(self, request: harvester_protocol.RequestSignatures) -> Message | None:
456
479
  """
457
480
  The farmer requests a signature on the header hash, for one of the proofs that we found.
458
481
  A signature is created on the header hash using the harvester private key. This can also
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
3
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
4
4
 
5
5
  from chia_rs.sized_ints import uint32
6
6
 
@@ -31,7 +31,7 @@ class HarvesterRpcApi:
31
31
  "/update_harvester_config": self.update_harvester_config,
32
32
  }
33
33
 
34
- async def _state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> list[WsRpcMessage]:
34
+ async def _state_changed(self, change: str, change_data: dict[str, Any] | None = None) -> list[WsRpcMessage]:
35
35
  if change_data is None:
36
36
  change_data = {}
37
37
 
@@ -102,14 +102,14 @@ class HarvesterRpcApi:
102
102
  }
103
103
 
104
104
  async def update_harvester_config(self, request: dict[str, Any]) -> EndpointResult:
105
- use_gpu_harvesting: Optional[bool] = None
106
- gpu_index: Optional[int] = None
107
- enforce_gpu_index: Optional[bool] = None
108
- disable_cpu_affinity: Optional[bool] = None
109
- parallel_decompressor_count: Optional[int] = None
110
- decompressor_thread_count: Optional[int] = None
111
- recursive_plot_scan: Optional[bool] = None
112
- refresh_parameter_interval_seconds: Optional[uint32] = None
105
+ use_gpu_harvesting: bool | None = None
106
+ gpu_index: int | None = None
107
+ enforce_gpu_index: bool | None = None
108
+ disable_cpu_affinity: bool | None = None
109
+ parallel_decompressor_count: int | None = None
110
+ decompressor_thread_count: int | None = None
111
+ recursive_plot_scan: bool | None = None
112
+ refresh_parameter_interval_seconds: uint32 | None = None
113
113
  if "use_gpu_harvesting" in request:
114
114
  use_gpu_harvesting = bool(request["use_gpu_harvesting"])
115
115
  if "gpu_index" in request:
@@ -3,11 +3,11 @@ from __future__ import annotations
3
3
  import os
4
4
  import pathlib
5
5
  import sys
6
- from typing import Any, Optional
6
+ from typing import Any
7
7
 
8
8
  from chia_rs import ConsensusConstants
9
9
 
10
- from chia.apis import ApiProtocolRegistry
10
+ from chia.apis import StubMetadataRegistry
11
11
  from chia.consensus.constants import replace_str_to_bytes
12
12
  from chia.consensus.default_constants import DEFAULT_CONSTANTS, update_testnet_overrides
13
13
  from chia.harvester.harvester import Harvester
@@ -48,7 +48,7 @@ def create_harvester_service(
48
48
  peer_api = HarvesterAPI(node)
49
49
  network_id = service_config["selected_network"]
50
50
 
51
- rpc_info: Optional[RpcInfo[HarvesterRpcApi]] = None
51
+ rpc_info: RpcInfo[HarvesterRpcApi] | None = None
52
52
  if service_config.get("start_rpc_server", True):
53
53
  rpc_info = (HarvesterRpcApi, service_config["rpc_port"])
54
54
 
@@ -64,7 +64,7 @@ def create_harvester_service(
64
64
  network_id=network_id,
65
65
  rpc_info=rpc_info,
66
66
  connect_to_daemon=connect_to_daemon,
67
- class_for_type=ApiProtocolRegistry,
67
+ stub_metadata_for_type=StubMetadataRegistry,
68
68
  )
69
69
 
70
70
 
@@ -6,7 +6,7 @@ import logging
6
6
  import random
7
7
  import time
8
8
  from collections.abc import AsyncIterator
9
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
9
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
10
10
 
11
11
  import dns.asyncresolver
12
12
  from chia_rs.sized_ints import uint16, uint64
@@ -42,7 +42,7 @@ class Introducer:
42
42
  self.dns_servers = dns_servers
43
43
  self.resolver = dns.asyncresolver.Resolver()
44
44
  self._shut_down = False
45
- self._server: Optional[ChiaServer] = None
45
+ self._server: ChiaServer | None = None
46
46
  self.log = logging.getLogger(__name__)
47
47
 
48
48
  @contextlib.asynccontextmanager
@@ -62,7 +62,7 @@ class Introducer:
62
62
  # TODO: fill this out?
63
63
  pass
64
64
 
65
- def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
65
+ def get_connections(self, request_node_type: NodeType | None) -> list[dict[str, Any]]:
66
66
  return default_get_connections(server=self.server, request_node_type=request_node_type)
67
67
 
68
68
  def set_server(self, server: ChiaServer):
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING, ClassVar, Optional, cast
4
+ from typing import TYPE_CHECKING, ClassVar
5
5
 
6
6
  from chia_rs.sized_ints import uint64
7
7
 
@@ -17,9 +17,11 @@ from chia.types.peer_info import TimestampedPeerInfo
17
17
 
18
18
  class IntroducerAPI:
19
19
  if TYPE_CHECKING:
20
- from chia.server.api_protocol import ApiProtocol
20
+ from chia.apis.introducer_stub import IntroducerApiStub
21
21
 
22
- _protocol_check: ClassVar[ApiProtocol] = cast("IntroducerAPI", None)
22
+ # Verify this class implements the IntroducerApiStub protocol
23
+ def _protocol_check(self: IntroducerAPI) -> IntroducerApiStub:
24
+ return self
23
25
 
24
26
  log: logging.Logger
25
27
  introducer: Introducer
@@ -40,7 +42,7 @@ class IntroducerAPI:
40
42
  self,
41
43
  request: RequestPeersIntroducer,
42
44
  peer: WSChiaConnection,
43
- ) -> Optional[Message]:
45
+ ) -> Message | None:
44
46
  max_peers = self.introducer.max_peers_to_send
45
47
  if self.introducer.server is None or self.introducer.server.introducer_peers is None:
46
48
  return None
@@ -3,9 +3,9 @@ from __future__ import annotations
3
3
  import os
4
4
  import pathlib
5
5
  import sys
6
- from typing import Any, Optional
6
+ from typing import Any
7
7
 
8
- from chia.apis import ApiProtocolRegistry
8
+ from chia.apis import StubMetadataRegistry
9
9
  from chia.introducer.introducer import Introducer
10
10
  from chia.introducer.introducer_api import IntroducerAPI
11
11
  from chia.introducer.introducer_service import IntroducerService
@@ -26,7 +26,7 @@ SERVICE_NAME = "introducer"
26
26
  def create_introducer_service(
27
27
  root_path: pathlib.Path,
28
28
  config: dict[str, Any],
29
- advertised_port: Optional[int] = None,
29
+ advertised_port: int | None = None,
30
30
  connect_to_daemon: bool = True,
31
31
  ) -> IntroducerService:
32
32
  service_config = config[SERVICE_NAME]
@@ -60,7 +60,7 @@ def create_introducer_service(
60
60
  service_name=SERVICE_NAME,
61
61
  network_id=network_id,
62
62
  connect_to_daemon=connect_to_daemon,
63
- class_for_type=ApiProtocolRegistry,
63
+ stub_metadata_for_type=StubMetadataRegistry,
64
64
  )
65
65
 
66
66
 
chia/legacy/keyring.py CHANGED
@@ -6,7 +6,8 @@ helper it's required to install the `legacy_keyring` extra dependency which can
6
6
  from __future__ import annotations
7
7
 
8
8
  import sys
9
- from typing import Callable, Union, cast
9
+ from collections.abc import Callable
10
+ from typing import TypeAlias, cast
10
11
 
11
12
  import click
12
13
  from chia_rs import G1Element
@@ -21,11 +22,10 @@ except ImportError:
21
22
  sys.exit("Use `install.sh -l` to install the legacy_keyring dependency.")
22
23
  CryptFileKeyring = None
23
24
 
24
-
25
25
  from chia.util.errors import KeychainUserNotFound
26
26
  from chia.util.keychain import MAX_KEYS, KeyData, KeyDataSecrets, get_private_key_user
27
27
 
28
- LegacyKeyring = Union[MacKeyring, WinKeyring, CryptFileKeyring]
28
+ LegacyKeyring: TypeAlias = MacKeyring | WinKeyring | CryptFileKeyring
29
29
 
30
30
 
31
31
  CURRENT_KEY_VERSION = "1.8"
chia/plot_sync/delta.py CHANGED
@@ -1,14 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
- from typing import Union
5
4
 
6
5
  from chia.protocols.harvester_protocol import Plot
7
6
 
8
7
 
9
8
  @dataclass
10
9
  class DeltaType:
11
- additions: Union[dict[str, Plot], list[str]]
10
+ additions: dict[str, Plot] | list[str]
12
11
  removals: list[str]
13
12
 
14
13
  def __str__(self) -> str:
@@ -2,11 +2,11 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import time
5
- from collections.abc import Awaitable, Collection, Sequence
5
+ from collections.abc import Awaitable, Callable, Collection, Sequence
6
6
  from dataclasses import dataclass, field
7
- from typing import Any, Callable, Optional, Union
7
+ from typing import Any
8
8
 
9
- from chia_rs import PlotSize
9
+ from chia_rs import ConsensusConstants
10
10
  from chia_rs.sized_bytes import bytes32
11
11
  from chia_rs.sized_ints import int16, uint32, uint64
12
12
  from typing_extensions import Protocol
@@ -40,7 +40,7 @@ from chia.server.ws_connection import WSChiaConnection
40
40
  log = logging.getLogger(__name__)
41
41
 
42
42
 
43
- def get_list_or_len(list_in: Sequence[object], length: bool) -> Union[int, Sequence[object]]:
43
+ def get_list_or_len(list_in: Sequence[object], length: bool) -> int | Sequence[object]:
44
44
  return len(list_in) if length else list_in
45
45
 
46
46
 
@@ -52,7 +52,7 @@ class Sync:
52
52
  plots_processed: uint32 = uint32(0)
53
53
  plots_total: uint32 = uint32(0)
54
54
  delta: Delta = field(default_factory=Delta)
55
- time_done: Optional[float] = None
55
+ time_done: float | None = None
56
56
 
57
57
  def in_progress(self) -> bool:
58
58
  return self.sync_id != 0
@@ -76,7 +76,7 @@ class Sync:
76
76
 
77
77
 
78
78
  class ReceiverUpdateCallback(Protocol):
79
- def __call__(self, peer_id: bytes32, delta: Optional[Delta]) -> Awaitable[None]:
79
+ def __call__(self, peer_id: bytes32, delta: Delta | None) -> Awaitable[None]:
80
80
  pass
81
81
 
82
82
 
@@ -91,12 +91,14 @@ class Receiver:
91
91
  _total_plot_size: int
92
92
  _total_effective_plot_size: int
93
93
  _update_callback: ReceiverUpdateCallback
94
- _harvesting_mode: Optional[HarvestingMode]
94
+ _harvesting_mode: HarvestingMode | None
95
+ _constants: ConsensusConstants
95
96
 
96
97
  def __init__(
97
98
  self,
98
99
  connection: WSChiaConnection,
99
100
  update_callback: ReceiverUpdateCallback,
101
+ constants: ConsensusConstants,
100
102
  ) -> None:
101
103
  self._connection = connection
102
104
  self._current_sync = Sync()
@@ -109,12 +111,13 @@ class Receiver:
109
111
  self._total_effective_plot_size = 0
110
112
  self._update_callback = update_callback
111
113
  self._harvesting_mode = None
114
+ self._constants = constants
112
115
 
113
- async def trigger_callback(self, update: Optional[Delta] = None) -> None:
116
+ async def trigger_callback(self, update: Delta | None = None) -> None:
114
117
  try:
115
118
  await self._update_callback(self._connection.peer_node_id, update)
116
- except Exception as e:
117
- log.error(f"_update_callback: node_id {self.connection().peer_node_id}, raised {e}")
119
+ except Exception:
120
+ log.exception(f"_update_callback: node_id {self.connection().peer_node_id}")
118
121
 
119
122
  def reset(self) -> None:
120
123
  log.info(f"reset: node_id {self.connection().peer_node_id}, current_sync: {self._current_sync}")
@@ -158,7 +161,7 @@ class Receiver:
158
161
  def total_effective_plot_size(self) -> int:
159
162
  return self._total_effective_plot_size
160
163
 
161
- def harvesting_mode(self) -> Optional[HarvestingMode]:
164
+ def harvesting_mode(self) -> HarvestingMode | None:
162
165
  return self._harvesting_mode
163
166
 
164
167
  async def _process(
@@ -168,7 +171,7 @@ class Receiver:
168
171
  f"_process: node_id {self.connection().peer_node_id}, message_type: {message_type}, message: {message}"
169
172
  )
170
173
 
171
- async def send_response(plot_sync_error: Optional[PlotSyncError] = None) -> None:
174
+ async def send_response(plot_sync_error: PlotSyncError | None = None) -> None:
172
175
  if self._connection is not None:
173
176
  await self._connection.send_message(
174
177
  make_msg(
@@ -181,13 +184,13 @@ class Receiver:
181
184
  await method(message)
182
185
  await send_response()
183
186
  except InvalidIdentifierError as e:
184
- log.warning(f"_process: node_id {self.connection().peer_node_id}, InvalidIdentifierError {e}")
187
+ log.exception(f"_process: node_id {self.connection().peer_node_id}")
185
188
  await send_response(PlotSyncError(int16(e.error_code), f"{e}", e.expected_identifier))
186
189
  except PlotSyncException as e:
187
- log.warning(f"_process: node_id {self.connection().peer_node_id}, Error {e}")
190
+ log.exception(f"_process: node_id {self.connection().peer_node_id}")
188
191
  await send_response(PlotSyncError(int16(e.error_code), f"{e}", None))
189
192
  except Exception as e:
190
- log.warning(f"_process: node_id {self.connection().peer_node_id}, Exception {e}")
193
+ log.exception(f"_process: node_id {self.connection().peer_node_id}")
191
194
  await send_response(PlotSyncError(int16(ErrorCodes.unknown), f"{e}", None))
192
195
 
193
196
  def _validate_identifier(self, identifier: PlotSyncIdentifier, start: bool = False) -> None:
@@ -349,10 +352,10 @@ class Receiver:
349
352
  self._keys_missing = self._current_sync.delta.keys_missing.additions.copy()
350
353
  self._duplicates = self._current_sync.delta.duplicates.additions.copy()
351
354
  self._total_plot_size = sum(plot.file_size for plot in self._plots.values())
355
+
352
356
  self._total_effective_plot_size = int(
353
- # TODO: todo_v2_plots support v2 plots
354
357
  sum(
355
- UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(PlotSize.make_v1(plot.size)))
358
+ UI_ACTUAL_SPACE_CONSTANT_FACTOR * _expected_plot_size(plot.param(), self._constants)
356
359
  for plot in self._plots.values()
357
360
  )
358
361
  )
chia/plot_sync/sender.py CHANGED
@@ -7,9 +7,9 @@ import traceback
7
7
  from collections.abc import Iterable
8
8
  from dataclasses import dataclass
9
9
  from pathlib import Path
10
- from typing import Any, Generic, Optional, TypeVar
10
+ from typing import Any, Generic, TypeVar
11
11
 
12
- from chia_rs.sized_ints import int16, uint32, uint64
12
+ from chia_rs.sized_ints import int16, uint8, uint32, uint64
13
13
  from typing_extensions import Protocol
14
14
 
15
15
  from chia.plot_sync.exceptions import AlreadyStartedError, InvalidConnectionTypeError
@@ -37,13 +37,18 @@ log = logging.getLogger(__name__)
37
37
  def _convert_plot_info_list(plot_infos: list[PlotInfo]) -> list[Plot]:
38
38
  converted: list[Plot] = []
39
39
  for plot_info in plot_infos:
40
- # TODO: todo_v2_plots support v2 plots
41
- k = plot_info.prover.get_size().size_v1
42
- assert k is not None
40
+ param = plot_info.prover.get_param()
41
+ k: uint8
42
+ if param.size_v1 is not None:
43
+ k = param.size_v1
44
+ else:
45
+ assert param.strength_v2 is not None
46
+ k = uint8(0x80 | param.strength_v2)
47
+
43
48
  converted.append(
44
49
  Plot(
45
50
  filename=plot_info.prover.get_filename(),
46
- size=k,
51
+ size=uint8(k),
47
52
  plot_id=plot_info.prover.get_id(),
48
53
  pool_public_key=plot_info.pool_public_key,
49
54
  pool_contract_puzzle_hash=plot_info.pool_contract_puzzle_hash,
@@ -84,7 +89,7 @@ class MessageGenerator(Generic[T]):
84
89
  class ExpectedResponse:
85
90
  message_type: ProtocolMessageTypes
86
91
  identifier: PlotSyncIdentifier
87
- message: Optional[PlotSyncResponse] = None
92
+ message: PlotSyncResponse | None = None
88
93
 
89
94
  def __str__(self) -> str:
90
95
  return (
@@ -95,14 +100,14 @@ class ExpectedResponse:
95
100
 
96
101
  class Sender:
97
102
  _plot_manager: PlotManager
98
- _connection: Optional[WSChiaConnection]
103
+ _connection: WSChiaConnection | None
99
104
  _sync_id: uint64
100
105
  _next_message_id: uint64
101
106
  _messages: list[MessageGenerator[PayloadType]]
102
107
  _last_sync_id: uint64
103
108
  _stop_requested = False
104
- _task: Optional[asyncio.Task[None]]
105
- _response: Optional[ExpectedResponse]
109
+ _task: asyncio.Task[None] | None
110
+ _response: ExpectedResponse | None
106
111
  _harvesting_mode: HarvestingMode
107
112
 
108
113
  def __init__(self, plot_manager: PlotManager, harvesting_mode: HarvestingMode) -> None: