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
@@ -8,7 +8,7 @@ import random
8
8
  import tempfile
9
9
  from concurrent.futures.process import ProcessPoolExecutor
10
10
  from multiprocessing.context import BaseContext
11
- from typing import IO, Optional
11
+ from typing import IO
12
12
 
13
13
  from chia_rs import (
14
14
  BlockRecord,
@@ -30,7 +30,7 @@ from chia.consensus.block_header_validation import validate_finished_header_bloc
30
30
  from chia.consensus.blockchain_interface import BlockchainInterface
31
31
  from chia.consensus.deficit import calculate_deficit
32
32
  from chia.consensus.full_block_to_block_record import header_block_to_sub_block_record
33
- from chia.consensus.get_block_challenge import prev_tx_block
33
+ from chia.consensus.get_block_challenge import pre_sp_tx_block_height
34
34
  from chia.consensus.pot_iterations import (
35
35
  calculate_ip_iters,
36
36
  calculate_sp_iters,
@@ -67,24 +67,24 @@ class WeightProofHandler:
67
67
  self,
68
68
  constants: ConsensusConstants,
69
69
  blockchain: BlockchainInterface,
70
- multiprocessing_context: Optional[BaseContext] = None,
70
+ multiprocessing_context: BaseContext | None = None,
71
71
  ):
72
- self.tip: Optional[bytes32] = None
73
- self.proof: Optional[WeightProof] = None
72
+ self.tip: bytes32 | None = None
73
+ self.proof: WeightProof | None = None
74
74
  self.constants = constants
75
75
  self.blockchain = blockchain
76
76
  self.lock = asyncio.Lock()
77
77
  self._num_processes = 4
78
78
  self.multiprocessing_context = multiprocessing_context
79
79
 
80
- async def get_proof_of_weight(self, tip: bytes32) -> Optional[WeightProof]:
80
+ async def get_proof_of_weight(self, tip: bytes32) -> WeightProof | None:
81
81
  tip_rec = self.blockchain.try_block_record(tip)
82
82
  if tip_rec is None:
83
83
  log.error("unknown tip")
84
84
  return None
85
85
 
86
86
  if tip_rec.height < self.constants.WEIGHT_PROOF_RECENT_BLOCKS:
87
- log.debug("chain to short for weight proof")
87
+ log.info(f"chain to short for weight proof. tip: {tip_rec.height}")
88
88
  return None
89
89
 
90
90
  async with self.lock:
@@ -108,7 +108,7 @@ class WeightProofHandler:
108
108
  sub_epoch_data.append(_create_sub_epoch_data(ses))
109
109
  return sub_epoch_data
110
110
 
111
- async def _create_proof_of_weight(self, tip: bytes32) -> Optional[WeightProof]:
111
+ async def _create_proof_of_weight(self, tip: bytes32) -> WeightProof | None:
112
112
  """
113
113
  Creates a weight proof object
114
114
  """
@@ -124,6 +124,10 @@ class WeightProofHandler:
124
124
  return None
125
125
 
126
126
  summary_heights = self.blockchain.get_ses_heights()
127
+ if len(summary_heights) <= 1:
128
+ log.error("not enough sub epochs. perhaps WEIGHT_PROOF_RECENT_BLOCKS is too small")
129
+ return None
130
+
127
131
  zero_hash = self.blockchain.height_to_hash(uint32(0))
128
132
  assert zero_hash is not None
129
133
  prev_ses_block = await self.blockchain.get_block_record_from_db(zero_hash)
@@ -183,7 +187,7 @@ class WeightProofHandler:
183
187
  seed = ses.get_hash()
184
188
  return seed
185
189
 
186
- async def _get_recent_chain(self, tip_height: uint32) -> Optional[list[HeaderBlock]]:
190
+ async def _get_recent_chain(self, tip_height: uint32) -> list[HeaderBlock] | None:
187
191
  recent_chain: list[HeaderBlock] = []
188
192
  ses_heights = self.blockchain.get_ses_heights()
189
193
  min_height = 0
@@ -256,10 +260,10 @@ class WeightProofHandler:
256
260
  return None
257
261
 
258
262
  summary_heights = self.blockchain.get_ses_heights()
259
- h_hash: Optional[bytes32] = self.blockchain.height_to_hash(uint32(0))
263
+ h_hash: bytes32 | None = self.blockchain.height_to_hash(uint32(0))
260
264
  if h_hash is None:
261
265
  return None
262
- prev_ses_block: Optional[BlockRecord] = await self.blockchain.get_block_record_from_db(h_hash)
266
+ prev_ses_block: BlockRecord | None = await self.blockchain.get_block_record_from_db(h_hash)
263
267
  if prev_ses_block is None:
264
268
  return None
265
269
 
@@ -294,7 +298,7 @@ class WeightProofHandler:
294
298
 
295
299
  async def __create_sub_epoch_segments(
296
300
  self, ses_block: BlockRecord, se_start: BlockRecord, sub_epoch_n: uint32
297
- ) -> Optional[list[SubEpochChallengeSegment]]:
301
+ ) -> list[SubEpochChallengeSegment] | None:
298
302
  segments: list[SubEpochChallengeSegment] = []
