chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc1__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 (453) hide show
  1. chia/_tests/blockchain/blockchain_test_utils.py +2 -3
  2. chia/_tests/blockchain/test_augmented_chain.py +2 -3
  3. chia/_tests/blockchain/test_blockchain.py +261 -44
  4. chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
  5. chia/_tests/blockchain/test_build_chains.py +197 -1
  6. chia/_tests/blockchain/test_get_block_generator.py +1 -1
  7. chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
  8. chia/_tests/clvm/benchmark_costs.py +1 -1
  9. chia/_tests/clvm/coin_store.py +3 -4
  10. chia/_tests/clvm/test_message_conditions.py +2 -2
  11. chia/_tests/clvm/test_puzzle_compression.py +2 -3
  12. chia/_tests/clvm/test_puzzles.py +1 -2
  13. chia/_tests/clvm/test_singletons.py +2 -3
  14. chia/_tests/clvm/test_spend_sim.py +7 -7
  15. chia/_tests/cmds/cmd_test_utils.py +30 -25
  16. chia/_tests/cmds/test_dev_gh.py +1 -1
  17. chia/_tests/cmds/test_farm_cmd.py +1 -1
  18. chia/_tests/cmds/test_show.py +1 -2
  19. chia/_tests/cmds/wallet/test_did.py +101 -56
  20. chia/_tests/cmds/wallet/test_nft.py +109 -84
  21. chia/_tests/cmds/wallet/test_notifications.py +1 -1
  22. chia/_tests/cmds/wallet/test_offer.toffer +1 -1
  23. chia/_tests/cmds/wallet/test_vcs.py +8 -8
  24. chia/_tests/cmds/wallet/test_wallet.py +100 -46
  25. chia/_tests/conftest.py +31 -20
  26. chia/_tests/connection_utils.py +1 -1
  27. chia/_tests/core/consensus/stores/__init__.py +0 -0
  28. chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
  29. chia/_tests/core/consensus/test_block_creation.py +2 -31
  30. chia/_tests/core/consensus/test_pot_iterations.py +38 -3
  31. chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
  32. chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
  33. chia/_tests/core/daemon/test_daemon.py +80 -0
  34. chia/_tests/core/data_layer/test_data_layer.py +1 -1
  35. chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
  36. chia/_tests/core/data_layer/test_data_rpc.py +14 -10
  37. chia/_tests/core/data_layer/test_data_store.py +5 -5
  38. chia/_tests/core/farmer/test_farmer_api.py +2 -2
  39. chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
  40. chia/_tests/core/full_node/ram_db.py +3 -1
  41. chia/_tests/core/full_node/stores/test_block_store.py +28 -16
  42. chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
  43. chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
  44. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  45. chia/_tests/core/full_node/test_address_manager.py +200 -27
  46. chia/_tests/core/full_node/test_block_height_map.py +2 -2
  47. chia/_tests/core/full_node/test_conditions.py +7 -6
  48. chia/_tests/core/full_node/test_full_node.py +456 -40
  49. chia/_tests/core/full_node/test_generator_tools.py +32 -2
  50. chia/_tests/core/full_node/test_hint_management.py +1 -1
  51. chia/_tests/core/full_node/test_node_load.py +20 -21
  52. chia/_tests/core/full_node/test_performance.py +3 -4
  53. chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
  54. chia/_tests/core/full_node/test_subscriptions.py +1 -2
  55. chia/_tests/core/full_node/test_transactions.py +9 -5
  56. chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
  57. chia/_tests/core/large_block.py +1 -2
  58. chia/_tests/core/make_block_generator.py +3 -4
  59. chia/_tests/core/mempool/test_mempool.py +36 -86
  60. chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
  61. chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
  62. chia/_tests/core/mempool/test_mempool_manager.py +421 -69
  63. chia/_tests/core/mempool/test_mempool_performance.py +3 -2
  64. chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
  65. chia/_tests/core/server/flood.py +1 -1
  66. chia/_tests/core/server/test_dos.py +1 -1
  67. chia/_tests/core/server/test_node_discovery.py +41 -27
  68. chia/_tests/core/server/test_rate_limits.py +1 -1
  69. chia/_tests/core/server/test_server.py +1 -1
  70. chia/_tests/core/services/test_services.py +5 -5
  71. chia/_tests/core/ssl/test_ssl.py +1 -1
  72. chia/_tests/core/test_cost_calculation.py +6 -6
  73. chia/_tests/core/test_crawler.py +2 -2
  74. chia/_tests/core/test_crawler_rpc.py +1 -1
  75. chia/_tests/core/test_db_conversion.py +3 -1
  76. chia/_tests/core/test_db_validation.py +5 -3
  77. chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
  78. chia/_tests/core/test_filter.py +4 -1
  79. chia/_tests/core/test_full_node_rpc.py +99 -82
  80. chia/_tests/core/test_program.py +2 -2
  81. chia/_tests/core/util/test_block_cache.py +1 -1
  82. chia/_tests/core/util/test_keychain.py +2 -2
  83. chia/_tests/core/util/test_lockfile.py +1 -1
  84. chia/_tests/core/util/test_log_exceptions.py +5 -5
  85. chia/_tests/core/util/test_streamable.py +81 -22
  86. chia/_tests/db/test_db_wrapper.py +1 -3
  87. chia/_tests/environments/wallet.py +5 -5
  88. chia/_tests/farmer_harvester/test_farmer.py +9 -7
  89. chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
  90. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  91. chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
  92. chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
  93. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
  94. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
  95. chia/_tests/generator/test_compression.py +1 -2
  96. chia/_tests/generator/test_rom.py +8 -4
  97. chia/_tests/plot_sync/test_plot_sync.py +3 -3
  98. chia/_tests/plot_sync/test_receiver.py +3 -3
  99. chia/_tests/plot_sync/test_sender.py +1 -1
  100. chia/_tests/plot_sync/test_sync_simulated.py +3 -3
  101. chia/_tests/plot_sync/util.py +2 -2
  102. chia/_tests/pools/test_pool_cmdline.py +48 -21
  103. chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
  104. chia/_tests/pools/test_pool_rpc.py +237 -105
  105. chia/_tests/pools/test_pool_wallet.py +11 -2
  106. chia/_tests/pools/test_wallet_pool_store.py +5 -4
  107. chia/_tests/rpc/test_rpc_client.py +1 -1
  108. chia/_tests/simulation/test_simulation.py +13 -8
  109. chia/_tests/simulation/test_simulator.py +2 -2
  110. chia/_tests/timelord/test_new_peak.py +191 -47
  111. chia/_tests/timelord/test_timelord.py +1 -1
  112. chia/_tests/tools/test_full_sync.py +0 -2
  113. chia/_tests/tools/test_run_block.py +3 -1
  114. chia/_tests/util/benchmark_cost.py +3 -3
  115. chia/_tests/util/benchmarks.py +2 -2
  116. chia/_tests/util/blockchain.py +11 -5
  117. chia/_tests/util/blockchain_mock.py +1 -4
  118. chia/_tests/util/coin_store.py +29 -0
  119. chia/_tests/util/constants.py +2 -18
  120. chia/_tests/util/full_sync.py +3 -3
  121. chia/_tests/util/generator_tools_testing.py +2 -3
  122. chia/_tests/util/key_tool.py +2 -3
  123. chia/_tests/util/misc.py +33 -31
  124. chia/_tests/util/network_protocol_data.py +19 -17
  125. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  126. chia/_tests/util/protocol_messages_json.py +3 -1
  127. chia/_tests/util/run_block.py +2 -2
  128. chia/_tests/util/setup_nodes.py +7 -7
  129. chia/_tests/util/spend_sim.py +47 -55
  130. chia/_tests/util/test_condition_tools.py +5 -4
  131. chia/_tests/util/test_config.py +2 -2
  132. chia/_tests/util/test_dump_keyring.py +1 -1
  133. chia/_tests/util/test_full_block_utils.py +12 -14
  134. chia/_tests/util/test_misc.py +2 -2
  135. chia/_tests/util/test_paginator.py +4 -4
  136. chia/_tests/util/test_priority_mutex.py +2 -2
  137. chia/_tests/util/test_replace_str_to_bytes.py +15 -5
  138. chia/_tests/util/test_ssl_check.py +1 -1
  139. chia/_tests/util/test_testnet_overrides.py +13 -3
  140. chia/_tests/util/time_out_assert.py +4 -2
  141. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
  142. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
  143. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
  144. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
  145. chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
  146. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
  147. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
  148. chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
  149. chia/_tests/wallet/conftest.py +11 -12
  150. chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
  151. chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
  152. chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
  153. chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
  154. chia/_tests/wallet/nft_wallet/config.py +1 -1
  155. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
  156. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
  157. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
  158. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
  159. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
  160. chia/_tests/wallet/rpc/test_wallet_rpc.py +305 -184
  161. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
  162. chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
  163. chia/_tests/wallet/test_clvm_casts.py +88 -0
  164. chia/_tests/wallet/test_coin_management.py +1 -1
  165. chia/_tests/wallet/test_coin_selection.py +1 -1
  166. chia/_tests/wallet/test_conditions.py +1 -1
  167. chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
  168. chia/_tests/wallet/test_notifications.py +5 -3
  169. chia/_tests/wallet/test_sign_coin_spends.py +6 -6
  170. chia/_tests/wallet/test_signer_protocol.py +13 -12
  171. chia/_tests/wallet/test_singleton.py +1 -1
  172. chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
  173. chia/_tests/wallet/test_util.py +2 -2
  174. chia/_tests/wallet/test_wallet.py +108 -29
  175. chia/_tests/wallet/test_wallet_action_scope.py +9 -2
  176. chia/_tests/wallet/test_wallet_blockchain.py +2 -3
  177. chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
  178. chia/_tests/wallet/test_wallet_node.py +2 -4
  179. chia/_tests/wallet/test_wallet_retry.py +4 -2
  180. chia/_tests/wallet/test_wallet_state_manager.py +191 -5
  181. chia/_tests/wallet/test_wallet_test_framework.py +1 -1
  182. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
  183. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
  184. chia/_tests/wallet/wallet_block_tools.py +6 -6
  185. chia/_tests/weight_proof/test_weight_proof.py +10 -48
  186. chia/apis.py +1 -1
  187. chia/cmds/beta.py +1 -1
  188. chia/cmds/chia.py +9 -9
  189. chia/cmds/cmd_classes.py +12 -11
  190. chia/cmds/cmd_helpers.py +1 -1
  191. chia/cmds/cmds_util.py +12 -9
  192. chia/cmds/coin_funcs.py +2 -2
  193. chia/cmds/configure.py +2 -2
  194. chia/cmds/data.py +0 -2
  195. chia/cmds/data_funcs.py +1 -1
  196. chia/cmds/db_validate_func.py +1 -2
  197. chia/cmds/dev/__init__.py +0 -0
  198. chia/cmds/dev/data.py +273 -0
  199. chia/cmds/{gh.py → dev/gh.py} +5 -5
  200. chia/cmds/dev/main.py +22 -0
  201. chia/cmds/dev/mempool.py +78 -0
  202. chia/cmds/dev/mempool_funcs.py +63 -0
  203. chia/cmds/farm_funcs.py +5 -4
  204. chia/cmds/init_funcs.py +11 -11
  205. chia/cmds/keys.py +2 -2
  206. chia/cmds/keys_funcs.py +4 -4
  207. chia/cmds/netspace_funcs.py +1 -1
  208. chia/cmds/peer_funcs.py +2 -2
  209. chia/cmds/plotnft_funcs.py +72 -26
  210. chia/cmds/rpc.py +1 -1
  211. chia/cmds/show_funcs.py +5 -5
  212. chia/cmds/signer.py +8 -7
  213. chia/cmds/sim_funcs.py +8 -9
  214. chia/cmds/wallet.py +2 -2
  215. chia/cmds/wallet_funcs.py +165 -131
  216. chia/{util → consensus}/augmented_chain.py +1 -2
  217. chia/consensus/block_body_validation.py +54 -40
  218. chia/consensus/block_creation.py +42 -76
  219. chia/consensus/block_header_validation.py +32 -26
  220. chia/consensus/block_record.py +0 -3
  221. chia/consensus/blockchain.py +23 -32
  222. chia/consensus/blockchain_interface.py +1 -5
  223. chia/consensus/check_time_locks.py +57 -0
  224. chia/consensus/coin_store_protocol.py +151 -0
  225. chia/consensus/coinbase.py +0 -6
  226. chia/consensus/condition_costs.py +4 -0
  227. chia/{util → consensus}/condition_tools.py +4 -5
  228. chia/consensus/cost_calculator.py +1 -1
  229. chia/consensus/default_constants.py +32 -9
  230. chia/consensus/deficit.py +1 -3
  231. chia/consensus/difficulty_adjustment.py +1 -2
  232. chia/consensus/find_fork_point.py +1 -3
  233. chia/consensus/full_block_to_block_record.py +1 -6
  234. chia/{util → consensus}/generator_tools.py +1 -3
  235. chia/consensus/get_block_challenge.py +30 -7
  236. chia/consensus/make_sub_epoch_summary.py +1 -5
  237. chia/consensus/multiprocess_validation.py +21 -20
  238. chia/consensus/pot_iterations.py +74 -13
  239. chia/{util → consensus}/prev_transaction_block.py +1 -1
  240. chia/consensus/vdf_info_computation.py +1 -3
  241. chia/daemon/keychain_proxy.py +5 -5
  242. chia/daemon/server.py +22 -5
  243. chia/data_layer/data_layer.py +92 -51
  244. chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
  245. chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
  246. chia/data_layer/data_layer_util.py +4 -6
  247. chia/data_layer/data_layer_wallet.py +42 -69
  248. chia/data_layer/dl_wallet_store.py +12 -6
  249. chia/data_layer/download_data.py +3 -3
  250. chia/data_layer/s3_plugin_service.py +0 -1
  251. chia/farmer/farmer.py +3 -4
  252. chia/farmer/farmer_api.py +11 -7
  253. chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
  254. chia/full_node/block_height_map.py +7 -6
  255. chia/full_node/block_store.py +5 -7
  256. chia/full_node/bundle_tools.py +1 -2
  257. chia/full_node/coin_store.py +143 -124
  258. chia/{types → full_node}/eligible_coin_spends.py +39 -70
  259. chia/full_node/fee_estimator.py +1 -1
  260. chia/full_node/fee_estimator_interface.py +0 -8
  261. chia/full_node/fee_tracker.py +25 -25
  262. chia/full_node/full_node.py +70 -53
  263. chia/full_node/full_node_api.py +57 -40
  264. chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
  265. chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
  266. chia/full_node/full_node_store.py +23 -8
  267. chia/full_node/mempool.py +206 -53
  268. chia/full_node/mempool_check_conditions.py +20 -63
  269. chia/full_node/mempool_manager.py +26 -40
  270. chia/full_node/subscriptions.py +1 -3
  271. chia/full_node/tx_processing_queue.py +50 -3
  272. chia/full_node/weight_proof.py +46 -37
  273. chia/harvester/harvester.py +1 -1
  274. chia/harvester/harvester_api.py +22 -7
  275. chia/introducer/introducer.py +1 -1
  276. chia/introducer/introducer_api.py +1 -1
  277. chia/plot_sync/exceptions.py +1 -1
  278. chia/plot_sync/receiver.py +1 -1
  279. chia/plot_sync/sender.py +2 -2
  280. chia/pools/pool_puzzles.py +13 -18
  281. chia/pools/pool_wallet.py +23 -46
  282. chia/protocols/farmer_protocol.py +11 -3
  283. chia/protocols/full_node_protocol.py +1 -4
  284. chia/protocols/harvester_protocol.py +3 -3
  285. chia/protocols/pool_protocol.py +1 -2
  286. chia/protocols/shared_protocol.py +3 -3
  287. chia/protocols/timelord_protocol.py +1 -3
  288. chia/protocols/wallet_protocol.py +3 -3
  289. chia/rpc/rpc_client.py +7 -8
  290. chia/rpc/rpc_server.py +3 -3
  291. chia/rpc/util.py +3 -1
  292. chia/seeder/crawler.py +1 -1
  293. chia/seeder/crawler_api.py +1 -1
  294. chia/seeder/dns_server.py +2 -0
  295. chia/seeder/start_crawler.py +3 -3
  296. chia/server/address_manager.py +286 -38
  297. chia/server/address_manager_store.py +0 -215
  298. chia/{types → server}/aliases.py +7 -7
  299. chia/server/api_protocol.py +1 -1
  300. chia/server/chia_policy.py +1 -1
  301. chia/server/node_discovery.py +76 -113
  302. chia/server/rate_limits.py +1 -1
  303. chia/server/resolve_peer_info.py +43 -0
  304. chia/server/server.py +5 -5
  305. chia/server/start_data_layer.py +4 -4
  306. chia/server/start_farmer.py +5 -4
  307. chia/server/start_full_node.py +5 -4
  308. chia/server/start_harvester.py +7 -5
  309. chia/server/start_introducer.py +2 -2
  310. chia/server/start_service.py +1 -1
  311. chia/server/start_timelord.py +7 -5
  312. chia/server/start_wallet.py +7 -5
  313. chia/server/ws_connection.py +1 -1
  314. chia/simulator/add_blocks_in_batches.py +2 -2
  315. chia/simulator/block_tools.py +245 -201
  316. chia/simulator/full_node_simulator.py +38 -10
  317. chia/simulator/setup_services.py +12 -12
  318. chia/simulator/simulator_full_node_rpc_api.py +2 -2
  319. chia/simulator/simulator_full_node_rpc_client.py +2 -2
  320. chia/simulator/simulator_test_tools.py +2 -2
  321. chia/simulator/start_simulator.py +1 -1
  322. chia/simulator/wallet_tools.py +10 -18
  323. chia/ssl/create_ssl.py +1 -1
  324. chia/timelord/iters_from_block.py +14 -14
  325. chia/timelord/timelord.py +15 -11
  326. chia/timelord/timelord_api.py +14 -2
  327. chia/timelord/timelord_state.py +20 -14
  328. chia/types/blockchain_format/program.py +53 -10
  329. chia/types/blockchain_format/proof_of_space.py +73 -19
  330. chia/types/coin_spend.py +3 -56
  331. chia/types/generator_types.py +28 -0
  332. chia/types/internal_mempool_item.py +1 -2
  333. chia/types/mempool_item.py +12 -7
  334. chia/types/unfinished_header_block.py +1 -2
  335. chia/types/validation_state.py +1 -2
  336. chia/types/weight_proof.py +1 -3
  337. chia/util/action_scope.py +3 -3
  338. chia/util/block_cache.py +1 -2
  339. chia/util/byte_types.py +1 -1
  340. chia/util/casts.py +21 -0
  341. chia/util/config.py +0 -37
  342. chia/util/db_wrapper.py +8 -1
  343. chia/util/errors.py +3 -2
  344. chia/util/initial-config.yaml +21 -5
  345. chia/util/keychain.py +6 -7
  346. chia/util/keyring_wrapper.py +5 -5
  347. chia/util/limited_semaphore.py +1 -1
  348. chia/util/priority_mutex.py +1 -1
  349. chia/util/streamable.py +63 -5
  350. chia/util/task_timing.py +1 -1
  351. chia/util/virtual_project_analysis.py +1 -1
  352. chia/wallet/cat_wallet/cat_info.py +7 -3
  353. chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
  354. chia/wallet/cat_wallet/cat_utils.py +1 -1
  355. chia/wallet/cat_wallet/cat_wallet.py +44 -36
  356. chia/wallet/cat_wallet/lineage_store.py +7 -0
  357. chia/wallet/cat_wallet/r_cat_wallet.py +273 -0
  358. chia/wallet/conditions.py +5 -10
  359. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
  360. chia/wallet/derivation_record.py +33 -0
  361. chia/wallet/derive_keys.py +3 -3
  362. chia/wallet/did_wallet/did_info.py +12 -3
  363. chia/wallet/did_wallet/did_wallet.py +132 -101
  364. chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
  365. chia/wallet/driver_protocol.py +3 -1
  366. chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
  367. chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
  368. chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
  369. chia/wallet/nft_wallet/nft_wallet.py +69 -112
  370. chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
  371. chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
  372. chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
  373. chia/wallet/nft_wallet/uncurry_nft.py +4 -6
  374. chia/wallet/notification_manager.py +2 -3
  375. chia/wallet/outer_puzzles.py +7 -2
  376. chia/wallet/puzzle_drivers.py +1 -1
  377. chia/wallet/puzzles/clawback/drivers.py +5 -4
  378. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
  379. chia/wallet/puzzles/singleton_top_layer.py +2 -1
  380. chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
  381. chia/wallet/puzzles/tails.py +1 -3
  382. chia/wallet/signer_protocol.py +5 -6
  383. chia/wallet/singleton.py +5 -4
  384. chia/wallet/singleton_record.py +1 -1
  385. chia/wallet/trade_manager.py +18 -20
  386. chia/wallet/trade_record.py +3 -6
  387. chia/wallet/trading/offer.py +12 -13
  388. chia/wallet/uncurried_puzzle.py +2 -2
  389. chia/wallet/util/compute_additions.py +58 -0
  390. chia/wallet/util/compute_hints.py +3 -3
  391. chia/wallet/util/compute_memos.py +4 -4
  392. chia/wallet/util/curry_and_treehash.py +2 -1
  393. chia/wallet/util/debug_spend_bundle.py +1 -1
  394. chia/wallet/util/merkle_tree.py +1 -1
  395. chia/wallet/util/peer_request_cache.py +1 -2
  396. chia/wallet/util/tx_config.py +3 -8
  397. chia/wallet/util/wallet_sync_utils.py +10 -5
  398. chia/wallet/util/wallet_types.py +1 -0
  399. chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
  400. chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
  401. chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
  402. chia/wallet/vc_wallet/vc_drivers.py +50 -8
  403. chia/wallet/vc_wallet/vc_store.py +3 -5
  404. chia/wallet/vc_wallet/vc_wallet.py +15 -22
  405. chia/wallet/wallet.py +36 -46
  406. chia/wallet/wallet_action_scope.py +73 -4
  407. chia/wallet/wallet_blockchain.py +1 -3
  408. chia/wallet/wallet_interested_store.py +1 -1
  409. chia/wallet/wallet_nft_store.py +3 -3
  410. chia/wallet/wallet_node.py +17 -16
  411. chia/wallet/wallet_node_api.py +4 -5
  412. chia/wallet/wallet_pool_store.py +1 -1
  413. chia/wallet/wallet_protocol.py +2 -0
  414. chia/wallet/wallet_puzzle_store.py +1 -1
  415. chia/{rpc → wallet}/wallet_request_types.py +670 -81
  416. chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
  417. chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
  418. chia/wallet/wallet_singleton_store.py +8 -7
  419. chia/wallet/wallet_spend_bundle.py +4 -3
  420. chia/wallet/wallet_state_manager.py +320 -191
  421. chia/wallet/wallet_weight_proof_handler.py +1 -2
  422. chia/wallet/wsm_apis.py +98 -0
  423. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/RECORD +443 -436
  425. mozilla-ca/cacert.pem +3 -165
  426. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
  427. chia/cmds/dev.py +0 -18
  428. chia/types/blockchain_format/slots.py +0 -9
  429. chia/types/blockchain_format/sub_epoch_summary.py +0 -5
  430. chia/types/end_of_slot_bundle.py +0 -5
  431. chia/types/full_block.py +0 -5
  432. chia/types/header_block.py +0 -5
  433. chia/types/spend_bundle_conditions.py +0 -7
  434. chia/types/transaction_queue_entry.py +0 -56
  435. chia/types/unfinished_block.py +0 -5
  436. /chia/cmds/{installers.py → dev/installers.py} +0 -0
  437. /chia/cmds/{sim.py → dev/sim.py} +0 -0
  438. /chia/{util → cmds}/dump_keyring.py +0 -0
  439. /chia/{full_node → consensus}/signage_point.py +0 -0
  440. /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
  441. /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
  442. /chia/{util → full_node}/full_block_utils.py +0 -0
  443. /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
  444. /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
  445. /chia/{full_node → protocols}/fee_estimate.py +0 -0
  446. /chia/{server → protocols}/outbound_message.py +0 -0
  447. /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
  448. /chia/{util → simulator}/vdf_prover.py +0 -0
  449. /chia/{util → ssl}/ssl_check.py +0 -0
  450. /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
  451. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/entry_points.txt +0 -0
