chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc2__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 +495 -265
  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 +274 -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.5rc2.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.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.5rc2.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/entry_points.txt +0 -0
@@ -7,27 +7,25 @@ from collections.abc import Collection
7
7
  from typing import Any, Optional, Union
8
8
 
9
9
  import anyio
10
+ from chia_rs import BlockRecord, FullBlock, SpendBundle
10
11
  from chia_rs.sized_bytes import bytes32
11
12
  from chia_rs.sized_ints import uint8, uint32, uint64, uint128
12
13
 
14
+ from chia.consensus.augmented_chain import AugmentedBlockchain
13
15
  from chia.consensus.block_body_validation import ForkInfo
14
- from chia.consensus.block_record import BlockRecord
15
16
  from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
16
17
  from chia.consensus.blockchain import BlockchainMutexPriority
17
18
  from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
18
19
  from chia.full_node.full_node import FullNode
19
20
  from chia.full_node.full_node_api import FullNodeAPI
21
+ from chia.protocols.outbound_message import NodeType
20
22
  from chia.rpc.rpc_server import default_get_connections
21
- from chia.server.outbound_message import NodeType
22
23
  from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
23
24
  from chia.simulator.block_tools import BlockTools
24
25
  from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol
25
26
  from chia.types.blockchain_format.coin import Coin
26
27
  from chia.types.coin_record import CoinRecord
27
- from chia.types.full_block import FullBlock
28
- from chia.types.spend_bundle import SpendBundle
29
28
  from chia.types.validation_state import ValidationState
30
- from chia.util.augmented_chain import AugmentedBlockchain
31
29
  from chia.util.config import lock_and_load_config, save_config
32
30
  from chia.util.timing import adjusted_timeout, backoff_times
33
31
  from chia.wallet.conditions import CreateCoin
@@ -125,7 +123,33 @@ class FullNodeSimulator(FullNodeAPI):
125
123
  return self.auto_farm
126
124
 
127
125
  async def get_all_coins(self, request: GetAllCoinsProtocol) -> list[CoinRecord]:
128
- return await self.full_node.coin_store.get_all_coins(request.include_spent_coins)
126
+ """
127
+ Simulates fetching all coins by querying coins added at each block height.
128
+
129
+ Args:
130
+ request: An object containing the `include_spent_coins` flag.
131
+
132
+ Returns:
133
+ A combined list of CoinRecords (including spent coins if requested).
134
+ """
135
+ coin_records: list[CoinRecord] = []
136
+ current_height = 0
137
+
138
+ # `.get_peak_height` can return `None`. We use -1 in that case to exit early
139
+ max_block_height = self.full_node.blockchain.get_peak_height() or -1
140
+
141
+ while current_height <= max_block_height:
142
+ # Fetch coins added at the current block height
143
+ records_at_height = await self.full_node.coin_store.get_coins_added_at_height(uint32(current_height))
144
+
145
+ if not request.include_spent_coins:
146
+ # Filter out spent coins if not requested
147
+ records_at_height = [record for record in records_at_height if not record.spent]
148
+
149
+ coin_records.extend(records_at_height)
150
+ current_height += 1
151
+
152
+ return coin_records
129
153
 
130
154
  async def revert_block_height(self, new_height: uint32) -> None:
