chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__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 (528) 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_build_chains.py +2 -4
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  7. chia/_tests/clvm/coin_store.py +4 -7
  8. chia/_tests/clvm/test_clvm_step.py +4 -4
  9. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  10. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  11. chia/_tests/clvm/test_singletons.py +2 -4
  12. chia/_tests/clvm/test_spend_sim.py +2 -2
  13. chia/_tests/cmds/cmd_test_utils.py +27 -45
  14. chia/_tests/cmds/test_cmd_framework.py +6 -6
  15. chia/_tests/cmds/test_daemon.py +3 -3
  16. chia/_tests/cmds/test_show.py +4 -4
  17. chia/_tests/cmds/test_tx_config_args.py +1 -2
  18. chia/_tests/cmds/testing_classes.py +4 -5
  19. chia/_tests/cmds/wallet/test_did.py +24 -27
  20. chia/_tests/cmds/wallet/test_nft.py +12 -10
  21. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  22. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  23. chia/_tests/conftest.py +59 -30
  24. chia/_tests/connection_utils.py +2 -2
  25. chia/_tests/core/cmds/test_beta.py +4 -4
  26. chia/_tests/core/cmds/test_keys.py +2 -3
  27. chia/_tests/core/cmds/test_wallet.py +15 -15
  28. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  29. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  30. chia/_tests/core/daemon/test_daemon.py +11 -11
  31. chia/_tests/core/data_layer/conftest.py +2 -2
  32. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  33. chia/_tests/core/data_layer/test_data_store.py +10 -10
  34. chia/_tests/core/data_layer/util.py +11 -11
  35. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  36. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  37. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  38. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  39. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  40. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  41. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  42. chia/_tests/core/full_node/test_conditions.py +21 -23
  43. chia/_tests/core/full_node/test_full_node.py +225 -62
  44. chia/_tests/core/full_node/test_hint_management.py +2 -4
  45. chia/_tests/core/full_node/test_performance.py +0 -1
  46. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  47. chia/_tests/core/full_node/test_transactions.py +1 -2
  48. chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
  49. chia/_tests/core/mempool/test_mempool.py +29 -37
  50. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  51. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  52. chia/_tests/core/mempool/test_mempool_manager.py +963 -839
  53. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  54. chia/_tests/core/server/serve.py +7 -7
  55. chia/_tests/core/server/test_dos.py +1 -2
  56. chia/_tests/core/server/test_event_loop.py +12 -4
  57. chia/_tests/core/server/test_loop.py +7 -8
  58. chia/_tests/core/server/test_rate_limits.py +9 -8
  59. chia/_tests/core/server/test_server.py +61 -1
  60. chia/_tests/core/services/test_services.py +2 -2
  61. chia/_tests/core/ssl/test_ssl.py +2 -2
  62. chia/_tests/core/test_cost_calculation.py +2 -6
  63. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  64. chia/_tests/core/test_filter.py +0 -1
  65. chia/_tests/core/test_full_node_rpc.py +2 -2
  66. chia/_tests/core/test_merkle_set.py +1 -2
  67. chia/_tests/core/test_seeder.py +4 -4
  68. chia/_tests/core/util/test_config.py +4 -4
  69. chia/_tests/core/util/test_jsonify.py +2 -2
  70. chia/_tests/core/util/test_keychain.py +3 -3
  71. chia/_tests/core/util/test_lockfile.py +2 -1
  72. chia/_tests/core/util/test_log_exceptions.py +1 -2
  73. chia/_tests/core/util/test_streamable.py +17 -17
  74. chia/_tests/db/test_db_wrapper.py +3 -2
  75. chia/_tests/environments/wallet.py +14 -14
  76. chia/_tests/ether.py +4 -3
  77. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  78. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  79. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  80. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  81. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  82. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  83. chia/_tests/harvester/test_harvester_api.py +11 -4
  84. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  85. chia/_tests/plot_sync/test_receiver.py +11 -10
  86. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  87. chia/_tests/plot_sync/util.py +1 -2
  88. chia/_tests/plotting/test_plot_manager.py +7 -6
  89. chia/_tests/plotting/test_prover.py +30 -38
  90. chia/_tests/pools/test_pool_cmdline.py +4 -6
  91. chia/_tests/pools/test_pool_rpc.py +203 -61
  92. chia/_tests/pools/test_pool_wallet.py +3 -3
  93. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  94. chia/_tests/process_junit.py +2 -2
  95. chia/_tests/rpc/test_rpc_client.py +4 -4
  96. chia/_tests/rpc/test_rpc_server.py +3 -3
  97. chia/_tests/simulation/test_simulation.py +12 -25
  98. chia/_tests/solver/test_solver_service.py +13 -4
  99. chia/_tests/testconfig.py +2 -2
  100. chia/_tests/timelord/test_new_peak.py +22 -11
  101. chia/_tests/tools/test_run_block.py +0 -2
  102. chia/_tests/tools/test_virtual_project.py +2 -1
  103. chia/_tests/util/benchmarks.py +1 -0
  104. chia/_tests/util/blockchain.py +38 -36
  105. chia/_tests/util/blockchain_mock.py +11 -11
  106. chia/_tests/util/build_network_protocol_files.py +2 -1
  107. chia/_tests/util/coin_store.py +2 -1
  108. chia/_tests/util/config.py +1 -1
  109. chia/_tests/util/db_connection.py +2 -3
  110. chia/_tests/util/full_sync.py +9 -11
  111. chia/_tests/util/gen_ssl_certs.py +4 -5
  112. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  113. chia/_tests/util/misc.py +24 -24
  114. chia/_tests/util/network_protocol_data.py +20 -3
  115. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  116. chia/_tests/util/protocol_messages_json.py +292 -3
  117. chia/_tests/util/setup_nodes.py +62 -47
  118. chia/_tests/util/spend_sim.py +57 -57
  119. chia/_tests/util/test_async_pool.py +2 -3
  120. chia/_tests/util/test_chia_version.py +1 -3
  121. chia/_tests/util/test_config.py +3 -3
  122. chia/_tests/util/test_full_block_utils.py +6 -3
  123. chia/_tests/util/test_limited_semaphore.py +1 -2
  124. chia/_tests/util/test_misc.py +2 -2
  125. chia/_tests/util/test_network.py +1 -2
  126. chia/_tests/util/test_priority_mutex.py +3 -3
  127. chia/_tests/util/test_recursive_replace.py +5 -6
  128. chia/_tests/util/test_replace_str_to_bytes.py +8 -10
  129. chia/_tests/util/test_testnet_overrides.py +3 -3
  130. chia/_tests/util/time_out_assert.py +2 -2
  131. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  132. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  133. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  134. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  135. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  136. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  137. chia/_tests/wallet/conftest.py +6 -6
  138. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  139. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  140. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  141. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  142. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  145. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  146. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  147. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  148. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  149. chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
  150. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  151. chia/_tests/wallet/test_coin_management.py +2 -2
  152. chia/_tests/wallet/test_conditions.py +45 -51
  153. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  154. chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
  155. chia/_tests/wallet/test_notifications.py +14 -14
  156. chia/_tests/wallet/test_signer_protocol.py +5 -5
  157. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  158. chia/_tests/wallet/test_transaction_store.py +20 -20
  159. chia/_tests/wallet/test_util.py +2 -2
  160. chia/_tests/wallet/test_wallet.py +380 -228
  161. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  162. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  163. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  164. chia/_tests/wallet/test_wallet_node.py +14 -14
  165. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  166. chia/_tests/wallet/test_wallet_utils.py +2 -3
  167. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  168. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  169. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  170. chia/_tests/wallet/wallet_block_tools.py +12 -11
  171. chia/_tests/weight_proof/config.py +1 -0
  172. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  173. chia/apis/__init__.py +21 -0
  174. chia/apis/farmer_stub.py +102 -0
  175. chia/apis/full_node_stub.py +372 -0
  176. chia/apis/harvester_stub.py +57 -0
  177. chia/apis/introducer_stub.py +35 -0
  178. chia/apis/solver_stub.py +30 -0
  179. chia/apis/stub_protocol_registry.py +21 -0
  180. chia/apis/timelord_stub.py +39 -0
  181. chia/apis/wallet_stub.py +161 -0
  182. chia/cmds/beta.py +3 -4
  183. chia/cmds/beta_funcs.py +4 -3
  184. chia/cmds/check_wallet_db.py +4 -4
  185. chia/cmds/chia.py +1 -2
  186. chia/cmds/cmd_classes.py +11 -13
  187. chia/cmds/cmd_helpers.py +11 -11
  188. chia/cmds/cmds_util.py +15 -15
  189. chia/cmds/coin_funcs.py +6 -7
  190. chia/cmds/coins.py +2 -3
  191. chia/cmds/configure.py +1 -2
  192. chia/cmds/data.py +42 -42
  193. chia/cmds/data_funcs.py +81 -81
  194. chia/cmds/db.py +4 -5
  195. chia/cmds/db_backup_func.py +2 -2
  196. chia/cmds/db_upgrade_func.py +3 -3
  197. chia/cmds/db_validate_func.py +2 -2
  198. chia/cmds/dev/data.py +4 -4
  199. chia/cmds/dev/gh.py +5 -5
  200. chia/cmds/dev/installers.py +2 -3
  201. chia/cmds/dev/mempool.py +3 -4
  202. chia/cmds/dev/mempool_funcs.py +4 -4
  203. chia/cmds/dev/sim.py +8 -8
  204. chia/cmds/dump_keyring.py +3 -3
  205. chia/cmds/farm.py +6 -8
  206. chia/cmds/farm_funcs.py +25 -24
  207. chia/cmds/init_funcs.py +4 -4
  208. chia/cmds/keys.py +16 -18
  209. chia/cmds/keys_funcs.py +36 -36
  210. chia/cmds/netspace.py +1 -3
  211. chia/cmds/netspace_funcs.py +1 -2
  212. chia/cmds/options.py +3 -2
  213. chia/cmds/param_types.py +17 -16
  214. chia/cmds/passphrase.py +6 -7
  215. chia/cmds/passphrase_funcs.py +11 -13
  216. chia/cmds/peer.py +1 -3
  217. chia/cmds/peer_funcs.py +3 -3
  218. chia/cmds/plotnft.py +6 -7
  219. chia/cmds/plotnft_funcs.py +37 -26
  220. chia/cmds/rpc.py +3 -3
  221. chia/cmds/show.py +3 -5
  222. chia/cmds/show_funcs.py +9 -9
  223. chia/cmds/sim_funcs.py +25 -26
  224. chia/cmds/solver.py +1 -3
  225. chia/cmds/solver_funcs.py +1 -2
  226. chia/cmds/start_funcs.py +2 -2
  227. chia/cmds/wallet.py +76 -81
  228. chia/cmds/wallet_funcs.py +206 -177
  229. chia/consensus/augmented_chain.py +6 -6
  230. chia/consensus/block_body_validation.py +19 -15
  231. chia/consensus/block_creation.py +25 -21
  232. chia/consensus/block_header_validation.py +27 -13
  233. chia/consensus/block_height_map.py +3 -6
  234. chia/consensus/block_height_map_protocol.py +2 -2
  235. chia/consensus/block_record.py +2 -4
  236. chia/consensus/blockchain.py +58 -40
  237. chia/consensus/blockchain_interface.py +7 -7
  238. chia/consensus/coin_store_protocol.py +5 -6
  239. chia/consensus/condition_tools.py +4 -4
  240. chia/consensus/cost_calculator.py +2 -3
  241. chia/consensus/default_constants.py +16 -13
  242. chia/consensus/deficit.py +1 -3
  243. chia/consensus/difficulty_adjustment.py +3 -5
  244. chia/consensus/find_fork_point.py +2 -4
  245. chia/consensus/full_block_to_block_record.py +11 -13
  246. chia/consensus/generator_tools.py +2 -3
  247. chia/consensus/get_block_challenge.py +42 -26
  248. chia/consensus/get_block_generator.py +2 -3
  249. chia/consensus/make_sub_epoch_summary.py +8 -7
  250. chia/consensus/multiprocess_validation.py +31 -20
  251. chia/consensus/pos_quality.py +6 -23
  252. chia/consensus/pot_iterations.py +17 -44
  253. chia/consensus/signage_point.py +4 -5
  254. chia/consensus/vdf_info_computation.py +2 -4
  255. chia/daemon/client.py +8 -8
  256. chia/daemon/keychain_proxy.py +31 -37
  257. chia/daemon/server.py +32 -33
  258. chia/daemon/windows_signal.py +4 -3
  259. chia/data_layer/data_layer.py +86 -77
  260. chia/data_layer/data_layer_rpc_api.py +9 -9
  261. chia/data_layer/data_layer_rpc_client.py +13 -15
  262. chia/data_layer/data_layer_server.py +3 -3
  263. chia/data_layer/data_layer_util.py +14 -14
  264. chia/data_layer/data_layer_wallet.py +94 -101
  265. chia/data_layer/data_store.py +50 -50
  266. chia/data_layer/dl_wallet_store.py +9 -12
  267. chia/data_layer/download_data.py +8 -9
  268. chia/data_layer/s3_plugin_service.py +5 -9
  269. chia/data_layer/start_data_layer.py +5 -5
  270. chia/farmer/farmer.py +31 -31
  271. chia/farmer/farmer_api.py +45 -33
  272. chia/farmer/farmer_rpc_api.py +5 -4
  273. chia/farmer/farmer_rpc_client.py +6 -6
  274. chia/farmer/start_farmer.py +6 -6
  275. chia/full_node/block_store.py +13 -16
  276. chia/full_node/check_fork_next_block.py +1 -2
  277. chia/full_node/coin_store.py +15 -16
  278. chia/full_node/eligible_coin_spends.py +3 -3
  279. chia/full_node/fee_estimate_store.py +2 -3
  280. chia/full_node/fee_tracker.py +1 -2
  281. chia/full_node/full_block_utils.py +4 -4
  282. chia/full_node/full_node.py +238 -224
  283. chia/full_node/full_node_api.py +193 -150
  284. chia/full_node/full_node_rpc_api.py +53 -31
  285. chia/full_node/full_node_rpc_client.py +18 -19
  286. chia/full_node/full_node_store.py +45 -43
  287. chia/full_node/hint_management.py +2 -2
  288. chia/full_node/mempool.py +17 -19
  289. chia/full_node/mempool_manager.py +89 -42
  290. chia/full_node/pending_tx_cache.py +2 -3
  291. chia/full_node/start_full_node.py +5 -5
  292. chia/full_node/sync_store.py +3 -4
  293. chia/full_node/tx_processing_queue.py +34 -13
  294. chia/full_node/weight_proof.py +61 -48
  295. chia/harvester/harvester.py +25 -24
  296. chia/harvester/harvester_api.py +61 -38
  297. chia/harvester/harvester_rpc_api.py +10 -10
  298. chia/harvester/start_harvester.py +4 -4
  299. chia/introducer/introducer.py +3 -3
  300. chia/introducer/introducer_api.py +6 -4
  301. chia/introducer/start_introducer.py +4 -4
  302. chia/legacy/keyring.py +3 -3
  303. chia/plot_sync/delta.py +1 -2
  304. chia/plot_sync/receiver.py +20 -17
  305. chia/plot_sync/sender.py +15 -10
  306. chia/plotters/bladebit.py +7 -7
  307. chia/plotters/chiapos.py +2 -2
  308. chia/plotters/madmax.py +4 -4
  309. chia/plotters/plotters.py +4 -4
  310. chia/plotters/plotters_util.py +3 -3
  311. chia/plotting/cache.py +20 -14
  312. chia/plotting/check_plots.py +26 -35
  313. chia/plotting/create_plots.py +22 -23
  314. chia/plotting/manager.py +21 -14
  315. chia/plotting/prover.py +59 -42
  316. chia/plotting/util.py +16 -16
  317. chia/pools/pool_config.py +2 -1
  318. chia/pools/pool_puzzles.py +11 -12
  319. chia/pools/pool_wallet.py +34 -57
  320. chia/pools/pool_wallet_info.py +39 -10
  321. chia/protocols/farmer_protocol.py +8 -9
  322. chia/protocols/fee_estimate.py +3 -4
  323. chia/protocols/full_node_protocol.py +3 -4
  324. chia/protocols/harvester_protocol.py +27 -15
  325. chia/protocols/outbound_message.py +3 -3
  326. chia/protocols/pool_protocol.py +8 -9
  327. chia/protocols/shared_protocol.py +1 -2
  328. chia/protocols/solver_protocol.py +9 -2
  329. chia/protocols/timelord_protocol.py +4 -7
  330. chia/protocols/wallet_protocol.py +11 -12
  331. chia/rpc/rpc_client.py +9 -9
  332. chia/rpc/rpc_server.py +17 -17
  333. chia/rpc/util.py +2 -2
  334. chia/seeder/crawler.py +8 -8
  335. chia/seeder/crawler_api.py +21 -27
  336. chia/seeder/crawler_rpc_api.py +2 -2
  337. chia/seeder/dns_server.py +21 -21
  338. chia/seeder/start_crawler.py +4 -4
  339. chia/server/address_manager.py +15 -16
  340. chia/server/api_protocol.py +11 -11
  341. chia/server/chia_policy.py +46 -26
  342. chia/server/introducer_peers.py +2 -3
  343. chia/server/node_discovery.py +19 -19
  344. chia/server/rate_limit_numbers.py +4 -5
  345. chia/server/rate_limits.py +4 -4
  346. chia/server/resolve_peer_info.py +4 -4
  347. chia/server/server.py +49 -52
  348. chia/server/signal_handlers.py +6 -6
  349. chia/server/start_service.py +17 -17
  350. chia/server/upnp.py +4 -6
  351. chia/server/ws_connection.py +52 -37
  352. chia/simulator/add_blocks_in_batches.py +1 -3
  353. chia/simulator/block_tools.py +312 -200
  354. chia/simulator/full_node_simulator.py +56 -35
  355. chia/simulator/keyring.py +2 -3
  356. chia/simulator/setup_services.py +15 -15
  357. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  358. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  359. chia/simulator/simulator_protocol.py +1 -2
  360. chia/simulator/simulator_test_tools.py +3 -3
  361. chia/simulator/start_simulator.py +7 -7
  362. chia/simulator/wallet_tools.py +10 -10
  363. chia/solver/solver.py +10 -10
  364. chia/solver/solver_api.py +10 -8
  365. chia/solver/solver_rpc_api.py +2 -2
  366. chia/solver/start_solver.py +4 -4
  367. chia/ssl/cacert.pem +148 -90
  368. chia/ssl/chia_ca.crt +14 -10
  369. chia/ssl/chia_ca_old.crt +19 -0
  370. chia/ssl/create_ssl.py +4 -4
  371. chia/ssl/renewedselfsignedca.conf +4 -0
  372. chia/ssl/ssl_check.py +1 -2
  373. chia/timelord/iters_from_block.py +1 -4
  374. chia/timelord/start_timelord.py +4 -4
  375. chia/timelord/timelord.py +44 -40
  376. chia/timelord/timelord_api.py +6 -4
  377. chia/timelord/timelord_launcher.py +2 -2
  378. chia/timelord/timelord_rpc_api.py +2 -2
  379. chia/timelord/timelord_state.py +11 -12
  380. chia/types/block_protocol.py +1 -3
  381. chia/types/blockchain_format/coin.py +1 -3
  382. chia/types/blockchain_format/program.py +11 -8
  383. chia/types/blockchain_format/proof_of_space.py +123 -76
  384. chia/types/blockchain_format/tree_hash.py +3 -3
  385. chia/types/blockchain_format/vdf.py +1 -2
  386. chia/types/coin_spend.py +3 -3
  387. chia/types/mempool_item.py +5 -5
  388. chia/types/mempool_submission_status.py +2 -3
  389. chia/types/peer_info.py +1 -2
  390. chia/types/unfinished_header_block.py +3 -4
  391. chia/types/validation_state.py +1 -2
  392. chia/util/action_scope.py +8 -8
  393. chia/util/async_pool.py +5 -5
  394. chia/util/bech32m.py +1 -2
  395. chia/util/beta_metrics.py +2 -2
  396. chia/util/block_cache.py +4 -4
  397. chia/util/chia_logging.py +2 -2
  398. chia/util/chia_version.py +1 -2
  399. chia/util/config.py +15 -16
  400. chia/util/db_wrapper.py +26 -27
  401. chia/util/default_root.py +1 -2
  402. chia/util/errors.py +3 -3
  403. chia/util/file_keyring.py +14 -14
  404. chia/util/files.py +2 -3
  405. chia/util/hash.py +4 -4
  406. chia/util/initial-config.yaml +3 -5
  407. chia/util/inline_executor.py +2 -1
  408. chia/util/ip_address.py +1 -2
  409. chia/util/keychain.py +25 -27
  410. chia/util/keyring_wrapper.py +18 -19
  411. chia/util/lock.py +3 -4
  412. chia/util/log_exceptions.py +1 -2
  413. chia/util/lru_cache.py +2 -2
  414. chia/util/network.py +6 -6
  415. chia/util/path.py +2 -3
  416. chia/util/priority_mutex.py +2 -2
  417. chia/util/profiler.py +1 -2
  418. chia/util/safe_cancel_task.py +1 -2
  419. chia/util/streamable.py +22 -8
  420. chia/util/task_referencer.py +1 -1
  421. chia/util/timing.py +3 -3
  422. chia/util/virtual_project_analysis.py +6 -5
  423. chia/util/ws_message.py +2 -2
  424. chia/wallet/cat_wallet/cat_info.py +3 -4
  425. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  426. chia/wallet/cat_wallet/cat_utils.py +3 -4
  427. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  428. chia/wallet/cat_wallet/lineage_store.py +3 -4
  429. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  430. chia/wallet/coin_selection.py +9 -10
  431. chia/wallet/conditions.py +120 -105
  432. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  433. chia/wallet/derivation_record.py +1 -2
  434. chia/wallet/derive_keys.py +2 -4
  435. chia/wallet/did_wallet/did_info.py +10 -11
  436. chia/wallet/did_wallet/did_wallet.py +36 -82
  437. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  438. chia/wallet/driver_protocol.py +5 -7
  439. chia/wallet/lineage_proof.py +4 -4
  440. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  441. chia/wallet/nft_wallet/nft_info.py +8 -9
  442. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  443. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  444. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  445. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  446. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  447. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  448. chia/wallet/notification_manager.py +3 -3
  449. chia/wallet/notification_store.py +44 -61
  450. chia/wallet/outer_puzzles.py +6 -7
  451. chia/wallet/puzzle_drivers.py +34 -6
  452. chia/wallet/puzzles/clawback/drivers.py +6 -6
  453. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  454. chia/wallet/puzzles/load_clvm.py +1 -1
  455. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  456. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  457. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  458. chia/wallet/puzzles/tails.py +3 -3
  459. chia/wallet/singleton.py +5 -7
  460. chia/wallet/singleton_record.py +3 -3
  461. chia/wallet/start_wallet.py +5 -5
  462. chia/wallet/trade_manager.py +37 -58
  463. chia/wallet/trade_record.py +4 -4
  464. chia/wallet/trading/offer.py +59 -46
  465. chia/wallet/trading/trade_store.py +8 -9
  466. chia/wallet/transaction_record.py +8 -8
  467. chia/wallet/uncurried_puzzle.py +1 -2
  468. chia/wallet/util/clvm_streamable.py +12 -12
  469. chia/wallet/util/compute_hints.py +4 -5
  470. chia/wallet/util/curry_and_treehash.py +1 -2
  471. chia/wallet/util/merkle_tree.py +2 -3
  472. chia/wallet/util/peer_request_cache.py +8 -8
  473. chia/wallet/util/signing.py +85 -0
  474. chia/wallet/util/tx_config.py +15 -6
  475. chia/wallet/util/wallet_sync_utils.py +14 -16
  476. chia/wallet/util/wallet_types.py +2 -2
  477. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  478. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  479. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  480. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  481. chia/wallet/vc_wallet/vc_store.py +5 -6
  482. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  483. chia/wallet/wallet.py +50 -78
  484. chia/wallet/wallet_action_scope.py +11 -11
  485. chia/wallet/wallet_blockchain.py +12 -12
  486. chia/wallet/wallet_coin_record.py +12 -6
  487. chia/wallet/wallet_coin_store.py +24 -25
  488. chia/wallet/wallet_interested_store.py +3 -5
  489. chia/wallet/wallet_nft_store.py +10 -11
  490. chia/wallet/wallet_node.py +53 -61
  491. chia/wallet/wallet_node_api.py +5 -3
  492. chia/wallet/wallet_protocol.py +23 -23
  493. chia/wallet/wallet_puzzle_store.py +15 -18
  494. chia/wallet/wallet_request_types.py +778 -114
  495. chia/wallet/wallet_retry_store.py +1 -3
  496. chia/wallet/wallet_rpc_api.py +572 -909
  497. chia/wallet/wallet_rpc_client.py +87 -279
  498. chia/wallet/wallet_singleton_store.py +3 -4
  499. chia/wallet/wallet_state_manager.py +332 -106
  500. chia/wallet/wallet_transaction_store.py +11 -14
  501. chia/wallet/wallet_user_store.py +4 -6
  502. chia/wallet/wallet_weight_proof_handler.py +4 -4
  503. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
  505. chia/apis.py +0 -21
  506. chia/consensus/check_time_locks.py +0 -57
  507. chia/data_layer/puzzles/__init__.py +0 -0
  508. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  509. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  510. chia/types/coin_record.py +0 -44
  511. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  512. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  513. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  514. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  515. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  516. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  517. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  518. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  520. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  521. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  522. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  524. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  525. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  526. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/plotters/bladebit.py CHANGED