@@ -1,26 +1,22 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import Optional
5
4
 
6
5
  from chia_puzzles_py.programs import CHIALISP_DESERIALISATION
7
6
  from chia_rs import (
7
+ CoinSpend,
8
8
  ConsensusConstants,
9
9
  get_flags_for_height_and_constants,
10
10
  run_chia_program,
11
11
  )
12
12
  from chia_rs import get_puzzle_and_solution_for_coin2 as get_puzzle_and_solution_for_coin_rust
13
- from chia_rs.sized_bytes import bytes32
14
- from chia_rs.sized_ints import uint32, uint64
13
+ from chia_rs.sized_ints import uint64
15
14
 
15
+ from chia.consensus.condition_tools import conditions_for_solution
16
16
  from chia.types.blockchain_format.coin import Coin
17
17
  from chia.types.blockchain_format.program import Program
18
- from chia.types.coin_record import CoinRecord
19
- from chia.types.coin_spend import CoinSpend, CoinSpendWithConditions, SpendInfo, make_spend
18
+ from chia.types.coin_spend import CoinSpendWithConditions, SpendInfo, make_spend
20
19
  from chia.types.generator_types import BlockGenerator
21
- from chia.types.spend_bundle_conditions import SpendBundleConditions
22
- from chia.util.condition_tools import conditions_for_solution
23
- from chia.util.errors import Err
24
20
 