299
303
  start_height = await self.get_prev_two_slots_height(se_start)
300
304
 
@@ -304,7 +308,7 @@ class WeightProofHandler:
304
308
  header_blocks = await self.blockchain.get_header_blocks_in_range(
305
309
  start_height, ses_block.height + self.constants.MAX_SUB_SLOT_BLOCKS, tx_filter=False
306
310
  )
307
- curr: Optional[HeaderBlock] = header_blocks[se_start.header_hash]
311
+ curr: HeaderBlock | None = header_blocks[se_start.header_hash]
308
312
  height = se_start.height
309
313
  assert curr is not None
310
314
  first = True
@@ -354,7 +358,7 @@ class WeightProofHandler:
354
358
  header_blocks: dict[bytes32, HeaderBlock],
355
359
  blocks: dict[bytes32, BlockRecord],
356
360
  first_segment_in_sub_epoch: bool,
357
- ) -> tuple[Optional[SubEpochChallengeSegment], uint32]:
361
+ ) -> tuple[SubEpochChallengeSegment | None, uint32]:
358
362
  assert self.blockchain is not None
359
363
  sub_slots: list[SubSlotData] = []
360
364
  log.debug(f"create challenge segment block {header_block.header_hash} block height {header_block.height} ")
@@ -401,7 +405,7 @@ class WeightProofHandler:
401
405
  header_blocks: dict[bytes32, HeaderBlock],
402
406
  blocks: dict[bytes32, BlockRecord],
403
407
  first_in_sub_epoch: bool,
404
- ) -> tuple[Optional[list[SubSlotData]], Optional[VDFInfo]]:
408
+ ) -> tuple[list[SubSlotData] | None, VDFInfo | None]:
405
409
  # combine cc vdfs of all reward blocks from the start of the sub slot to end
406
410
  header_block_sub_rec = blocks[header_block.header_hash]
407
411
  # find slot start
@@ -476,7 +480,7 @@ class WeightProofHandler:
476
480
  header_block: HeaderBlock,
477
481
  blocks: dict[bytes32, BlockRecord],
478
482
  header_blocks: dict[bytes32, HeaderBlock],
479
- ) -> Optional[VDFInfo]:
483
+ ) -> VDFInfo | None:
480
484
  curr = blocks[header_block.header_hash]
481
485
  while curr.height > 0 and not curr.sub_epoch_summary_included:
482
486
  curr = blocks[curr.prev_hash]
@@ -484,7 +488,7 @@ class WeightProofHandler:
484
488
 
485
489
  async def __slot_end_vdf(
486
490
  self, start_height: uint32, header_blocks: dict[bytes32, HeaderBlock], blocks: dict[bytes32, BlockRecord]
487
- ) -> tuple[Optional[list[SubSlotData]], uint32]:
491
+ ) -> tuple[list[SubSlotData] | None, uint32]:
488
492
  # gets all vdfs first sub slot after challenge block to last sub slot
489
493
  log.debug(f"slot end vdf start height {start_height}")
490
494
  header_hash = self.blockchain.height_to_hash(start_height)
@@ -659,7 +663,7 @@ class WeightProofHandler:
659
663
 