@@ -7,7 +7,7 @@ import os
7
7
  import sys
8
8
  import traceback
9
9
  from pathlib import Path
10
- from typing import Any, Literal, Optional, Union
10
+ from typing import Any, Literal
11
11
 
12
12
  from chia.plotters.plotters_util import get_venv_bin, reset_loop_policy_for_windows, run_command, run_plotter
13
13
  from chia.plotting.create_plots import resolve_plot_keys
@@ -23,9 +23,9 @@ def is_bladebit_supported() -> bool:
23
23
  return sys.platform.startswith("linux") or sys.platform in {"win32", "cygwin", "darwin"}
24
24
 
25
25
 
26
- def meets_memory_requirement(plotters_root_path: Path) -> tuple[bool, Optional[str]]:
26
+ def meets_memory_requirement(plotters_root_path: Path) -> tuple[bool, str | None]:
27
27
  have_enough_memory: bool = False
28
- warning_string: Optional[str] = None
28
+ warning_string: str | None = None
29
29
 
30
30
  bladebit_executable_path = get_bladebit_executable_path(plotters_root_path)
31
31
  if bladebit_executable_path.exists():
@@ -87,7 +87,7 @@ def get_bladebit_exec_path(with_cuda: bool = False) -> str:
87
87
  return "bladebit.exe" if sys.platform in {"win32", "cygwin"} else "bladebit"