131
155
  """
@@ -205,7 +229,7 @@ class FullNodeSimulator(FullNodeAPI):
205
229
  await asyncio.sleep(1)
206
230
  else:
207
231
  current_time = False
208
- mempool_bundle = await self.full_node.mempool_manager.create_bundle_from_mempool(curr.header_hash)
232
+ mempool_bundle = self.full_node.mempool_manager.create_bundle_from_mempool(curr.header_hash)
209
233
  if mempool_bundle is None:
210
234
  spend_bundle = None
211
235
  else:
@@ -258,7 +282,7 @@ class FullNodeSimulator(FullNodeAPI):
258
282
  await asyncio.sleep(1)
259
283
  else:
260
284
  current_time = False
261
- mempool_bundle = await self.full_node.mempool_manager.create_bundle_from_mempool(curr.header_hash)
285
+ mempool_bundle = self.full_node.mempool_manager.create_bundle_from_mempool(curr.header_hash)
262
286
  if mempool_bundle is None:
263
287
  spend_bundle = None
264
288
  else:
@@ -369,7 +393,8 @@ class FullNodeSimulator(FullNodeAPI):
369
393
  if count == 0:
370
394
  return 0
371
395
 
372
- target_puzzlehash = await wallet.get_new_puzzlehash()
396
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
397
+ target_puzzlehash = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
373
398
  rewards = 0
374
399
 
375
400
  block_reward_coins = set()
@@ -687,7 +712,10 @@ class FullNodeSimulator(FullNodeAPI):
687
712
  for amount in amounts:
688
713
  # We need unique puzzle hash amount combos so we'll only generate a new puzzle hash when we've already
689
714
  # seen that amount sent to that puzzle hash
690
- puzzle_hash = await wallet.get_puzzle_hash(new=amount in amounts_seen)
715
+ async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
716
+ puzzle_hash = await action_scope.get_puzzle_hash(
717
+ wallet.wallet_state_manager, override_reuse_puzhash_with=amount not in amounts_seen
718
+ )
691
719
  outputs.append(CreateCoin(puzzle_hash, amount))
692
720
  amounts_seen.add(amount)
693
721
 
@@ -18,10 +18,20 @@ from chia_rs.sized_ints import uint16
18
18
  from chia.cmds.init_funcs import init
19
19
  from chia.consensus.constants import replace_str_to_bytes
20
20
  from chia.daemon.server import WebSocketServer, daemon_launch_lock_path
21
+ from chia.protocols.outbound_message import NodeType
21
22
  from chia.protocols.shared_protocol import Capability, default_capabilities
22
23
  from chia.seeder.dns_server import DNSServer, create_dns_server_service
23
24
  from chia.seeder.start_crawler import create_full_node_crawler_service
24
- from chia.server.outbound_message import NodeType
25
+ from chia.server.aliases import (
26
+ CrawlerService,
27
+ FarmerService,
28
+ FullNodeService,
29
+ HarvesterService,
30
+ IntroducerService,
31
+ TimelordService,
32
+ WalletService,
33
+ )
34
+ from chia.server.resolve_peer_info import set_peer_info
25
35
  from chia.server.signal_handlers import SignalHandlers
26
36
  from chia.server.start_farmer import create_farmer_service
27
37
  from chia.server.start_full_node import create_full_node_service
@@ -35,18 +45,9 @@ from chia.simulator.ssl_certs import get_next_nodes_certs_and_keys, get_next_pri
35
45
  from chia.simulator.start_simulator import SimulatorFullNodeService, create_full_node_simulator_service
36
46
  from chia.ssl.create_ssl import create_all_ssl
37
47
  from chia.timelord.timelord_launcher import VDFClientProcessMgr, find_vdf_client, spawn_process
38
- from chia.types.aliases import (
39
- CrawlerService,
40
- FarmerService,
41
- FullNodeService,
42
- HarvesterService,
43
- IntroducerService,
44
- TimelordService,
45
- WalletService,
46
- )
47
48
  from chia.types.peer_info import UnresolvedPeerInfo
48
49
  from chia.util.bech32m import encode_puzzle_hash
49
- from chia.util.config import config_path_for_filename, load_config, lock_and_load_config, save_config, set_peer_info
50
+ from chia.util.config import config_path_for_filename, load_config, lock_and_load_config, save_config
50
51
  from chia.util.db_wrapper import generate_in_memory_db_uri
51
52
  from chia.util.keychain import bytes_to_mnemonic
52
53
  from chia.util.lock import Lockfile
@@ -316,7 +317,6 @@ async def setup_wallet_node(
316
317
  # filesystem operations are async on windows
317
318
  # [WinError 32] The process cannot access the file because it is
318
319
  # being used by another process
319
- pass
320
320
  keychain.delete_all_keys()
321
321
 
322
322
 
@@ -1,14 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from chia_rs import FullBlock
3
4
  from chia_rs.sized_bytes import bytes32
4
5
  from chia_rs.sized_ints import uint32
5
6
 
6
- from chia.rpc.full_node_rpc_api import FullNodeRpcApi
7
+ from chia.full_node.full_node_rpc_api import FullNodeRpcApi
7
8
  from chia.rpc.rpc_server import Endpoint, EndpointResult
8
9
  from chia.simulator.full_node_simulator import FullNodeSimulator
9
10
  from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol
10
11
  from chia.types.coin_record import CoinRecord
11
- from chia.types.full_block import FullBlock
12
12
  from chia.util.bech32m import decode_puzzle_hash
13
13
 
14
14
 
@@ -1,11 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from chia_rs import FullBlock
3
4
  from chia_rs.sized_bytes import bytes32
4
5
  from chia_rs.sized_ints import uint128
5
6
 
6
- from chia.rpc.full_node_rpc_client import FullNodeRpcClient
7
+ from chia.full_node.full_node_rpc_client import FullNodeRpcClient
7
8
  from chia.types.coin_record import CoinRecord
8
- from chia.types.full_block import FullBlock
9
9
  from chia.util.bech32m import encode_puzzle_hash
10
10
 
11
11
 
@@ -9,7 +9,6 @@ from chia_rs import PrivateKey
9
9
  from chia_rs.sized_bytes import bytes32
10
10
  from chia_rs.sized_ints import uint32
11
11
 
12
- from chia.consensus.coinbase import create_puzzlehash_for_pk
13
12
  from chia.daemon.server import WebSocketServer, daemon_launch_lock_path
14
13
  from chia.server.signal_handlers import SignalHandlers
15
14
  from chia.simulator.full_node_simulator import FullNodeSimulator
@@ -29,6 +28,7 @@ from chia.util.errors import KeychainFingerprintExists
29
28
  from chia.util.keychain import Keychain
30
29
  from chia.util.lock import Lockfile
31
30
  from chia.wallet.derive_keys import master_sk_to_wallet_sk
31
+ from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_hash_for_pk
32
32
 
33
33
  """