660
664
  def _get_weights_for_sampling(
661
665
  rng: random.Random, total_weight: uint128, recent_chain: list[HeaderBlock]
662
- ) -> Optional[list[uint128]]:
666
+ ) -> list[uint128] | None:
663
667
  weight_to_check = []
664
668
  last_l_weight = recent_chain[-1].reward_chain_block.weight - recent_chain[0].reward_chain_block.weight
665
669
  delta = last_l_weight / total_weight
@@ -680,7 +684,7 @@ def _get_weights_for_sampling(
680
684
  def _sample_sub_epoch(
681
685
  start_of_epoch_weight: uint128,
682
686
  end_of_epoch_weight: uint128,
683
- weight_to_check: Optional[list[uint128]],
687
+ weight_to_check: list[uint128] | None,
684
688
  ) -> bool:
685
689
  """
686
690
  weight_to_check: list[uint128] is expected to be sorted
@@ -715,7 +719,7 @@ def _create_sub_epoch_data(
715
719
  # New work difficulty and iterations per sub-slot
716
720
  sub_slot_iters = sub_epoch_summary.new_sub_slot_iters
717
721
  new_difficulty = sub_epoch_summary.new_difficulty
718
- return SubEpochData(reward_chain_hash, previous_sub_epoch_overflows, sub_slot_iters, new_difficulty)
722
+ return SubEpochData(reward_chain_hash, previous_sub_epoch_overflows, sub_slot_iters, new_difficulty, None)
719
723
 
720
724
 
721
725
  async def _challenge_block_vdfs(
@@ -762,7 +766,7 @@ async def _challenge_block_vdfs(
762
766
  return ssd
763
767
 
764
768
 
765
- def handle_finished_slots(end_of_slot: EndOfSubSlotBundle, icc_end_of_slot_info: Optional[VDFInfo]) -> SubSlotData:
769
+ def handle_finished_slots(end_of_slot: EndOfSubSlotBundle, icc_end_of_slot_info: VDFInfo | None) -> SubSlotData:
766
770
  return SubSlotData(
767
771
  None,
768
772
  None,
@@ -833,7 +837,7 @@ def handle_end_of_slot(
833
837
  def _validate_sub_epoch_summaries(
834
838
  constants: ConsensusConstants,
835
839
  weight_proof: WeightProof,
836
- ) -> tuple[Optional[list[SubEpochSummary]], Optional[list[uint128]]]:
840
+ ) -> tuple[list[SubEpochSummary] | None, list[uint128] | None]:
837
841
  last_ses_hash, last_ses_sub_height = _get_last_ses_hash(constants, weight_proof.recent_chain_data)
838
842
  if last_ses_hash is None:
839
843
  log.warning("could not find last ses block")
@@ -879,6 +883,7 @@ def _map_sub_epoch_summaries(
879
883
  data.num_blocks_overflow,
880
884
  data.new_difficulty,
881
885
  data.new_sub_slot_iters,
886
+ None,
882
887
  )
883
888
 
884
889
  if idx < len(sub_epoch_data) - 1:
@@ -929,14 +934,14 @@ def _validate_sub_epoch_segments(
929
934
  summaries_bytes: list[bytes],
930
935
  height: uint32,
931
936
  validate_from: int = 0,
932
- ) -> Optional[list[tuple[VDFProof, ClassgroupElement, VDFInfo]]]:
937
+ ) -> list[tuple[VDFProof, ClassgroupElement, VDFInfo]] | None:
933
938
  summaries = summaries_from_bytes(summaries_bytes)
934
939
  sub_epoch_segments: SubEpochSegments = SubEpochSegments.from_bytes(weight_proof_bytes)
935
940
  rc_sub_slot_hash = constants.GENESIS_CHALLENGE
936
941
  total_blocks, total_ip_iters = 0, 0
937
942
  total_slot_iters, total_slots = 0, 0
938
943
  total_ip_iters = 0
939
- prev_ses: Optional[SubEpochSummary] = None
944
+ prev_ses: SubEpochSummary | None = None
940
945
  segments_by_sub_epoch = map_segments_by_sub_epoch(sub_epoch_segments.challenge_segments)
941
946
  curr_ssi = constants.SUB_SLOT_ITERS_STARTING
942
947
  vdfs_to_validate = []
@@ -988,7 +993,7 @@ def _validate_segment(
988
993
  curr_ssi: uint64,
989
994
  prev_ssi: uint64,
990
995
  curr_difficulty: uint64,
991
- ses: Optional[SubEpochSummary],
996
+ ses: SubEpochSummary | None,
992
997
  first_segment_in_se: bool,
993
998
  sampled: bool,
994
999
  height: uint32,
@@ -1000,7 +1005,7 @@ def _validate_segment(
1000
1005
  if sampled and sub_slot_data.is_challenge():
1001
1006
  after_challenge = True
1002
1007
  required_iters = __validate_pospace(
1003
- constants, segment, idx, curr_difficulty, curr_ssi, ses, first_segment_in_se, height
1008
+ constants, segment, idx, curr_difficulty, ses, first_segment_in_se, height
1004
1009
  )
1005
1010
  if required_iters is None:
1006
1011
  return False, uint64(0), uint64(0), uint64(0), []
@@ -1144,7 +1149,7 @@ def sub_slot_data_vdf_input(
1144
1149
  ) -> ClassgroupElement:
1145
1150
  cc_input = ClassgroupElement.get_default_element()
1146
1151
  sp_total_iters = get_sp_total_iters(constants, is_overflow, ssi, sub_slot_data)
1147
- ssd: Optional[SubSlotData] = None
1152
+ ssd: SubSlotData | None = None
1148
1153
  if is_overflow and new_sub_slot:
1149
1154
  if sub_slot_idx >= 2:
1150
1155
  if sub_slots[sub_slot_idx - 2].cc_slot_end_info is None:
@@ -1202,7 +1207,7 @@ def validate_recent_blocks(
1202
1207
  constants: ConsensusConstants,
1203
1208
  recent_chain_bytes: bytes,
1204
1209
  summaries_bytes: list[bytes],
1205
- shutdown_file_path: Optional[pathlib.Path] = None,
1210
+ shutdown_file_path: pathlib.Path | None = None,
1206
1211
  ) -> tuple[bool, list[bytes]]:
1207
1212
  recent_chain: RecentChainData = RecentChainData.from_bytes(recent_chain_bytes)
1208
1213
  summaries = summaries_from_bytes(summaries_bytes)
@@ -1221,7 +1226,7 @@ def validate_recent_blocks(
1221
1226
  ses_blocks, sub_slots, transaction_blocks = 0, 0, 0
1222
1227
  challenge, prev_challenge = recent_chain.recent_chain_data[0].reward_chain_block.pos_ss_cc_challenge_hash, None
1223
1228
  tip_height = recent_chain.recent_chain_data[-1].height
1224
- prev_block_record: Optional[BlockRecord] = None
1229
+ prev_block_record: BlockRecord | None = None
1225
1230
  deficit = uint8(0)
1226
1231
  adjusted = False
1227
1232
  validated_block_count = 0
@@ -1245,7 +1250,9 @@ def validate_recent_blocks(
1245
1250
  if sub_slot.challenge_chain.new_difficulty is not None:
1246
1251
  diff = sub_slot.challenge_chain.new_difficulty
1247
1252
 
1248
- if (challenge is not None) and (prev_challenge is not None) and transaction_blocks > 1:
1253
+ # we need at least two challenges and more than 2 transaction blocks in the cache to validate pospace
1254
+ # otherwise we might fail to validate due to lack of information
1255
+ if (challenge is not None) and (prev_challenge is not None) and transaction_blocks > 2:
1249
1256
  overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
1250
1257
  if not adjusted:
1251
1258
  assert prev_block_record is not None
@@ -1267,7 +1274,7 @@ def validate_recent_blocks(
1267
1274
  required_iters = caluclated_required_iters
1268
1275
  else:
1269
1276
  ret = _validate_pospace_recent_chain(
1270
- constants, sub_blocks, block, challenge, diff, ssi, overflow, prev_challenge
1277
+ constants, sub_blocks, block, challenge, diff, overflow, prev_challenge
1271
1278
  )
1272
1279
  if ret is None:
1273
1280
  return False, []
@@ -1310,10 +1317,9 @@ def _validate_pospace_recent_chain(
1310
1317
  block: HeaderBlock,
1311
1318
  challenge: bytes32,
1312
1319
  diff: uint64,
1313
- ssi: uint64,
1314
1320
  overflow: bool,
1315
1321
  prev_challenge: bytes32,
1316
- ) -> Optional[uint64]:
1322
+ ) -> uint64 | None:
1317
1323
  if block.reward_chain_block.challenge_chain_sp_vdf is None:
1318
1324
  # Edge case of first sp (start of slot), where sp_iters == 0
1319
1325
  cc_sp_hash: bytes32 = challenge
@@ -1328,8 +1334,13 @@ def _validate_pospace_recent_chain(
1328
1334
  cc_sp_hash,
1329
1335
  block.height,
1330
1336
  diff,
1331
- ssi,
1332
- prev_tx_block(blocks, blocks.block_record(block.prev_header_hash)),
1337
+ pre_sp_tx_block_height(
1338
+ constants=constants,
1339
+ blocks=blocks,
1340
+ prev_b_hash=block.prev_header_hash,
1341
+ sp_index=block.reward_chain_block.signage_point_index,
1342
+ finished_sub_slots=len(block.finished_sub_slots),
1343
+ ),
1333
1344
  )
1334
1345
  if required_iters is None:
1335
1346
  log.error(f"could not verify proof of space block {block.height} {overflow}")
@@ -1343,11 +1354,10 @@ def __validate_pospace(
1343
1354
  segment: SubEpochChallengeSegment,
1344
1355
  idx: int,
1345
1356
  curr_diff: uint64,
1346
- curr_sub_slot_iters: uint64,
1347
- ses: Optional[SubEpochSummary],
1357
+ ses: SubEpochSummary | None,
1348
1358
  first_in_sub_epoch: bool,
1349
1359
  height: uint32,
1350
- ) -> Optional[uint64]:
1360
+ ) -> uint64 | None:
1351
1361
  if first_in_sub_epoch and segment.sub_epoch_n == 0 and idx == 0:
1352
1362
  cc_sub_slot_hash = constants.GENESIS_CHALLENGE
1353
1363
  else:
@@ -1370,6 +1380,9 @@ def __validate_pospace(
1370
1380
  # validate proof of space
1371
1381
  assert sub_slot_data.proof_of_space is not None
1372
1382
 
1383
+ # when sampling blocks as part of weight proof validation, the previous
1384
+ # transaction height is a conservative estimate, since we don't have direct
1385
+ # access to it.
1373
1386
  required_iters = validate_pospace_and_get_required_iters(
1374
1387
  constants,
1375
1388
  sub_slot_data.proof_of_space,
@@ -1377,8 +1390,8 @@ def __validate_pospace(
1377
1390
  cc_sp_hash,
1378
1391
  height,
1379
1392
  curr_diff,
1380
- curr_sub_slot_iters,
1381
- uint32(0), # prev_tx_block(blocks, prev_b), todo need to get height of prev tx block somehow here
1393
+ uint32(0), # not used, since height_agnostic=True
1394
+ height_agnostic=True,
1382
1395
  )
1383
1396
  if required_iters is None:
1384
1397
  log.error("could not verify proof of space")
@@ -1417,7 +1430,7 @@ def __get_rc_sub_slot(
1417
1430
 
1418
1431
  new_diff = None if ses is None else ses.new_difficulty
1419
1432
  new_ssi = None if ses is None else ses.new_sub_slot_iters
1420
- ses_hash: Optional[bytes32] = None if ses is None else ses.get_hash()
1433
+ ses_hash: bytes32 | None = None if ses is None else ses.get_hash()
1421
1434
  overflow = is_overflow_block(constants, first.signage_point_index)
1422
1435
  if overflow:
1423
1436
  if idx >= 2 and slots[idx - 2].cc_slot_end is not None and slots[idx - 1].cc_slot_end is not None:
@@ -1434,7 +1447,7 @@ def __get_rc_sub_slot(
1434
1447
  idx -= 1
1435
1448
  sub_slot = slots[idx]
1436
1449
 
1437
- icc_sub_slot_hash: Optional[bytes32] = None
1450
+ icc_sub_slot_hash: bytes32 | None = None
1438
1451
  assert sub_slot is not None
1439
1452
  assert sub_slot.cc_slot_end_info is not None
1440
1453
 
@@ -1471,8 +1484,8 @@ def __get_rc_sub_slot(
1471
1484
  return rc_sub_slot
1472
1485
 
1473
1486
 
1474
- def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: Optional[SubEpochSummary]) -> ChallengeChainSubSlot:
1475
- sub_slot: Optional[SubSlotData] = None
1487
+ def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: SubEpochSummary | None) -> ChallengeChainSubSlot:
1488
+ sub_slot: SubSlotData | None = None
1476
1489
  for i in reversed(range(idx)):
1477
1490
  sub_slot = sub_slots[i]
1478
1491
  if sub_slot.cc_slot_end_info is not None:
@@ -1482,7 +1495,7 @@ def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: Optional[SubE
1482
1495
  assert sub_slot.cc_slot_end_info is not None
1483
1496
 
1484
1497
  icc_vdf = sub_slot.icc_slot_end_info
1485
- icc_vdf_hash: Optional[bytes32] = None
1498
+ icc_vdf_hash: bytes32 | None = None
1486
1499
  if icc_vdf is not None:
1487
1500
  icc_vdf_hash = icc_vdf.get_hash()
1488
1501
  cc_sub_slot = ChallengeChainSubSlot(
@@ -1529,7 +1542,7 @@ def summaries_from_bytes(summaries_bytes: list[bytes]) -> list[SubEpochSummary]:
1529
1542
 
1530
1543
  def _get_last_ses_hash(
1531
1544
  constants: ConsensusConstants, recent_reward_chain: list[HeaderBlock]
1532
- ) -> tuple[Optional[bytes32], uint32]:
1545
+ ) -> tuple[bytes32 | None, uint32]:
1533
1546
  for idx, block in enumerate(reversed(recent_reward_chain)):
1534
1547
  if (block.reward_chain_block.height % constants.SUB_EPOCH_BLOCKS) == 0:
1535
1548
  original_idx = len(recent_reward_chain) - 1 - idx # reverse
@@ -1560,7 +1573,7 @@ def _get_ses_idx(recent_reward_chain: list[HeaderBlock]) -> list[int]:
1560
1573
  def get_deficit(
1561
1574
  constants: ConsensusConstants,
1562
1575
  curr_deficit: uint8,
1563
- prev_block: Optional[BlockRecord],
1576
+ prev_block: BlockRecord | None,
1564
1577
  overflow: bool,
1565
1578
  num_finished_sub_slots: int,
1566
1579
  ) -> uint8:
@@ -1634,7 +1647,7 @@ def map_segments_by_sub_epoch(
1634
1647
  def _validate_vdf_batch(
1635
1648
  constants: ConsensusConstants,
1636
1649
  vdf_list: list[tuple[bytes, bytes, bytes]],
1637
- shutdown_file_path: Optional[pathlib.Path] = None,
1650
+ shutdown_file_path: pathlib.Path | None = None,
1638
1651
  ) -> bool:
1639
1652
  for vdf_proof_bytes, class_group_bytes, info in vdf_list:
1640
1653
  vdf = VDFProof.from_bytes(vdf_proof_bytes)
@@ -8,11 +8,10 @@ import logging
8
8
  from collections.abc import AsyncIterator
9
9
  from concurrent.futures.thread import ThreadPoolExecutor
10
10
  from pathlib import Path
11
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
11
+ from typing import TYPE_CHECKING, Any, ClassVar, Literal, cast
12
12
 
13
13
  from chia_rs import ConsensusConstants
14
- from chia_rs.sized_ints import uint32
15
- from typing_extensions import Literal
14
+ from chia_rs.sized_ints import uint8, uint32
16
15
 
17
16
  from chia.plot_sync.sender import Sender
18
17
  from chia.plotting.manager import PlotManager
@@ -56,11 +55,11 @@ class Harvester:
56
55
  root_path: Path
57
56
  _shut_down: bool
58
57
  executor: ThreadPoolExecutor
59
- state_changed_callback: Optional[StateChangedProtocol] = None
58
+ state_changed_callback: StateChangedProtocol | None = None
60
59
  constants: ConsensusConstants
61
60
  _refresh_lock: asyncio.Lock
62
61
  event_loop: asyncio.events.AbstractEventLoop
63
- _server: Optional[ChiaServer]
62
+ _server: ChiaServer | None
64
63
  _mode: HarvestingMode
65
64
 
66
65
  @property
@@ -91,7 +90,10 @@ class Harvester:
91
90
  self.log.info(f"Using plots_refresh_parameter: {refresh_parameter}")
92
91
 
93
92
  self.plot_manager = PlotManager(
94
- root_path, refresh_parameter=refresh_parameter, refresh_callback=self._plot_refresh_callback
93
+ root_path,
94
+ refresh_parameter=refresh_parameter,
95
+ refresh_callback=self._plot_refresh_callback,
96
+ constants=constants,
95
97
  )
96
98
  self._shut_down = False
97
99
  self.executor = concurrent.futures.ThreadPoolExecutor(
@@ -99,7 +101,7 @@ class Harvester:
99
101
  )
100
102
  self._server = None
101
103
  self.constants = constants
102
- self.state_changed_callback: Optional[StateChangedProtocol] = None
104
+ self.state_changed_callback: StateChangedProtocol | None = None
103
105
  self.parallel_read: bool = config.get("parallel_read", True)
104
106
 
105
107
  context_count = config.get("parallel_decompressor_count", DEFAULT_PARALLEL_DECOMPRESSOR_COUNT)
@@ -148,7 +150,7 @@ class Harvester:
148
150
 
149
151
  await self.plot_sync_sender.await_closed()
150
152
 
151
- def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
153
+ def get_connections(self, request_node_type: NodeType | None) -> list[dict[str, Any]]:
152
154
  return default_get_connections(server=self.server, request_node_type=request_node_type)
153
155
 
154
156
  async def on_connect(self, connection: WSChiaConnection) -> None:
@@ -157,7 +159,7 @@ class Harvester:
157
159
  def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
158
160
  self.state_changed_callback = callback
159
161
 
160
- def state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> None:
162
+ def state_changed(self, change: str, change_data: dict[str, Any] | None = None) -> None:
161
163
  if self.state_changed_callback is not None:
162
164
  self.state_changed_callback(change, change_data)
163
165
 
@@ -190,13 +192,12 @@ class Harvester:
190
192
  with self.plot_manager:
191
193
  for path, plot_info in self.plot_manager.plots.items():
192
194
  prover = plot_info.prover
193
- size = prover.get_size()
194
- if size.size_v1 is not None:
195
- k = size.size_v1
195
+ param = prover.get_param()
196
+ if param.size_v1 is not None:
197
+ k = uint8(param.size_v1)
196
198
  else:
197
- assert size.size_v2 is not None
198
- k = size.size_v2
199
- # TODO: todo_v2_plots support v2 plots in RPC response
199
+ assert param.strength_v2 is not None
200
+ k = uint8(0x80 | param.strength_v2)
200
201
  response_plots.append(
201
202
  {
202
203
  "filename": str(path),
@@ -246,16 +247,16 @@ class Harvester:
246
247
  async def update_harvester_config(
247
248
  self,
248
249
  *,
249
- use_gpu_harvesting: Optional[bool] = None,
250
- gpu_index: Optional[int] = None,
251
- enforce_gpu_index: Optional[bool] = None,
252
- disable_cpu_affinity: Optional[bool] = None,
253
- parallel_decompressor_count: Optional[int] = None,
254
- decompressor_thread_count: Optional[int] = None,
255
- recursive_plot_scan: Optional[bool] = None,
256
- refresh_parameter_interval_seconds: Optional[uint32] = None,
250
+ use_gpu_harvesting: bool | None = None,
251
+ gpu_index: int | None = None,
252
+ enforce_gpu_index: bool | None = None,
253
+ disable_cpu_affinity: bool | None = None,
254
+ parallel_decompressor_count: int | None = None,
255
+ decompressor_thread_count: int | None = None,
256
+ recursive_plot_scan: bool | None = None,
257
+ refresh_parameter_interval_seconds: uint32 | None = None,
257
258
  ) -> bool:
258
- refresh_parameter: Optional[PlotsRefreshParameter] = None
259
+ refresh_parameter: PlotsRefreshParameter | None = None
259
260
  if refresh_parameter_interval_seconds is not None:
260
261
  refresh_parameter = PlotsRefreshParameter(
261
262
  interval_seconds=refresh_parameter_interval_seconds,