88
88
 
89
89
 
90
- def get_bladebit_exec_venv_path(with_cuda: bool = False) -> Optional[Path]:
90
+ def get_bladebit_exec_venv_path(with_cuda: bool = False) -> Path | None:
91
91
  venv_bin_path = get_venv_bin()
92
92
  if not venv_bin_path:
93
93
  return None
@@ -131,7 +131,7 @@ def get_bladebit_executable_path(plotters_root_path: Path) -> Path:
131
131
 
132
132
  def get_bladebit_version(
133
133
  plotters_root_path: Path,
134
- ) -> Union[tuple[Literal[False], str], tuple[None, str], tuple[Literal[True], list[str]]]:
134
+ ) -> tuple[Literal[False], str] | tuple[None, str] | tuple[Literal[True], list[str]]:
135
135
  bladebit_executable_path = get_bladebit_executable_path(plotters_root_path)
136
136
  if not bladebit_executable_path.exists():
137
137
  # (found=False, "")
@@ -157,7 +157,7 @@ def get_bladebit_version(
157
157
  return None, str(e)
158
158
 
159
159
 
160
- def get_bladebit_install_info(plotters_root_path: Path) -> Optional[dict[str, Any]]:
160
+ def get_bladebit_install_info(plotters_root_path: Path) -> dict[str, Any] | None:
161
161
  info: dict[str, Any] = {"display_name": "BladeBit Plotter"}
162
162
  installed: bool = False
163
163
  supported: bool = is_bladebit_supported()
@@ -165,7 +165,7 @@ def get_bladebit_install_info(plotters_root_path: Path) -> Optional[dict[str, An
165
165
 
166
166
  bladebit_executable_path = get_bladebit_executable_path(plotters_root_path)
167
167
  if bladebit_executable_path.exists():
168
- version: Optional[str] = None
168
+ version: str | None = None
169
169
  found, response = get_bladebit_version(plotters_root_path)
170
170
  if found:
171
171
  version = ".".join(response)
chia/plotters/chiapos.py CHANGED
@@ -10,7 +10,7 @@ import importlib.metadata
10
10
  import logging
11
11
  from argparse import Namespace
12
12
  from pathlib import Path
13
- from typing import Any, Optional
13
+ from typing import Any
14
14
 
15
15
  from chia.plotting.create_plots import create_plots, resolve_plot_keys
16
16
  from chia.plotting.util import Params, add_plot_directory, validate_plot_size
@@ -18,7 +18,7 @@ from chia.plotting.util import Params, add_plot_directory, validate_plot_size
18
18
  log = logging.getLogger(__name__)
19
19
 
20
20
 
21
- def get_chiapos_install_info() -> Optional[dict[str, Any]]:
21
+ def get_chiapos_install_info() -> dict[str, Any] | None:
22
22
  chiapos_version = importlib.metadata.version("chiapos")
23
23
  return {"display_name": "Chia Proof of Space", "version": chiapos_version, "installed": True}
24
24
 
chia/plotters/madmax.py CHANGED
@@ -6,7 +6,7 @@ import os
6
6
  import sys
7
7
  import traceback
8
8
  from pathlib import Path
9
- from typing import Any, Optional
9
+ from typing import Any
10
10
 
11
11
  from chia.plotters.plotters_util import get_venv_bin, reset_loop_policy_for_windows, run_command, run_plotter
12
12
  from chia.plotting.create_plots import resolve_plot_keys
@@ -32,7 +32,7 @@ def get_madmax_package_path() -> Path:
32
32
  return Path(os.path.dirname(sys.executable)).joinpath("madmax")
33
33
 
34
34
 
35
- def get_madmax_exec_venv_path(ksize: int = 32) -> Optional[Path]:
35
+ def get_madmax_exec_venv_path(ksize: int = 32) -> Path | None:
36
36
  venv_bin_path = get_venv_bin()
37
37
  if not venv_bin_path:
38
38
  return None
@@ -100,14 +100,14 @@ def get_madmax_version(plotters_root_path: Path):
100
100
  return None, f"Failed to determine madmax version: {e} {tb}"
101
101
 
102
102
 
103
- def get_madmax_install_info(plotters_root_path: Path) -> Optional[dict[str, Any]]:
103
+ def get_madmax_install_info(plotters_root_path: Path) -> dict[str, Any] | None:
104
104
  info: dict[str, Any] = {"display_name": "madMAx Plotter"}
105
105
  installed: bool = False
106
106
  supported: bool = is_madmax_supported()
107
107
 
108
108
  madmax_executable_path = get_madmax_executable_path_for_ksize(plotters_root_path)
109
109
  if madmax_executable_path.exists():
110
- version: Optional[str] = None
110
+ version: str | None = None
111
111
  found, result_msg = get_madmax_version(plotters_root_path)
112
112
  if found:
113
113
  version = ".".join(result_msg)
chia/plotters/plotters.py CHANGED
@@ -5,7 +5,7 @@ import binascii
5
5
  import os
6
6
  from enum import Enum
7
7
  from pathlib import Path
8
- from typing import Any, Optional
8
+ from typing import Any
9
9
 
10
10
  from chia.plotters.bladebit import get_bladebit_install_info, plot_bladebit
11
11
  from chia.plotters.chiapos import get_chiapos_install_info, plot_chia
@@ -550,9 +550,9 @@ def call_plotters(root_path: Path, args):
550
550
  def get_available_plotters(root_path) -> dict[str, Any]:
551
551
  plotters_root_path: Path = get_plotters_root_path(root_path)
552
552
  plotters: dict[str, Any] = {}
553
- chiapos: Optional[dict[str, Any]] = get_chiapos_install_info()
554
- bladebit: Optional[dict[str, Any]] = get_bladebit_install_info(plotters_root_path)
555
- madmax: Optional[dict[str, Any]] = get_madmax_install_info(plotters_root_path)
553
+ chiapos: dict[str, Any] | None = get_chiapos_install_info()
554
+ bladebit: dict[str, Any] | None = get_bladebit_install_info(plotters_root_path)
555
+ madmax: dict[str, Any] | None = get_madmax_install_info(plotters_root_path)
556
556
 
557
557
  if chiapos is not None:
558
558
  plotters["chiapos"] = chiapos
@@ -10,7 +10,7 @@ import sys
10
10
  from collections.abc import Iterator
11
11
  from datetime import datetime
12
12
  from pathlib import Path
13
- from typing import Optional, TextIO
13
+ from typing import TextIO
14
14
 
15
15
  from chia.util.chia_version import chia_short_version
16
16
  from chia.util.config import lock_and_load_config
@@ -18,8 +18,8 @@ from chia.util.task_referencer import create_referenced_task
18
18
 
19
19
 
20
20
  @contextlib.contextmanager
21
- def get_optional_beta_plot_log_file(root_path: Path, plotter: str) -> Iterator[Optional[TextIO]]:
22
- beta_log_path: Optional[Path] = None
21
+ def get_optional_beta_plot_log_file(root_path: Path, plotter: str) -> Iterator[TextIO | None]:
22
+ beta_log_path: Path | None = None
23
23
  with lock_and_load_config(root_path, "config.yaml") as config:
24
24
  if config.get("beta", {}).get("enabled", False):
25
25
  file_name = f"{plotter}_{datetime.now().strftime('%m_%d_%Y__%H_%M_%S')}.log"
chia/plotting/cache.py CHANGED
@@ -5,14 +5,15 @@ import time
5
5
  import traceback
6
6
  from collections.abc import ItemsView, KeysView, ValuesView
7
7
  from dataclasses import dataclass, field
8
+ from functools import lru_cache
8
9
  from math import ceil
9
10
  from pathlib import Path
10
- from typing import TYPE_CHECKING, Optional
11
+ from typing import TYPE_CHECKING
11
12
 
12
13
  if TYPE_CHECKING:
13
14
  from chia.plotting.prover import ProverProtocol
14
15
 
15
- from chia_rs import G1Element
16
+ from chia_rs import G1Element, PrivateKey
16
17
  from chia_rs.sized_bytes import bytes32
17
18
  from chia_rs.sized_ints import uint16, uint64
18
19
 
@@ -27,13 +28,18 @@ log = logging.getLogger(__name__)
27
28
  CURRENT_VERSION: int = 2
28
29
 
29
30
 
31
+ @lru_cache
32
+ def cached_master_sk_to_local_sk(master: PrivateKey) -> PrivateKey:
33
+ return master_sk_to_local_sk(master)
34
+
35
+
30
36
  @streamable
31
37
  @dataclass(frozen=True)
32
38
  class DiskCacheEntry(Streamable):
33
39
  prover_data: bytes
34
40
  farmer_public_key: G1Element
35
- pool_public_key: Optional[G1Element]
36
- pool_contract_puzzle_hash: Optional[bytes32]
41
+ pool_public_key: G1Element | None
42
+ pool_contract_puzzle_hash: bytes32 | None
37
43
  plot_public_key: G1Element
38
44
  last_use: uint64
39
45
 
@@ -48,8 +54,8 @@ class CacheDataV1(Streamable):
48
54
  class CacheEntry:
49
55
  prover: ProverProtocol
50
56
  farmer_public_key: G1Element
51
- pool_public_key: Optional[G1Element]
52
- pool_contract_puzzle_hash: Optional[bytes32]
57
+ pool_public_key: G1Element | None
58
+ pool_contract_puzzle_hash: bytes32 | None
53
59
  plot_public_key: G1Element
54
60
  last_use: float
55
61
 
@@ -61,15 +67,15 @@ class CacheEntry:
61
67
  local_master_sk,
62
68
  ) = parse_plot_info(prover.get_memo())
63
69
 
64
- pool_public_key: Optional[G1Element] = None
65
- pool_contract_puzzle_hash: Optional[bytes32] = None
70
+ pool_public_key: G1Element | None = None
71
+ pool_contract_puzzle_hash: bytes32 | None = None
66
72
  if isinstance(pool_public_key_or_puzzle_hash, G1Element):
67
73
  pool_public_key = pool_public_key_or_puzzle_hash
68
74
  else:
69
75
  assert isinstance(pool_public_key_or_puzzle_hash, bytes32)
70
76
  pool_contract_puzzle_hash = pool_public_key_or_puzzle_hash
71
77
 
72
- local_sk = master_sk_to_local_sk(local_master_sk)
78
+ local_sk = cached_master_sk_to_local_sk(local_master_sk)
73
79
 
74
80
  plot_public_key: G1Element = generate_plot_public_key(
75
81
  local_sk.get_g1(), farmer_public_key, pool_contract_puzzle_hash is not None
@@ -165,9 +171,9 @@ class Cache:
165
171
  # it's here to filter invalid cache entries coming from bladebit RAM plotting.
166
172
  # Related: - https://github.com/Chia-Network/chia-blockchain/issues/13084
167
173
  # - https://github.com/Chia-Network/chiapos/pull/337
168
- ps = new_entry.prover.get_size()
169
- if ps.size_v1 is not None:
170
- k = ps.size_v1
174
+ param = new_entry.prover.get_param()
175
+ if param.size_v1 is not None:
176
+ k = param.size_v1
171
177
  if k not in estimated_c2_sizes:
172
178
  estimated_c2_sizes[k] = ceil(2**k / 100_000_000) * ceil(k / 8)
173
179
  memo_size = len(new_entry.prover.get_memo())
@@ -190,7 +196,7 @@ class Cache:
190
196
  )
191
197
  else:
192
198
  self._data[Path(path)] = new_entry
193
- elif ps.size_v2 is not None:
199
+ elif param.strength_v2 is not None:
194
200
  # TODO: todo_v2_plots validate prover size
195
201
  self._data[Path(path)] = new_entry
196
202
 
@@ -212,7 +218,7 @@ class Cache:
212
218
  def items(self) -> ItemsView[Path, CacheEntry]:
213
219
  return self._data.items()
214
220
 
215
- def get(self, path: Path) -> Optional[CacheEntry]:
221
+ def get(self, path: Path) -> CacheEntry | None:
216
222
  return self._data.get(path)
217
223
 
218
224
  def changed(self) -> bool:
@@ -7,16 +7,14 @@ from collections.abc import Sequence
7
7
  from pathlib import Path
8
8
  from threading import Lock
9
9
  from time import monotonic, sleep
10
- from typing import Optional, Union
11
10
 
12
- from chia_rs import G1Element
13
- from chia_rs.sized_bytes import bytes32
11
+ from chia_rs import G1Element, solve_proof
14
12
  from chia_rs.sized_ints import uint8, uint32
15
13
  from chiapos import Verifier
16
14
 
17
15
  from chia.consensus.default_constants import DEFAULT_CONSTANTS
18
16
  from chia.plotting.manager import PlotManager
19
- from chia.plotting.prover import PlotVersion
17
+ from chia.plotting.prover import QualityProtocol, V1Prover, V2Prover, V2Quality
20
18
  from chia.plotting.util import (
21
19
  PlotInfo,
22
20
  PlotRefreshEvents,
@@ -26,10 +24,6 @@ from chia.plotting.util import (
26
24
  get_plot_filenames,
27
25
  parse_plot_info,
28
26
  )
29
- from chia.types.blockchain_format.proof_of_space import (
30
- quality_for_partial_proof,
31
- solve_proof,
32
- )
33
27
  from chia.util.bech32m import encode_puzzle_hash
34
28
  from chia.util.config import load_config
35
29
  from chia.util.cpu import available_logical_cores
@@ -46,8 +40,8 @@ def plot_refresh_callback(event: PlotRefreshEvents, refresh_result: PlotRefreshR
46
40
 
47
41
  def check_plots(
48
42
  root_path: Path,
49
- num: Optional[int],
50
- challenge_start: Optional[int],
43
+ num: int | None,
44
+ challenge_start: int | None,
51
45
  grep_string: str,
52
46
  list_duplicates: bool,
53
47
  debug_show_memo: bool,
@@ -61,6 +55,7 @@ def check_plots(
61
55
  open_no_key_filenames=True,
62
56
  refresh_parameter=plot_refresh_parameter,
63
57
  refresh_callback=plot_refresh_callback,
58
+ constants=DEFAULT_CONSTANTS,
64
59
  )
65
60
 
66
61
  context_count = config["harvester"].get("parallel_decompressor_count", 5)
@@ -142,7 +137,7 @@ def check_plots(
142
137
  log.info("")
143
138
  log.info(f"Starting to test each plot with {num} challenges each\n")
144
139
  total_good_plots_v1: Counter[uint8] = Counter()
145
- total_good_plots_v2: Counter[uint8] = Counter()
140
+ total_good_plots_v2: int = 0
146
141
  total_size = 0
147
142
  bad_plots_list: list[Path] = []
148
143
 
@@ -165,7 +160,7 @@ def check_plots(
165
160
  local_sk = master_sk_to_local_sk(local_master_sk)
166
161
 
167
162
  with lock:
168
- log.info(f"Testing plot {plot_path} k={pr.get_size()}")
163
+ log.info(f"Testing plot {plot_path} k={pr.get_param()}")
169
164
  if plot_info.pool_public_key is not None:
170
165
  log.info(f"\t{'Pool public key:':<23} {plot_info.pool_public_key}")
171
166
  if plot_info.pool_contract_puzzle_hash is not None:
@@ -176,18 +171,13 @@ def check_plots(
176
171
 
177
172
  total_proofs = 0
178
173
  caught_exception: bool = False
179
- version = pr.get_version()
180
174
  for i in range(num_start, num_end):
181
175
  challenge = std_hash(i.to_bytes(32, "big"))
182
- # these are either qualities (v1) or partial proofs (v2)
183
- proofs: Sequence[Union[bytes32, bytes]]
176
+ qualities: Sequence[QualityProtocol]
184
177
  # Some plot errors cause get_qualities_for_challenge to throw a RuntimeError
185
178
  try:
186
179
  quality_start_time = round(monotonic() * 1000)
187
- if version == PlotVersion.V1:
188
- proofs = pr.get_qualities_for_challenge(challenge)
189
- else:
190
- proofs = pr.get_partial_proofs_for_challenge(challenge, DEFAULT_CONSTANTS.PLOT_STRENGTH_INITIAL)
180
+ qualities = pr.get_qualities_for_challenge(challenge, DEFAULT_CONSTANTS.QUALITY_PROOF_SCAN_FILTER)
191
181
  quality_spent_time = round(monotonic() * 1000) - quality_start_time
192
182
  if quality_spent_time > 8000:
193
183
  log.warning(
@@ -215,18 +205,22 @@ def check_plots(
215
205
  caught_exception = True
216
206
  break
217
207
 
218
- for index, proof in enumerate(proofs):
208
+ for index, quality in enumerate(qualities):
219
209
  # Other plot errors cause get_full_proof or validate_proof to throw an AssertionError
220
210
  try:
221
211
  proof_start_time = round(monotonic() * 1000)
222
- if version == PlotVersion.V1:
223
- quality_str = bytes32(proof)
212
+ quality_str = quality.get_string()
213
+
214
+ if isinstance(pr, V1Prover):
224
215
  full_proof = pr.get_full_proof(challenge, index, parallel_read)
225
216
  proof_spent_time = round(monotonic() * 1000) - proof_start_time
226
- else:
227
- quality_str = quality_for_partial_proof(proof, challenge)
217
+ elif isinstance(pr, V2Prover):
218
+ assert isinstance(quality, V2Quality)
219
+ partial_proof = pr.get_partial_proof(quality)
228
220
  proof_spent_time = round(monotonic() * 1000) - proof_start_time
229
- full_proof = solve_proof(proof)
221
+ full_proof = solve_proof(
222
+ partial_proof, pr.get_id(), pr.get_strength(), DEFAULT_CONSTANTS.PLOT_SIZE_V2
223
+ )
230
224
 
231
225
  if proof_spent_time > 15000:
232
226
  log.warning(
@@ -236,7 +230,7 @@ def check_plots(
236
230
  else:
237
231
  log.info(f"\tFinding proof took: {proof_spent_time} ms. Filepath: {plot_path}")
238
232
 
239
- ver_quality_str = v.validate_proof(pr.get_id(), pr.get_size().size_v1, challenge, full_proof)
233
+ ver_quality_str = v.validate_proof(pr.get_id(), pr.get_param().size_v1, challenge, full_proof)
240
234
  if quality_str == ver_quality_str:
241
235
  total_proofs += 1
242
236
  else:
@@ -257,15 +251,13 @@ def check_plots(
257
251
  f"\tProofs {total_proofs} / {challenges}, {round(total_proofs / float(challenges), 4)}. "
258
252
  f"Filepath: {plot_path}"
259
253
  )
260
- version_and_size = pr.get_size()
261
- if version_and_size.size_v1 is not None:
262
- k = version_and_size.size_v1
254
+ param = pr.get_param()
255
+ if param.size_v1 is not None:
256
+ k = param.size_v1
263
257
  total_good_plots_v1[k] += 1
264
258
  total_size += plot_path.stat().st_size
265
259
  else:
266
- assert version_and_size.size_v2 is not None
267
- k = version_and_size.size_v2
268
- total_good_plots_v2[k] += 1
260
+ total_good_plots_v2 += 1
269
261
  total_size += plot_path.stat().st_size
270
262
  else:
271
263
  log.error(
@@ -288,12 +280,11 @@ def check_plots(
288
280
  log.info("")
289
281
  log.info("")
290
282
  log.info("Summary")
291
- total_plots: int = sum(list(total_good_plots_v1.values()) + list(total_good_plots_v2.values()))
283
+ total_plots: int = sum(list(total_good_plots_v1.values())) + total_good_plots_v2
292
284
  log.info(f"Found {total_plots} valid plots, total size {total_size / (1024 * 1024 * 1024 * 1024):.5f} TiB")
293
285
  for k, count in sorted(dict(total_good_plots_v1).items()):
294
286
  log.info(f"{count} v1 plots of size {k}")
295
- for k, count in sorted(dict(total_good_plots_v2).items()):
296
- log.info(f"{count} v2 plots of size {k}")
287
+ log.info(f"{total_good_plots_v2} v2 plots")
297
288
  grand_total_bad = len(bad_plots_list) + len(plot_manager.failed_to_open_filenames)
298
289
  if grand_total_bad > 0:
299
290
  log.warning(f"{grand_total_bad} invalid plots found:")
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  import logging
4
4
  from datetime import datetime
5
5
  from pathlib import Path
6
- from typing import Optional
7
6
 
8
7
  from chia_rs import AugSchemeMPL, G1Element, PrivateKey
9
8
  from chia_rs.sized_bytes import bytes32
@@ -27,15 +26,15 @@ class PlotKeys:
27
26
  def __init__(
28
27
  self,
29
28
  farmer_public_key: G1Element,
30
- pool_public_key: Optional[G1Element],
31
- pool_contract_address: Optional[str],
29
+ pool_public_key: G1Element | None,
30
+ pool_contract_address: str | None,
32
31
  ):
33
32
  self.farmer_public_key = farmer_public_key
34
33
  self.pool_public_key = pool_public_key
35
34
  self.pool_contract_address = pool_contract_address
36
35
 
37
36
  @property
38
- def pool_contract_puzzle_hash(self) -> Optional[bytes32]:
37
+ def pool_contract_puzzle_hash(self) -> bytes32 | None:
39
38
  if self.pool_contract_address is not None:
40
39
  return decode_puzzle_hash(self.pool_contract_address)
41
40
  return None
@@ -44,10 +43,10 @@ class PlotKeys:
44
43
  class PlotKeysResolver:
45
44
  def __init__(
46
45
  self,
47
- farmer_public_key: Optional[str],
48
- alt_fingerprint: Optional[int],
49
- pool_public_key: Optional[str],
50
- pool_contract_address: Optional[str],
46
+ farmer_public_key: str | None,
47
+ alt_fingerprint: int | None,
48
+ pool_public_key: str | None,
49
+ pool_contract_address: str | None,
51
50
  root_path: Path,
52
51
  log: logging.Logger,
53
52
  connect_to_daemon: bool = False,
@@ -59,13 +58,13 @@ class PlotKeysResolver:
59
58
  self.root_path = root_path
60
59
  self.log = log
61
60
  self.connect_to_daemon = connect_to_daemon
62
- self.resolved_keys: Optional[PlotKeys] = None
61
+ self.resolved_keys: PlotKeys | None = None
63
62
 
64
63
  async def resolve(self) -> PlotKeys:
65
64
  if self.resolved_keys is not None:
66
65
  return self.resolved_keys
67
66
 
68
- keychain_proxy: Optional[KeychainProxy] = None
67
+ keychain_proxy: KeychainProxy | None = None
69
68
  try:
70
69
  if self.connect_to_daemon:
71
70
  keychain_proxy = await connect_to_keychain_and_validate(self.root_path, self.log)
@@ -78,7 +77,7 @@ class PlotKeysResolver:
78
77
  else:
79
78
  farmer_public_key = await self.get_farmer_public_key(keychain_proxy)
80
79
 
81
- pool_public_key: Optional[G1Element] = None
80
+ pool_public_key: G1Element | None = None
82
81
  if self.pool_public_key is not None:
83
82
  if self.pool_contract_address is not None:
84
83
  raise RuntimeError("Choose one of pool_contract_address and pool_public_key")
@@ -93,8 +92,8 @@ class PlotKeysResolver:
93
92
  await keychain_proxy.close()
94
93
  return self.resolved_keys
95
94
 
96
- async def get_sk(self, keychain_proxy: Optional[KeychainProxy] = None) -> Optional[PrivateKey]:
97
- sk: Optional[PrivateKey] = None
95
+ async def get_sk(self, keychain_proxy: KeychainProxy | None = None) -> PrivateKey | None:
96
+ sk: PrivateKey | None = None
98
97
  if keychain_proxy:
99
98
  try:
100
99
  if self.alt_fingerprint is not None:
@@ -104,7 +103,7 @@ class PlotKeysResolver:
104
103
  except Exception as e:
105
104
  log.error(f"Keychain proxy failed with error: {e}")
106
105
  else:
107
- sk_ent: Optional[tuple[PrivateKey, bytes]] = None
106
+ sk_ent: tuple[PrivateKey, bytes] | None = None
108
107
  keychain: Keychain = Keychain()
109
108
  if self.alt_fingerprint is not None:
110
109
  sk_ent = keychain.get_private_key_by_fingerprint(self.alt_fingerprint)
@@ -115,16 +114,16 @@ class PlotKeysResolver:
115
114
  sk = sk_ent[0]
116
115
  return sk
117
116
 
118
- async def get_farmer_public_key(self, keychain_proxy: Optional[KeychainProxy] = None) -> G1Element:
119
- sk: Optional[PrivateKey] = await self.get_sk(keychain_proxy)
117
+ async def get_farmer_public_key(self, keychain_proxy: KeychainProxy | None = None) -> G1Element:
118
+ sk: PrivateKey | None = await self.get_sk(keychain_proxy)
120
119
  if sk is None:
121
120
  raise RuntimeError(
122
121
  "No keys, please run 'chia keys add', 'chia keys generate' or provide a public key with -f"
123
122
  )
124
123
  return master_sk_to_farmer_sk(sk).get_g1()
125
124
 
126
- async def get_pool_public_key(self, keychain_proxy: Optional[KeychainProxy] = None) -> G1Element:
127
- sk: Optional[PrivateKey] = await self.get_sk(keychain_proxy)
125
+ async def get_pool_public_key(self, keychain_proxy: KeychainProxy | None = None) -> G1Element:
126
+ sk: PrivateKey | None = await self.get_sk(keychain_proxy)
128
127
  if sk is None:
129
128
  raise RuntimeError(
130
129
  "No keys, please run 'chia keys add', 'chia keys generate' or provide a public key with -p"
@@ -133,10 +132,10 @@ class PlotKeysResolver:
133
132
 
134
133
 
135
134
  async def resolve_plot_keys(
136
- farmer_public_key: Optional[str],
137
- alt_fingerprint: Optional[int],
138
- pool_public_key: Optional[str],
139
- pool_contract_address: Optional[str],
135
+ farmer_public_key: str | None,
136
+ alt_fingerprint: int | None,
137
+ pool_public_key: str | None,
138
+ pool_contract_address: str | None,
140
139
  root_path: Path,
141
140
  log: logging.Logger,
142
141
  connect_to_daemon: bool = False,
@@ -150,7 +149,7 @@ async def create_plots(
150
149
  args: Params,
151
150
  keys: PlotKeys,
152
151
  use_datetime: bool = True,
153
- test_private_keys: Optional[list[PrivateKey]] = None,
152
+ test_private_keys: list[PrivateKey] | None = None,
154
153
  ) -> tuple[dict[bytes32, Path], dict[bytes32, Path]]:
155
154
  if args.tmp2_dir is None:
156
155
  args.tmp2_dir = args.tmp_dir
chia/plotting/manager.py CHANGED
@@ -4,11 +4,12 @@ import logging
4
4
  import threading
5
5
  import time
6
6
  import traceback
7
+ from collections.abc import Callable
7
8
  from concurrent.futures.thread import ThreadPoolExecutor
8
9
  from pathlib import Path
9
- from typing import Any, Callable, Optional
10
+ from typing import Any
10
11
 
11
- from chia_rs import G1Element
12
+ from chia_rs import ConsensusConstants, G1Element
12
13
  from chiapos import decompressor_context_queue
13
14
 
14
15
  from chia.consensus.pos_quality import UI_ACTUAL_SPACE_CONSTANT_FACTOR, _expected_plot_size
@@ -36,24 +37,26 @@ class PlotManager:
36
37
  farmer_public_keys: list[G1Element]
37
38
  pool_public_keys: list[G1Element]
38
39
  cache: Cache
39
- match_str: Optional[str]
40
+ match_str: str | None
40
41
  open_no_key_filenames: bool
41
42
  last_refresh_time: float
42
43
  refresh_parameter: PlotsRefreshParameter
43
44
  log: Any
44
45
  _lock: threading.Lock
45
- _refresh_thread: Optional[threading.Thread]
46
+ _refresh_thread: threading.Thread | None
46
47
  _refreshing_enabled: bool
47
48
  _refresh_callback: Callable
48
49
  _initial: bool
49
50
  max_compression_level_allowed: int
50
51
  context_count: int
52
+ constants: ConsensusConstants
51
53
 
52
54
  def __init__(
53
55
  self,
54
56
  root_path: Path,
55
57
  refresh_callback: Callable,
56
- match_str: Optional[str] = None,
58
+ constants: ConsensusConstants,
59
+ match_str: str | None = None,
57
60
  open_no_key_filenames: bool = False,
58
61
  refresh_parameter: PlotsRefreshParameter = PlotsRefreshParameter(),
59
62
  ):
@@ -82,6 +85,7 @@ class PlotManager:
82
85
  self._initial = True
83
86
  self.max_compression_level_allowed = 0
84
87
  self.context_count = 0
88
+ self.constants = constants
85
89
 
86
90
  def __enter__(self):
87
91
  self._lock.acquire()
@@ -278,8 +282,8 @@ class PlotManager:
278
282
  f"total_result.removed {len(total_result.removed)}, "
279
283
  f"total_duration {total_result.duration:.2f} seconds"
280
284
  )
281
- except Exception as e:
282
- log.error(f"_refresh_callback raised: {e} with the traceback: {traceback.format_exc()}")
285
+ except Exception:
286
+ log.exception("_refresh_callback raised")
283
287
  self.reset()
284
288
 
285
289
  def refresh_batch(self, plot_paths: list[Path], plot_directories: set[Path]) -> PlotRefreshResult:
@@ -292,7 +296,7 @@ class PlotManager:
292
296
  if self.match_str is not None:
293
297
  log.info(f'Only loading plots that contain "{self.match_str}" in the file or directory name')
294
298
 
295
- def process_file(file_path: Path) -> Optional[PlotInfo]:
299
+ def process_file(file_path: Path) -> PlotInfo | None:
296
300
  if not self._refreshing_enabled:
297
301
  return None
298
302
  filename_str = str(file_path)
@@ -309,7 +313,7 @@ class PlotManager:
309
313
  if file_path in self.plots:
310
314
  return self.plots[file_path]
311
315
 
312
- entry: Optional[tuple[str, set[str]]] = self.plot_filename_paths.get(file_path.name)
316
+ entry: tuple[str, set[str]] | None = self.plot_filename_paths.get(file_path.name)
313
317
  if entry is not None:
314
318
  _loaded_parent, duplicates = entry
315
319
  if str(file_path.parent) in duplicates:
@@ -328,17 +332,20 @@ class PlotManager:
328
332
 
329
333
  log.debug(f"process_file {file_path!s}")
330
334
 
331
- expected_size = _expected_plot_size(prover.get_size()) * UI_ACTUAL_SPACE_CONSTANT_FACTOR
335
+ expected_size = (
336
+ _expected_plot_size(prover.get_param(), self.constants) * UI_ACTUAL_SPACE_CONSTANT_FACTOR
337
+ )
332
338
 
333
339
  # TODO: consider checking if the file was just written to (which would mean that the file is still
334
340
  # being copied). A segfault might happen in this edge case.
335
341
 
336
- k = prover.get_size()
342
+ param = prover.get_param()
337
343
  level = prover.get_compression_level()
338
344
  if (
339
345
  level == 0
340
346
  and stat_info.st_size < 0.98 * expected_size
341
- and ((k.size_v1 is not None and k.size_v1 >= 30) or (k.size_v2 is not None and k.size_v2 >= 28))
347
+ and param.size_v1 is not None
348
+ and param.size_v1 >= 30
342
349
  ):
343
350
  log.warning(
344
351
  f"Not farming plot {file_path}. "
@@ -388,7 +395,7 @@ class PlotManager:
388
395
  self.no_key_filenames.remove(file_path)
389
396
 
390
397
  with self.plot_filename_paths_lock:
391
- paths: Optional[tuple[str, set[str]]] = self.plot_filename_paths.get(file_path.name)
398
+ paths: tuple[str, set[str]] | None = self.plot_filename_paths.get(file_path.name)
392
399
  if paths is None:
393
400
  paths = (str(Path(cache_entry.prover.get_filename()).parent), set())
394
401
  self.plot_filename_paths[file_path.name] = paths
@@ -419,7 +426,7 @@ class PlotManager:
419
426
  log.error(f"Failed to open file {file_path}. {e} {tb}")
420
427
  self.failed_to_open_filenames[file_path] = int(time.time())
421
428
  return None
422
- log.debug(f"Found plot {file_path} of size {new_plot_info.prover.get_size()}, cache_hit: {cache_hit}")
429
+ log.debug(f"Found plot {file_path} of size {new_plot_info.prover.get_param()}, cache_hit: {cache_hit}")
423
430
 
424
431
  return new_plot_info
425
432