chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_build_chains.py +2 -4
  6. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  7. chia/_tests/clvm/coin_store.py +4 -7
  8. chia/_tests/clvm/test_clvm_step.py +4 -4
  9. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  10. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  11. chia/_tests/clvm/test_singletons.py +2 -4
  12. chia/_tests/clvm/test_spend_sim.py +2 -2
  13. chia/_tests/cmds/cmd_test_utils.py +27 -45
  14. chia/_tests/cmds/test_cmd_framework.py +6 -6
  15. chia/_tests/cmds/test_daemon.py +3 -3
  16. chia/_tests/cmds/test_show.py +4 -4
  17. chia/_tests/cmds/test_tx_config_args.py +1 -2
  18. chia/_tests/cmds/testing_classes.py +4 -5
  19. chia/_tests/cmds/wallet/test_did.py +24 -27
  20. chia/_tests/cmds/wallet/test_nft.py +12 -10
  21. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  22. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  23. chia/_tests/conftest.py +59 -30
  24. chia/_tests/connection_utils.py +2 -2
  25. chia/_tests/core/cmds/test_beta.py +4 -4
  26. chia/_tests/core/cmds/test_keys.py +2 -3
  27. chia/_tests/core/cmds/test_wallet.py +15 -15
  28. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  29. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  30. chia/_tests/core/daemon/test_daemon.py +11 -11
  31. chia/_tests/core/data_layer/conftest.py +2 -2
  32. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  33. chia/_tests/core/data_layer/test_data_store.py +10 -10
  34. chia/_tests/core/data_layer/util.py +11 -11
  35. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  36. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  37. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  38. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  39. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  40. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  41. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  42. chia/_tests/core/full_node/test_conditions.py +21 -23
  43. chia/_tests/core/full_node/test_full_node.py +225 -62
  44. chia/_tests/core/full_node/test_hint_management.py +2 -4
  45. chia/_tests/core/full_node/test_performance.py +0 -1
  46. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  47. chia/_tests/core/full_node/test_transactions.py +1 -2
  48. chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
  49. chia/_tests/core/mempool/test_mempool.py +29 -37
  50. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  51. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  52. chia/_tests/core/mempool/test_mempool_manager.py +963 -839
  53. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  54. chia/_tests/core/server/serve.py +7 -7
  55. chia/_tests/core/server/test_dos.py +1 -2
  56. chia/_tests/core/server/test_event_loop.py +12 -4
  57. chia/_tests/core/server/test_loop.py +7 -8
  58. chia/_tests/core/server/test_rate_limits.py +9 -8
  59. chia/_tests/core/server/test_server.py +61 -1
  60. chia/_tests/core/services/test_services.py +2 -2
  61. chia/_tests/core/ssl/test_ssl.py +2 -2
  62. chia/_tests/core/test_cost_calculation.py +2 -6
  63. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  64. chia/_tests/core/test_filter.py +0 -1
  65. chia/_tests/core/test_full_node_rpc.py +2 -2
  66. chia/_tests/core/test_merkle_set.py +1 -2
  67. chia/_tests/core/test_seeder.py +4 -4
  68. chia/_tests/core/util/test_config.py +4 -4
  69. chia/_tests/core/util/test_jsonify.py +2 -2
  70. chia/_tests/core/util/test_keychain.py +3 -3
  71. chia/_tests/core/util/test_lockfile.py +2 -1
  72. chia/_tests/core/util/test_log_exceptions.py +1 -2
  73. chia/_tests/core/util/test_streamable.py +17 -17
  74. chia/_tests/db/test_db_wrapper.py +3 -2
  75. chia/_tests/environments/wallet.py +14 -14
  76. chia/_tests/ether.py +4 -3
  77. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  78. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  79. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  80. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  81. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  82. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  83. chia/_tests/harvester/test_harvester_api.py +11 -4
  84. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  85. chia/_tests/plot_sync/test_receiver.py +11 -10
  86. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  87. chia/_tests/plot_sync/util.py +1 -2
  88. chia/_tests/plotting/test_plot_manager.py +7 -6
  89. chia/_tests/plotting/test_prover.py +30 -38
  90. chia/_tests/pools/test_pool_cmdline.py +4 -6
  91. chia/_tests/pools/test_pool_rpc.py +203 -61
  92. chia/_tests/pools/test_pool_wallet.py +3 -3
  93. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  94. chia/_tests/process_junit.py +2 -2
  95. chia/_tests/rpc/test_rpc_client.py +4 -4
  96. chia/_tests/rpc/test_rpc_server.py +3 -3
  97. chia/_tests/simulation/test_simulation.py +12 -25
  98. chia/_tests/solver/test_solver_service.py +13 -4
  99. chia/_tests/testconfig.py +2 -2
  100. chia/_tests/timelord/test_new_peak.py +22 -11
  101. chia/_tests/tools/test_run_block.py +0 -2
  102. chia/_tests/tools/test_virtual_project.py +2 -1
  103. chia/_tests/util/benchmarks.py +1 -0
  104. chia/_tests/util/blockchain.py +38 -36
  105. chia/_tests/util/blockchain_mock.py +11 -11
  106. chia/_tests/util/build_network_protocol_files.py +2 -1
  107. chia/_tests/util/coin_store.py +2 -1
  108. chia/_tests/util/config.py +1 -1
  109. chia/_tests/util/db_connection.py +2 -3
  110. chia/_tests/util/full_sync.py +9 -11
  111. chia/_tests/util/gen_ssl_certs.py +4 -5
  112. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  113. chia/_tests/util/misc.py +24 -24
  114. chia/_tests/util/network_protocol_data.py +20 -3
  115. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  116. chia/_tests/util/protocol_messages_json.py +292 -3
  117. chia/_tests/util/setup_nodes.py +62 -47
  118. chia/_tests/util/spend_sim.py +57 -57
  119. chia/_tests/util/test_async_pool.py +2 -3
  120. chia/_tests/util/test_chia_version.py +1 -3
  121. chia/_tests/util/test_config.py +3 -3
  122. chia/_tests/util/test_full_block_utils.py +6 -3
  123. chia/_tests/util/test_limited_semaphore.py +1 -2
  124. chia/_tests/util/test_misc.py +2 -2
  125. chia/_tests/util/test_network.py +1 -2
  126. chia/_tests/util/test_priority_mutex.py +3 -3
  127. chia/_tests/util/test_recursive_replace.py +5 -6
  128. chia/_tests/util/test_replace_str_to_bytes.py +8 -10
  129. chia/_tests/util/test_testnet_overrides.py +3 -3
  130. chia/_tests/util/time_out_assert.py +2 -2
  131. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  132. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  133. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  134. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  135. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  136. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  137. chia/_tests/wallet/conftest.py +6 -6
  138. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  139. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  140. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  141. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  142. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  145. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  146. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  147. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  148. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  149. chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
  150. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  151. chia/_tests/wallet/test_coin_management.py +2 -2
  152. chia/_tests/wallet/test_conditions.py +45 -51
  153. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  154. chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
  155. chia/_tests/wallet/test_notifications.py +14 -14
  156. chia/_tests/wallet/test_signer_protocol.py +5 -5
  157. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  158. chia/_tests/wallet/test_transaction_store.py +20 -20
  159. chia/_tests/wallet/test_util.py +2 -2
  160. chia/_tests/wallet/test_wallet.py +380 -228
  161. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  162. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  163. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  164. chia/_tests/wallet/test_wallet_node.py +14 -14
  165. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  166. chia/_tests/wallet/test_wallet_utils.py +2 -3
  167. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  168. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  169. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  170. chia/_tests/wallet/wallet_block_tools.py +12 -11
  171. chia/_tests/weight_proof/config.py +1 -0
  172. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  173. chia/apis/__init__.py +21 -0
  174. chia/apis/farmer_stub.py +102 -0
  175. chia/apis/full_node_stub.py +372 -0
  176. chia/apis/harvester_stub.py +57 -0
  177. chia/apis/introducer_stub.py +35 -0
  178. chia/apis/solver_stub.py +30 -0
  179. chia/apis/stub_protocol_registry.py +21 -0
  180. chia/apis/timelord_stub.py +39 -0
  181. chia/apis/wallet_stub.py +161 -0
  182. chia/cmds/beta.py +3 -4
  183. chia/cmds/beta_funcs.py +4 -3
  184. chia/cmds/check_wallet_db.py +4 -4
  185. chia/cmds/chia.py +1 -2
  186. chia/cmds/cmd_classes.py +11 -13
  187. chia/cmds/cmd_helpers.py +11 -11
  188. chia/cmds/cmds_util.py +15 -15
  189. chia/cmds/coin_funcs.py +6 -7
  190. chia/cmds/coins.py +2 -3
  191. chia/cmds/configure.py +1 -2
  192. chia/cmds/data.py +42 -42
  193. chia/cmds/data_funcs.py +81 -81
  194. chia/cmds/db.py +4 -5
  195. chia/cmds/db_backup_func.py +2 -2
  196. chia/cmds/db_upgrade_func.py +3 -3
  197. chia/cmds/db_validate_func.py +2 -2
  198. chia/cmds/dev/data.py +4 -4
  199. chia/cmds/dev/gh.py +5 -5
  200. chia/cmds/dev/installers.py +2 -3
  201. chia/cmds/dev/mempool.py +3 -4
  202. chia/cmds/dev/mempool_funcs.py +4 -4
  203. chia/cmds/dev/sim.py +8 -8
  204. chia/cmds/dump_keyring.py +3 -3
  205. chia/cmds/farm.py +6 -8
  206. chia/cmds/farm_funcs.py +25 -24
  207. chia/cmds/init_funcs.py +4 -4
  208. chia/cmds/keys.py +16 -18
  209. chia/cmds/keys_funcs.py +36 -36
  210. chia/cmds/netspace.py +1 -3
  211. chia/cmds/netspace_funcs.py +1 -2
  212. chia/cmds/options.py +3 -2
  213. chia/cmds/param_types.py +17 -16
  214. chia/cmds/passphrase.py +6 -7
  215. chia/cmds/passphrase_funcs.py +11 -13
  216. chia/cmds/peer.py +1 -3
  217. chia/cmds/peer_funcs.py +3 -3
  218. chia/cmds/plotnft.py +6 -7
  219. chia/cmds/plotnft_funcs.py +37 -26
  220. chia/cmds/rpc.py +3 -3
  221. chia/cmds/show.py +3 -5
  222. chia/cmds/show_funcs.py +9 -9
  223. chia/cmds/sim_funcs.py +25 -26
  224. chia/cmds/solver.py +1 -3
  225. chia/cmds/solver_funcs.py +1 -2
  226. chia/cmds/start_funcs.py +2 -2
  227. chia/cmds/wallet.py +76 -81
  228. chia/cmds/wallet_funcs.py +206 -177
  229. chia/consensus/augmented_chain.py +6 -6
  230. chia/consensus/block_body_validation.py +19 -15
  231. chia/consensus/block_creation.py +25 -21
  232. chia/consensus/block_header_validation.py +27 -13
  233. chia/consensus/block_height_map.py +3 -6
  234. chia/consensus/block_height_map_protocol.py +2 -2
  235. chia/consensus/block_record.py +2 -4
  236. chia/consensus/blockchain.py +58 -40
  237. chia/consensus/blockchain_interface.py +7 -7
  238. chia/consensus/coin_store_protocol.py +5 -6
  239. chia/consensus/condition_tools.py +4 -4
  240. chia/consensus/cost_calculator.py +2 -3
  241. chia/consensus/default_constants.py +16 -13
  242. chia/consensus/deficit.py +1 -3
  243. chia/consensus/difficulty_adjustment.py +3 -5
  244. chia/consensus/find_fork_point.py +2 -4
  245. chia/consensus/full_block_to_block_record.py +11 -13
  246. chia/consensus/generator_tools.py +2 -3
  247. chia/consensus/get_block_challenge.py +42 -26
  248. chia/consensus/get_block_generator.py +2 -3
  249. chia/consensus/make_sub_epoch_summary.py +8 -7
  250. chia/consensus/multiprocess_validation.py +31 -20
  251. chia/consensus/pos_quality.py +6 -23
  252. chia/consensus/pot_iterations.py +17 -44
  253. chia/consensus/signage_point.py +4 -5
  254. chia/consensus/vdf_info_computation.py +2 -4
  255. chia/daemon/client.py +8 -8
  256. chia/daemon/keychain_proxy.py +31 -37
  257. chia/daemon/server.py +32 -33
  258. chia/daemon/windows_signal.py +4 -3
  259. chia/data_layer/data_layer.py +86 -77
  260. chia/data_layer/data_layer_rpc_api.py +9 -9
  261. chia/data_layer/data_layer_rpc_client.py +13 -15
  262. chia/data_layer/data_layer_server.py +3 -3
  263. chia/data_layer/data_layer_util.py +14 -14
  264. chia/data_layer/data_layer_wallet.py +94 -101
  265. chia/data_layer/data_store.py +50 -50
  266. chia/data_layer/dl_wallet_store.py +9 -12
  267. chia/data_layer/download_data.py +8 -9
  268. chia/data_layer/s3_plugin_service.py +5 -9
  269. chia/data_layer/start_data_layer.py +5 -5
  270. chia/farmer/farmer.py +31 -31
  271. chia/farmer/farmer_api.py +45 -33
  272. chia/farmer/farmer_rpc_api.py +5 -4
  273. chia/farmer/farmer_rpc_client.py +6 -6
  274. chia/farmer/start_farmer.py +6 -6
  275. chia/full_node/block_store.py +13 -16
  276. chia/full_node/check_fork_next_block.py +1 -2
  277. chia/full_node/coin_store.py +15 -16
  278. chia/full_node/eligible_coin_spends.py +3 -3
  279. chia/full_node/fee_estimate_store.py +2 -3
  280. chia/full_node/fee_tracker.py +1 -2
  281. chia/full_node/full_block_utils.py +4 -4
  282. chia/full_node/full_node.py +238 -224
  283. chia/full_node/full_node_api.py +193 -150
  284. chia/full_node/full_node_rpc_api.py +53 -31
  285. chia/full_node/full_node_rpc_client.py +18 -19
  286. chia/full_node/full_node_store.py +45 -43
  287. chia/full_node/hint_management.py +2 -2
  288. chia/full_node/mempool.py +17 -19
  289. chia/full_node/mempool_manager.py +89 -42
  290. chia/full_node/pending_tx_cache.py +2 -3
  291. chia/full_node/start_full_node.py +5 -5
  292. chia/full_node/sync_store.py +3 -4
  293. chia/full_node/tx_processing_queue.py +34 -13
  294. chia/full_node/weight_proof.py +61 -48
  295. chia/harvester/harvester.py +25 -24
  296. chia/harvester/harvester_api.py +61 -38
  297. chia/harvester/harvester_rpc_api.py +10 -10
  298. chia/harvester/start_harvester.py +4 -4
  299. chia/introducer/introducer.py +3 -3
  300. chia/introducer/introducer_api.py +6 -4
  301. chia/introducer/start_introducer.py +4 -4
  302. chia/legacy/keyring.py +3 -3
  303. chia/plot_sync/delta.py +1 -2
  304. chia/plot_sync/receiver.py +20 -17
  305. chia/plot_sync/sender.py +15 -10
  306. chia/plotters/bladebit.py +7 -7
  307. chia/plotters/chiapos.py +2 -2
  308. chia/plotters/madmax.py +4 -4
  309. chia/plotters/plotters.py +4 -4
  310. chia/plotters/plotters_util.py +3 -3
  311. chia/plotting/cache.py +20 -14
  312. chia/plotting/check_plots.py +26 -35
  313. chia/plotting/create_plots.py +22 -23
  314. chia/plotting/manager.py +21 -14
  315. chia/plotting/prover.py +59 -42
  316. chia/plotting/util.py +16 -16
  317. chia/pools/pool_config.py +2 -1
  318. chia/pools/pool_puzzles.py +11 -12
  319. chia/pools/pool_wallet.py +34 -57
  320. chia/pools/pool_wallet_info.py +39 -10
  321. chia/protocols/farmer_protocol.py +8 -9
  322. chia/protocols/fee_estimate.py +3 -4
  323. chia/protocols/full_node_protocol.py +3 -4
  324. chia/protocols/harvester_protocol.py +27 -15
  325. chia/protocols/outbound_message.py +3 -3
  326. chia/protocols/pool_protocol.py +8 -9
  327. chia/protocols/shared_protocol.py +1 -2
  328. chia/protocols/solver_protocol.py +9 -2
  329. chia/protocols/timelord_protocol.py +4 -7
  330. chia/protocols/wallet_protocol.py +11 -12
  331. chia/rpc/rpc_client.py +9 -9
  332. chia/rpc/rpc_server.py +17 -17
  333. chia/rpc/util.py +2 -2
  334. chia/seeder/crawler.py +8 -8
  335. chia/seeder/crawler_api.py +21 -27
  336. chia/seeder/crawler_rpc_api.py +2 -2
  337. chia/seeder/dns_server.py +21 -21
  338. chia/seeder/start_crawler.py +4 -4
  339. chia/server/address_manager.py +15 -16
  340. chia/server/api_protocol.py +11 -11
  341. chia/server/chia_policy.py +46 -26
  342. chia/server/introducer_peers.py +2 -3
  343. chia/server/node_discovery.py +19 -19
  344. chia/server/rate_limit_numbers.py +4 -5
  345. chia/server/rate_limits.py +4 -4
  346. chia/server/resolve_peer_info.py +4 -4
  347. chia/server/server.py +49 -52
  348. chia/server/signal_handlers.py +6 -6
  349. chia/server/start_service.py +17 -17
  350. chia/server/upnp.py +4 -6
  351. chia/server/ws_connection.py +52 -37
  352. chia/simulator/add_blocks_in_batches.py +1 -3
  353. chia/simulator/block_tools.py +312 -200
  354. chia/simulator/full_node_simulator.py +56 -35
  355. chia/simulator/keyring.py +2 -3
  356. chia/simulator/setup_services.py +15 -15
  357. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  358. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  359. chia/simulator/simulator_protocol.py +1 -2
  360. chia/simulator/simulator_test_tools.py +3 -3
  361. chia/simulator/start_simulator.py +7 -7
  362. chia/simulator/wallet_tools.py +10 -10
  363. chia/solver/solver.py +10 -10
  364. chia/solver/solver_api.py +10 -8
  365. chia/solver/solver_rpc_api.py +2 -2
  366. chia/solver/start_solver.py +4 -4
  367. chia/ssl/cacert.pem +148 -90
  368. chia/ssl/chia_ca.crt +14 -10
  369. chia/ssl/chia_ca_old.crt +19 -0
  370. chia/ssl/create_ssl.py +4 -4
  371. chia/ssl/renewedselfsignedca.conf +4 -0
  372. chia/ssl/ssl_check.py +1 -2
  373. chia/timelord/iters_from_block.py +1 -4
  374. chia/timelord/start_timelord.py +4 -4
  375. chia/timelord/timelord.py +44 -40
  376. chia/timelord/timelord_api.py +6 -4
  377. chia/timelord/timelord_launcher.py +2 -2
  378. chia/timelord/timelord_rpc_api.py +2 -2
  379. chia/timelord/timelord_state.py +11 -12
  380. chia/types/block_protocol.py +1 -3
  381. chia/types/blockchain_format/coin.py +1 -3
  382. chia/types/blockchain_format/program.py +11 -8
  383. chia/types/blockchain_format/proof_of_space.py +123 -76
  384. chia/types/blockchain_format/tree_hash.py +3 -3
  385. chia/types/blockchain_format/vdf.py +1 -2
  386. chia/types/coin_spend.py +3 -3
  387. chia/types/mempool_item.py +5 -5
  388. chia/types/mempool_submission_status.py +2 -3
  389. chia/types/peer_info.py +1 -2
  390. chia/types/unfinished_header_block.py +3 -4
  391. chia/types/validation_state.py +1 -2
  392. chia/util/action_scope.py +8 -8
  393. chia/util/async_pool.py +5 -5
  394. chia/util/bech32m.py +1 -2
  395. chia/util/beta_metrics.py +2 -2
  396. chia/util/block_cache.py +4 -4
  397. chia/util/chia_logging.py +2 -2
  398. chia/util/chia_version.py +1 -2
  399. chia/util/config.py +15 -16
  400. chia/util/db_wrapper.py +26 -27
  401. chia/util/default_root.py +1 -2
  402. chia/util/errors.py +3 -3
  403. chia/util/file_keyring.py +14 -14
  404. chia/util/files.py +2 -3
  405. chia/util/hash.py +4 -4
  406. chia/util/initial-config.yaml +3 -5
  407. chia/util/inline_executor.py +2 -1
  408. chia/util/ip_address.py +1 -2
  409. chia/util/keychain.py +25 -27
  410. chia/util/keyring_wrapper.py +18 -19
  411. chia/util/lock.py +3 -4
  412. chia/util/log_exceptions.py +1 -2
  413. chia/util/lru_cache.py +2 -2
  414. chia/util/network.py +6 -6
  415. chia/util/path.py +2 -3
  416. chia/util/priority_mutex.py +2 -2
  417. chia/util/profiler.py +1 -2
  418. chia/util/safe_cancel_task.py +1 -2
  419. chia/util/streamable.py +22 -8
  420. chia/util/task_referencer.py +1 -1
  421. chia/util/timing.py +3 -3
  422. chia/util/virtual_project_analysis.py +6 -5
  423. chia/util/ws_message.py +2 -2
  424. chia/wallet/cat_wallet/cat_info.py +3 -4
  425. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  426. chia/wallet/cat_wallet/cat_utils.py +3 -4
  427. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  428. chia/wallet/cat_wallet/lineage_store.py +3 -4
  429. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  430. chia/wallet/coin_selection.py +9 -10
  431. chia/wallet/conditions.py +120 -105
  432. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  433. chia/wallet/derivation_record.py +1 -2
  434. chia/wallet/derive_keys.py +2 -4
  435. chia/wallet/did_wallet/did_info.py +10 -11
  436. chia/wallet/did_wallet/did_wallet.py +36 -82
  437. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  438. chia/wallet/driver_protocol.py +5 -7
  439. chia/wallet/lineage_proof.py +4 -4
  440. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  441. chia/wallet/nft_wallet/nft_info.py +8 -9
  442. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  443. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  444. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  445. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  446. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  447. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  448. chia/wallet/notification_manager.py +3 -3
  449. chia/wallet/notification_store.py +44 -61
  450. chia/wallet/outer_puzzles.py +6 -7
  451. chia/wallet/puzzle_drivers.py +34 -6
  452. chia/wallet/puzzles/clawback/drivers.py +6 -6
  453. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  454. chia/wallet/puzzles/load_clvm.py +1 -1
  455. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  456. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  457. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  458. chia/wallet/puzzles/tails.py +3 -3
  459. chia/wallet/singleton.py +5 -7
  460. chia/wallet/singleton_record.py +3 -3
  461. chia/wallet/start_wallet.py +5 -5
  462. chia/wallet/trade_manager.py +37 -58
  463. chia/wallet/trade_record.py +4 -4
  464. chia/wallet/trading/offer.py +59 -46
  465. chia/wallet/trading/trade_store.py +8 -9
  466. chia/wallet/transaction_record.py +8 -8
  467. chia/wallet/uncurried_puzzle.py +1 -2
  468. chia/wallet/util/clvm_streamable.py +12 -12
  469. chia/wallet/util/compute_hints.py +4 -5
  470. chia/wallet/util/curry_and_treehash.py +1 -2
  471. chia/wallet/util/merkle_tree.py +2 -3
  472. chia/wallet/util/peer_request_cache.py +8 -8
  473. chia/wallet/util/signing.py +85 -0
  474. chia/wallet/util/tx_config.py +15 -6
  475. chia/wallet/util/wallet_sync_utils.py +14 -16
  476. chia/wallet/util/wallet_types.py +2 -2
  477. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  478. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  479. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  480. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  481. chia/wallet/vc_wallet/vc_store.py +5 -6
  482. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  483. chia/wallet/wallet.py +50 -78
  484. chia/wallet/wallet_action_scope.py +11 -11
  485. chia/wallet/wallet_blockchain.py +12 -12
  486. chia/wallet/wallet_coin_record.py +12 -6
  487. chia/wallet/wallet_coin_store.py +24 -25
  488. chia/wallet/wallet_interested_store.py +3 -5
  489. chia/wallet/wallet_nft_store.py +10 -11
  490. chia/wallet/wallet_node.py +53 -61
  491. chia/wallet/wallet_node_api.py +5 -3
  492. chia/wallet/wallet_protocol.py +23 -23
  493. chia/wallet/wallet_puzzle_store.py +15 -18
  494. chia/wallet/wallet_request_types.py +778 -114
  495. chia/wallet/wallet_retry_store.py +1 -3
  496. chia/wallet/wallet_rpc_api.py +572 -909
  497. chia/wallet/wallet_rpc_client.py +87 -279
  498. chia/wallet/wallet_singleton_store.py +3 -4
  499. chia/wallet/wallet_state_manager.py +332 -106
  500. chia/wallet/wallet_transaction_store.py +11 -14
  501. chia/wallet/wallet_user_store.py +4 -6
  502. chia/wallet/wallet_weight_proof_handler.py +4 -4
  503. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
  504. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
  505. chia/apis.py +0 -21
  506. chia/consensus/check_time_locks.py +0 -57
  507. chia/data_layer/puzzles/__init__.py +0 -0
  508. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  509. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  510. chia/types/coin_record.py +0 -44
  511. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  512. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  513. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  514. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  515. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  516. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  517. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  518. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  520. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  521. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  522. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  524. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  525. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  526. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
  527. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
  528. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