34
34
  These functions are used to test the simulator.
@@ -56,7 +56,7 @@ def get_puzzle_hash_from_key(keychain: Keychain, fingerprint: int, key_id: int =
56
56
  raise Exception("Fingerprint not found")
57
57
  private_key = priv_key_and_entropy[0]
58
58
  sk_for_wallet_id: PrivateKey = master_sk_to_wallet_sk(private_key, uint32(key_id))
59
- puzzle_hash: bytes32 = create_puzzlehash_for_pk(sk_for_wallet_id.get_g1())
59
+ puzzle_hash: bytes32 = puzzle_hash_for_pk(sk_for_wallet_id.get_g1())
60
60
  return puzzle_hash
61
61
 
62
62
 
@@ -12,7 +12,7 @@ from chia_rs.sized_ints import uint16
12
12
 
13
13
  from chia.apis import ApiProtocolRegistry
14
14
  from chia.full_node.full_node import FullNode
15
- from chia.server.outbound_message import NodeType
15
+ from chia.protocols.outbound_message import NodeType
16
16
  from chia.server.signal_handlers import SignalHandlers
17
17
  from chia.server.start_service import Service, async_run
18
18
  from chia.simulator.block_tools import BlockTools, test_constants
@@ -2,19 +2,21 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any, Optional
4
4
 
5
- from chia_rs import AugSchemeMPL, ConsensusConstants, G1Element, G2Element, PrivateKey
5
+ from chia_rs import AugSchemeMPL, CoinSpend, ConsensusConstants, G1Element, G2Element, PrivateKey, SpendBundle
6
6
  from chia_rs.sized_bytes import bytes32
7
7
  from chia_rs.sized_ints import uint32, uint64
8
- from clvm.casts import int_from_bytes, int_to_bytes
9
8
 
9
+ from chia.consensus.condition_tools import (
10
+ agg_sig_additional_data,
11
+ conditions_dict_for_solution,
12
+ make_aggsig_final_message,
13
+ )
10
14
  from chia.types.blockchain_format.coin import Coin
11
15
  from chia.types.blockchain_format.program import Program
12
- from chia.types.blockchain_format.serialized_program import SerializedProgram
13
- from chia.types.coin_spend import CoinSpend
16
+ from chia.types.coin_spend import make_spend
14
17
  from chia.types.condition_opcodes import ConditionOpcode
15
18
  from chia.types.condition_with_args import ConditionWithArgs
16
- from chia.types.spend_bundle import SpendBundle
17
- from chia.util.condition_tools import agg_sig_additional_data, conditions_dict_for_solution, make_aggsig_final_message
19
+ from chia.util.casts import int_from_bytes, int_to_bytes
18
20
  from chia.util.hash import std_hash
19
21
  from chia.wallet.conditions import AssertCoinAnnouncement
20
22
  from chia.wallet.derive_keys import master_sk_to_wallet_sk
@@ -160,19 +162,9 @@ class WalletTool:
160
162
  ConditionWithArgs(ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT, [primary_announcement_hash])
161
163
  )