25
21
  DESERIALIZE_MOD = Program.from_bytes(CHIALISP_DESERIALISATION)
26
22
 
@@ -61,10 +57,13 @@ def get_spends_for_block(generator: BlockGenerator, height: int, constants: Cons
61
57
  spends: list[CoinSpend] = []
62
58
 
63
59
  for spend in Program.to(ret).first().as_iter():
64
- parent, puzzle, amount, solution = spend.as_iter()
65
- puzzle_hash = puzzle.get_tree_hash()
66
- coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
67
- spends.append(make_spend(coin, puzzle, solution))
60
+ try:
61
+ parent, puzzle, amount, solution = spend.as_iter()
62
+ puzzle_hash = puzzle.get_tree_hash()
63
+ coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
64
+ spends.append(make_spend(coin, puzzle, solution))
65
+ except ValueError:
66
+ log.warning("get_spends_for_block() encountered a puzzle we couldn't serialize: {e}")
68
67
 
69
68
  return spends
70
69
 
@@ -90,56 +89,14 @@ def get_spends_for_block_with_conditions(
90
89
  spends: list[CoinSpendWithConditions] = []
91
90
 
92
91
  for spend in Program.to(ret).first().as_iter():
93
- parent, puzzle, amount, solution = spend.as_iter()
94
- puzzle_hash = puzzle.get_tree_hash()
95
- coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
96
- coin_spend = make_spend(coin, puzzle, solution)
97
- conditions = conditions_for_solution(puzzle, solution, constants.MAX_BLOCK_COST_CLVM)
98
- spends.append(CoinSpendWithConditions(coin_spend, conditions))
92
+ try:
93
+ parent, puzzle, amount, solution = spend.as_iter()
94
+ puzzle_hash = puzzle.get_tree_hash()
95
+ coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
96
+ coin_spend = make_spend(coin, puzzle, solution)
97
+ conditions = conditions_for_solution(puzzle, solution, constants.MAX_BLOCK_COST_CLVM)
98
+ spends.append(CoinSpendWithConditions(coin_spend, conditions))
99
+ except ValueError:
100
+ log.warning("get_spends_for_block_with_conditions() encountered a puzzle we couldn't serialize: {e}")
99
101
 
100
102
  return spends
101
-
102
-
103
- def mempool_check_time_locks(
104
- removal_coin_records: dict[bytes32, CoinRecord],
105
- bundle_conds: SpendBundleConditions,
106
- prev_transaction_block_height: uint32,
107
- timestamp: uint64,
108
- ) -> Optional[Err]:
109
- """
110
- Check all time and height conditions against current state.
111
- """
112
-
113
- if prev_transaction_block_height < bundle_conds.height_absolute:
114
- return Err.ASSERT_HEIGHT_ABSOLUTE_FAILED
115
- if timestamp < bundle_conds.seconds_absolute:
116
- return Err.ASSERT_SECONDS_ABSOLUTE_FAILED
117
- if bundle_conds.before_height_absolute is not None:
118
- if prev_transaction_block_height >= bundle_conds.before_height_absolute:
119
- return Err.ASSERT_BEFORE_HEIGHT_ABSOLUTE_FAILED
120
- if bundle_conds.before_seconds_absolute is not None:
121
- if timestamp >= bundle_conds.before_seconds_absolute:
122
- return Err.ASSERT_BEFORE_SECONDS_ABSOLUTE_FAILED
123
-
124
- for spend in bundle_conds.spends:
125
- unspent = removal_coin_records[bytes32(spend.coin_id)]
126
- if spend.birth_height is not None:
127
- if spend.birth_height != unspent.confirmed_block_index:
128
- return Err.ASSERT_MY_BIRTH_HEIGHT_FAILED
129
- if spend.birth_seconds is not None:
130
- if spend.birth_seconds != unspent.timestamp:
131
- return Err.ASSERT_MY_BIRTH_SECONDS_FAILED
132
- if spend.height_relative is not None:
133
- if prev_transaction_block_height < unspent.confirmed_block_index + spend.height_relative:
134
- return Err.ASSERT_HEIGHT_RELATIVE_FAILED
135
- if spend.seconds_relative is not None:
136
- if timestamp < unspent.timestamp + spend.seconds_relative:
137
- return Err.ASSERT_SECONDS_RELATIVE_FAILED
138
- if spend.before_height_relative is not None:
139
- if prev_transaction_block_height >= unspent.confirmed_block_index + spend.before_height_relative:
140
- return Err.ASSERT_BEFORE_HEIGHT_RELATIVE_FAILED
141
- if spend.before_seconds_relative is not None:
142
- if timestamp >= unspent.timestamp + spend.before_seconds_relative:
143
- return Err.ASSERT_BEFORE_SECONDS_RELATIVE_FAILED
144
-
145
- return None
@@ -13,7 +13,8 @@ from chia_rs import (
13
13
  ELIGIBLE_FOR_FF,
14
14
  BLSCache,
15
15
  ConsensusConstants,
16
- G2Element,
16
+ SpendBundle,
17
+ SpendBundleConditions,
17
18
  supports_fast_forward,
18
19
  validate_clvm_and_signature,
19
20
  )
@@ -22,23 +23,21 @@ from chia_rs.sized_ints import uint32, uint64
22
23
  from chiabip158 import PyBIP158
23
24
 
24
25
  from chia.consensus.block_record import BlockRecordProtocol
26
+ from chia.consensus.check_time_locks import check_time_locks
25
27
  from chia.consensus.cost_calculator import NPCResult
26
28
  from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator
29
+ from chia.full_node.eligible_coin_spends import EligibilityAndAdditions
27
30
  from chia.full_node.fee_estimation import FeeBlockInfo, MempoolInfo, MempoolItemInfo
28
31
  from chia.full_node.fee_estimator_interface import FeeEstimatorInterface
29
32
  from chia.full_node.mempool import MEMPOOL_ITEM_FEE_LIMIT, Mempool, MempoolRemoveInfo, MempoolRemoveReason
30
- from chia.full_node.mempool_check_conditions import mempool_check_time_locks
31
33
  from chia.full_node.pending_tx_cache import ConflictTxCache, PendingTxCache
32
34
  from chia.types.blockchain_format.coin import Coin
33
35
  from chia.types.clvm_cost import CLVMCost
34
36
  from chia.types.coin_record import CoinRecord
35
- from chia.types.eligible_coin_spends import EligibilityAndAdditions, UnspentLineageInfo
36
37
  from chia.types.fee_rate import FeeRate
37
- from chia.types.generator_types import BlockGenerator
38
+ from chia.types.generator_types import NewBlockGenerator
38
39
  from chia.types.mempool_inclusion_status import MempoolInclusionStatus
39
- from chia.types.mempool_item import BundleCoinSpend, MempoolItem
40
- from chia.types.spend_bundle import SpendBundle
41
- from chia.types.spend_bundle_conditions import SpendBundleConditions
40
+ from chia.types.mempool_item import BundleCoinSpend, MempoolItem, UnspentLineageInfo
42
41
  from chia.util.db_wrapper import SQLITE_INT_MAX
43
42
  from chia.util.errors import Err, ValidationError
44
43
  from chia.util.inline_executor import InlineExecutor
@@ -362,43 +361,30 @@ class MempoolManager:
362
361
  self.pool.shutdown(wait=True)
363
362
 
364
363
  # TODO: remove this, use create_generator() instead
365
- async def create_bundle_from_mempool(
366
- self,
367
- last_tb_header_hash: bytes32,
368
- item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
369
- ) -> Optional[tuple[SpendBundle, list[Coin]]]:
364
+ def create_bundle_from_mempool(self, last_tb_header_hash: bytes32) -> Optional[tuple[SpendBundle, list[Coin]]]:
370
365
  """
371
366
  Returns aggregated spendbundle that can be used for creating new block,
372
367
  additions and removals in that spend_bundle
373
368
  """
374
-
375
- lineage_cache = LineageInfoCache(self.get_unspent_lineage_info_for_puzzle_hash)
376
-
377
369
  if self.peak is None or self.peak.header_hash != last_tb_header_hash:
378
370
  return None
379
- return await self.mempool.create_bundle_from_mempool_items(
380
- lineage_cache.get_unspent_lineage_info, self.constants, self.peak.height, item_inclusion_filter
381
- )
371
+ return self.mempool.create_bundle_from_mempool_items(self.constants, self.peak.height)
382
372
 
383
- async def create_block_generator(
384
- self,
385
- last_tb_header_hash: bytes32,
386
- item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
387
- ) -> Optional[tuple[BlockGenerator, G2Element, list[Coin], list[Coin]]]:
373
+ def create_block_generator(self, last_tb_header_hash: bytes32, timeout: float) -> Optional[NewBlockGenerator]:
388
374
  """
389
375
  Returns a block generator program, the aggregate signature and all additions and removals, for a new block
390
376
  """
391
377
  if self.peak is None or self.peak.header_hash != last_tb_header_hash:
392
378
  return None
379
+ return self.mempool.create_block_generator(self.constants, self.peak.height, timeout)
393
380
 
394
- lineage_cache = LineageInfoCache(self.get_unspent_lineage_info_for_puzzle_hash)
395
-
396
- return await self.mempool.create_block_generator(
397
- lineage_cache.get_unspent_lineage_info,
398
- self.constants,
399
- self.peak.height,
400
- item_inclusion_filter,
401
- )
381
+ def create_block_generator2(self, last_tb_header_hash: bytes32, timeout: float) -> Optional[NewBlockGenerator]:
382
+ """
383
+ Returns a block generator program, the aggregate signature and all additions, for a new block
384
+ """
385
+ if self.peak is None or self.peak.header_hash != last_tb_header_hash:
386
+ return None
387
+ return self.mempool.create_block_generator2(self.constants, self.peak.height, timeout)
402
388
 
403
389
  def get_filter(self) -> bytes:
404
390
  all_transactions: set[bytes32] = set()
@@ -572,12 +558,13 @@ class MempoolManager:
572
558
  get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
573
559
  ) -> tuple[Optional[Err], Optional[MempoolItem], list[bytes32]]:
574
560
  """
575
- Validates new_spend with the given NPCResult, and spend_name, and the current mempool. The mempool should
561
+ Validates new_spend with the given SpendBundleConditions, and
562
+ spend_name, and the current mempool. The mempool should
576
563
  be locked during this call (blockchain lock).
577
564
 
578
565
  Args:
579
566
  new_spend: spend bundle to validate
580
- conds: result of running the clvm transaction in a fake block
567
+ conds: result of running the clvm transaction
581
568
  spend_name: hash of the spend bundle data, passed in as an optimization
582
569
  first_added_height: The block height that `new_spend` first entered this node's mempool.
583
570
  Used to estimate how long a spend has taken to be included on the chain.
@@ -630,7 +617,7 @@ class MempoolManager:
630
617
  return Err.INVALID_COIN_SOLUTION, None, []
631
618
 
632
619
  mark_as_fast_forward = eligibility_info.ff_puzzle_hash is not None and supports_fast_forward(coin_spend)
633
- latest_singleton_coin = None
620
+ lineage_info = None
634
621
  if mark_as_fast_forward:
635
622
  # Make sure the fast forward spend still has a version that is
636
623
  # still unspent, because if the singleton has been melted, the
@@ -639,13 +626,12 @@ class MempoolManager:
639
626
  lineage_info = await get_unspent_lineage_info_for_puzzle_hash(eligibility_info.ff_puzzle_hash)
640
627
  if lineage_info is None:
641
628
  return Err.DOUBLE_SPEND, None, []
642
- latest_singleton_coin = lineage_info.coin_id
643
629
  bundle_coin_spends[coin_id] = BundleCoinSpend(
644
630
  coin_spend=coin_spend,
645
631
  eligible_for_dedup=supports_dedup,
646
632
  eligible_for_fast_forward=mark_as_fast_forward,
647
633
  additions=eligibility_info.spend_additions,
648
- latest_singleton_coin=latest_singleton_coin,
634
+ latest_singleton_lineage=lineage_info,
649
635
  )
650
636
 
651
637
  if removal_names != removal_names_from_coin_spends:
@@ -739,7 +725,7 @@ class MempoolManager:
739
725
  # point-of-view of the next block to be farmed. Therefore we pass in the
740
726
  # current peak's height and timestamp
741
727
  assert self.peak.timestamp is not None
742
- tl_error: Optional[Err] = mempool_check_time_locks(
728
+ tl_error: Optional[Err] = check_time_locks(
743
729
  removal_record_dict,
744
730
  conds,
745
731
  self.peak.height,
@@ -872,7 +858,7 @@ class MempoolManager:
872
858
  continue
873
859
 
874
860
  bcs = item.bundle_coin_spends.get(spend)
875
- if bcs is not None and bcs.latest_singleton_coin is None:
861
+ if bcs is not None and bcs.latest_singleton_lineage is None:
876
862
  # this is a regular coin spend that's now made it into
877
863
  # a block and we just evict its mempool item
878
864
  included_items.append(MempoolItemInfo(item.cost, item.fee, item.height_added_to_mempool))
@@ -895,7 +881,7 @@ class MempoolManager:
895
881
  # item, for the same singleton
896
882
  found_matches = 0
897
883
  for bcs in item.bundle_coin_spends.values():
898
- if bcs.latest_singleton_coin != spend:
884
+ if bcs.latest_singleton_lineage is None or bcs.latest_singleton_lineage.coin_id != spend:
899
885
  continue
900
886
  found_matches += 1
901
887
 
@@ -911,7 +897,7 @@ class MempoolManager:
911
897
  break
912
898
 
913
899
  spends_to_update.append((lineage_info.coin_id, spend, item_name))
914
- bcs.latest_singleton_coin = lineage_info.coin_id
900
+ bcs.latest_singleton_lineage = lineage_info
915
901
 
916
902
  if found_matches == 0: # pragma: no cover
917
903
  # We are not expected to get here. this is all
@@ -3,12 +3,10 @@ from __future__ import annotations
3
3
  import logging
4
4
  from dataclasses import dataclass, field
5
5
 
6
- from chia_rs import Coin
6
+ from chia_rs import Coin, SpendBundleConditions
7
7
  from chia_rs.sized_bytes import bytes32
8
8
  from chia_rs.sized_ints import uint64
9
9
 
10
- from chia.types.spend_bundle_conditions import SpendBundleConditions
11
-
12
10
  log = logging.getLogger(__name__)
13
11
 
14
12
 
@@ -1,20 +1,67 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import dataclasses
4
5
  import logging
5
- from dataclasses import dataclass
6
+ from dataclasses import dataclass, field
6
7
  from queue import SimpleQueue
7
- from typing import Optional
8
+ from typing import ClassVar, Generic, Optional, TypeVar, Union
8
9
 
10
+ from chia_rs import SpendBundle
9
11
  from chia_rs.sized_bytes import bytes32
10
12
 
11
- from chia.types.transaction_queue_entry import TransactionQueueEntry
13
+ from chia.server.ws_connection import WSChiaConnection
14
+ from chia.types.mempool_inclusion_status import MempoolInclusionStatus
15
+ from chia.util.errors import Err
16
+
17
+ T = TypeVar("T")
12
18
 
13
19
 
14
20
  class TransactionQueueFull(Exception):
15
21
  pass
16
22
 
17
23
 
24
+ class ValuedEventSentinel:
25
+ pass
26
+
27
+
28
+ @dataclasses.dataclass
29
+ class ValuedEvent(Generic[T]):
30
+ _value_sentinel: ClassVar[ValuedEventSentinel] = ValuedEventSentinel()
31
+
32
+ _event: asyncio.Event = dataclasses.field(default_factory=asyncio.Event)
33
+ _value: Union[ValuedEventSentinel, T] = _value_sentinel
34
+
35
+ def set(self, value: T) -> None:
36
+ if not isinstance(self._value, ValuedEventSentinel):
37
+ raise Exception("Value already set")
38
+ self._value = value
39
+ self._event.set()
40
+
41
+ async def wait(self) -> T:
42
+ await self._event.wait()
43
+ if isinstance(self._value, ValuedEventSentinel):
44
+ raise Exception("Value not set despite event being set")
45
+ return self._value
46
+
47
+
48
+ @dataclass(frozen=True)
49
+ class TransactionQueueEntry:
50
+ """
51
+ A transaction received from peer. This is put into a queue, and not yet in the mempool.
52
+ """
53
+
54
+ transaction: SpendBundle = field(compare=False)
55
+ transaction_bytes: Optional[bytes] = field(compare=False)
56
+ spend_name: bytes32
57
+ peer: Optional[WSChiaConnection] = field(compare=False)
58
+ test: bool = field(compare=False)
59
+ done: ValuedEvent[tuple[MempoolInclusionStatus, Optional[Err]]] = field(
60
+ default_factory=ValuedEvent,
61
+ compare=False,
62
+ )
63
+
64
+
18
65
  @dataclass
19
66
  class TransactionQueue:
20
67
  """
@@ -10,29 +10,36 @@ from concurrent.futures.process import ProcessPoolExecutor
10
10
  from multiprocessing.context import BaseContext
11
11
  from typing import IO, Optional
12
12
 
13
- from chia_rs import ConsensusConstants, SubEpochChallengeSegment, SubEpochData, SubEpochSegments, SubSlotData
13
+ from chia_rs import (
14
+ BlockRecord,
15
+ ChallengeChainSubSlot,
16
+ ConsensusConstants,
17
+ EndOfSubSlotBundle,
18
+ HeaderBlock,
19
+ RewardChainSubSlot,
20
+ SubEpochChallengeSegment,
21
+ SubEpochData,
22
+ SubEpochSegments,
23
+ SubEpochSummary,
24
+ SubSlotData,
25
+ )
14
26
  from chia_rs.sized_bytes import bytes32
15
27
  from chia_rs.sized_ints import uint8, uint32, uint64, uint128
16
28
 
17
29
  from chia.consensus.block_header_validation import validate_finished_header_block
18
- from chia.consensus.block_record import BlockRecord
19
30
  from chia.consensus.blockchain_interface import BlockchainInterface
20
31
  from chia.consensus.deficit import calculate_deficit
21
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
22
34
  from chia.consensus.pot_iterations import (
23
35
  calculate_ip_iters,
24
- calculate_iterations_quality,
25
36
  calculate_sp_iters,
26
37
  is_overflow_block,
38
+ validate_pospace_and_get_required_iters,
27
39
  )
28
40
  from chia.consensus.vdf_info_computation import get_signage_point_vdf_info
29
41
  from chia.types.blockchain_format.classgroup import ClassgroupElement
30
- from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
31
- from chia.types.blockchain_format.slots import ChallengeChainSubSlot, RewardChainSubSlot
32
- from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
33
42
  from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
34
- from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
35
- from chia.types.header_block import HeaderBlock
36
43
  from chia.types.validation_state import ValidationState
37
44
  from chia.types.weight_proof import (
38
45
  RecentChainData,
@@ -994,7 +1001,7 @@ def _validate_segment(
994
1001
  if sampled and sub_slot_data.is_challenge():
995
1002
  after_challenge = True
996
1003
  required_iters = __validate_pospace(
997
- constants, segment, idx, curr_difficulty, ses, first_segment_in_se, height
1004
+ constants, segment, idx, curr_difficulty, curr_ssi, ses, first_segment_in_se, height
998
1005
  )
999
1006
  if required_iters is None:
1000
1007
  return False, uint64(0), uint64(0), uint64(0), []
@@ -1142,7 +1149,7 @@ def sub_slot_data_vdf_input(
1142
1149
  if is_overflow and new_sub_slot:
1143
1150
  if sub_slot_idx >= 2:
1144
1151
  if sub_slots[sub_slot_idx - 2].cc_slot_end_info is None:
1145
- for ssd_idx in reversed(range(0, sub_slot_idx - 1)):
1152
+ for ssd_idx in reversed(range(sub_slot_idx - 1)):
1146
1153
  ssd = sub_slots[ssd_idx]
1147
1154
  if ssd.cc_slot_end_info is not None:
1148
1155
  ssd = sub_slots[ssd_idx + 1]
@@ -1157,7 +1164,7 @@ def sub_slot_data_vdf_input(
1157
1164
  return cc_input
1158
1165
 
1159
1166
  elif not is_overflow and not new_sub_slot:
1160
- for ssd_idx in reversed(range(0, sub_slot_idx)):
1167
+ for ssd_idx in reversed(range(sub_slot_idx)):
1161
1168
  ssd = sub_slots[ssd_idx]
1162
1169
  if ssd.cc_slot_end_info is not None:
1163
1170
  ssd = sub_slots[ssd_idx + 1]
@@ -1174,7 +1181,7 @@ def sub_slot_data_vdf_input(
1174
1181
 
1175
1182
  elif not new_sub_slot and is_overflow:
1176
1183
  slots_seen = 0
1177
- for ssd_idx in reversed(range(0, sub_slot_idx)):
1184
+ for ssd_idx in reversed(range(sub_slot_idx)):
1178
1185
  ssd = sub_slots[ssd_idx]
1179
1186
  if ssd.cc_slot_end_info is not None:
1180
1187
  slots_seen += 1
@@ -1239,7 +1246,7 @@ def validate_recent_blocks(
1239
1246
  if sub_slot.challenge_chain.new_difficulty is not None:
1240
1247
  diff = sub_slot.challenge_chain.new_difficulty
1241
1248
 
1242
- if (challenge is not None) and (prev_challenge is not None):
1249
+ if (challenge is not None) and (prev_challenge is not None) and transaction_blocks > 1:
1243
1250
  overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
1244
1251
  if not adjusted:
1245
1252
  assert prev_block_record is not None
@@ -1260,7 +1267,9 @@ def validate_recent_blocks(
1260
1267
  assert caluclated_required_iters is not None
1261
1268
  required_iters = caluclated_required_iters
1262
1269
  else:
1263
- ret = _validate_pospace_recent_chain(constants, block, challenge, diff, overflow, prev_challenge)
1270
+ ret = _validate_pospace_recent_chain(
1271
+ constants, sub_blocks, block, challenge, diff, ssi, overflow, prev_challenge
1272
+ )
1264
1273
  if ret is None:
1265
1274
  return False, []
1266
1275
  required_iters = ret
@@ -1298,9 +1307,11 @@ def validate_recent_blocks(
1298
1307
 
1299
1308
  def _validate_pospace_recent_chain(
1300
1309
  constants: ConsensusConstants,
1310
+ blocks: BlockCache,
1301
1311
  block: HeaderBlock,
1302
1312
  challenge: bytes32,
1303
1313
  diff: uint64,
1314
+ ssi: uint64,
1304
1315
  overflow: bool,
1305
1316
  prev_challenge: bytes32,
1306
1317
  ) -> Optional[uint64]:
@@ -1310,23 +1321,21 @@ def _validate_pospace_recent_chain(
1310
1321
  else:
1311
1322
  cc_sp_hash = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
1312
1323
  assert cc_sp_hash is not None
1313
- q_str = verify_and_get_quality_string(
1314
- block.reward_chain_block.proof_of_space,
1324
+
1325
+ required_iters = validate_pospace_and_get_required_iters(
1315
1326
  constants,
1327
+ block.reward_chain_block.proof_of_space,
1316
1328
  challenge if not overflow else prev_challenge,
1317
1329
  cc_sp_hash,
1318
- height=block.height,
1330
+ block.height,
1331
+ diff,
1332
+ ssi,
1333
+ prev_tx_block(blocks, blocks.block_record(block.prev_header_hash)),
1319
1334
  )
1320
- if q_str is None:
1335
+ if required_iters is None:
1321
1336
  log.error(f"could not verify proof of space block {block.height} {overflow}")
1322
1337
  return None
1323
- required_iters = calculate_iterations_quality(
1324
- constants.DIFFICULTY_CONSTANT_FACTOR,
1325
- q_str,
1326
- block.reward_chain_block.proof_of_space.size,
1327
- diff,
1328
- cc_sp_hash,
1329
- )
1338
+
1330
1339
  return required_iters
1331
1340
 
1332
1341
 
@@ -1335,6 +1344,7 @@ def __validate_pospace(
1335
1344
  segment: SubEpochChallengeSegment,
1336
1345
  idx: int,
1337
1346
  curr_diff: uint64,
1347
+ curr_sub_slot_iters: uint64,
1338
1348
  ses: Optional[SubEpochSummary],
1339
1349
  first_in_sub_epoch: bool,
1340
1350
  height: uint32,
@@ -1360,23 +1370,22 @@ def __validate_pospace(
1360
1370
 
1361
1371
  # validate proof of space
1362
1372
  assert sub_slot_data.proof_of_space is not None
1363
- q_str = verify_and_get_quality_string(
1364
- sub_slot_data.proof_of_space,
1373
+
1374
+ required_iters = validate_pospace_and_get_required_iters(
1365
1375
  constants,
1376
+ sub_slot_data.proof_of_space,
1366
1377
  challenge,
1367
1378
  cc_sp_hash,
1368
- height=height,
1379
+ height,
1380
+ curr_diff,
1381
+ curr_sub_slot_iters,
1382
+ uint32(0), # prev_tx_block(blocks, prev_b), todo need to get height of prev tx block somehow here
1369
1383
  )
1370
- if q_str is None:
1384
+ if required_iters is None:
1371
1385
  log.error("could not verify proof of space")
1372
1386
  return None
1373
- return calculate_iterations_quality(
1374
- constants.DIFFICULTY_CONSTANT_FACTOR,
1375
- q_str,
1376
- sub_slot_data.proof_of_space.size,
1377
- curr_diff,
1378
- cc_sp_hash,
1379
- )
1387
+
1388
+ return required_iters
1380
1389
 
1381
1390
 
1382
1391
  def __get_rc_sub_slot(
@@ -1465,7 +1474,7 @@ def __get_rc_sub_slot(
1465
1474
 
1466
1475
  def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: Optional[SubEpochSummary]) -> ChallengeChainSubSlot:
1467
1476
  sub_slot: Optional[SubSlotData] = None
1468
- for i in reversed(range(0, idx)):
1477
+ for i in reversed(range(idx)):
1469
1478
  sub_slot = sub_slots[i]
1470
1479
  if sub_slot.cc_slot_end_info is not None:
1471
1480
  break
@@ -36,8 +36,8 @@ from chia.plotting.util import (
36
36
  remove_plot_directory,
37
37
  update_harvester_config,
38
38
  )
39
+ from chia.protocols.outbound_message import NodeType
39
40
  from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
40
- from chia.server.outbound_message import NodeType
41
41
  from chia.server.server import ChiaServer
42
42
  from chia.server.ws_connection import WSChiaConnection
43
43
  from chia.util.cpu import available_logical_cores
@@ -6,23 +6,26 @@ import time
6
6
  from pathlib import Path
7
7
  from typing import TYPE_CHECKING, ClassVar, Optional, cast
8
8
 
9
- from chia_rs import AugSchemeMPL, G1Element, G2Element
9
+ from chia_rs import AugSchemeMPL, G1Element, G2Element, PlotSize, ProofOfSpace
10
10
  from chia_rs.sized_bytes import bytes32
11
11
  from chia_rs.sized_ints import uint8, uint32, uint64
12
12
 
13
- from chia.consensus.pot_iterations import calculate_iterations_quality, calculate_sp_interval_iters
13
+ from chia.consensus.pot_iterations import (
14
+ calculate_iterations_quality,
15
+ calculate_sp_interval_iters,
16
+ )
14
17
  from chia.harvester.harvester import Harvester
15
18
  from chia.plotting.util import PlotInfo, parse_plot_info
16
19
  from chia.protocols import harvester_protocol
17
20
  from chia.protocols.farmer_protocol import FarmingInfo
18
21
  from chia.protocols.harvester_protocol import Plot, PlotSyncResponse
22
+ from chia.protocols.outbound_message import Message, make_msg
19
23
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
20
24
  from chia.server.api_protocol import ApiMetadata
21
- from chia.server.outbound_message import Message, make_msg
22
25
  from chia.server.ws_connection import WSChiaConnection
23
26
  from chia.types.blockchain_format.proof_of_space import (
24
- ProofOfSpace,
25
27
  calculate_pos_challenge,
28
+ calculate_prefix_bits,
26
29
  generate_plot_public_key,
27
30
  passes_plot_filter,
28
31
  )
@@ -144,12 +147,15 @@ class HarvesterAPI:
144
147
 
145
148
  # Found proofs of space (on average 1 is expected per plot)
146
149
  for index, quality_str in enumerate(quality_strings):
150
+ # TODO: todo_v2_plots
147
151
  required_iters: uint64 = calculate_iterations_quality(
148
- self.harvester.constants.DIFFICULTY_CONSTANT_FACTOR,
152
+ self.harvester.constants,
149
153
  quality_str,
150
- plot_info.prover.get_size(),
154
+ PlotSize.make_v1(plot_info.prover.get_size()),
151
155
  difficulty,
152
156
  new_challenge.sp_hash,
157
+ sub_slot_iters,
158
+ new_challenge.last_tx_height,
153
159
  )
154
160
  sp_interval_iters = calculate_sp_interval_iters(self.harvester.constants, sub_slot_iters)
155
161
  if required_iters < sp_interval_iters:
@@ -243,8 +249,17 @@ class HarvesterAPI:
243
249
  # Passes the plot filter (does not check sp filter yet though, since we have not reached sp)
244
250
  # This is being executed at the beginning of the slot
245
251
  total += 1
252
+
253
+ # TODO: todo_v2_plots support v2 plots in PlotManager
254
+ filter_prefix_bits = uint8(
255
+ calculate_prefix_bits(
256
+ self.harvester.constants,
257
+ new_challenge.peak_height,
258
+ PlotSize.make_v1(try_plot_info.prover.get_size()),
259
+ )
260
+ )
246
261
  if passes_plot_filter(
247
- new_challenge.filter_prefix_bits,
262
+ filter_prefix_bits,
248
263
  try_plot_info.prover.get_id(),
249
264
  new_challenge.challenge_hash,
250
265
  new_challenge.sp_hash,
@@ -11,9 +11,9 @@ from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
11
11
  import dns.asyncresolver
12
12
  from chia_rs.sized_ints import uint16, uint64
13
13
 
14
+ from chia.protocols.outbound_message import NodeType
14
15
  from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
15
16
  from chia.server.introducer_peers import VettedPeer
16
- from chia.server.outbound_message import NodeType
17
17
  from chia.server.server import ChiaServer
18
18
  from chia.server.ws_connection import WSChiaConnection
19
19
  from chia.types.peer_info import TimestampedPeerInfo
@@ -7,10 +7,10 @@ from chia_rs.sized_ints import uint64
7
7
 
8
8
  from chia.introducer.introducer import Introducer
9
9
  from chia.protocols.introducer_protocol import RequestPeersIntroducer, RespondPeersIntroducer
10
+ from chia.protocols.outbound_message import Message, make_msg
10
11
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
11
12
  from chia.rpc.rpc_server import StateChangedProtocol
12
13
  from chia.server.api_protocol import ApiMetadata
13
- from chia.server.outbound_message import Message, make_msg
14
14
  from chia.server.ws_connection import WSChiaConnection
15
15
  from chia.types.peer_info import TimestampedPeerInfo
16
16
 
@@ -6,7 +6,7 @@ from chia_rs.sized_ints import uint64
6
6
 
7
7
  from chia.plot_sync.util import ErrorCodes, State
8
8
  from chia.protocols.harvester_protocol import PlotSyncIdentifier
9
- from chia.server.outbound_message import NodeType
9
+ from chia.protocols.outbound_message import NodeType
10
10
 
11
11
 
12
12
  class PlotSyncException(Exception):