@@ -5,13 +5,16 @@ import contextlib
5
5
  import dataclasses
6
6
  import logging
7
7
  import random
8
+ import sqlite3
8
9
  import time
9
10
  from collections.abc import Awaitable, Coroutine
10
- from typing import Any, Optional
11
+ from typing import Any
11
12
 
12
13
  import pytest
13
14
  from chia_rs import (
14
15
  AugSchemeMPL,
16
+ Coin,
17
+ CoinRecord,
15
18
  ConsensusConstants,
16
19
  Foliage,
17
20
  FoliageTransactionBlock,
@@ -37,6 +40,7 @@ from chia._tests.connection_utils import add_dummy_connection, connect_and_get_p
37
40
  from chia._tests.core.full_node.stores.test_coin_store import get_future_reward_coins
38
41
  from chia._tests.core.make_block_generator import make_spend_bundle
39
42
  from chia._tests.core.node_height import node_height_at_least
43
+ from chia._tests.core.test_db_validation import make_db
40
44
  from chia._tests.util.misc import wallet_height_at_least
41
45
  from chia._tests.util.setup_nodes import (
42
46
  OldSimulatorsAndWallets,
@@ -52,14 +56,14 @@ from chia.consensus.get_block_challenge import get_block_challenge
52
56
  from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
53
57
  from chia.consensus.pot_iterations import is_overflow_block
54
58
  from chia.consensus.signage_point import SignagePoint
55
- from chia.full_node.full_node import WalletUpdate
59
+ from chia.full_node.full_node import FullNode, WalletUpdate
56
60
  from chia.full_node.full_node_api import FullNodeAPI
57
61
  from chia.full_node.sync_store import Peak
58
62
  from chia.protocols import full_node_protocol, timelord_protocol, wallet_protocol
59
63
  from chia.protocols import full_node_protocol as fnp
60
64
  from chia.protocols.farmer_protocol import DeclareProofOfSpace
61
65
  from chia.protocols.full_node_protocol import NewTransaction, RespondTransaction
62
- from chia.protocols.outbound_message import Message, NodeType
66
+ from chia.protocols.outbound_message import Message, NodeType, make_msg
63
67
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
64
68
  from chia.protocols.shared_protocol import Capability, default_capabilities
65
69
  from chia.protocols.wallet_protocol import SendTransaction, TransactionAck
@@ -91,7 +95,6 @@ from chia.types.blockchain_format.proof_of_space import (
91
95
  )
92
96
  from chia.types.blockchain_format.serialized_program import SerializedProgram
93
97
  from chia.types.blockchain_format.vdf import CompressibleVDFField, VDFProof
94
- from chia.types.coin_record import CoinRecord
95
98
  from chia.types.coin_spend import make_spend
96
99
  from chia.types.condition_opcodes import ConditionOpcode
97
100
  from chia.types.condition_with_args import ConditionWithArgs
@@ -102,6 +105,7 @@ from chia.util.casts import int_to_bytes
102
105
  from chia.util.errors import ConsensusError, Err
103
106
  from chia.util.hash import std_hash
104
107
  from chia.util.limited_semaphore import LimitedSemaphore
108
+ from chia.util.path import path_from_root
105
109
  from chia.util.recursive_replace import recursive_replace
106
110
  from chia.util.task_referencer import create_referenced_task
107
111
  from chia.wallet.estimate_fees import estimate_fees
@@ -111,6 +115,13 @@ from chia.wallet.wallet_node import WalletNode
111
115
  from chia.wallet.wallet_spend_bundle import WalletSpendBundle
112
116
 
113
117
 
118
+ def find_reward_coin(b: FullBlock, puzzle_hash: bytes32) -> Coin:
119
+ for c in b.get_included_reward_coins():
120
+ if c.puzzle_hash == puzzle_hash:
121
+ return c
122
+ raise ValueError("no reward coin with the specified puzzle hash found")
123
+
124
+
114
125
  def test_pre_validation_result() -> None:
115
126
  conds = SpendBundleConditions([], 0, 0, 0, None, None, [], 0, 0, 0, True, 0, 0, 0, 0, 0)
116
127
  results = PreValidationResult(None, uint64(1), conds, uint32(0))
@@ -246,7 +257,7 @@ async def test_block_compression(
246
257
  await time_out_assert(30, check_transaction_confirmed, True, tr)
247
258
 
248
259
  # Confirm generator is not compressed
249
- program: Optional[SerializedProgram] = (await full_node_1.get_all_full_blocks())[-1].transactions_generator
260
+ program: SerializedProgram | None = (await full_node_1.get_all_full_blocks())[-1].transactions_generator
250
261
  assert program is not None
251
262
  assert len((await full_node_1.get_all_full_blocks())[-1].transactions_generator_ref_list) == 0
252
263
 
@@ -812,11 +823,10 @@ async def test_respond_unfinished(
812
823
  block_list_input=blocks,
813
824
  guarantee_transaction_block=True,
814
825
  farmer_reward_puzzle_hash=ph,
815
- pool_reward_puzzle_hash=ph,
816
826
  )
817
827
  await full_node_1.full_node.add_block(blocks[-2])
818
828
  await full_node_1.full_node.add_block(blocks[-1])
819
- coin_to_spend = blocks[-1].get_included_reward_coins()[0]
829
+ coin_to_spend = find_reward_coin(blocks[-1], ph)
820
830
 
821
831
  spend_bundle = wallet_a.generate_signed_transaction(coin_to_spend.amount, ph_receiver, coin_to_spend)
822
832
 
@@ -936,7 +946,6 @@ async def test_new_transaction_and_mempool(
936
946
  3,
937
947
  guarantee_transaction_block=True,
938
948
  farmer_reward_puzzle_hash=wallet_ph,
939
- pool_reward_puzzle_hash=wallet_ph,
940
949
  )
941
950
  for block in blocks:
942
951
  await full_node_1.full_node.add_block(block)
@@ -993,7 +1002,7 @@ async def test_new_transaction_and_mempool(
993
1002
  included_tx = 0
994
1003
  not_included_tx = 0
995
1004
  seen_bigger_transaction_has_high_fee = False
996
- successful_bundle: Optional[WalletSpendBundle] = None
1005
+ successful_bundle: WalletSpendBundle | None = None
997
1006
 
998
1007
  # Fill mempool
999
1008
  receiver_puzzlehash = wallet_receiver.get_new_puzzlehash()
@@ -1127,7 +1136,6 @@ async def test_request_respond_transaction(
1127
1136
  block_list_input=blocks,
1128
1137
  guarantee_transaction_block=True,
1129
1138
  farmer_reward_puzzle_hash=wallet_ph,
1130
- pool_reward_puzzle_hash=wallet_ph,
1131
1139
  )
1132
1140
 
1133
1141
  incoming_queue, _dummy_node_id = await add_dummy_connection(server_1, self_hostname, 12312)
@@ -1148,9 +1156,8 @@ async def test_request_respond_transaction(
1148
1156
 
1149
1157
  receiver_puzzlehash = wallet_receiver.get_new_puzzlehash()
1150
1158
 
1151
- spend_bundle = wallet_a.generate_signed_transaction(
1152
- uint64(100), receiver_puzzlehash, blocks[-1].get_included_reward_coins()[0]
1153
- )
1159
+ coin = find_reward_coin(blocks[-1], wallet_ph)
1160
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(100), receiver_puzzlehash, coin)
1154
1161
  assert spend_bundle is not None
1155
1162
  respond_transaction = fnp.RespondTransaction(spend_bundle)
1156
1163
  res = await full_node_1.respond_transaction(respond_transaction, peer)
@@ -1192,7 +1199,6 @@ async def test_respond_transaction_fail(
1192
1199
  block_list_input=blocks,
1193
1200
  guarantee_transaction_block=True,
1194
1201
  farmer_reward_puzzle_hash=cb_ph,
1195
- pool_reward_puzzle_hash=cb_ph,
1196
1202
  )
1197
1203
  await asyncio.sleep(1)
1198
1204
  while incoming_queue.qsize() > 0:
@@ -1204,11 +1210,8 @@ async def test_respond_transaction_fail(
1204
1210
 
1205
1211
  await time_out_assert(10, time_out_messages(incoming_queue, "new_peak", 3))
1206
1212
  # Invalid transaction does not propagate
1207
- spend_bundle = wallet_a.generate_signed_transaction(
1208
- uint64(100_000_000_000_000),
1209
- receiver_puzzlehash,
1210
- blocks_new[-1].get_included_reward_coins()[0],
1211
- )
1213
+ coin = find_reward_coin(blocks_new[-1], cb_ph)
1214
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(100_000_000_000_000), receiver_puzzlehash, coin)
1212
1215
 
1213
1216
  assert spend_bundle is not None
1214
1217
  respond_transaction = fnp.RespondTransaction(spend_bundle)
@@ -1228,18 +1231,15 @@ async def test_request_block(
1228
1231
  full_node_1, _full_node_2, _server_1, _server_2, wallet_a, wallet_receiver, bt = wallet_nodes
1229
1232
  blocks = await full_node_1.get_all_full_blocks()
1230
1233
 
1234
+ wallet_ph = wallet_a.get_new_puzzlehash()
1231
1235
  blocks = bt.get_consecutive_blocks(
1232
1236
  3,
1233
1237
  block_list_input=blocks,
1234
1238
  guarantee_transaction_block=True,
1235
- farmer_reward_puzzle_hash=wallet_a.get_new_puzzlehash(),
1236
- pool_reward_puzzle_hash=wallet_a.get_new_puzzlehash(),
1237
- )
1238
- spend_bundle = wallet_a.generate_signed_transaction(
1239
- uint64(1123),
1240
- wallet_receiver.get_new_puzzlehash(),
1241
- blocks[-1].get_included_reward_coins()[0],
1239
+ farmer_reward_puzzle_hash=wallet_ph,
1242
1240
  )
1241
+ coin = find_reward_coin(blocks[-1], wallet_ph)
1242
+ spend_bundle = wallet_a.generate_signed_transaction(uint64(1123), wallet_receiver.get_new_puzzlehash(), coin)
1243
1243
  blocks = bt.get_consecutive_blocks(
1244
1244
  1, block_list_input=blocks, guarantee_transaction_block=True, transaction_data=spend_bundle
1245
1245
  )
@@ -1280,18 +1280,19 @@ async def test_request_blocks(
1280
1280
  blocks = await full_node_1.get_all_full_blocks()
1281
1281
 
1282
1282
  # create more blocks than constants.MAX_BLOCK_COUNT_PER_REQUEST (32)
1283
+ wallet_ph = wallet_a.get_new_puzzlehash()
1283
1284
  blocks = bt.get_consecutive_blocks(
1284
1285
  33,
1285
1286
  block_list_input=blocks,
1286
1287
  guarantee_transaction_block=True,
1287
- farmer_reward_puzzle_hash=wallet_a.get_new_puzzlehash(),
1288
- pool_reward_puzzle_hash=wallet_a.get_new_puzzlehash(),
1288
+ farmer_reward_puzzle_hash=wallet_ph,
1289
1289
  )
1290
1290
 
1291
+ coin = find_reward_coin(blocks[-1], wallet_ph)
1291
1292
  spend_bundle = wallet_a.generate_signed_transaction(
1292
1293
  uint64(1123),
1293
1294
  wallet_receiver.get_new_puzzlehash(),
1294
- blocks[-1].get_included_reward_coins()[0],
1295
+ coin,
1295
1296
  )
1296
1297
  blocks_t = bt.get_consecutive_blocks(
1297
1298
  1, block_list_input=blocks, guarantee_transaction_block=True, transaction_data=spend_bundle
@@ -1375,7 +1376,7 @@ async def test_new_unfinished_block(
1375
1376
  assert res is not None
1376
1377
  assert res is not None and res.data == bytes(fnp.RequestUnfinishedBlock(unf.partial_hash))
1377
1378
 
1378
- # when we receive a new unfinished block, we advertize it to our peers.
1379
+ # when we receive a new unfinished block, we advertise it to our peers.
1379
1380
  # We send new_unfinished_blocks to old peers (0.0.35 and earlier) and we
1380
1381
  # send new_unfinishe_blocks2 to new peers (0.0.6 and later). Test both
1381
1382
  peer.protocol_version = Version(peer_version)
@@ -1473,7 +1474,7 @@ async def test_new_unfinished_block2_forward_limit(
1473
1474
 
1474
1475
  unf_blocks: list[UnfinishedBlock] = []
1475
1476
 
1476
- last_reward_hash: Optional[bytes32] = None
1477
+ last_reward_hash: bytes32 | None = None
1477
1478
  for idx in range(6):
1478
1479
  # we include a different transaction in each block. This makes the
1479
1480
  # foliage different in each of them, but the reward block (plot) the same
@@ -1769,7 +1770,7 @@ async def test_request_unfinished_block2(
1769
1770
 
1770
1771
  # the "best" unfinished block according to the metric we use to pick one
1771
1772
  # deterministically
1772
- best_unf: Optional[UnfinishedBlock] = None
1773
+ best_unf: UnfinishedBlock | None = None
1773
1774
 
1774
1775
  for idx in range(6):
1775
1776
  # we include a different transaction in each block. This makes the
@@ -2450,31 +2451,30 @@ async def test_invalid_capability_can_connect(
2450
2451
  @pytest.mark.anyio
2451
2452
  async def test_node_start_with_existing_blocks(db_version: int) -> None:
2452
2453
  with TempKeyring(populate=True) as keychain:
2453
- block_tools = await create_block_tools_async(keychain=keychain)
2454
-
2455
- blocks_per_cycle = 5
2456
- expected_height = 0
2457
-
2458
- for cycle in range(2):
2459
- async with setup_full_node(
2460
- consensus_constants=block_tools.constants,
2461
- db_name="node_restart_test.db",
2462
- self_hostname=block_tools.config["self_hostname"],
2463
- local_bt=block_tools,
2464
- simulator=True,
2465
- db_version=db_version,
2466
- reuse_db=True,
2467
- ) as service:
2468
- simulator_api = service._api
2469
- assert isinstance(simulator_api, FullNodeSimulator)
2470
- await simulator_api.farm_blocks_to_puzzlehash(count=blocks_per_cycle)
2471
-
2472
- expected_height += blocks_per_cycle
2473
- assert simulator_api.full_node._blockchain is not None
2474
- block_record = simulator_api.full_node._blockchain.get_peak()
2475
-
2476
- assert block_record is not None, f"block_record is None on cycle {cycle + 1}"
2477
- assert block_record.height == expected_height, f"wrong height on cycle {cycle + 1}"
2454
+ async with create_block_tools_async(keychain=keychain) as block_tools:
2455
+ blocks_per_cycle = 5
2456
+ expected_height = 0
2457
+
2458
+ for cycle in range(2):
2459
+ async with setup_full_node(
2460
+ consensus_constants=block_tools.constants,
2461
+ db_name="node_restart_test.db",
2462
+ self_hostname=block_tools.config["self_hostname"],
2463
+ local_bt=block_tools,
2464
+ simulator=True,
2465
+ db_version=db_version,
2466
+ reuse_db=True,
2467
+ ) as service:
2468
+ simulator_api = service._api
2469
+ assert isinstance(simulator_api, FullNodeSimulator)
2470
+ await simulator_api.farm_blocks_to_puzzlehash(count=blocks_per_cycle)
2471
+
2472
+ expected_height += blocks_per_cycle
2473
+ assert simulator_api.full_node._blockchain is not None
2474
+ block_record = simulator_api.full_node._blockchain.get_peak()
2475
+
2476
+ assert block_record is not None, f"block_record is None on cycle {cycle + 1}"
2477
+ assert block_record.height == expected_height, f"wrong height on cycle {cycle + 1}"
2478
2478
 
2479
2479
 
2480
2480
  @pytest.mark.anyio
@@ -2713,7 +2713,7 @@ async def test_long_reorg_nodes(
2713
2713
  p2 = full_node_1.full_node.blockchain.get_peak()
2714
2714
  return p1 == p2
2715
2715
 
2716
- await time_out_assert(300, check_nodes_in_sync)
2716
+ await time_out_assert(600, check_nodes_in_sync)
2717
2717
  peak = full_node_2.full_node.blockchain.get_peak()
2718
2718
  assert peak is not None
2719
2719
  print(f"peak: {str(peak.header_hash)[:6]}")
@@ -3224,12 +3224,15 @@ async def declare_pos_unfinished_block(
3224
3224
  include_signature_source_data=True,
3225
3225
  )
3226
3226
  await full_node_api.declare_proof_of_space(pospace, dummy_peer)
3227
- q_str: Optional[bytes32] = verify_and_get_quality_string(
3227
+ tx_peak = blockchain.get_tx_peak()
3228
+ assert tx_peak is not None
3229
+ q_str: bytes32 | None = verify_and_get_quality_string(
3228
3230
  block.reward_chain_block.proof_of_space,
3229
3231
  blockchain.constants,
3230
3232
  challenge,
3231
3233
  challenge_chain_sp,
3232
3234
  height=block.reward_chain_block.height,
3235
+ prev_transaction_block_height=tx_peak.height,
3233
3236
  )
3234
3237
  assert q_str is not None
3235
3238
  unfinised_block = None
@@ -3256,7 +3259,7 @@ async def add_tx_to_mempool(
3256
3259
  coinbase_puzzlehash: bytes32,
3257
3260
  receiver_puzzlehash: bytes32,
3258
3261
  amount: uint64,
3259
- ) -> Optional[SpendBundle]:
3262
+ ) -> SpendBundle | None:
3260
3263
  spend_coin = None
3261
3264
  coins = spend_block.get_included_reward_coins()
3262
3265
  for coin in coins:
@@ -3322,7 +3325,9 @@ async def test_pending_tx_cache_retry_on_new_peak(
3322
3325
  wallet = WalletTool(test_constants)
3323
3326
  ph = wallet.get_new_puzzlehash()
3324
3327
  blocks = bt.get_consecutive_blocks(
3325
- 3, guarantee_transaction_block=True, farmer_reward_puzzle_hash=ph, pool_reward_puzzle_hash=ph
3328
+ 3,
3329
+ guarantee_transaction_block=True,
3330
+ farmer_reward_puzzle_hash=ph,
3326
3331
  )
3327
3332
  for block in blocks:
3328
3333
  await full_node_api.full_node.add_block(block)
@@ -3330,7 +3335,7 @@ async def test_pending_tx_cache_retry_on_new_peak(
3330
3335
  assert peak is not None
3331
3336
  current_height = peak.height
3332
3337
  # Create a transaction with a height condition that makes it pending
3333
- coin = blocks[-1].get_included_reward_coins()[0]
3338
+ coin = find_reward_coin(blocks[-1], ph)
3334
3339
  if condition == ConditionOpcode.ASSERT_HEIGHT_RELATIVE:
3335
3340
  condition_height = 1
3336
3341
  else:
@@ -3357,3 +3362,161 @@ async def test_pending_tx_cache_retry_on_new_peak(
3357
3362
  assert f"Added transaction to mempool: {sb_name}\n" in caplog.text
3358
3363
  # Make sure the transaction was retried and got added to the mempool
3359
3364
  assert full_node_api.full_node.mempool_manager.get_mempool_item(sb_name, include_pending=False) is not None
3365
+
3366
+
3367
+ @pytest.mark.anyio
3368
+ @pytest.mark.parametrize("mismatch_cost", [True, False])
3369
+ @pytest.mark.parametrize("mismatch_fee", [True, False])
3370
+ @pytest.mark.parametrize("tx_already_seen", [True, False])
3371
+ @pytest.mark.parametrize("mismatch_on_reannounce", [True, False])
3372
+ async def test_ban_for_mismatched_tx_cost_fee(
3373
+ three_nodes: list[FullNodeAPI],
3374
+ bt: BlockTools,
3375
+ self_hostname: str,
3376
+ mismatch_cost: bool,
3377
+ mismatch_fee: bool,
3378
+ tx_already_seen: bool,
3379
+ mismatch_on_reannounce: bool,
3380
+ ) -> None:
3381
+ """
3382
+ Tests that a peer gets banned if it sends a `NewTransaction` message with a
3383
+ cost and/or fee that doesn't match the transaction's validation cost/fee.
3384
+ We setup full nodes, and with `tx_already_seen` we control whether the
3385
+ first full node has this transaction already or it needs to request it.
3386
+ In both cases we check the transaction's validation cost and fee against
3387
+ the ones specified in the `NewTransaction` message.
3388
+ With `mismatch_on_reannounce` we control whether the peer sent us the same
3389
+ transaction twice with different cost and fee.
3390
+ """
3391
+ full_node_1, full_node_2, full_node_3 = three_nodes
3392
+ server_1 = full_node_1.full_node.server
3393
+ server_2 = full_node_2.full_node.server
3394
+ server_3 = full_node_3.full_node.server
3395
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
3396
+ await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
3397
+ ws_con_1 = next(iter(server_1.all_connections.values()))
3398
+ ws_con_2 = next(iter(server_2.all_connections.values()))
3399
+ ws_con_3 = next(iter(server_3.all_connections.values()))
3400
+ wallet = WalletTool(test_constants)
3401
+ wallet_ph = wallet.get_new_puzzlehash()
3402
+ # If we're covering that the first full node has this transaction already
3403
+ # we must add it accordingly, otherwise we'll add it to the second node so
3404
+ # that the first node requests it, reacting to the NewTransaction message.
3405
+ if tx_already_seen:
3406
+ node = full_node_1.full_node
3407
+ ws_con = ws_con_1
3408
+ else:
3409
+ node = full_node_2.full_node
3410
+ ws_con = ws_con_2
3411
+ blocks = bt.get_consecutive_blocks(3, guarantee_transaction_block=True, farmer_reward_puzzle_hash=wallet_ph)
3412
+ for block in blocks:
3413
+ await node.add_block(block)
3414
+ # Create a transaction and add it to the relevant full node's mempool
3415
+ coin = find_reward_coin(blocks[-1], wallet_ph)
3416
+ sb = wallet.generate_signed_transaction(uint64(42), wallet_ph, coin)
3417
+ sb_name = sb.name()
3418
+ await node.add_transaction(sb, sb_name, ws_con)
3419
+ mempool_item = node.mempool_manager.get_mempool_item(sb_name)
3420
+ assert mempool_item is not None
3421
+ # Now send a NewTransaction with a cost and/or fee mismatch from the second
3422
+ # full node.
3423
+ cost = uint64(mempool_item.cost + 1) if mismatch_cost else mempool_item.cost
3424
+ fee = uint64(mempool_item.fee + 1) if mismatch_fee else mempool_item.fee
3425
+ msg = make_msg(ProtocolMessageTypes.new_transaction, NewTransaction(mempool_item.name, cost, fee))
3426
+ # We won't ban localhost, so let's set a different ip address for the
3427
+ # second node.
3428
+ full_node_2_ip = "1.3.3.7"
3429
+ ws_con_1.peer_info = PeerInfo(full_node_2_ip, ws_con_1.peer_info.port)
3430
+
3431
+ # Send the NewTransaction message from the second node to the first
3432
+ async def send_from_node_2() -> None:
3433
+ await ws_con_2.send_message(msg)
3434
+
3435
+ # Send this message from the third node as well, just to end up with two
3436
+ # peers advertising the same transaction at the same time.
3437
+ async def send_from_node_3() -> None:
3438
+ await ws_con_3.send_message(msg)
3439
+
3440
+ for node in [full_node_1.full_node, full_node_2.full_node, full_node_3.full_node]:
3441
+ await time_out_assert(5, node.synced)
3442
+ await asyncio.gather(send_from_node_2(), send_from_node_3())
3443
+ if mismatch_on_reannounce and (mismatch_cost or mismatch_fee):
3444
+ # Send a second NewTransaction that doesn't match the first
3445
+ reannounce_cost = uint64(cost + 1) if mismatch_cost else cost
3446
+ reannounce_fee = uint64(fee + 1) if mismatch_fee else fee
3447
+ reannounce_msg = make_msg(
3448
+ ProtocolMessageTypes.new_transaction, NewTransaction(mempool_item.name, reannounce_cost, reannounce_fee)
3449
+ )
3450
+ await ws_con_2.send_message(reannounce_msg)
3451
+ # Make sure the peer is banned as it sent the same transaction twice
3452
+ # with different cost and/or fee.
3453
+ await time_out_assert(5, lambda: full_node_2_ip in server_1.banned_peers)
3454
+ return
3455
+ if not tx_already_seen:
3456
+ # When the first full node receives the NewTransaction message and it
3457
+ # hasn't seen the transaction before, it will issue a transaction
3458
+ # request. We need to wait until it receives the transaction and add it
3459
+ # to its mempool.
3460
+ await time_out_assert(30, lambda: full_node_1.full_node.mempool_manager.seen(mempool_item.name))
3461
+ # Make sure the first full node has banned the second as the item it has
3462
+ # already seen has a different validation cost and/or fee than the one from
3463
+ # the NewTransaction message.
3464
+ if mismatch_cost or mismatch_fee:
3465
+ await time_out_assert(5, lambda: full_node_2_ip in server_1.banned_peers)
3466
+ else:
3467
+ await time_out_assert(5, lambda: full_node_2_ip not in server_1.banned_peers)
3468
+
3469
+
3470
+ @pytest.mark.anyio
3471
+ async def test_new_tx_zero_cost(
3472
+ setup_two_nodes_fixture: tuple[list[FullNodeSimulator], list[tuple[WalletNode, ChiaServer]], BlockTools],
3473
+ self_hostname: str,
3474
+ ) -> None:
3475
+ """
3476
+ Tests that a peer gets banned if it sends a `NewTransaction` message with
3477
+ zero cost.
3478
+ """
3479
+ [full_node_1, full_node_2], _, bt = setup_two_nodes_fixture
3480
+ server_1 = full_node_1.full_node.server
3481
+ server_2 = full_node_2.full_node.server
3482
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
3483
+ ws_con_1 = next(iter(server_1.all_connections.values()))
3484
+ ws_con_2 = next(iter(server_2.all_connections.values()))
3485
+ await full_node_1.full_node.add_block(bt.get_consecutive_blocks(1)[0])
3486
+ # Send a NewTransaction with zero cost
3487
+ msg = make_msg(
3488
+ ProtocolMessageTypes.new_transaction, NewTransaction(bytes32.random(), cost=uint64(0), fees=uint64(42))
3489
+ )
3490
+ # We won't ban localhost, so let's set a different ip address for the
3491
+ # second node.
3492
+ full_node_2_ip = "1.3.3.7"
3493
+ ws_con_1.peer_info = PeerInfo(full_node_2_ip, ws_con_1.peer_info.port)
3494
+ await ws_con_2.send_message(msg)
3495
+ # Make sure the first full node has banned the second.
3496
+ await time_out_assert(3, lambda: full_node_2_ip in server_1.banned_peers)
3497
+
3498
+
3499
+ @pytest.mark.anyio
3500
+ @pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.HARD_FORK_2_0], reason="save time")
3501
+ async def test_corrupt_blockchain(bt: BlockTools, default_400_blocks: list[FullBlock]) -> None:
3502
+ full_node = await FullNode.create(
3503
+ bt.config["full_node"],
3504
+ root_path=bt.root_path,
3505
+ consensus_constants=bt.constants,
3506
+ )
3507
+
3508
+ config = bt.config["full_node"]
3509
+ db_path_replaced: str = config["database_path"].replace("CHALLENGE", config["selected_network"])
3510
+ db_path = path_from_root(bt.root_path, db_path_replaced)
3511
+ db_path.parent.mkdir(parents=True, exist_ok=True)
3512
+
3513
+ await make_db(db_path, default_400_blocks)
3514
+ with contextlib.closing(sqlite3.connect(db_path)) as conn:
3515
+ conn.execute("DELETE FROM current_peak;")
3516
+ conn.commit()
3517
+
3518
+ with pytest.raises(RuntimeError, match="corrupt blockchain DB"):
3519
+ # the blockchain is empty (without a peak)
3520
+ # but there are coins in the coin store
3521
+ async with full_node.manage():
3522
+ pass # pragma: no cover
@@ -1,7 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional
4
-
5
3
  import pytest
6
4
  from chia_rs import BlockRecord
7
5
  from chia_rs.sized_bytes import bytes32
@@ -38,7 +36,7 @@ async def test_hints_to_add(bt: BlockTools, empty_blockchain: Blockchain) -> Non
38
36
  blocks = bt.get_consecutive_blocks(2)
39
37
  await _validate_and_add_block(empty_blockchain, blocks[0])
40
38
  await _validate_and_add_block(empty_blockchain, blocks[1])
41
- br: Optional[BlockRecord] = empty_blockchain.get_peak()
39
+ br: BlockRecord | None = empty_blockchain.get_peak()
42
40
  assert br is not None
43
41
 
44
42
  scs = StateChangeSummary(br, uint32(0), [], removals, additions, [])
@@ -56,7 +54,7 @@ async def test_lookup_coin_ids(bt: BlockTools, empty_blockchain: Blockchain) ->
56
54
  blocks = bt.get_consecutive_blocks(2)
57
55
  await _validate_and_add_block(empty_blockchain, blocks[0])
58
56
  await _validate_and_add_block(empty_blockchain, blocks[1])
59
- br: Optional[BlockRecord] = empty_blockchain.get_peak()
57
+ br: BlockRecord | None = empty_blockchain.get_peak()
60
58
  assert br is not None
61
59
 
62
60
  rewards: list[Coin] = [
@@ -36,7 +36,6 @@ class TestPerformance:
36
36
  block_list_input=blocks,
37
37
  guarantee_transaction_block=True,
38
38
  farmer_reward_puzzle_hash=wallet_ph,
39
- pool_reward_puzzle_hash=wallet_ph,
40
39
  )
41
40
  for block in blocks:
42
41
  await full_node_1.full_node.add_block(block)
@@ -1,16 +1,29 @@
1
1
  from __future__ import annotations
2
2
 
3
- from chia_rs.sized_ints import uint32
3
+ from chia_rs import FullBlock
4
+ from chia_rs.sized_ints import uint8, uint32
4
5
 
5
- from chia.consensus.generator_tools import get_block_header
6
- from chia.consensus.get_block_challenge import prev_tx_block
7
- from chia.simulator.block_tools import BlockTools, load_block_list
6
+ from chia.consensus.get_block_challenge import pre_sp_tx_block_height
7
+ from chia.simulator.block_tools import BlockTools, load_block_list, test_constants
8
8
  from chia.util.block_cache import BlockCache
9
9
 
10
10
 
11
11
  def test_prev_tx_block_none() -> None:
12
12
  # If prev_b is None, should return 0
13
- assert prev_tx_block(BlockCache({}), None) == uint32(0)
13
+ assert pre_sp_tx_block_height(
14
+ constants=test_constants,
15
+ blocks=BlockCache({}),
16
+ prev_b_hash=test_constants.GENESIS_CHALLENGE,
17
+ sp_index=uint8(0),
18
+ first_in_sub_slot=False,
19
+ ) == uint32(0)
20
+ assert pre_sp_tx_block_height(
21
+ constants=test_constants,
22
+ blocks=BlockCache({}),
23
+ prev_b_hash=test_constants.GENESIS_CHALLENGE,
24
+ sp_index=uint8(1),
25
+ first_in_sub_slot=True,
26
+ ) == uint32(0)
14
27
 
15
28
 
16
29
  def test_prev_tx_block_blockrecord_tx(bt: BlockTools) -> None:
@@ -21,9 +34,45 @@ def test_prev_tx_block_blockrecord_tx(bt: BlockTools) -> None:
21
34
  guarantee_transaction_block=True,
22
35
  )
23
36
  _, _, blocks = load_block_list(block_list, bt.constants)
24
- assert prev_tx_block(BlockCache(blocks), block_list[-1]) == uint32(9)
25
- assert prev_tx_block(BlockCache(blocks), blocks[block_list[-1].header_hash]) == uint32(9)
26
- assert prev_tx_block(BlockCache(blocks), get_block_header(block_list[-1])) == uint32(9)
37
+ block = block_list[-1]
38
+ latest_tx_before_sp = find_tx_before_sp(block_list)
39
+ assert latest_tx_before_sp is not None
40
+ assert (
41
+ pre_sp_tx_block_height(
42
+ constants=test_constants,
43
+ blocks=BlockCache(blocks),
44
+ prev_b_hash=block.prev_header_hash,
45
+ sp_index=block.reward_chain_block.signage_point_index,
46
+ first_in_sub_slot=len(block.finished_sub_slots) > 0,
47
+ )
48
+ == latest_tx_before_sp.height
49
+ )
50
+ block = block_list[-2]
51
+ latest_tx_before_sp = find_tx_before_sp(block_list[:-1])
52
+ assert latest_tx_before_sp is not None
53
+ assert (
54
+ pre_sp_tx_block_height(
55
+ constants=test_constants,
56
+ blocks=BlockCache(blocks),
57
+ prev_b_hash=block.prev_header_hash,
58
+ sp_index=block.reward_chain_block.signage_point_index,
59
+ first_in_sub_slot=len(block.finished_sub_slots) > 0,
60
+ )
61
+ == latest_tx_before_sp.height
62
+ )
63
+ block = block_list[-3]
64
+ latest_tx_before_sp = find_tx_before_sp(block_list[:-2])
65
+ assert latest_tx_before_sp is not None
66
+ assert (
67
+ pre_sp_tx_block_height(
68
+ constants=test_constants,
69
+ blocks=BlockCache(blocks),
70
+ prev_b_hash=block.prev_header_hash,
71
+ sp_index=block.reward_chain_block.signage_point_index,
72
+ first_in_sub_slot=len(block.finished_sub_slots) > 0,
73
+ )
74
+ == latest_tx_before_sp.height
75
+ )
27
76
 
28
77
 
29
78
  def test_prev_tx_block_blockrecord_not_tx(bt: BlockTools) -> None:
@@ -38,6 +87,34 @@ def test_prev_tx_block_blockrecord_not_tx(bt: BlockTools) -> None:
38
87
  block_list_input=block_list,
39
88
  )
40
89
  _, _, blocks = load_block_list(block_list, bt.constants)
41
- assert prev_tx_block(BlockCache(blocks), block_list[-1]) == uint32(7)
42
- assert prev_tx_block(BlockCache(blocks), blocks[block_list[-1].header_hash]) == uint32(7)
43
- assert prev_tx_block(BlockCache(blocks), get_block_header(block_list[-1])) == uint32(7)
90
+ block = block_list[-1]
91
+ latest_tx_before_sp = find_tx_before_sp(block_list)
92
+ assert latest_tx_before_sp is not None
93
+ assert pre_sp_tx_block_height(
94
+ constants=test_constants,
95
+ blocks=BlockCache(blocks),
96
+ prev_b_hash=block.prev_header_hash,
97
+ sp_index=block.reward_chain_block.signage_point_index,
98
+ first_in_sub_slot=len(block.finished_sub_slots) > 0,
99
+ ) == uint32(latest_tx_before_sp.height)
100
+
101
+
102
+ # get the latest infused transaction block before the signage point of the last block in the list
103
+ def find_tx_before_sp(block_list: list[FullBlock]) -> FullBlock | None:
104
+ before_slot = False
105
+ before_sp = False
106
+ if len(block_list[-1].finished_sub_slots) > 0:
107
+ before_slot = True
108
+ sp_index = block_list[-1].reward_chain_block.signage_point_index
109
+ idx = len(block_list) - 2
110
+ curr = None
111
+ while idx > 0:
112
+ curr = block_list[idx]
113
+ if curr.reward_chain_block.signage_point_index < sp_index:
114
+ before_sp = True
115
+ if curr.foliage_transaction_block is not None and (before_slot or before_sp):
116
+ break
117
+ if len(curr.finished_sub_slots) > 0:
118
+ before_slot = True
119
+ idx -= 1
120
+ return curr
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import random
5
- from typing import Optional
6
5
 
7
6
  import pytest
8
7
  from chia_rs import BlockRecord
@@ -77,7 +76,7 @@ async def test_tx_propagation(three_nodes_two_wallets, self_hostname, seeded_ran
77
76
  await time_out_assert(20, wallet_0.wallet_state_manager.main_wallet.get_confirmed_balance, funds)
78
77
 
79
78
  async def peak_height(fna: FullNodeAPI):
80
- peak: Optional[BlockRecord] = fna.full_node.blockchain.get_peak()
79
+ peak: BlockRecord | None = fna.full_node.blockchain.get_peak()
81
80
  if peak is None:
82
81
  return -1
83
82
  peak_height = peak.height