162
164
  main_solution = self.make_solution(condition_dic)
163
- spends.append(
164
- CoinSpend(
165
- coin, SerializedProgram.from_program(puzzle), SerializedProgram.from_program(main_solution)
166
- )
167
- )
165
+ spends.append(make_spend(coin, puzzle, main_solution))
168
166
  else:
169
- spends.append(
170
- CoinSpend(
171
- coin,
172
- SerializedProgram.from_program(puzzle),
173
- SerializedProgram.from_program(self.make_solution(secondary_coins_cond_dic)),
174
- )
175
- )
167
+ spends.append(make_spend(coin, puzzle, self.make_solution(secondary_coins_cond_dic)))
176
168
  return spends
177
169
 
178
170
  def sign_transaction(self, coin_spends: list[CoinSpend]) -> SpendBundle:
chia/ssl/create_ssl.py CHANGED
@@ -13,7 +13,7 @@ from cryptography.hazmat.primitives.asymmetric import rsa
13
13
  from cryptography.hazmat.primitives.serialization import load_pem_private_key
14
14
  from cryptography.x509.oid import NameOID
15
15
 
16
- from chia.util.ssl_check import DEFAULT_PERMISSIONS_CERT_FILE, DEFAULT_PERMISSIONS_KEY_FILE
16
+ from chia.ssl.ssl_check import DEFAULT_PERMISSIONS_CERT_FILE, DEFAULT_PERMISSIONS_KEY_FILE
17
17
 
