chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. chia/__init__.py +8 -4
  2. chia/_tests/blockchain/blockchain_test_utils.py +6 -8
  3. chia/_tests/blockchain/test_augmented_chain.py +4 -4
  4. chia/_tests/blockchain/test_blockchain.py +165 -190
  5. chia/_tests/blockchain/test_blockchain_transactions.py +5 -2
  6. chia/_tests/blockchain/test_build_chains.py +2 -4
  7. chia/_tests/blockchain/test_get_block_generator.py +2 -3
  8. chia/_tests/clvm/coin_store.py +4 -7
  9. chia/_tests/clvm/test_clvm_step.py +4 -4
  10. chia/_tests/clvm/test_puzzle_compression.py +2 -1
  11. chia/_tests/clvm/test_puzzle_drivers.py +2 -2
  12. chia/_tests/clvm/test_singletons.py +2 -4
  13. chia/_tests/clvm/test_spend_sim.py +2 -2
  14. chia/_tests/cmds/cmd_test_utils.py +27 -45
  15. chia/_tests/cmds/test_cmd_framework.py +6 -6
  16. chia/_tests/cmds/test_daemon.py +3 -3
  17. chia/_tests/cmds/test_show.py +4 -4
  18. chia/_tests/cmds/test_tx_config_args.py +1 -2
  19. chia/_tests/cmds/testing_classes.py +4 -5
  20. chia/_tests/cmds/wallet/test_did.py +24 -27
  21. chia/_tests/cmds/wallet/test_nft.py +12 -10
  22. chia/_tests/cmds/wallet/test_vcs.py +11 -12
  23. chia/_tests/cmds/wallet/test_wallet.py +134 -89
  24. chia/_tests/conftest.py +66 -31
  25. chia/_tests/connection_utils.py +2 -2
  26. chia/_tests/core/cmds/test_beta.py +4 -4
  27. chia/_tests/core/cmds/test_keys.py +2 -3
  28. chia/_tests/core/cmds/test_wallet.py +15 -15
  29. chia/_tests/core/consensus/test_pot_iterations.py +19 -73
  30. chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
  31. chia/_tests/core/daemon/test_daemon.py +11 -11
  32. chia/_tests/core/data_layer/conftest.py +2 -2
  33. chia/_tests/core/data_layer/test_data_rpc.py +28 -14
  34. chia/_tests/core/data_layer/test_data_store.py +10 -10
  35. chia/_tests/core/data_layer/util.py +11 -11
  36. chia/_tests/core/farmer/test_farmer_api.py +2 -4
  37. chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
  38. chia/_tests/core/full_node/stores/test_block_store.py +5 -4
  39. chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
  40. chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
  41. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  42. chia/_tests/core/full_node/test_block_height_map.py +3 -4
  43. chia/_tests/core/full_node/test_conditions.py +21 -23
  44. chia/_tests/core/full_node/test_full_node.py +273 -70
  45. chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
  46. chia/_tests/core/full_node/test_hint_management.py +2 -4
  47. chia/_tests/core/full_node/test_performance.py +0 -1
  48. chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
  49. chia/_tests/core/full_node/test_transactions.py +1 -2
  50. chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
  51. chia/_tests/core/mempool/test_mempool.py +54 -50
  52. chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
  53. chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
  54. chia/_tests/core/mempool/test_mempool_manager.py +988 -854
  55. chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
  56. chia/_tests/core/server/serve.py +7 -7
  57. chia/_tests/core/server/test_dos.py +1 -2
  58. chia/_tests/core/server/test_event_loop.py +12 -4
  59. chia/_tests/core/server/test_loop.py +7 -8
  60. chia/_tests/core/server/test_rate_limits.py +9 -8
  61. chia/_tests/core/server/test_server.py +61 -1
  62. chia/_tests/core/services/test_services.py +2 -2
  63. chia/_tests/core/ssl/test_ssl.py +2 -2
  64. chia/_tests/core/test_cost_calculation.py +2 -6
  65. chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
  66. chia/_tests/core/test_filter.py +0 -1
  67. chia/_tests/core/test_full_node_rpc.py +2 -2
  68. chia/_tests/core/test_merkle_set.py +1 -2
  69. chia/_tests/core/test_seeder.py +4 -4
  70. chia/_tests/core/util/test_config.py +4 -4
  71. chia/_tests/core/util/test_jsonify.py +2 -2
  72. chia/_tests/core/util/test_keychain.py +3 -3
  73. chia/_tests/core/util/test_lockfile.py +2 -1
  74. chia/_tests/core/util/test_log_exceptions.py +1 -2
  75. chia/_tests/core/util/test_streamable.py +17 -17
  76. chia/_tests/db/test_db_wrapper.py +3 -2
  77. chia/_tests/environments/wallet.py +14 -14
  78. chia/_tests/ether.py +4 -3
  79. chia/_tests/farmer_harvester/test_farmer.py +41 -24
  80. chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
  81. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
  82. chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
  83. chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
  84. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
  85. chia/_tests/harvester/test_harvester_api.py +11 -4
  86. chia/_tests/plot_sync/test_plot_sync.py +13 -11
  87. chia/_tests/plot_sync/test_receiver.py +11 -10
  88. chia/_tests/plot_sync/test_sync_simulated.py +2 -2
  89. chia/_tests/plot_sync/util.py +1 -2
  90. chia/_tests/plotting/test_plot_manager.py +7 -6
  91. chia/_tests/plotting/test_prover.py +30 -38
  92. chia/_tests/pools/test_pool_cmdline.py +4 -6
  93. chia/_tests/pools/test_pool_rpc.py +203 -61
  94. chia/_tests/pools/test_pool_wallet.py +3 -3
  95. chia/_tests/pools/test_wallet_pool_store.py +1 -4
  96. chia/_tests/process_junit.py +2 -2
  97. chia/_tests/rpc/test_rpc_client.py +4 -4
  98. chia/_tests/rpc/test_rpc_server.py +3 -3
  99. chia/_tests/simulation/test_simulation.py +12 -25
  100. chia/_tests/solver/test_solver_service.py +13 -4
  101. chia/_tests/testconfig.py +2 -2
  102. chia/_tests/timelord/test_new_peak.py +22 -11
  103. chia/_tests/tools/test_run_block.py +0 -2
  104. chia/_tests/tools/test_virtual_project.py +2 -1
  105. chia/_tests/util/benchmarks.py +1 -0
  106. chia/_tests/util/blockchain.py +38 -36
  107. chia/_tests/util/blockchain_mock.py +11 -11
  108. chia/_tests/util/build_network_protocol_files.py +2 -1
  109. chia/_tests/util/coin_store.py +2 -1
  110. chia/_tests/util/config.py +1 -1
  111. chia/_tests/util/db_connection.py +2 -3
  112. chia/_tests/util/full_sync.py +9 -11
  113. chia/_tests/util/gen_ssl_certs.py +4 -5
  114. chia/_tests/util/get_name_puzzle_conditions.py +2 -0
  115. chia/_tests/util/misc.py +24 -24
  116. chia/_tests/util/network_protocol_data.py +20 -3
  117. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  118. chia/_tests/util/protocol_messages_json.py +292 -3
  119. chia/_tests/util/setup_nodes.py +62 -47
  120. chia/_tests/util/spend_sim.py +57 -57
  121. chia/_tests/util/test_async_pool.py +2 -3
  122. chia/_tests/util/test_chia_version.py +1 -3
  123. chia/_tests/util/test_config.py +3 -3
  124. chia/_tests/util/test_full_block_utils.py +6 -3
  125. chia/_tests/util/test_limited_semaphore.py +1 -2
  126. chia/_tests/util/test_misc.py +2 -2
  127. chia/_tests/util/test_network.py +1 -2
  128. chia/_tests/util/test_priority_mutex.py +3 -3
  129. chia/_tests/util/test_recursive_replace.py +5 -6
  130. chia/_tests/util/test_replace_str_to_bytes.py +9 -10
  131. chia/_tests/util/test_testnet_overrides.py +3 -3
  132. chia/_tests/util/time_out_assert.py +2 -2
  133. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
  134. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
  135. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
  136. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
  137. chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
  138. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
  139. chia/_tests/wallet/conftest.py +6 -6
  140. chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
  141. chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
  142. chia/_tests/wallet/did_wallet/test_did.py +16 -6
  143. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
  144. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
  145. chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
  146. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
  147. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
  148. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
  149. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
  150. chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
  151. chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
  152. chia/_tests/wallet/test_clvm_streamable.py +2 -3
  153. chia/_tests/wallet/test_coin_management.py +2 -2
  154. chia/_tests/wallet/test_conditions.py +45 -51
  155. chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
  156. chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
  157. chia/_tests/wallet/test_notifications.py +14 -14
  158. chia/_tests/wallet/test_signer_protocol.py +5 -5
  159. chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
  160. chia/_tests/wallet/test_transaction_store.py +20 -20
  161. chia/_tests/wallet/test_util.py +2 -2
  162. chia/_tests/wallet/test_wallet.py +380 -228
  163. chia/_tests/wallet/test_wallet_action_scope.py +4 -4
  164. chia/_tests/wallet/test_wallet_blockchain.py +12 -12
  165. chia/_tests/wallet/test_wallet_coin_store.py +3 -4
  166. chia/_tests/wallet/test_wallet_node.py +16 -15
  167. chia/_tests/wallet/test_wallet_test_framework.py +2 -1
  168. chia/_tests/wallet/test_wallet_utils.py +2 -3
  169. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
  170. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
  171. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
  172. chia/_tests/wallet/wallet_block_tools.py +12 -11
  173. chia/_tests/weight_proof/config.py +1 -0
  174. chia/_tests/weight_proof/test_weight_proof.py +5 -4
  175. chia/apis/__init__.py +21 -0
  176. chia/apis/farmer_stub.py +102 -0
  177. chia/apis/full_node_stub.py +374 -0
  178. chia/apis/harvester_stub.py +57 -0
  179. chia/apis/introducer_stub.py +35 -0
  180. chia/apis/solver_stub.py +30 -0
  181. chia/apis/stub_protocol_registry.py +21 -0
  182. chia/apis/timelord_stub.py +39 -0
  183. chia/apis/wallet_stub.py +161 -0
  184. chia/cmds/beta.py +3 -4
  185. chia/cmds/beta_funcs.py +4 -3
  186. chia/cmds/check_wallet_db.py +4 -4
  187. chia/cmds/chia.py +1 -2
  188. chia/cmds/cmd_classes.py +11 -13
  189. chia/cmds/cmd_helpers.py +11 -11
  190. chia/cmds/cmds_util.py +15 -15
  191. chia/cmds/coin_funcs.py +6 -7
  192. chia/cmds/coins.py +2 -3
  193. chia/cmds/configure.py +1 -2
  194. chia/cmds/data.py +42 -42
  195. chia/cmds/data_funcs.py +81 -81
  196. chia/cmds/db.py +4 -5
  197. chia/cmds/db_backup_func.py +2 -2
  198. chia/cmds/db_upgrade_func.py +3 -3
  199. chia/cmds/db_validate_func.py +2 -2
  200. chia/cmds/dev/data.py +4 -4
  201. chia/cmds/dev/gh.py +5 -5
  202. chia/cmds/dev/installers.py +2 -3
  203. chia/cmds/dev/mempool.py +3 -4
  204. chia/cmds/dev/mempool_funcs.py +4 -4
  205. chia/cmds/dev/sim.py +8 -8
  206. chia/cmds/dump_keyring.py +3 -3
  207. chia/cmds/farm.py +6 -8
  208. chia/cmds/farm_funcs.py +25 -24
  209. chia/cmds/init_funcs.py +4 -4
  210. chia/cmds/keys.py +16 -18
  211. chia/cmds/keys_funcs.py +36 -36
  212. chia/cmds/netspace.py +1 -3
  213. chia/cmds/netspace_funcs.py +1 -2
  214. chia/cmds/options.py +3 -2
  215. chia/cmds/param_types.py +17 -16
  216. chia/cmds/passphrase.py +6 -7
  217. chia/cmds/passphrase_funcs.py +11 -13
  218. chia/cmds/peer.py +1 -3
  219. chia/cmds/peer_funcs.py +3 -3
  220. chia/cmds/plotnft.py +6 -7
  221. chia/cmds/plotnft_funcs.py +37 -26
  222. chia/cmds/rpc.py +3 -3
  223. chia/cmds/show.py +3 -5
  224. chia/cmds/show_funcs.py +9 -9
  225. chia/cmds/sim_funcs.py +25 -26
  226. chia/cmds/solver.py +1 -3
  227. chia/cmds/solver_funcs.py +1 -2
  228. chia/cmds/start_funcs.py +2 -2
  229. chia/cmds/wallet.py +76 -81
  230. chia/cmds/wallet_funcs.py +206 -177
  231. chia/consensus/augmented_chain.py +6 -6
  232. chia/consensus/block_body_validation.py +19 -15
  233. chia/consensus/block_creation.py +25 -21
  234. chia/consensus/block_header_validation.py +27 -13
  235. chia/consensus/block_height_map.py +3 -6
  236. chia/consensus/block_height_map_protocol.py +2 -2
  237. chia/consensus/block_record.py +2 -4
  238. chia/consensus/blockchain.py +58 -40
  239. chia/consensus/blockchain_interface.py +7 -7
  240. chia/consensus/coin_store_protocol.py +5 -6
  241. chia/consensus/condition_tools.py +4 -4
  242. chia/consensus/cost_calculator.py +2 -3
  243. chia/consensus/default_constants.py +19 -13
  244. chia/consensus/deficit.py +1 -3
  245. chia/consensus/difficulty_adjustment.py +3 -5
  246. chia/consensus/find_fork_point.py +2 -4
  247. chia/consensus/full_block_to_block_record.py +11 -13
  248. chia/consensus/generator_tools.py +2 -3
  249. chia/consensus/get_block_challenge.py +50 -26
  250. chia/consensus/get_block_generator.py +2 -3
  251. chia/consensus/make_sub_epoch_summary.py +8 -7
  252. chia/consensus/multiprocess_validation.py +31 -20
  253. chia/consensus/pos_quality.py +6 -23
  254. chia/consensus/pot_iterations.py +17 -44
  255. chia/consensus/signage_point.py +4 -5
  256. chia/consensus/vdf_info_computation.py +2 -4
  257. chia/daemon/client.py +8 -8
  258. chia/daemon/keychain_proxy.py +31 -37
  259. chia/daemon/server.py +32 -33
  260. chia/daemon/windows_signal.py +4 -3
  261. chia/data_layer/data_layer.py +86 -77
  262. chia/data_layer/data_layer_rpc_api.py +9 -9
  263. chia/data_layer/data_layer_rpc_client.py +13 -15
  264. chia/data_layer/data_layer_server.py +3 -3
  265. chia/data_layer/data_layer_util.py +14 -14
  266. chia/data_layer/data_layer_wallet.py +94 -101
  267. chia/data_layer/data_store.py +50 -50
  268. chia/data_layer/dl_wallet_store.py +9 -12
  269. chia/data_layer/download_data.py +8 -9
  270. chia/data_layer/s3_plugin_service.py +5 -9
  271. chia/data_layer/start_data_layer.py +5 -5
  272. chia/farmer/farmer.py +31 -31
  273. chia/farmer/farmer_api.py +45 -33
  274. chia/farmer/farmer_rpc_api.py +5 -4
  275. chia/farmer/farmer_rpc_client.py +6 -6
  276. chia/farmer/start_farmer.py +6 -6
  277. chia/full_node/block_store.py +13 -16
  278. chia/full_node/check_fork_next_block.py +1 -2
  279. chia/full_node/coin_store.py +15 -16
  280. chia/full_node/eligible_coin_spends.py +3 -3
  281. chia/full_node/fee_estimate_store.py +2 -3
  282. chia/full_node/fee_tracker.py +1 -2
  283. chia/full_node/full_block_utils.py +4 -4
  284. chia/full_node/full_node.py +239 -223
  285. chia/full_node/full_node_api.py +197 -152
  286. chia/full_node/full_node_rpc_api.py +34 -32
  287. chia/full_node/full_node_rpc_client.py +18 -19
  288. chia/full_node/full_node_store.py +45 -43
  289. chia/full_node/hard_fork_utils.py +44 -0
  290. chia/full_node/hint_management.py +2 -2
  291. chia/full_node/mempool.py +17 -19
  292. chia/full_node/mempool_manager.py +89 -42
  293. chia/full_node/pending_tx_cache.py +2 -3
  294. chia/full_node/start_full_node.py +5 -5
  295. chia/full_node/sync_store.py +3 -4
  296. chia/full_node/tx_processing_queue.py +120 -36
  297. chia/full_node/weight_proof.py +61 -48
  298. chia/harvester/harvester.py +25 -24
  299. chia/harvester/harvester_api.py +61 -38
  300. chia/harvester/harvester_rpc_api.py +10 -10
  301. chia/harvester/start_harvester.py +4 -4
  302. chia/introducer/introducer.py +3 -3
  303. chia/introducer/introducer_api.py +6 -4
  304. chia/introducer/start_introducer.py +4 -4
  305. chia/legacy/keyring.py +3 -3
  306. chia/plot_sync/delta.py +1 -2
  307. chia/plot_sync/receiver.py +20 -17
  308. chia/plot_sync/sender.py +15 -10
  309. chia/plotters/bladebit.py +7 -7
  310. chia/plotters/chiapos.py +2 -2
  311. chia/plotters/madmax.py +4 -4
  312. chia/plotters/plotters.py +4 -4
  313. chia/plotters/plotters_util.py +3 -3
  314. chia/plotting/cache.py +20 -14
  315. chia/plotting/check_plots.py +26 -35
  316. chia/plotting/create_plots.py +22 -23
  317. chia/plotting/manager.py +21 -14
  318. chia/plotting/prover.py +59 -42
  319. chia/plotting/util.py +16 -16
  320. chia/pools/pool_config.py +2 -1
  321. chia/pools/pool_puzzles.py +11 -12
  322. chia/pools/pool_wallet.py +34 -57
  323. chia/pools/pool_wallet_info.py +39 -10
  324. chia/protocols/farmer_protocol.py +8 -9
  325. chia/protocols/fee_estimate.py +3 -4
  326. chia/protocols/full_node_protocol.py +3 -4
  327. chia/protocols/harvester_protocol.py +27 -15
  328. chia/protocols/outbound_message.py +3 -3
  329. chia/protocols/pool_protocol.py +8 -9
  330. chia/protocols/shared_protocol.py +1 -2
  331. chia/protocols/solver_protocol.py +9 -2
  332. chia/protocols/timelord_protocol.py +4 -7
  333. chia/protocols/wallet_protocol.py +11 -12
  334. chia/rpc/rpc_client.py +9 -9
  335. chia/rpc/rpc_server.py +17 -17
  336. chia/rpc/util.py +2 -2
  337. chia/seeder/crawler.py +8 -8
  338. chia/seeder/crawler_api.py +21 -27
  339. chia/seeder/crawler_rpc_api.py +2 -2
  340. chia/seeder/dns_server.py +21 -21
  341. chia/seeder/start_crawler.py +4 -4
  342. chia/server/address_manager.py +15 -16
  343. chia/server/api_protocol.py +11 -11
  344. chia/server/chia_policy.py +46 -26
  345. chia/server/introducer_peers.py +2 -3
  346. chia/server/node_discovery.py +19 -19
  347. chia/server/rate_limit_numbers.py +4 -5
  348. chia/server/rate_limits.py +4 -4
  349. chia/server/resolve_peer_info.py +4 -4
  350. chia/server/server.py +49 -52
  351. chia/server/signal_handlers.py +6 -6
  352. chia/server/start_service.py +17 -17
  353. chia/server/upnp.py +4 -6
  354. chia/server/ws_connection.py +52 -37
  355. chia/simulator/add_blocks_in_batches.py +1 -3
  356. chia/simulator/block_tools.py +312 -200
  357. chia/simulator/full_node_simulator.py +56 -35
  358. chia/simulator/keyring.py +2 -3
  359. chia/simulator/setup_services.py +15 -15
  360. chia/simulator/simulator_full_node_rpc_api.py +1 -2
  361. chia/simulator/simulator_full_node_rpc_client.py +1 -2
  362. chia/simulator/simulator_protocol.py +1 -2
  363. chia/simulator/simulator_test_tools.py +3 -3
  364. chia/simulator/start_simulator.py +7 -7
  365. chia/simulator/wallet_tools.py +10 -10
  366. chia/solver/solver.py +10 -10
  367. chia/solver/solver_api.py +10 -8
  368. chia/solver/solver_rpc_api.py +2 -2
  369. chia/solver/start_solver.py +4 -4
  370. chia/ssl/cacert.pem +148 -90
  371. chia/ssl/chia_ca.crt +14 -10
  372. chia/ssl/chia_ca_old.crt +19 -0
  373. chia/ssl/create_ssl.py +4 -4
  374. chia/ssl/renewedselfsignedca.conf +4 -0
  375. chia/ssl/ssl_check.py +1 -2
  376. chia/timelord/iters_from_block.py +1 -4
  377. chia/timelord/start_timelord.py +4 -4
  378. chia/timelord/timelord.py +44 -40
  379. chia/timelord/timelord_api.py +6 -4
  380. chia/timelord/timelord_launcher.py +2 -2
  381. chia/timelord/timelord_rpc_api.py +2 -2
  382. chia/timelord/timelord_state.py +11 -12
  383. chia/types/block_protocol.py +1 -3
  384. chia/types/blockchain_format/coin.py +1 -3
  385. chia/types/blockchain_format/program.py +11 -8
  386. chia/types/blockchain_format/proof_of_space.py +123 -76
  387. chia/types/blockchain_format/tree_hash.py +3 -3
  388. chia/types/blockchain_format/vdf.py +1 -2
  389. chia/types/coin_spend.py +3 -3
  390. chia/types/mempool_item.py +5 -5
  391. chia/types/mempool_submission_status.py +2 -3
  392. chia/types/peer_info.py +1 -2
  393. chia/types/unfinished_header_block.py +3 -4
  394. chia/types/validation_state.py +1 -2
  395. chia/util/action_scope.py +8 -8
  396. chia/util/async_pool.py +5 -5
  397. chia/util/bech32m.py +1 -2
  398. chia/util/beta_metrics.py +2 -2
  399. chia/util/block_cache.py +4 -4
  400. chia/util/chia_logging.py +2 -2
  401. chia/util/chia_version.py +1 -2
  402. chia/util/config.py +15 -16
  403. chia/util/db_wrapper.py +26 -27
  404. chia/util/default_root.py +1 -2
  405. chia/util/errors.py +3 -3
  406. chia/util/file_keyring.py +14 -14
  407. chia/util/files.py +2 -3
  408. chia/util/hash.py +4 -4
  409. chia/util/initial-config.yaml +4 -5
  410. chia/util/inline_executor.py +2 -1
  411. chia/util/ip_address.py +1 -2
  412. chia/util/keychain.py +25 -27
  413. chia/util/keyring_wrapper.py +18 -19
  414. chia/util/lock.py +3 -4
  415. chia/util/log_exceptions.py +1 -2
  416. chia/util/lru_cache.py +2 -2
  417. chia/util/network.py +6 -6
  418. chia/util/path.py +2 -3
  419. chia/util/priority_mutex.py +2 -2
  420. chia/util/profiler.py +1 -2
  421. chia/util/safe_cancel_task.py +1 -2
  422. chia/util/streamable.py +24 -10
  423. chia/util/task_referencer.py +1 -1
  424. chia/util/timing.py +3 -3
  425. chia/util/virtual_project_analysis.py +6 -5
  426. chia/util/ws_message.py +2 -2
  427. chia/wallet/cat_wallet/cat_info.py +3 -4
  428. chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
  429. chia/wallet/cat_wallet/cat_utils.py +3 -4
  430. chia/wallet/cat_wallet/cat_wallet.py +61 -83
  431. chia/wallet/cat_wallet/lineage_store.py +3 -4
  432. chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
  433. chia/wallet/coin_selection.py +9 -10
  434. chia/wallet/conditions.py +142 -106
  435. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
  436. chia/wallet/derivation_record.py +1 -2
  437. chia/wallet/derive_keys.py +2 -4
  438. chia/wallet/did_wallet/did_info.py +10 -11
  439. chia/wallet/did_wallet/did_wallet.py +36 -82
  440. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
  441. chia/wallet/driver_protocol.py +5 -7
  442. chia/wallet/lineage_proof.py +4 -4
  443. chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
  444. chia/wallet/nft_wallet/nft_info.py +8 -9
  445. chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
  446. chia/wallet/nft_wallet/nft_wallet.py +79 -116
  447. chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
  448. chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
  449. chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
  450. chia/wallet/nft_wallet/uncurry_nft.py +10 -11
  451. chia/wallet/notification_manager.py +3 -3
  452. chia/wallet/notification_store.py +44 -61
  453. chia/wallet/outer_puzzles.py +6 -7
  454. chia/wallet/puzzle_drivers.py +34 -6
  455. chia/wallet/puzzles/clawback/drivers.py +6 -6
  456. chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
  457. chia/wallet/puzzles/load_clvm.py +1 -1
  458. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
  459. chia/wallet/puzzles/singleton_top_layer.py +2 -3
  460. chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
  461. chia/wallet/puzzles/tails.py +3 -3
  462. chia/wallet/singleton.py +5 -7
  463. chia/wallet/singleton_record.py +3 -3
  464. chia/wallet/start_wallet.py +5 -5
  465. chia/wallet/trade_manager.py +37 -58
  466. chia/wallet/trade_record.py +4 -4
  467. chia/wallet/trading/offer.py +59 -46
  468. chia/wallet/trading/trade_store.py +8 -9
  469. chia/wallet/transaction_record.py +8 -8
  470. chia/wallet/uncurried_puzzle.py +1 -2
  471. chia/wallet/util/clvm_streamable.py +12 -12
  472. chia/wallet/util/compute_hints.py +4 -5
  473. chia/wallet/util/curry_and_treehash.py +1 -2
  474. chia/wallet/util/merkle_tree.py +2 -3
  475. chia/wallet/util/peer_request_cache.py +8 -8
  476. chia/wallet/util/signing.py +85 -0
  477. chia/wallet/util/tx_config.py +15 -6
  478. chia/wallet/util/wallet_sync_utils.py +14 -16
  479. chia/wallet/util/wallet_types.py +2 -2
  480. chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
  481. chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
  482. chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
  483. chia/wallet/vc_wallet/vc_drivers.py +27 -27
  484. chia/wallet/vc_wallet/vc_store.py +5 -6
  485. chia/wallet/vc_wallet/vc_wallet.py +33 -61
  486. chia/wallet/wallet.py +50 -78
  487. chia/wallet/wallet_action_scope.py +11 -11
  488. chia/wallet/wallet_blockchain.py +12 -12
  489. chia/wallet/wallet_coin_record.py +12 -6
  490. chia/wallet/wallet_coin_store.py +24 -25
  491. chia/wallet/wallet_interested_store.py +3 -5
  492. chia/wallet/wallet_nft_store.py +10 -11
  493. chia/wallet/wallet_node.py +53 -61
  494. chia/wallet/wallet_node_api.py +5 -3
  495. chia/wallet/wallet_protocol.py +23 -23
  496. chia/wallet/wallet_puzzle_store.py +15 -18
  497. chia/wallet/wallet_request_types.py +778 -114
  498. chia/wallet/wallet_retry_store.py +1 -3
  499. chia/wallet/wallet_rpc_api.py +572 -909
  500. chia/wallet/wallet_rpc_client.py +87 -279
  501. chia/wallet/wallet_singleton_store.py +3 -4
  502. chia/wallet/wallet_state_manager.py +332 -106
  503. chia/wallet/wallet_transaction_store.py +11 -14
  504. chia/wallet/wallet_user_store.py +4 -6
  505. chia/wallet/wallet_weight_proof_handler.py +4 -4
  506. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
  507. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
  508. chia/apis.py +0 -21
  509. chia/consensus/check_time_locks.py +0 -57
  510. chia/data_layer/puzzles/__init__.py +0 -0
  511. chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
  512. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
  513. chia/types/coin_record.py +0 -44
  514. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  515. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
  516. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
  517. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
  518. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
  519. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
  520. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
  521. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
  522. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
  523. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
  524. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
  525. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
  526. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
  527. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
  528. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
  529. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
  530. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
  531. {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
@@ -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,
@@ -33,10 +36,11 @@ from packaging.version import Version
33
36
 
34
37
  from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error
35
38
  from chia._tests.conftest import ConsensusMode
36
- from chia._tests.connection_utils import add_dummy_connection, connect_and_get_peer
39
+ from chia._tests.connection_utils import add_dummy_connection, add_dummy_connection_wsc, connect_and_get_peer
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()
@@ -1023,7 +1032,7 @@ async def test_new_transaction_and_mempool(
1023
1032
  assert estimate_fees(spend_bundle) == fee
1024
1033
  respond_transaction = wallet_protocol.SendTransaction(spend_bundle)
1025
1034
 
1026
- await full_node_1.send_transaction(respond_transaction)
1035
+ await full_node_1.send_transaction(respond_transaction, fake_peer)
1027
1036
 
1028
1037
  request = fnp.RequestTransaction(spend_bundle.get_hash())
1029
1038
  req = await full_node_1.request_transaction(request)
@@ -1074,7 +1083,7 @@ async def test_new_transaction_and_mempool(
1074
1083
  assert err is None
1075
1084
 
1076
1085
  # Resubmission through wallet is also fine
1077
- response_msg = await full_node_1.send_transaction(SendTransaction(successful_bundle), test=True)
1086
+ response_msg = await full_node_1.send_transaction(SendTransaction(successful_bundle), fake_peer, test=True)
1078
1087
  assert response_msg is not None
1079
1088
  assert TransactionAck.from_bytes(response_msg.data).status == MempoolInclusionStatus.SUCCESS.value
1080
1089
 
@@ -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]}")
@@ -2950,7 +2950,13 @@ async def test_declare_proof_of_space_no_overflow(
2950
2950
  assert full_node_api.full_node.blockchain.get_peak_height() == blocks[-1].height
2951
2951
  for i in range(10, 100):
2952
2952
  sb = await add_tx_to_mempool(
2953
- full_node_api, wallet, blocks[-8], coinbase_puzzlehash, bytes32(i.to_bytes(32, "big")), uint64(i)
2953
+ full_node_api,
2954
+ dummy_peer,
2955
+ wallet,
2956
+ blocks[-8],
2957
+ coinbase_puzzlehash,
2958
+ bytes32(i.to_bytes(32, "big")),
2959
+ uint64(i),
2954
2960
  )
2955
2961
  blocks = bt.get_consecutive_blocks(
2956
2962
  block_list_input=blocks,
@@ -2994,7 +3000,13 @@ async def test_declare_proof_of_space_overflow(
2994
3000
  assert full_node_api.full_node.blockchain.get_peak_height() == blocks[-1].height
2995
3001
  for i in range(10, 100):
2996
3002
  sb = await add_tx_to_mempool(
2997
- full_node_api, wallet, blocks[-8], coinbase_puzzlehash, bytes32(i.to_bytes(32, "big")), uint64(i)
3003
+ full_node_api,
3004
+ dummy_peer,
3005
+ wallet,
3006
+ blocks[-8],
3007
+ coinbase_puzzlehash,
3008
+ bytes32(i.to_bytes(32, "big")),
3009
+ uint64(i),
2998
3010
  )
2999
3011
 
3000
3012
  blocks = bt.get_consecutive_blocks(
@@ -3224,12 +3236,15 @@ async def declare_pos_unfinished_block(
3224
3236
  include_signature_source_data=True,
3225
3237
  )
3226
3238
  await full_node_api.declare_proof_of_space(pospace, dummy_peer)
3227
- q_str: Optional[bytes32] = verify_and_get_quality_string(
3239
+ tx_peak = blockchain.get_tx_peak()
3240
+ assert tx_peak is not None
3241
+ q_str: bytes32 | None = verify_and_get_quality_string(
3228
3242
  block.reward_chain_block.proof_of_space,
3229
3243
  blockchain.constants,
3230
3244
  challenge,
3231
3245
  challenge_chain_sp,
3232
3246
  height=block.reward_chain_block.height,
3247
+ prev_transaction_block_height=tx_peak.height,
3233
3248
  )
3234
3249
  assert q_str is not None
3235
3250
  unfinised_block = None
@@ -3251,12 +3266,13 @@ async def declare_pos_unfinished_block(
3251
3266
 
3252
3267
  async def add_tx_to_mempool(
3253
3268
  full_node_api: FullNodeAPI,
3269
+ dummy_peer: WSChiaConnection,
3254
3270
  wallet: WalletTool,
3255
3271
  spend_block: FullBlock,
3256
3272
  coinbase_puzzlehash: bytes32,
3257
3273
  receiver_puzzlehash: bytes32,
3258
3274
  amount: uint64,
3259
- ) -> Optional[SpendBundle]:
3275
+ ) -> SpendBundle | None:
3260
3276
  spend_coin = None
3261
3277
  coins = spend_block.get_included_reward_coins()
3262
3278
  for coin in coins:
@@ -3266,7 +3282,7 @@ async def add_tx_to_mempool(
3266
3282
  assert spend_coin is not None
3267
3283
  spend_bundle = wallet.generate_signed_transaction(amount, receiver_puzzlehash, spend_coin)
3268
3284
  assert spend_bundle is not None
3269
- response_msg = await full_node_api.send_transaction(wallet_protocol.SendTransaction(spend_bundle))
3285
+ response_msg = await full_node_api.send_transaction(wallet_protocol.SendTransaction(spend_bundle), dummy_peer)
3270
3286
  assert (
3271
3287
  response_msg is not None
3272
3288
  and TransactionAck.from_bytes(response_msg.data).status == MempoolInclusionStatus.SUCCESS.value
@@ -3309,7 +3325,11 @@ def compare_unfinished_blocks(block1: UnfinishedBlock, block2: UnfinishedBlock)
3309
3325
  ],
3310
3326
  )
3311
3327
  async def test_pending_tx_cache_retry_on_new_peak(
3312
- condition: ConditionOpcode, error: str, blockchain_constants: ConsensusConstants, caplog: pytest.LogCaptureFixture
3328
+ condition: ConditionOpcode,
3329
+ error: str,
3330
+ blockchain_constants: ConsensusConstants,
3331
+ caplog: pytest.LogCaptureFixture,
3332
+ self_hostname: str,
3313
3333
  ) -> None:
3314
3334
  """
3315
3335
  Covers PendingTXCache items that are placed there due to unmet relative or
@@ -3322,7 +3342,9 @@ async def test_pending_tx_cache_retry_on_new_peak(
3322
3342
  wallet = WalletTool(test_constants)
3323
3343
  ph = wallet.get_new_puzzlehash()
3324
3344
  blocks = bt.get_consecutive_blocks(
3325
- 3, guarantee_transaction_block=True, farmer_reward_puzzle_hash=ph, pool_reward_puzzle_hash=ph
3345
+ 3,
3346
+ guarantee_transaction_block=True,
3347
+ farmer_reward_puzzle_hash=ph,
3326
3348
  )
3327
3349
  for block in blocks:
3328
3350
  await full_node_api.full_node.add_block(block)
@@ -3330,7 +3352,7 @@ async def test_pending_tx_cache_retry_on_new_peak(
3330
3352
  assert peak is not None
3331
3353
  current_height = peak.height
3332
3354
  # Create a transaction with a height condition that makes it pending
3333
- coin = blocks[-1].get_included_reward_coins()[0]
3355
+ coin = find_reward_coin(blocks[-1], ph)
3334
3356
  if condition == ConditionOpcode.ASSERT_HEIGHT_RELATIVE:
3335
3357
  condition_height = 1
3336
3358
  else:
@@ -3339,7 +3361,9 @@ async def test_pending_tx_cache_retry_on_new_peak(
3339
3361
  sb = wallet.generate_signed_transaction(uint64(42), ph, coin, condition_dic)
3340
3362
  sb_name = sb.name()
3341
3363
  # Send the transaction
3342
- res = await full_node_api.send_transaction(SendTransaction(sb))
3364
+ _, dummy_node_id = await add_dummy_connection(full_node_api.server, self_hostname, 12312)
3365
+ dummy_peer = full_node_api.server.all_connections[dummy_node_id]
3366
+ res = await full_node_api.send_transaction(SendTransaction(sb), dummy_peer)
3343
3367
  assert res is not None
3344
3368
  assert ProtocolMessageTypes(res.type) == ProtocolMessageTypes.transaction_ack
3345
3369
  transaction_ack = TransactionAck.from_bytes(res.data)
@@ -3357,3 +3381,182 @@ async def test_pending_tx_cache_retry_on_new_peak(
3357
3381
  assert f"Added transaction to mempool: {sb_name}\n" in caplog.text
3358
3382
  # Make sure the transaction was retried and got added to the mempool
3359
3383
  assert full_node_api.full_node.mempool_manager.get_mempool_item(sb_name, include_pending=False) is not None
3384
+
3385
+
3386
+ @pytest.mark.anyio
3387
+ @pytest.mark.parametrize("mismatch_cost", [True, False])
3388
+ @pytest.mark.parametrize("mismatch_fee", [True, False])
3389
+ @pytest.mark.parametrize("tx_already_seen", [True, False])
3390
+ @pytest.mark.parametrize("mismatch_on_reannounce", [True, False])
3391
+ async def test_ban_for_mismatched_tx_cost_fee(
3392
+ three_nodes: list[FullNodeAPI],
3393
+ bt: BlockTools,
3394
+ self_hostname: str,
3395
+ mismatch_cost: bool,
3396
+ mismatch_fee: bool,
3397
+ tx_already_seen: bool,
3398
+ mismatch_on_reannounce: bool,
3399
+ ) -> None:
3400
+ """
3401
+ Tests that a peer gets banned if it sends a `NewTransaction` message with a
3402
+ cost and/or fee that doesn't match the transaction's validation cost/fee.
3403
+ We setup full nodes, and with `tx_already_seen` we control whether the
3404
+ first full node has this transaction already or it needs to request it.
3405
+ In both cases we check the transaction's validation cost and fee against
3406
+ the ones specified in the `NewTransaction` message.
3407
+ With `mismatch_on_reannounce` we control whether the peer sent us the same
3408
+ transaction twice with different cost and fee.
3409
+ """
3410
+ full_node_1, full_node_2, full_node_3 = three_nodes
3411
+ server_1 = full_node_1.full_node.server
3412
+ server_2 = full_node_2.full_node.server
3413
+ server_3 = full_node_3.full_node.server
3414
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
3415
+ await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
3416
+ ws_con_1 = next(iter(server_1.all_connections.values()))
3417
+ ws_con_2 = next(iter(server_2.all_connections.values()))
3418
+ ws_con_3 = next(iter(server_3.all_connections.values()))
3419
+ wallet = WalletTool(test_constants)
3420
+ wallet_ph = wallet.get_new_puzzlehash()
3421
+ # If we're covering that the first full node has this transaction already
3422
+ # we must add it accordingly, otherwise we'll add it to the second node so
3423
+ # that the first node requests it, reacting to the NewTransaction message.
3424
+ if tx_already_seen:
3425
+ node = full_node_1.full_node
3426
+ ws_con = ws_con_1
3427
+ else:
3428
+ node = full_node_2.full_node
3429
+ ws_con = ws_con_2
3430
+ blocks = bt.get_consecutive_blocks(3, guarantee_transaction_block=True, farmer_reward_puzzle_hash=wallet_ph)
3431
+ for block in blocks:
3432
+ await node.add_block(block)
3433
+ # Create a transaction and add it to the relevant full node's mempool
3434
+ coin = find_reward_coin(blocks[-1], wallet_ph)
3435
+ sb = wallet.generate_signed_transaction(uint64(42), wallet_ph, coin)
3436
+ sb_name = sb.name()
3437
+ await node.add_transaction(sb, sb_name, ws_con)
3438
+ mempool_item = node.mempool_manager.get_mempool_item(sb_name)
3439
+ assert mempool_item is not None
3440
+ # Now send a NewTransaction with a cost and/or fee mismatch from the second
3441
+ # full node.
3442
+ cost = uint64(mempool_item.cost + 1) if mismatch_cost else mempool_item.cost
3443
+ fee = uint64(mempool_item.fee + 1) if mismatch_fee else mempool_item.fee
3444
+ msg = make_msg(ProtocolMessageTypes.new_transaction, NewTransaction(mempool_item.name, cost, fee))
3445
+ # We won't ban localhost, so let's set a different ip address for the
3446
+ # second node.
3447
+ full_node_2_ip = "1.3.3.7"
3448
+ ws_con_1.peer_info = PeerInfo(full_node_2_ip, ws_con_1.peer_info.port)
3449
+
3450
+ # Send the NewTransaction message from the second node to the first
3451
+ async def send_from_node_2() -> None:
3452
+ await ws_con_2.send_message(msg)
3453
+
3454
+ # Send this message from the third node as well, just to end up with two
3455
+ # peers advertising the same transaction at the same time.
3456
+ async def send_from_node_3() -> None:
3457
+ await ws_con_3.send_message(msg)
3458
+
3459
+ for node in [full_node_1.full_node, full_node_2.full_node, full_node_3.full_node]:
3460
+ await time_out_assert(5, node.synced)
3461
+ await asyncio.gather(send_from_node_2(), send_from_node_3())
3462
+ if mismatch_on_reannounce and (mismatch_cost or mismatch_fee):
3463
+ # Send a second NewTransaction that doesn't match the first
3464
+ reannounce_cost = uint64(cost + 1) if mismatch_cost else cost
3465
+ reannounce_fee = uint64(fee + 1) if mismatch_fee else fee
3466
+ reannounce_msg = make_msg(
3467
+ ProtocolMessageTypes.new_transaction, NewTransaction(mempool_item.name, reannounce_cost, reannounce_fee)
3468
+ )
3469
+ await ws_con_2.send_message(reannounce_msg)
3470
+ # Make sure the peer is banned as it sent the same transaction twice
3471
+ # with different cost and/or fee.
3472
+ await time_out_assert(5, lambda: full_node_2_ip in server_1.banned_peers)
3473
+ return
3474
+ if not tx_already_seen:
3475
+ # When the first full node receives the NewTransaction message and it
3476
+ # hasn't seen the transaction before, it will issue a transaction
3477
+ # request. We need to wait until it receives the transaction and add it
3478
+ # to its mempool.
3479
+ await time_out_assert(30, lambda: full_node_1.full_node.mempool_manager.seen(mempool_item.name))
3480
+ # Make sure the first full node has banned the second as the item it has
3481
+ # already seen has a different validation cost and/or fee than the one from
3482
+ # the NewTransaction message.
3483
+ if mismatch_cost or mismatch_fee:
3484
+ await time_out_assert(5, lambda: full_node_2_ip in server_1.banned_peers)
3485
+ else:
3486
+ await time_out_assert(5, lambda: full_node_2_ip not in server_1.banned_peers)
3487
+
3488
+
3489
+ @pytest.mark.anyio
3490
+ async def test_new_tx_zero_cost(
3491
+ setup_two_nodes_fixture: tuple[list[FullNodeSimulator], list[tuple[WalletNode, ChiaServer]], BlockTools],
3492
+ self_hostname: str,
3493
+ ) -> None:
3494
+ """
3495
+ Tests that a peer gets banned if it sends a `NewTransaction` message with
3496
+ zero cost.
3497
+ """
3498
+ [full_node_1, full_node_2], _, bt = setup_two_nodes_fixture
3499
+ server_1 = full_node_1.full_node.server
3500
+ server_2 = full_node_2.full_node.server
3501
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
3502
+ ws_con_1 = next(iter(server_1.all_connections.values()))
3503
+ ws_con_2 = next(iter(server_2.all_connections.values()))
3504
+ await full_node_1.full_node.add_block(bt.get_consecutive_blocks(1)[0])
3505
+ # Send a NewTransaction with zero cost
3506
+ msg = make_msg(
3507
+ ProtocolMessageTypes.new_transaction, NewTransaction(bytes32.random(), cost=uint64(0), fees=uint64(42))
3508
+ )
3509
+ # We won't ban localhost, so let's set a different ip address for the
3510
+ # second node.
3511
+ full_node_2_ip = "1.3.3.7"
3512
+ ws_con_1.peer_info = PeerInfo(full_node_2_ip, ws_con_1.peer_info.port)
3513
+ await ws_con_2.send_message(msg)
3514
+ # Make sure the first full node has banned the second.
3515
+ await time_out_assert(3, lambda: full_node_2_ip in server_1.banned_peers)
3516
+
3517
+
3518
+ @pytest.mark.anyio
3519
+ @pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.HARD_FORK_2_0], reason="save time")
3520
+ async def test_corrupt_blockchain(bt: BlockTools, default_400_blocks: list[FullBlock]) -> None:
3521
+ full_node = await FullNode.create(
3522
+ bt.config["full_node"],
3523
+ root_path=bt.root_path,
3524
+ consensus_constants=bt.constants,
3525
+ )
3526
+
3527
+ config = bt.config["full_node"]
3528
+ db_path_replaced: str = config["database_path"].replace("CHALLENGE", config["selected_network"])
3529
+ db_path = path_from_root(bt.root_path, db_path_replaced)
3530
+ db_path.parent.mkdir(parents=True, exist_ok=True)
3531
+
3532
+ await make_db(db_path, default_400_blocks)
3533
+ with contextlib.closing(sqlite3.connect(db_path)) as conn:
3534
+ conn.execute("DELETE FROM current_peak;")
3535
+ conn.commit()
3536
+
3537
+ with pytest.raises(RuntimeError, match="corrupt blockchain DB"):
3538
+ # the blockchain is empty (without a peak)
3539
+ # but there are coins in the coin store
3540
+ async with full_node.manage():
3541
+ pass # pragma: no cover
3542
+
3543
+
3544
+ @pytest.mark.anyio
3545
+ async def test_send_transaction_peer_tx_queue_full(
3546
+ one_node_one_block: tuple[FullNodeSimulator, ChiaServer, BlockTools], self_hostname: str
3547
+ ) -> None:
3548
+ """
3549
+ Covers the case where a peer's transaction queue is full and it sends a
3550
+ `SendTransaction` message. The full node should send the proper
3551
+ `TransactionAck` response with a correct error.
3552
+ """
3553
+ full_node_api, server, _ = one_node_one_block
3554
+ # Set limit to 0 to trigger queue full exception
3555
+ full_node_api.full_node.transaction_queue.peer_size_limit = 0
3556
+ spend_bundle = SpendBundle([], G2Element())
3557
+ dummy_peer, _ = await add_dummy_connection_wsc(server, self_hostname, 1337, NodeType.WALLET)
3558
+ response_msg = await full_node_api.send_transaction(wallet_protocol.SendTransaction(spend_bundle), dummy_peer)
3559
+ assert response_msg is not None
3560
+ response = wallet_protocol.TransactionAck.from_bytes(response_msg.data)
3561
+ assert MempoolInclusionStatus(response.status) == MempoolInclusionStatus.FAILED
3562
+ assert response.error == "Transaction queue full"