18
18
  _all_private_node_names: list[str] = [
19
19
  "full_node",
@@ -1,13 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional, Union
3
+ from typing import Union
4
4
 
5
5
  from chia_rs import ConsensusConstants, RewardChainBlock, RewardChainBlockUnfinished
6
6
  from chia_rs.sized_bytes import bytes32
7
7
  from chia_rs.sized_ints import uint32, uint64
8
8
 
9
- from chia.consensus.pot_iterations import calculate_ip_iters, calculate_iterations_quality, calculate_sp_iters
10
- from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
9
+ from chia.consensus.pot_iterations import (
10
+ calculate_ip_iters,
11
+ calculate_sp_iters,
12
+ validate_pospace_and_get_required_iters,
13
+ )
11
14
 
12
15
 
13
16
  def iters_from_block(
@@ -16,6 +19,7 @@ def iters_from_block(
16
19
  sub_slot_iters: uint64,
17
20
  difficulty: uint64,
18
21
  height: uint32,
22
+ prev_transaction_block_height: uint32,
19
23
  ) -> tuple[uint64, uint64]:
20
24
  if reward_chain_block.challenge_chain_sp_vdf is None:
21
25
  assert reward_chain_block.signage_point_index == 0
@@ -23,22 +27,18 @@ def iters_from_block(
23
27
  else:
24
28
  cc_sp = reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
25
29
 
26
- quality_string: Optional[bytes32] = verify_and_get_quality_string(
27
- reward_chain_block.proof_of_space,
30
+ required_iters = validate_pospace_and_get_required_iters(
28
31
  constants,
32
+ reward_chain_block.proof_of_space,
29
33
  reward_chain_block.pos_ss_cc_challenge_hash,
30
34
  cc_sp,
31
- height=height,
32
- )
33
- assert quality_string is not None
34
-
35
- required_iters: uint64 = calculate_iterations_quality(
36
- constants.DIFFICULTY_CONSTANT_FACTOR,
37
- quality_string,
38
- reward_chain_block.proof_of_space.size,
35
+ height,
39
36
  difficulty,
40
- cc_sp,
37
+ sub_slot_iters,
38
+ prev_transaction_block_height,
41
39
  )
40
+ assert required_iters is not None
41
+
42
42
  return (
43
43
  calculate_sp_iters(constants, sub_slot_iters, reward_chain_block.signage_point_index),
44
44
  calculate_ip_iters(
chia/timelord/timelord.py CHANGED
@@ -15,31 +15,32 @@ from concurrent.futures import ThreadPoolExecutor
15
15
  from pathlib import Path
16
16
  from typing import IO, TYPE_CHECKING, Any, ClassVar, Optional, cast
17
17
 
18
- from chia_rs import ConsensusConstants, RewardChainBlock
18
+ from chia_rs import (
19
+ ChallengeChainSubSlot,
20
+ ConsensusConstants,
21
+ EndOfSubSlotBundle,
22
+ InfusedChallengeChainSubSlot,
23
+ RewardChainBlock,
24
+ RewardChainSubSlot,
25
+ SubEpochSummary,
26
+ SubSlotProofs,
27
+ )
19
28
  from chia_rs.sized_bytes import bytes32
20
29
  from chia_rs.sized_ints import uint8, uint16, uint32, uint64, uint128
21
30
  from chiavdf import create_discriminant, prove
22
31
 
23
32
  from chia.consensus.pot_iterations import calculate_sp_iters, is_overflow_block
24
33
  from chia.protocols import timelord_protocol
34
+ from chia.protocols.outbound_message import NodeType, make_msg
25
35
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
26
36
  from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
27
- from chia.server.outbound_message import NodeType, make_msg
28
37
  from chia.server.server import ChiaServer
29
38
  from chia.server.ws_connection import WSChiaConnection
30
39
  from chia.timelord.iters_from_block import iters_from_block
31
40
  from chia.timelord.timelord_state import LastState
32
41
  from chia.timelord.types import Chain, IterationType, StateType
33
42
  from chia.types.blockchain_format.classgroup import ClassgroupElement
34
- from chia.types.blockchain_format.slots import (
35
- ChallengeChainSubSlot,
36
- InfusedChallengeChainSubSlot,
37
- RewardChainSubSlot,
38
- SubSlotProofs,
39
- )
40
- from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
41
43
  from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
42
- from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
43
44
  from chia.util.streamable import Streamable, streamable
44
45
  from chia.util.task_referencer import create_referenced_task
45
46
 
@@ -253,6 +254,7 @@ class Timelord:
253
254
  sub_slot_iters,
254
255
  difficulty,
255
256
  self.get_height(),
257
+ self.last_state.get_last_tx_height(),
256
258
  )
257
259
  except Exception as e:
258
260
  log.warning(f"Received invalid unfinished block: {e}.")
@@ -555,6 +557,7 @@ class Timelord:
555
557
  self.last_state.get_sub_slot_iters(),
556
558
  self.last_state.get_difficulty(),
557
559
  self.get_height(),
560
+ uint32(0),
558
561
  )
559
562
  except Exception as e:
560
563
  log.error(f"Error {e}")
@@ -628,7 +631,7 @@ class Timelord:
628
631
  ):
629
632
  # We don't know when the last block was, so we can't make peaks
630
633
  return
631
-
634
+ assert self.last_state.last_tx_block_block_height is not None
632
635
  sp_total_iters = (
633
636
  ip_total_iters
634
637
  - ip_iters
@@ -1169,6 +1172,7 @@ class Timelord:
1169
1172
  t1 = time.time()
1170
1173
  log.info(
1171
1174
  f"Working on compact proof for height: {picked_info.height}. "
1175
+ f"VDF: {picked_info.field_vdf}. "
1172
1176
  f"Iters: {picked_info.new_proof_of_time.number_of_iterations}."
1173
1177
  )
1174
1178
  bluebox_process_data = BlueboxProcessData(
@@ -38,7 +38,7 @@ class TimelordAPI:
38
38
  self.timelord.state_changed_callback = callback
39
39
 
40
40
  @metadata.request()
41
- async def new_peak_timelord(self, new_peak: timelord_protocol.NewPeakTimelord) -> None:
41
+ async def new_peak_timelord(self, new_peak: NewPeakTimelord) -> None:
42
42
  if self.timelord.last_state is None:
43
43
  return None
44
44
  async with self.timelord.lock:
@@ -63,6 +63,8 @@ class TimelordAPI:
63
63
  "Not skipping peak, has equal weight but lower iterations,"
64
64
  f"current peak:{self.timelord.last_state.total_iters} new peak "
65
65
  f"{new_peak.reward_chain_block.total_iters}"
66
+ f"current rh: {self.timelord.last_state.peak.reward_chain_block.get_hash()}"
67
+ f"new peak rh: {new_peak.reward_chain_block.get_hash()}"
66
68
  )
67
69
  self.timelord.new_peak = new_peak
68
70
  self.timelord.state_changed("new_peak", {"height": new_peak.reward_chain_block.height})
@@ -82,7 +84,7 @@ class TimelordAPI:
82
84
  log.info(
83
85
  "Not skipping peak, don't have. Maybe we are not the fastest timelord "
84
86
  f"height: {new_peak.reward_chain_block.height} weight:"
85
- f"{new_peak.reward_chain_block.weight} "
87
+ f"{new_peak.reward_chain_block.weight} rh {new_peak.reward_chain_block.get_hash()}"
86
88
  )
87
89
  self.timelord.new_peak = new_peak
88
90
  self.timelord.state_changed("new_peak", {"height": new_peak.reward_chain_block.height})
@@ -99,13 +101,22 @@ class TimelordAPI:
99
101
  self.timelord.state_changed("skipping_peak", {"height": new_peak.reward_chain_block.height})
100
102
 
101
103
  def check_orphaned_unfinished_block(self, new_peak: NewPeakTimelord):
104
+ new_peak_unf_rh = new_peak.reward_chain_block.get_unfinished().get_hash()
102
105
  for unf_block in self.timelord.unfinished_blocks:
103
106
  if unf_block.reward_chain_block.total_iters <= new_peak.reward_chain_block.total_iters:
107
+ if unf_block.reward_chain_block.get_hash() == new_peak_unf_rh:
108
+ log.debug("unfinished block is the same as the new peak")
109
+ continue
104
110
  # there is an unfinished block that would be orphaned by this peak
111
+ log.info(f"this peak would orphan unfinished block {unf_block.reward_chain_block.get_hash()}")
105
112
  return True
106
113
  for unf_block in self.timelord.overflow_blocks:
107
114
  if unf_block.reward_chain_block.total_iters <= new_peak.reward_chain_block.total_iters:
115
+ if unf_block.reward_chain_block.get_hash() == new_peak_unf_rh:
116
+ log.debug("overflow unfinished block is the same as the new peak")
117
+ continue
108
118
  # there is an unfinished block (overflow) that would be orphaned by this peak
119
+ log.info(f"this peak would orphan unfinished overflow block {unf_block.reward_chain_block.get_hash()}")
109
120
  return True
110
121
  return False
111
122
 
@@ -123,6 +134,7 @@ class TimelordAPI:
123
134
  self.timelord.last_state.get_sub_slot_iters(),
124
135
  self.timelord.last_state.get_difficulty(),
125
136
  self.timelord.get_height(),
137
+ self.timelord.last_state.get_last_tx_height(),
126
138
  )
127
139
  except Exception:
128
140
  return None
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import logging
4
4
  from typing import Optional, Union
5
5
 
6
- from chia_rs import ConsensusConstants
6
+ from chia_rs import ChallengeBlockInfo, ConsensusConstants, EndOfSubSlotBundle, SubEpochSummary
7
7
  from chia_rs.sized_bytes import bytes32
8
8
  from chia_rs.sized_ints import uint8, uint32, uint64, uint128
9
9
 
@@ -11,9 +11,6 @@ from chia.protocols import timelord_protocol
11
11
  from chia.timelord.iters_from_block import iters_from_block
12
12
  from chia.timelord.types import Chain, StateType
13
13
  from chia.types.blockchain_format.classgroup import ClassgroupElement
14
- from chia.types.blockchain_format.slots import ChallengeBlockInfo
15
- from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
16
- from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
17
14
 
18
15
  log = logging.getLogger(__name__)
19
16
 
@@ -41,7 +38,9 @@ class LastState:
41
38
  self.last_height: uint32 = uint32(0)
42
39
  self.total_iters: uint128 = uint128(0)
43
40
  self.last_challenge_sb_or_eos_total_iters = uint128(0)
44
- self.last_block_total_iters: Optional[uint128] = None
41
+ self.last_tx_block_total_iters: Optional[uint128] = None
42
+ self.last_tx_block_block_height: uint32 = uint32(0)
43
+ self.last_tx_block_sp_index: uint8 = uint8(0)
45
44
  self.last_peak_challenge: bytes32 = constants.GENESIS_CHALLENGE
46
45
  self.difficulty: uint64 = constants.DIFFICULTY_STARTING
47
46
  self.sub_slot_iters: uint64 = constants.SUB_SLOT_ITERS_STARTING
@@ -55,13 +54,7 @@ class LastState:
55
54
  self.state_type = StateType.PEAK
56
55
  self.peak = state
57
56
  self.subslot_end = None
58
- _, self.last_ip = iters_from_block(
59
- self.constants,
60
- state.reward_chain_block,
61
- state.sub_slot_iters,
62
- state.difficulty,
63
- state.reward_chain_block.height,
64
- )
57
+
65
58
  self.deficit = state.deficit
66
59
  self.sub_epoch_summary = state.sub_epoch_summary
67
60
  self.last_weight = state.reward_chain_block.weight
@@ -71,7 +64,17 @@ class LastState:
71
64
  self.difficulty = state.difficulty
72
65
  self.sub_slot_iters = state.sub_slot_iters
73
66
  if state.reward_chain_block.is_transaction_block:
74
- self.last_block_total_iters = self.total_iters
67
+ self.last_tx_block_block_height = state.reward_chain_block.height
68
+ self.last_tx_block_total_iters = self.total_iters
69
+ self.last_tx_block_sp_index = state.reward_chain_block.signage_point_index
70
+ _, self.last_ip = iters_from_block(
71
+ self.constants,
72
+ state.reward_chain_block,
73
+ state.sub_slot_iters,
74
+ state.difficulty,
75
+ state.reward_chain_block.height,
76
+ self.last_tx_block_block_height,
77
+ )
75
78
  self.reward_challenge_cache = state.previous_reward_challenges
76
79
  self.last_challenge_sb_or_eos_total_iters = self.peak.last_challenge_sb_or_eos_total_iters
77
80
  self.new_epoch = False
@@ -171,7 +174,10 @@ class LastState:
171
174
  return None
172
175
 
173
176
  def get_last_block_total_iters(self) -> Optional[uint128]:
174
- return self.last_block_total_iters
177
+ return self.last_tx_block_total_iters
178
+
179
+ def get_last_tx_height(self) -> uint32:
180
+ return self.last_tx_block_block_height
175
181
 
176
182
  def get_passed_ses_height_but_not_yet_included(self) -> bool:
177
183
  return self.passed_ses_height_but_not_yet_included
@@ -1,23 +1,25 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import io
4
- from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar
4
+ from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union
5
5
 
6
- from chia_rs import ENABLE_KECCAK, MEMPOOL_MODE, run_chia_program, tree_hash
6
+ from chia_rs import MEMPOOL_MODE, run_chia_program, tree_hash
7
7
  from chia_rs.sized_bytes import bytes32
8
- from clvm.casts import int_from_bytes
9
8
  from clvm.CLVMObject import CLVMStorage
10
9
  from clvm.EvalError import EvalError
11
10
  from clvm.serialize import sexp_from_stream, sexp_to_stream
12
11
  from clvm.SExp import SExp
12
+ from typing_extensions import Self
13
13
 
14
+ from chia.types.blockchain_format.serialized_program import SerializedProgram
14
15
  from chia.types.blockchain_format.tree_hash import sha256_treehash
15
16
  from chia.util.byte_types import hexstr_to_bytes
17
+ from chia.util.casts import int_from_bytes
16
18
  from chia.util.hash import std_hash
17
19
 
18
20
  INFINITE_COST = 11000000000
19
21
 
20
- DEFAULT_FLAGS = MEMPOOL_MODE | ENABLE_KECCAK
22
+ DEFAULT_FLAGS = MEMPOOL_MODE
21
23
 
22
24
  T_CLVMStorage = TypeVar("T_CLVMStorage", bound=CLVMStorage)
23
25
  T_Program = TypeVar("T_Program", bound="Program")
@@ -29,14 +31,27 @@ class Program(SExp):
29
31
  """
30
32
 
31
33
  @classmethod
32
- def parse(cls: type[T_Program], f) -> T_Program:
34
+ def parse(cls, f) -> Self:
33
35
  return sexp_from_stream(f, cls.to)
34
36
 
35
- def stream(self, f):
37
+ def stream(self, f) -> None:
36
38
  sexp_to_stream(self, f)
37
39
 
38
40
  @classmethod
39
- def from_bytes(cls: type[T_Program], blob: bytes) -> T_Program:
41
+ def from_serialized(cls, prg: SerializedProgram) -> Self:
42
+ """
43
+ Convert the SerializedProgram to a Program object.
44
+ """
45
+ return cls.from_bytes(bytes(prg))
46
+
47
+ def to_serialized(self) -> SerializedProgram:
48
+ """
49
+ Convert a Program object to a SerializedProgram.
50
+ """
51
+ return SerializedProgram.from_bytes(bytes(self))
52
+
53
+ @classmethod
54
+ def from_bytes(cls, blob: bytes) -> Self:
40
55
  # this runs the program "1", which just returns the first argument.
41
56
  # the first argument is the buffer we want to parse. This effectively
42
57
  # leverages the rust parser and LazyNode, making it a lot faster to
@@ -50,7 +65,7 @@ class Program(SExp):
50
65
  return cls.to(ret)
51
66
 
52
67
  @classmethod
53
- def fromhex(cls: type[T_Program], hexstr: str) -> T_Program:
68
+ def fromhex(cls, hexstr: str) -> Self:
54
69
  return cls.from_bytes(hexstr_to_bytes(hexstr))
55
70
 
56
71
  @classmethod
@@ -90,7 +105,7 @@ class Program(SExp):
90
105
  raise ValueError(f"`at` got illegal character `{c}`. Only `f` & `r` allowed")
91
106
  return v
92
107
 
93
- def replace(self: T_Program, **kwargs: Any) -> T_Program:
108
+ def replace(self, **kwargs: Any) -> Self:
94
109
  """
95
110
  Create a new program replacing the given paths (using `at` syntax).
96
111
  Example:
@@ -155,7 +170,7 @@ class Program(SExp):
155
170
  # (2 (1 . self) rest)
156
171
  #
157
172
  # Resulting in a function which places its own arguments after those
158
- # curried in in the form of a proper list.
173
+ # curried in the form of a proper list.
159
174
  def curry(self, *args) -> Program:
160
175
  fixed_args: Any = 1
161
176
  for arg in reversed(args):
@@ -267,3 +282,31 @@ def _sexp_replace(sexp: T_CLVMStorage, to_sexp: Callable[[Any], T_Program], **kw
267
282
  new_r = _sexp_replace(pair[1], to_sexp, **args_by_prefix.get("r", {}))
268
283
 
269
284
  return to_sexp((new_f, new_r))
285
+
286
+
287
+ def _run(prg: Union[SerializedProgram, Program], max_cost: int, flags: int, args: Any) -> tuple[int, Program]:
288
+ if isinstance(prg, SerializedProgram):
289
+ result = prg.run_rust(max_cost, flags, args)
290
+ return result[0], Program(result[1]) # type: ignore[arg-type]
291
+ else:
292
+ return prg._run(max_cost, flags, args)
293
+
294
+
295
+ def uncurry(prg: Union[SerializedProgram, Program]) -> tuple[Program, Program]:
296
+ if isinstance(prg, SerializedProgram):
297
+ result = prg.uncurry_rust()
298
+ return Program(result[0]), Program(result[1]) # type: ignore[arg-type]
299
+ else:
300
+ return prg.uncurry()
301
+
302
+
303
+ def run(prg: Union[SerializedProgram, Program], args: Any) -> Program:
304
+ return _run(prg, INFINITE_COST, 0, args)[1]
305
+
306
+
307
+ def run_with_cost(prg: Union[SerializedProgram, Program], max_cost: int, args: Any) -> tuple[int, Program]:
308
+ return _run(prg, max_cost, 0, args)
309
+
310
+
311
+ def run_mempool_with_cost(prg: Union[SerializedProgram, Program], max_cost: int, args: Any) -> tuple[int, Program]:
312
+ return _run(prg, max_cost, MEMPOOL_MODE, args)